Ask HN: Good large format (>20 inches) touchscreen E-Paper display options?

Hacker News
news.ycombinator.com
2026-08-24 23:46:01
Comments...
Original Article

Looking for options that might work for a low power touchscreen for a calendar project.

POP-2000, a lingua-franca POP-2 dialect

Lobsters
hitogata.neocities.org
2026-08-24 22:44:14
Comments...
Original Article
Written 2026-08-24

Devine (of Uxn fame) and I have been talking a lot about POP-2 , a language from the 1970s originally used in the same circles as the first Lisp dialects.

Devine had been looking into writing a new assembler for Uxn in a high-level language to aid in bootstrapping a Uxn system, while I personally have always been interested in languages that would make for good "tiny compilers", and we came upon POP-2 as something that would make for a good lingua-franca between all of these tiny systems.

Tiny Compilers (or, why I don't exactly care for concatenative programming)

A bit of a crazy title, I know. Don't get me wrong, I love the concatenative programming paradigm- its way of forming new functions/constructs via juxtaposition and composition are really elegant. But something that I tried to make clear in the paper I wrote for ok is that I don't feel particularly drawn to concatenative languages for those features- rather, I like concatenative languages because they're ridiculously easy to write an interpreter/compiler for while (often, not always) allowing for some low-level control- at least, compared to the other languages that I like playing around with, like C or Odin.

Coming from someone who originally made conlangs (a LOT of conlangs) before they'd even begun to touch computer programming, I care more about the langdev-side of things than actually making software. Specifically, when I'd work on an idea for a programming language, I typically had the following goals in mind:

  • As easy as possible to implement an interpreter/compiler for a given system, ideally using basically no external tools/libraries for parsing or code generation
  • Fairly "usable" (rather vague and subjective, but effectively it "shouldn't look like an esolang", going by an "I know it when I see it" description)
  • Minimal syntax
  • Minimal set of features, essentially only the bare minimum you'd need to bootstrap the compiler/interpreter (which should be a goal basically as soon as you get the language working)
  • Some low-level control/support for "systems programming", at least enough to where writing an operating system in the language should be feasible
  • It should be hostable on a small system (normally I'd set my minimum expectations to that of ok , so ~16MiB of memory with room to spare, but Uxn or perhaps something like a 6502 would be even better)

Concatenative languages, and languages targeting small/low-level stack-based VMs in general, just happen to map really well to these sorts of constraints. I don't like concatenative languages because I think concatenation as a paradigm is inherently better, but rather, I like them because concatenation makes the implementation problem of creating a programming language delightfully small. The benefits of this naturally stretch further into the classic arguments in favor of these types of systems (i.e. permacomputing and whatnot).

A bit about POP-2

If you look at the goals for language design that I outlined earlier and compare them to the goals outlined in the original POP-2 Papers , they're basically identical:

goals for POP-2's design

Devine's POP-2 article lays out a good overview of a POP-2 dialect written to target Uxn, but to summarize, a minimal POP-2 implementation supports declaring multiple variables at once with vars x y z; , declaring functions with function myfunc a b; (followed by the function body and then an end ), basic if / elseif / else control-flow, I/O with => , as well as looping via labels and gotos. The neat thing about POP-2 is that values manipulate an underlying stack- from Devine's own article:

function sum x y;
  x + y;
end

sum(5, 6) * 2;

Could just as easily be written this way, since the arguments to sum just get pushed onto the stack, and the value returned by sum also just gets pushed to the stack- that, and encountering an operator like + just looks ahead at the next element in the expression, pushes that to the stack, and then pops that and the next element off of the stack to add them together:

function sum x y;
  x; + y;
end

5; 6; sum(); * 2;

With this inherently stack-based nature, adding just some basic memory management, support for different-width values for different systems, and a more universal I/O system would be all that's needed for a convenient, beginner-friendly language that could be made to run on tons of tiny systems- not as a replacement for those system's existing languages, but more as a social exercise by allowing newcomers to start off with a language that's both easy to learn and runs on tons of our small systems, while also being a language that's easy enough for us , the creators of these small systems, to implement a compiler for.

POP-2000, a modest proposal

POP-2000, (or POP2K, we aren't completely set on a name yet) is a standardized dialect of POP-2 with the goal of adding the support for systems-level stuff that we'd like on our small systems, while also being very clearly defined (if you pour through the reference section of the POP-2 papers, the grammar is defined but it's very hard to get through).

I've been working on it basically nonstop for the past few days, while talking with Devine (more like "pestering Devine incessantly") about what features should be supported or added over on the concatenative Discord server about the grammar, syntax, etc.

I hope to have more details online soon- again, this whole thing was nothing more than a "what-if" less than a week ago. I've just about completed a grammar for the language written in EBNF notation. I'll create a Git repo with the "standard" soon enough (debating not doing it on GitHub, what with the bad neglect and relationship with ICE ), and as soon as that's created, I'll add it to this article. In the meantime though, I figured I'd write about what's in the works.

I also hope to write a kind of reference-implementation for the language's compiler in C, initially targeting ok , meaning soon our little VM is gonna have a high-level language!

POP-2000 EBNF grammar (work-in-progress)

For now, the full grammar I have so far in EBNF notation is as follows (expect changes in the future):

program = { element } ;

element = function
        | vars
        | imperative ;

function = "function" , identifier , [ params ] , ";" ,
             [ function_body ] ,
           "end" ;

const = "const"

vars = "vars" , var , { var } , ";" ;
var = identifier , [ ":" , ( integer | string ) ] ;

imperative = if
           | ( statement_sequence , ";" ) ;
           
if = "if" , expression , "then" , [ body ] ,
     { "elseif" , expression , "then" , [ body ] } ,
     [ "else" , [ body ] ] ,
     "close" ;

body = { imperative | vars } , [ statement_sequence ] ;

statement_sequence = statement , { ";" , statement } ;

statement = goto
          | labeled_statement
          | expression_list ;

(* "return" is only allowed to occur WITHIN A FUNCTION BODY, 
   the parser should enforce this *)
goto = "goto" , identifier 
     | "return" ; 

labeled_statement = label , { imperative } ;
label = identifier , ":" ;

expression_list = expression , { "," , expression } ;

expression = io ;

io = "=>" , primary
   | assign ;

assign = "->" , primary
       | apply ;
       
apply = "<>" , primary
      | shift ;
      
shift = ( "<<" | ">>" ) , primary
        | comparison ;

comparison = ( "<" | ">" | "=" | "!" ) , primary
           | term ;

term = ( "+" | "-" ) , primary
     | factor ;

factor = [ "*" | "/" | "%" ] , primary ;

primary = call
        | reference
        | quotation
        | grouping
        | index
        | identifier
        | literal ;

call = identifier , "(" , [ expression_list ] , ")" ;

reference = "#" , identifier ;
quotation = "@" , identifier ;
grouping = "(" , expression , ")" ;
index = "{" , expression , "}" ;

identifier = ( letter | "_" ) , { letter | digit | "_" } ;

literal = integer
        | hexadecimal
        | string ;

integer = digit , { digit } ; 
hexadecimal = "0x" , hex_digit , { hex_digit } ;

string = "\"" , { string_char } , "\"" ;
string_char = ? any printable character except for double-quotes and backslash ?
            | "\\\"" (* C-style escape for double quotes, with \" *)
            | "\\" ; (* C-style escape for backslash *)

letter = "A" ... "Z"
       | "a" ... "z" ;

digit = "0" ... "9" ;

hex_digit = digit 
          | "A" ... "F"
          | "a" ... "f" ;

Thomson Reuters Launches Its Own Frontier Model

Hacker News
www.thomsonreuters.com
2026-08-24 22:11:39
Comments...
Original Article

TORONTO, August 24, 2026 – Thomson Reuters (Nasdaq/TSX: TRI), a global content and technology company, today announced the launch of Thomson, the company's first proprietary large language model, developed in-house. Frontier labs have typically spent billions of dollars on compute and years of infrastructure investment to reach the frontier. Thomson Reuters took a different path: starting from a strong open-source foundation and investing $40 million to train Thomson into the right intelligence for the jobs that matter most, covering talent and compute. The result is a model Thomson Reuters fully controls, without the heavy inference costs of typical frontier models.

As one of the world's leading providers of trusted content and expertise for professionals, Thomson Reuters built Thomson on decades of proprietary content, technology, and domain expertise no other company can match. Training on that foundation is what made Thomson possible: a model built to Fiduciary-Grade™ standards , at a fraction of the typical cost.

“For years, the AI industry has treated scale as the answer: bigger models, more compute, more money. Thomson shows there is another path,” said Joel Hron, Chief Technology Officer, Thomson Reuters. “Start with a strong foundation, specialize it deeply for the work that matters, and you can build intelligence that is highly capable, far more efficient and entirely under your control. We think that changes the economics of professional AI.”

What Makes Thomson Different

Thomson starts from a strong open-source foundation. What makes it different is what happens next: state-of-the-art mid-training and post-training techniques, drawing on decades of authoritative content from Westlaw, Practical Law, Checkpoint, and Reuters, with hundreds of subject matter experts integrated from the design of training objectives through to the final evaluations.

“Thomson proves what’s possible when you build AI on decades of proprietary content and editorial expertise,” said Steve Hasker, CEO of Thomson Reuters. “That’s an advantage only Thomson Reuters has, and it shows in the results: our early evaluations put Thomson on par with the latest frontier models across a range of tasks. We’re putting it to work in CoCounsel Legal, with more capabilities and sovereign AI options to come. This is the bar we intend to keep raising.”

The model has been trained on less than 10% of Thomson Reuters content so far, and what comes next is not simply feeding it more data. It is continued discovery of new kinds of specialization and understanding, made possible only by building on decades of proprietary content and editorial expertise.

AI Sovereignty, and Why It Matters Now

Professionals are paying closer attention to questions of AI sovereignty: how a model is trained, what behaviors and biases live inside it, where it runs, and how the privacy of their information is protected. Thomson marks a shift for Thomson Reuters into a world where those questions are answered directly, not left to third parties alone.

Thomson shows a meaningful uplift from its base model in instruction following, the ability to execute complex, multi-part professional instructions precisely. It demonstrates an even greater uplift in navigating dense, domain-specific content, the kind of nuanced reasoning the hardest professional tasks require. It is also able to be trained alongside Thomson Reuters proprietary tools like Westlaw and Practical Law, which makes it more sophisticated and nuanced in its work.

The domain-specific gain challenges a common assumption, that the most capable general-purpose models only need access to the right content to perform at an expert level. Thomson Reuters’ early results suggest otherwise. Proprietary training and human subject matter expertise, applied to a strong foundation, produces gains that content access alone does not.

Evaluations of Thomson's underlying foundation model are available in the technical report about the model’s development.

Put To the Test

Ahead of today's launch, Thomson Reuters began opening the model to a group of legal and AI academics for direct evaluation. We will continue to make the model available to external parties to aid in the further validation and development of Thomson over the coming weeks and months. Thomson Reuters is also making a “small” version of Thomson available as an open-weight model on Hugging Face for academic and non-commercial use to further aid in this validation.

“I tested Thomson against ChatGPT and Claude using some of the more challenging questions students have asked in my Corporate Tax class. All three models answered the questions correctly, but I preferred Thomson's responses overall. I especially appreciated the links to treatises, which made its responses more transparent and useful for legal work.” - Jonathan H. Choi, Washington University School of Law

“Our evaluation found Thomson’s citation quality generally competitive with leading frontier models, even when tested on Canadian employment-law questions without a Canada-specific setting.” - Professor Samuel Dahan, Director, Queen's Conflict Analytics Lab and Cornell Legal AI Lab

Trust as the Real Differentiator

Thomson Reuters is developing domain-specific AI for customers with the highest expectations of trust and accuracy. The AI industry has spent years competing on raw capability. Thomson Reuters is betting the next horizon will be won in the verification layer. This supports the future of Fiduciary-Grade AI™ in practice, the standard Thomson Reuters sets for AI designed for professionals with duties of care and accountability, where almost right is not good enough, and customer data is not used to train the model without explicit consent.

For CoCounsel, and More

Thomson's first deployment is inside Tabular Analysis in CoCounsel Legal, exactly the kind of high-volume, structured document review where a purpose-built model's advantage shows up immediately. CoCounsel Legal remains multi-model by design, applying Thomson where it delivers the clearest advantage and other leading models elsewhere. Thomson will be available in Tabular Analysis for law firms and corporate legal departments in the upcoming release. There are also plans to extend Thomson models across the legal and tax portfolio with more sovereign AI options to follow.

The launch of Thomson marks a new chapter for Thomson Reuters. The company has always owned the content, the expertise, and the tools professionals rely on every day. Now it owns the model too. Thomson Reuters is no longer only integrating the world's best content, technology and expertise. It is building intelligence that will power the future of professional work.

Thomson Reuters

Thomson Reuters (TSX/Nasdaq: TRI) informs the way forward by bringing together the trusted content and technology that people and organizations need to make the right decisions. The company serves professionals across legal, tax, audit, accounting, compliance, government, and media. Its products combine highly specialized software and insights to empower professionals with the data, intelligence, and solutions needed to make informed decisions, and to help institutions in their pursuit of justice, truth and transparency. Reuters, part of Thomson Reuters, is a world leading provider of trusted journalism and news. For more information, visit thomsonreuters.com.

Media Contact

Ali Hughes
Director, AI and Innovation Communications
Ali.Hughes@TR.com

How Universities Should Prepare Founders

Hacker News
paulgraham.com
2026-08-24 21:40:39
Comments...
Original Article
How Universities Should Prepare Founders August 2026

How should universities prepare students to start startups? Y Combinator is in the perfect position to answer this question, because we get them next. We're like grad school. And because YC has had 20 years to refine its model of what a promising founder looks like, you probably won't find a better target.

What do the YC partners look for? It's surprisingly simple. They want people who are good at building things and have a habit of doing it.

The hard part of startups is product: knowing what to build, and being able to build it. And that kind of knowledge comes from studying computer science or mechanical engineering or molecular biology, not management or finance.

[ 1 ]

So the way to prepare undergraduates to become successful founders is not to give them some new curriculum focused on "entrepreneurship". It's to do what universities already do best — to teach them computer science and mechanical engineering and molecular biology.

[ 2 ]

Indeed, preparing students to start startups is closer to the ideal of liberal education than preparing them for almost any other kind of career. Startups succeed or fail based on how much customers like the product. Customers don't care what the founders studied in college. So founders are free to study whatever they want, as long as they get good at building things.

But building should be understood in a very broad sense. It doesn't mean all would-be founders have to study some form of engineering. Almost any kind of expertise that could be described as building or creating could be useful. It was useful to Steve Jobs to have studied calligraphy, for example; it was one of the reasons Apple dominated desktop publishing. So while math and science and engineering and design tend to be good bets, I would not want to draw a sharp line around them, because I can imagine other forms of building that could be useful. And of course you don't have to major in something to be good at it. Mark Zuckerberg was good at programming, but he was a psychology major, not a CS major.

The best way to describe what would-be founders should study is that they should seek out powerful ideas. But smart people are naturally attracted to powerful ideas anyway. So as long as departments teaching powerful ideas exist, the sort of people who'd make good founders will find them.

[ 3 ]

In fact there are only two things universities need to change to be perfect at preparing founders: they need to make students feel that starting a startup is something they can do, and they need to encourage them to work on their own projects.

At the moment, the belief that it's possible to start a startup is very unevenly distributed. YC now gets so many applications that our application data is a reasonable proxy for interest in startups at different universities, and Harvard alumni, for example, apply at about twice the rate of Yale and Princeton alumni. Presumably Harvard students aren't that different from Yale and Princeton students; the reason Harvard students go on to start more startups is just that it's more customary there. Which in turn implies that merely by making their students feel that starting a startup is a viable option, Yale and Princeton could at least double the number who do.

Once a university has a culture of starting startups, you don't have to convince students that it's a viable option. New students learn that from older ones. But at a university that doesn't have much of a startup culture yet, there are things you can do to help this realization along. The most effective is probably to show students examples of people who've done it.

Until you've seen some founders in real life, you tend to think that starting startups is something done by other people. Seeing them pops that bubble. In fact seeing founders in real life is doubly inspiring: they seem impressive, but they also seem human. Especially when they talk about the early years, when they were clueless and made lots of mistakes. So strangely enough seeing founders in real life makes being one seem simultaneously both desirable and accessible. It makes students think "I want to be like that, and I could."

How inspiring founders are to students is a function roughly of how rich and famous they are divided by how much older they are than the students. So it's not essential to bring famous billionaires to campus. Founders in their mid twenties who are 3 years into a startup with a valuation of a couple hundred million will do as well; they may only be a twentieth as rich and famous, but they're twenty times easier for students to identify with.

________________

It's obvious why universities that want their students to start startups need to make them believe it's a viable option. But why is it so important for students to work on their own projects?

There are four reasons. The first is simply that it's a great way, possibly the best way, to understand a subject really deeply. The excitement of creating something new is a much more powerful motivator than the fear of doing badly on an exam.

Second, working on projects together is the best way for cofounders to discover one another. The most successful startups tend to have multiple founders, and the only way to tell for sure if someone will be good to work with is to work with them. Apple and Microsoft were just the last of many projects their founders had worked on together.

Third, a startup is a project, so starting one will feel natural to someone who's used to working on projects of their own. It won't seem weird that there's no teacher or boss telling them what to do. They're used to telling themselves.

Fourth, and perhaps most surprisingly, random side projects are where the best startup ideas come from. The best startup ideas tend to seem so implausible at first that anyone consciously looking for startup ideas would reject them. Who'd expect to start a huge company by creating a student directory? So the way to discover the best startup ideas is not to look for startup ideas but just to work on whatever random projects seem interesting. Because in fact such projects are far from random: young people who are good at building things are technological bellwethers, so any idea that seems interesting to them is disproportionately likely to lead somewhere valuable, even if they themselves don't realize it yet.

Now it should be clear why the YC partners care a lot about the projects that applicants have worked on and not at all about their GPAs. Projects are the best source of knowledge, the best source of founding teams, and the best source of startup ideas.

But encouraging students to work on their own projects may be difficult for universities. It will mean giving the students more free time, and universities may not like to do that.

Microsoft and Meta have something in common that few people realize. They both got started during reading period at Harvard. Reading period is the gap between the end of classes and the beginning of final exams. It's called reading period because students are supposed to spend it preparing for exams. But reading period also turns out to have the unique combination of qualities that make it perfect for starting new projects: the students are all on campus, and they don't have anything due the next day. That latter constraint, especially, is a huge drag on the most ambitious students. Merely eliminating it for a few weeks resulted in two trillion dollar companies. Imagine what the US GDP would be if reading period at Harvard were twice as long.

Universities will tend to resist the idea of keeping students less busy with coursework. Partly because administrators feel that if they want to achieve something, they have to do it by taking active measures. Achieving something merely by leaving students alone is alien to their nature.

And they should be left alone. These things should be the students' own projects; the university should resist the temptation to make them official. Partly because students will be more excited to work on a project that's entirely their own, and partly because many projects wouldn't survive official recognition, because they break some sort of rule. Bill Gates and Mark Zuckerberg both got in trouble with the Harvard administration over projects they worked on as undergrads. Bill broke university rules by bringing Paul Allen, who wasn't a student, into the computer lab with him to work on Altair Basic. Zuck got in such trouble over Facemash that he was put on disciplinary probation. And their cases are probably more the rule than the exception. Universities have lots of rules, and novel projects are often untidy things.

Right now there are students flying drones out of line of sight. Turn a blind eye to it.

Another reason it will be hard for universities to keep students less busy is that they'll worry that without some kind of oversight, most students will just waste whatever free time they're given. And they will! The price of giving the most energetic students room to do even better is that it leaves the least energetic ones room to do even worse. But that's a price that's worth paying, because if the most energetic students do better they could do a lot better, whereas the laziest students already learn so little that there's not much room for them to do worse. So giving all the students some of their time back could improve the average outcome a lot, even if it doesn't move the median.

[ 4 ]

It may seem a bit excessive to change the whole schedule of the university just to encourage would-be founders. They're never going to be more than 10% of the students. And it probably would be excessive if this change only helped founders. But in fact giving the students some of their time back would help all the most energetic and ambitious ones. They'd all explore new things of one type or another if the pressure of work were relieved for even a week or two.

________________

Now that I've explained how universities should prepare founders, I should explain how not to. One thing universities can't do is actually teach students how to start startups. Starting a startup is one of those things, like chemistry or painting, that you have to learn by doing. Which means a properly run class on how to start a startup would have to be a lab class: the students would actually have to start startups. And I know exactly what a class of this type should look like, because YC is it. But YC is very different in structure from a university, and if you tried to cram it into an undergrad degree program, it would become a joke. Are the students supposed to start these companies without any funding? Are they supposed to run startups, which notoriously take every moment of your time when done properly, while simultaneously taking three or four other classes? And what if, despite these handicaps, some of the startups actually take off? Are the students just supposed to abandon them? Because it's either that or drop out.

Running a startup is incompatible with being a full time student. The only way to learn how to start a startup is to do it. Those two statements are so obvious that they're practically truisms. And yet so many people manage to remain in denial about what they imply. You can't teach students how to start startups.

One common response to this inconvenient truth is to pretend to teach them how to start startups, for example by organizing business plan competitions. The students collaborate to come up with a startup idea, which they then pitch to simulated investors. This kind of exercise is not merely useless but positively misleading. It trains founders to think that fundraising is the essential step in starting a startup — that the core of starting a startup is to create a story that appeals to investors. As an investor, I can tell you that's not true. Fundraising is merely a necessary evil. The people you need to impress are users, not investors, and the way you impress them is with prototypes, not words. The core of starting a startup is not creating a story that appeals to investors, but creating a product that appeals to users.

[ 5 ]

In fact would-be founders should be doing exactly the opposite of what students do in business plan competitions. Instead of thinking about startups without building anything, they should be building things without thinking about whether they'll turn into startups.

Probably one of the reasons universities are tempted to organize bogus things like business plan competitions is that if they actually took the optimal measures to prepare students to start startups, it would look too quiet. Imagine if a university were doing everything right. Students would be getting a deep knowledge of how to build things in classes they were taking out of genuine interest, and working eagerly with their friends on side projects that had nothing to do with school. The students would graduate with exactly what predicts success in founders: the ability to build things and a habit of doing it. Plus a significant number of those side projects would be incipient startups. And yet it would look to parents and prospective students as if the university wasn't doing anything. Where are the classes on "entrepreneurship"? Where is the Innovation Center?

And indeed this is another great thing about the optimal plan for preparing startup founders: it costs nothing extra. You don't have to hire any deans of entrepreneurship or build any new buildings. In fact if you do, those things will tend to drag you down; there's no need for them, so if they have any effect at all it will tend to be for the worse. If you have spare money, give it to the people teaching computer science or mechanical engineering or molecular biology.

[ 6 ]

But if the optimal route looks too quiet, the solution is not to avoid it. The solution is to stand firm, knowing that you're doing the right thing, and eventually the results will speak for themselves. If you can develop an organic startup culture among your students and there are multiple students in every year who go on to start successful ones, this will soon become evident to anyone paying attention.

Notes

[

1 ] Should students still study computer science if AIs will write most code? Definitely. CS is an interesting subject in its own right and also a great way to understand problem solving in general. And even if you have AIs writing all your code for you, you're still in the position of an engineering manager, and good engineering managers should be able to do the work of those working for them.

[

2 ] One reason I always put "entrepreneurship" in quotes is that it's a misleading word to use to describe starting startups. "Entrepreneurship" simply means starting one's own business, and startups are a microscopically small subset of that world in which the rules are completely different. So conflating the two is asking for trouble.

[

3 ] Of course all departments will claim to be teaching powerful ideas. But false claims of this type don't seem much of a danger. The sort of people who'd make good founders wouldn't even need to see through them; they simply wouldn't be interested enough in the classes taught by such departments to have much of their time wasted by them.

[

4 ] There's an interesting parallel here to variation in income. The bottom of the income scale is anchored firmly at zero, because there are some people who are either incapable of working or just not interested in doing it at the moment. If you let there be more variation in income, it won't affect the income of the people at this end of the scale; n times zero is zero; but at the other end of the scale you'll see enormous change.

[

5 ] Presumably one reason these competitions lean toward impressing investors rather than users is that it's the only way to have a single set of judges. Investors can be treated as interchangeable, whereas the users of each product might be different. But if it's impractical to measure the right thing, that doesn't mean the solution is to measure the wrong one.

[

6 ] Another thing that will tend to draw universities away from the optimal path is business schools, if they have them. Business schools were not designed to train founders. They were designed to train the managerial class of the large industrial companies that arose in the early 20th century; they're the West Points of industrial capitalism. That's why their official name is usually the School of Management. But while the skills they teach might be useful in running companies beyond a certain size, they're not the critical ingredient in founding them. And the skills that are are already taught by other departments. So to the extent business schools affect their parent university's strategy for preparing founders, it can only be by adding error. Thanks to Trevor Blackwell, Daniel Diermeier, Jared Friedman, Diana Hu, Michael Kotlikoff, Jessica Livingston, Robert Morris, Harj Taggar, and Garry Tan for reading drafts of this.

Was Modern Art a CIA Psy-Op?

Hacker News
daily.jstor.org
2026-08-24 21:35:00
Comments...
Original Article

The icon indicates free access to the linked research on JSTOR.

In the mid-twentieth century, modern art and design represented the liberalism, individualism, dynamic activity, and creative risk possible in a free society. Jackson Pollock’s gestural style, for instance, drew an effective counterpoint to Nazi, and then Soviet, oppression. Modernism, in fact, became a weapon of the Cold War. Both the State Department and the CIA supported exhibitions of American art all over the world.

“Collaborate” “Collaborate”

The preeminent Cultural Cold Warrior, Thomas W. Braden, who served as MoMA’s executive secretary from 1948-1949, later joined the CIA in 1950 to supervise its cultural activities. Braden noted, in a Saturday Evening Post article titled “I’m glad the CIA is ‘immoral’” that American art “won more acclaim for the U.S. …than John Foster Dulles or Dwight D. Eisenhower could have bought with a hundred speeches.”

The relationship between Modern Art and American diplomacy began during WWII, when the Museum of Modern Art was mobilized for the war effort. MoMA was founded in 1929 by Abby Aldrich Rockefeller. A decade later, her son Nelson Rockefeller became president of the Museum. In 1940, while he was still President of MoMA, Rockefeller was appointed the Roosevelt Administration’s Coordinator of Inter-American affairs. He also served as Roosevelt’s Assistant Secretary of State in Latin America.

The Museum followed suit. MoMA fulfilled 38 government contracts for cultural materials during the Second World War, and mounted 19 exhibitions of contemporary American painting for the Coordinator’s office, which were exhibited throughout Latin America. (This direct relationship between the avant-garde and the war effort was well suited: The term avant-garde actually began as a French military term to describe vanguard troops advancing into battle.)

In the battle for “hearts and minds,” modern art was particularly effective. John Hay Whitney, both a president of MoMA and a member of the Whitney Family, which founded the Whitney Museum of American Art, explained that art stood out as a line of national defense, because it could “educate, inspire, and strengthen the hearts and wills of free men.”

Whitney succeeded Rockefeller as President of the Museum of Modern Art in January 1941, so that Nelson could turn his entire attention to his Coordinator duties. Under Whitney, MoMA served as “A Weapon of National Defense.” According to a Museum press release dated February 28, 1941, MoMA would “inaugurate a new program to speed the interchange of the art and culture of this hemisphere among all the twenty-one American republics.” The goal was “Pan-Americanism.” A “Traveling Art Caravan” through Latin America “would do more to bring us together as friends than ten years of commercial and political work.”

When the War ended, Nelson Rockefeller returned to the Museum, and his Inter-American-Affairs staffers assumed responsibilities for MoMA’s international exhibition program: René d’Harnoncourt, who had headed Inter-American’s art division, became the Museum’s vice president in charge of foreign activities. Fellow staffer Porter McCray became the Director of the Museum’s International Program.

Modern art was so well aligned with American Cold War foreign policy that McCray took a leave of absence from the Museum in 1951 to work on the Marshall Plan. In 1957, Whitney resigned his position as MoMA’s Chairman of the Board of Trustees to become United States Ambassador to Great Britain. Whitney remained a trustee of the Museum while he was Ambassador, and his successor as Chairman was… Nelson Rockefeller, who had served as Special Assistant to President Eisenhower for Foreign Affairs until 1955.

A model of the CIA headquarters in front of a Georgia O'Keefe painting
Georgia O’Keefe colors the landscape around a model of CIA headquarters

Even though Modern art and American diplomacy were of a piece, Soviet propaganda asserted that the United States was a “culturally barren” capitalist wasteland. To make the case for American cultural dynamism, the State Department in 1946 spent $49,000 to purchase seventy-nine paintings directly from American Modern artists, and mounted them in a traveling exhibition called “ Advancing American Art. ” That exhibition, which made stops in Europe and Latin America, included work from artists such as Georgia O’Keeffe and Jacob Lawrence .

Despite positive reviews from Paris to Port au Prince, the exhibition stopped short in Czechoslovakia in 1947, because Americans themselves were indignant. Look Magazine fired off an article entitled “Your Money Bought These Paintings.” The Look piece questioned why U.S. tax dollars were being spent on such confusing pieces of art—and wondered if these were paintings even art. Harry Truman took one look at Yasuo Kuniyoshi’s painting Circus Girl Resting , which was included in the exhibit, and said, “If this is art, I’m a Hottentot.”

In Congress, Republican Representatives John Taber of New York, and Fred Busbey of Illinois worried that some of the artists held Communist sympathies, or engaged in “Un-American Activities.”

The American public’s fear of the Red Menace brought “Advancing American Art” home early, but it was precisely because Modern art was not universally popular, and was created by artists who openly disdained orthodoxy, that it was such an effective tool in showcasing the fruits of American cultural freedom to anyone looking in from abroad. President Truman personally considered Modern art, “merely the vaporings of half-baked lazy people.” But he did not declare it degenerate and expel its practitioners to gulags in Siberia. Not only that, abstract expressionism in particular was a direct repudiation of Soviet Socialist Realism. Nelson Rockefeller liked to call it “Free Enterprise Painting.”

In contrast to the Soviet Union’s “Popular Front,” the New Yorker magazine wonderfully, and perfectly, referred to the political role of American Modernism as “The Unpopular Front.” The very existence of American Modern Art proved to the world that its creators were free to create, whether you liked their work or not.

If Advancing American Art proved the nation’s artists were free because they could splatter as much paint as they wanted, it also proved that Congress could not always be induced to spend tax dollars supporting it. Braden later wrote , “the idea that Congress would have approved many of our projects was about as likely as the John Birch Society’s approving Medicare.” Clearly the State Department wasn’t the right patron for Modern Art. Which brings us to the CIA.

In 1947, at the very moment that the Advancing American Art show was being recalled, and the United States Government was selling its O’Keeffe’s for fifty bucks a-piece (all seventy-nine pieces in the show together brought in $5,544), the CIA was being created. The CIA grew out of “Wild” Bill Donovan’s Office of Strategic Services (OSS), which was the U.S.’s wartime intelligence apparatus. MoMA’s John Hay Whitney and Thomas W. Braden had both been members of the OSS.

Their fellow operatives included the poet and Librarian of Congress Archibald MacLeish, the historian and public intellectual Arthur M. Schlesinger, Jr., and the Hollywood director John Ford. By the time the CIA was codified in 1947, clandestine affairs had long been the arena of America’s cultural elite. Now, as museum staffers like Braden joined, the cultural cognoscenti and the CIA fought the Cultural Cold War side by side, with the Whitney Trust acting as a funding conduit.

Speaking of front organizations, in 1954, MoMA took over (from the State Department) the U.S. Pavilion at the Venice Biennale, so that the U.S. could continue to exhibit Modern art abroad without appropriating public funds. (MoMA owned the U.S. pavilion at Venice from 1954 to 1962. It was the only national pavilion at the show that was privately owned.)

Eisenhower made MoMA’s role as a government proxy clear in 1954, speaking at the Museum’s twenty-fifth anniversary celebration. Eisenhower called Modern art a “Pillar of Liberty,” saying:

As long as our artists are free to create with sincerity and conviction, there will be healthy controversy and progress in art. How different it is in tyranny. When artists are made the slaves and tools of the state; when artists become the chief propagandists of a cause, progress is arrested and creation and genius are destroyed.

It was MoMA’s job, concurred United States Ambassador to the Soviet Union, to demonstrate to the rest of the world “both that we have a cultural life and that we care about it.”

The CIA not only helped finance MoMA’s international exhibitions, it made cultural forays across Europe. In 1950, the Agency created the Congress for Cultural Freedom (CCF), headquartered in Paris. Though it appeared to be an “autonomous association of artists, musicians and writers,” it was in fact a CIA funded project to “propagate the virtues of western democratic culture.” The CCF operated for 17 years, and, at its peak, “had offices in thirty-five countries, employed dozens of personnel, published over twenty prestige magazines, held art exhibitions, owned a news and features service, organized high-profile international conferences, and rewarded musicians and artists with prizes and public performances.”

The CIA chose to headquarter the Congress for Cultural Freedom in Paris, because that city had long been the capital of European cultural life, and the CCF’s main goal was to convince European intellectuals, who might otherwise be swayed by Soviet propaganda, which suggested that the U.S. was home only to capitalist philistines, that in fact the opposite was true: with Europe weakened by war, it was now the United States that would protect and nurture the western cultural tradition, in the face of Soviet dogma.

Braden, writing about his role in the CCF as director of the CIA’s cultural activities, explained in 1967, “in much of Europe in the 1950’s, socialists, people who called themselves ‘left’—the very people whom many Americans thought no better than Communists—were the only people who gave a damn about fighting Communism.” When the CIA made its bid to the European intelligentsia, the Agency was waging what Braden called “the battle for Picasso’s mind,” via Jackson Pollock’s art.

Accordingly, the CIA bankrolled the Partisan Review , which was the center of the American non-Communist left, carrying enormous cultural prestige in both the U.S. and Europe because of its association with writers like T.S. Eliot and George Orwell. Unsurprisingly, the editor of the Partisan Review was the art critic Clement Greenberg, the most influential arbiter of taste , and the strongest proponent of abstract expressionism in post-war New York.

The CCF worked with MoMA to mount 1952’s “Masterpieces of the Twentieth Century” Festival in Paris. The works for the show came from MoMA’s Collection, and “established the CCF as a major presence in European cultural life,” as the historian Hugh Wilford wrote in his book The Mighty Wurlitzer: How the CIA Played America .

Curator James Johnson Sweeney made sure to note that the works included in the show “could not have been created . . . by such totalitarian regimes as Nazi Germany or present-day Soviet Russia.” Distilling this message even further in 1954, MoMA’s August Heckscher declared that the museum’s work was “related to the central struggle of the age—the struggle of freedom against tyranny.”

Editors’ Note: An earlier version of this article misquoted President Truman. He considered Modern art “merely the vaporings of half-baked lazy people,” not “the vaporizings.”

[Sponsor] Finalist 4: Inspired by Paper Day Planners

Daring Fireball
www.finalist.works
2026-08-24 20:37:24
Finalist 4 is the biggest update yet to the paper-inspired day planner for iPhone, iPad, Mac, and now Apple Watch. The headline is Notes, in the app or as a folder of Markdown files that round-trips with Obsidian. Tasks in those files land on the right day, next to your reminders and events, even in...
Original Article

For people who finish things

A complete planner on every screen.

Your tasks, calendar, notes, habits, and journal, woven into one living page. On iPhone, iPad, Mac, and now Apple Watch. Plan your day without feeling stressed about it.

Free to try · 4.0 is a free update for everyone

Your day your way · stack ’em

"Auteur software"
John Gruber, Daring Fireball

App of the Day
2025 and 2026

★★★★★
4.8 on the App Store

From the editor

Finalist started three years ago as the planner I couldn't buy: one page that holds the whole day the way a good paper planner does, with everything paper can't do. Version 4.0 is the biggest release since 1.0. Notes moved in. The Watch app arrived. The Daily page became something you design.

All of it is below, and all of it is a free update.

— Slaven, developer of Finalist

"Finalist is so beautiful and thoughtfully designed that it makes me want to use it."

Section A · Your Day

Your whole day, on one page.

Events, tasks, reminders, habits, the weather, even your journal. Finalist sets them on a single page, so deciding what today is for takes one look.

Two Daily designs, same day. Flip the index tabs.

Two designs, and a layout editor. Daybook is the classic. Broadsheet is the newsprint look that shines on iPad and Mac. The Layout Editor goes further: multi-column spreads, a different layout per device, presets you can save. Your day ends up looking like you.

A favorite trick: tap Broadsheet's World Clock and the masthead retunes to another city's day, date and weather and all.

Made to lower your pulse. The page shows only the parts you use. Unfinished tasks roll forward without shame. Snooze is one tap: 15 minutes, 4 hours, or pick a day.

Share Day renders the day you're viewing as a clean, chrome-free image. Pick a theme, crop it, send it.

"It puts all of my thoughts in a single day, whether they be work appointments or personal tasks or intentions, while not overwhelming me with info I don't need."

Sketch your day in pencil . Commit when it's real.

The rebuilt Timeline compresses free time into blocks and lets you drag tasks straight from the rail.

9:00

Team standup Calendar · 25 min

10:00

Draft the pitch penciled

Draft the pitch accepted ✓

Drag a task from the rail to pencil it in. Resize with the handle. Accept writes the time into the real task.

Penciled times are tentative. Resize them, move them, change your mind. Nothing touches your real tasks and reminders until you tap Accept , and all of it is undoable.

Time blocking for people who hate committing before 9 AM.

Section B · Every Thread

Pick a Tag and hide the rest.

Tags now run across everything: tasks, notes, journal entries, habits, even Apple reminders and calendar events. Tap a tag on Daily and the day shows just that thread of your life.

Anything that holds dated tasks can unfold into a swimlane timeline: a tag, a list, a Smart List, even a markdown file or a whole folder. Columns adapt from days to weeks to months, so a year-long project stays legible on one screen.

Section C · Notes

Planning, meet note taking.

Tasks tell you what, notes tell you why. A new Notes tab brings notebooks, an inbox, tags, and search into the planner you already open every day. Pin a note to show on every Today, or pick a date for it to place it on that day only.

Notes on iPad: the sidebar, an App notebook, and a release-checklist note open with tasks half checked off

Already keep a folder of Markdown files?

Point Finalist at it. Obsidian vaults, iCloud Drive, any folder of .md files becomes a native notebook. Frontmatter round-trips both ways, unknown keys preserved. Tasks in your files become real Finalist tasks, on the right date, with the right tags. Wiki links, Dataview fields, and extended task statuses resolve right in the app.

If you have ever kept your schedule in one app and your notes in another, this release will end that commute.

--- date: 2026-08-11 tags: [launch, planning] --- - [x] submit the build - [/] release notes 📅 2026-08-11 - [!] reply to App Review - [ ] ship it, then [[Vacation]]

Section D · New on Apple Watch

Your day, on your wrist.

A full Watch app that runs even when your phone stays home. The Now card answers the day's current question, then your whole day scrolls below: events, tasks, reminders, habits. Long-press a task for Done, Tomorrow, or In 10 Minutes. And yes, the shared grocery list is checkable from the wrist.

The Now card mid-morning: the running work block with a countdown, the day's events below

In a block

The Now card on a Sunday: a seawall walk with time left, brunch coming up

Off the clock

The watch face complication wearing the day's highlight colors: the current block, its countdown, and the next task

On the face

Complications, a Smart Stack widget, and a big complication that wears your day's Highlight colors. Add by keyboard, scribble, or dictation. Requires watchOS 26.

milk
call dentist tue
pack for trip fri
birthday card!

The Capture sheet holding the scanned list, one line per item, above a Find Tasks button

Buy milk Today

Call dentist Tue

Pack for trip Fri

Get birthday card Today

Capture. Point it at a handwritten list, a screenshot, or anything you share into Finalist. Dated tasks come out, fields already filled. Dictate a note and it titles itself. Apple's on-device models do the work, so nothing about your day leaves your device.

Why it sticks

Works with your brain, not against it.

Planner apps fail when they turn your day into a guilt list. Finalist is built to lower the stakes: move a task to tomorrow without ceremony, keep the page down to what matters now, and let streaks encourage instead of punish.

"It has helped keeping up with my to do list, makes it easy to move unfinished tasks to the next day without making me feel guilty, and gives me a space to do some short journaling during the day."

"I have tried them all. Truly. Spent gobs of money on all of the heavy hitters. But THIS ONE works with my brain and just plain works."

And the rest of the paper

The 4.0 changelog runs to over 400 features and improvements . A few favorites:

Share Day Your day as a clean image, ready to send.

Smart Lists Overdue, Due Today, This Week, across tasks, Reminders, and markdown.

Hear Summary Your day read aloud, with a real player and read-along transcript.

Widgets Tap a checkbox to complete it right on the widget.

Live Activities Your current block, on the lock screen.

Custom event icons Map your own words, in any language, to event symbols.

Yearly Planner Paint highlight runs with one swipe, then caption them.

Convert anything Turn a task into a reminder or an event, and back.

Your hours Define Morning, Afternoon, and Evening, each with its own focus.

Journal Photos, daily goals, and your sleep from Apple Health.

Meeting links A compact Join button instead of a full-width URL.

Shortcuts & Siri Create and append notes, add tasks, hands free.

Letters to the editor

"Where has this app been all my life!"

Finalist user, December 2025

"I've used a lot of to-do apps in the past including Todoist, OmniFocus, Obsidian, and NotePlan. But Finalist fits me much much better!"

"The design language is clean, analog-almost, and feels like a digital extension of a physical planner, with the peace of mind of digital remembrance."

"I've gotten rid of all my other to-do apps and now this is the only one I'll use. I love looking at it, and if I'm looking at it, it means my stuff is getting done."

"A standout app that has a great future. Very responsive developer who is very open to feedback and keeps reiterating with useful additions."

"If you have not tried it yet, get ready for a surprise. Finalist is the best available iOS, iPadOS, and macOS task and event manager in the App Store."

"Guys, no joke, Finalist is really a great app. Slaven has put a lot of effort in developing the app, and introducing new features."

Finalist 4.0 · Out now

Plan tomorrow like you mean it.

Free to try. 4.0 is a free update, and one subscription or a lifetime license covers iPhone, iPad, Mac, and Apple Watch. Built by one person, shaped by 700+ beta testers on Discord.

"It's just so obvious, just using it, that Finalist is his own dream app for daily productivity."

This Week in People’s History, Aug 26-Sep 1, 2026

Portside
portside.org
2026-08-24 20:32:11
This Week in People’s History, Aug 26-Sep 1, 2026 Jonathan Bennett Mon, 08/24/2026 - 20:32 ...
Original Article

Kaepernick Can’t be Cancelled (2016 and 2026)

TEN YEARS AGO, ON AUGUST 26, 2016, Colin Kaepernick, a quarterback on the San Francisco 49ers football team, made a silent protest when he sat down while “The Star-Spangled Banner” was being played before the game. It was not the first time he had made a similar protest, but was the first time he did so when he was in uniform, so no one had mentioned noticing his earlier actions.

On this occasion, when a reporter asked Kaepernick about it, he replied: “I am not going to stand up to show pride in a flag for a country that oppresses Black people and people of color. To me, this is bigger than football and it would be selfish on my part to look the other way. There are bodies in the street and people getting paid leave and getting away with murder.”

That was the beginning of Kaepernick’s decade-long struggle to be both an outspoken anti-racist and a successful professional athlete; he has never stopped being an anti-racist, but the National Football League has sabotaged his professional athletic career by refusing to hire him, not because of a lack of athletic talent, but apparefntly because the owners of NFL teams refuse to employ players who are outspoken anti-racists.

When it became clear that the NFL team owners had blacklisted him, Kaepernick filed a grievance stating the owners "have colluded to deprive Mr. Kaepernick of employment rights in retaliation for Mr. Kaepernick's leadership and advocacy for equality and social justice and his bringing awareness to peculiar institutions still undermining racial equality in the United States." Under the NFL contract, grievances are resolved by arbitration, but before the arbitration took place, the owners and Kaepernick reached a confidential settlement, the details of which remain secret.

In less than a month from now, on September 15, 2026, Kaepernick’s memoir of his struggle, The Perilous Fight will be published by Legacy Lit. According to the publisher, The Perilous Fight is “equal parts memoir and manifesto, [which] traces the off-the-field battles that turned a single act of protest into a movement that changed American sports and culture forever.” https://portside.org/2016-08-30/insulting-colin-kaepernick-says-more-about-our-patriotism-his

You Don’t Need Official Permission to Adjudicate Crimes Against Humanity (1966)

SIXTY YEARS AGO, ON AUGUST 28, 1966, the U.S. war against Vietnam was growing bigger and bloodier every day.

On that day, more than 250,000 U.S. troops were stationed in South Vietnam; for more than four years U.S. forces had sprayed massive amounts of Agent Orange defoliant on the forests and farmland of Vietnam; for more than 17 months the U.S. had bombed both civilian and military targets in northern Vietnam.

Hundreds of thousands of people in cities and towns all over both the U.S. and Europe had participated in massive, peaceful, demonstrations against the war; on that day Nobel-prize-winning philosopher Bertrand Russell joined the protests by asking President Lyndon Johnson to testify in his own defense before an International War Crimes Tribunal in order to rebut the charge that the U.S. was committing war crimes.

Russell wrote that “Within living memory only the Nazis could be said to have exceeded in brutality the war waged by your Administration against the people of Vietnam, and it is because this war is loathed and condemned by the vast majority of mankind that demands are heard throughout the world for a formal international tribunal to hear the full evidence."

LBJ ignored Russell’s letter, but after the Tribunal heard the testimony of more than 35 witnesses, on May 10, 1967, its 16 members unanimously found that the U.S. had violated international law by committing acts of aggression against Vietnam, and by bombarding purely civilian targets such as hospitals, schools, medical establishments and dams, and that the governments of Australia, New Zealand and South Korea were accomplices in the illegal aggression against Vietnam.  For more information, see Against the Crime of Silence: Proceedings of the Russell International War Crimes Tribunal at https://archive.org/details/againstcrimeofsi0000unse

You Can Trust Us, We’re Landlords (1966)

SIXTY YEARS AGO, ON AUGUST 29, 1966, a possible showdown loomed in Chicago between two groups of civil rights advocates, some of whom were committed entirely to non-violent tactics and others of whom advocated the right to defend themselves when violently attacked.

A march had been planned demanding an end to the housing policies that prevented any people of color from living in Cicero, a suburb that shared a border with Chicago. But then some of the planners called the march off because they had reached an agreement with Cicero authorities on a way to end the suburb’s total ban on Black residents.

The cancellation of the march was opposed by the more militant open-housing advocates, who argued that it was impossible to gauge the good faith of Cicero landlords before the agreement had even gone into effect. If the landlords and Cicero officials were sincere in agreeing to relax the color line, surely they had no reason to object to a demonstration in support of what they had agreed to.

The more militant of the civil rights supporters, which included the Chicago chapter of the Congress of Racial Equality (CORE), the Association of Community Teams, the Student Nonviolent Coordinating Committee, the Oakland Committee for Community Improvement, and Deacons for Defense and Justice, announced they planned to march through Cicero on Sunday, September 4.

The next edition of This Week in People’s History will include a complete description of what happened in Cicero, Illinois, on September 4, 1966.

Dying in the Desert? Don’t Expect any Help from ICE (2006)

TWENTY YEARS AGO, ON SEPTEMBER 1, 2006, before the Homeland Security mafia had taken over, a federal judge in Tucson, Arizona, told the Border Patrol it should never have arrested two humanitarian aid workers on charges of conspiracy and human smuggling when the two had been, in fact, rushing three desert travelers, who were strangers to the aid workers, to a clinic for treatment of multiple life-threatening conditions.

The two aid workers were facing the possibility of 15 years in prison and a $500,000 fine when the judge dismissed their indictments.

The two aid workers, Shanti Sellz and Daniel Strauss, were volunteering with southern Arizona-based non-profit organization No More Deaths, a ministry of the Unitarian Universalist Church of Tucson, which focuses on reducing the number of fatalities from dehydration and heat stroke that occur every year among unprepared travelers in the Sonora Desert.

On the day when Seliz and Strauss were arrested in July 2005, they had come upon three individuals who were in imminent danger of dying from heat-related illnesses. Seliz and Strauss were following a protocol the No More Deaths had used for years, of which the Border Patrol was fully aware. Under the protocol, if the life of anyone in the desert was in danger, giving them transportation to a medical facility was viewed as a humanitarian necessity, regardless of the individual’s immigration status.

Fortunately, the judge in the case agreed with two arguments put forward by the defense: (1) The defendants were following a medical emergency protocol that No More Deaths had previously established and shared directly with the Border Patrol to ensure legal compliance, and (2) because the organization had openly practiced this medical transport protocol for years without prior legal interference or warning, the prosecution was a violation of the defendants' due process rights.

Six months after the charges against Seliz and Strauss were dismissed, the Rothko Chapel in Houston honored them with the Oscar Romero Human Rights Award. https://scholarship.law.unc.edu/cgi/viewcontent.cgi?article=1036&context=nccvlrts

For more People's History, visit
https://www.facebook.com/jonathan.bennett.7771/

6 Ways To Rebuild Unions at the State and Local Levels Now

Portside
portside.org
2026-08-24 19:22:40
6 Ways To Rebuild Unions at the State and Local Levels Now Stephanie Mon, 08/24/2026 - 19:22 ...
Original Article
6 Ways To Rebuild Unions at the State and Local Levels Now Published

Ian M.

If unions are going to grow, they will need new state and local policy.

Over the summer, primary victories for pro-worker candidates running for US Congress like Abdul El-Sayed have stolen headlines. But the numerous candidates who won downballot, like Janeese Lewis George for mayor in Washington, DC, could have significant impacts on workplace organizing in the coming two years.

Whether we like it or not, laws — not just on the federal but also on the state and local level — shape the opportunities for and constrictions on union organizing. For unions to grow at the scale the moment demands, workers and policymakers must reshape those laws so that organizing can expand. Workers need to use every strategic option available. That includes using state and local policy and government action.

Indeed, many of the harms the labor movement faces come down to federal, state, and local policy changes or government interventions, like the Taft–Hartley Act of 1947, which amended the National Labor Relations Act (NLRA) and made it much harder to organize a union and strike as a worker. It will take new interventions to undo them. Meanwhile, presidents, including this one, have used executive orders to unleash a war on unionized federal workers and workers at large.

At the same time, pro-labor policy has spurred , and been spurred by, workers in their efforts to organize. The NLRA of 1935 created a government-recognized and -supported process for organizing unions and precipitated widespread growth in union membership. In the 1960s and 1970s, state- and local-level expansions of public sector bargaining rights enabled the creation of the public sector backbone of the labor movement. More recent efforts to expand bargaining rights to workers like home health aides and childcare providers have grown union density in a number of states.

The NLRA governs how most workers in the private sector formally unionize, strike, and collectively bargain, and it creates serious constraints on what state and local governments can do. Nonetheless, states still have ample opportunity to establish workplace protections and create more favorable conditions for organizing.Over the past two decades, we’ve seen state legislatures and city councils improve the lives of workers through the $15 minimum wage, paid sick leave, and paid parental leave. Even major programs of the national American welfare state, such as unemployment insurance, depend heavily on state legislation and were first developed on the state level. Wisconsin, under pressure from organizing workers, created the first unemployment insurance system in 1933, two years before the current federal-state system was first set up in 1935.

State legislators, city council members, governors, and mayors can do more than pay lip service to supporting workers’ ability to organize. Here’s how.

1. Expand Who Can Organize, Who Can Bargain, and Who Can Strike

M illions of workers across the country remain uncovered by the National Labor Relations Act. Policymakers and workers can expand the right to organize, bargain, and strike for those excluded workers. These workers often include state and local public sector workers like public-school teachers, domestic workers like housecleaners and nannies, and farmworkers.

Virginia provides an example of both progress and work still to be done. The commonwealth lifted the ban on collective bargaining for public sector workers in 2021, allowing localities to permit collective bargaining by their public employees. Teachers in Fairfax County organized and formed the largest bargaining unit of 2024 nationally — the 27,500-strong Fairfax Education Unions. But Virginia’s governor vetoed a bill that would have extended collective bargaining to public sector workers statewide, leaving critical work to be done in the coming year.

2. Remove Barriers and Lower Costs for Workers to Organize

A nother way is to decrease the cost of organizing by making the conditions for organizing more hospitable and less risky. Some of these changes have been won in the last decade such as Just Cause for Fast Food Workers in New York City. Just cause protections make it illegal to terminate an employee without warning or a good cause. This means workers can feel more secure in coming together with their colleagues in forming a union.

Decreasing turnover in service sector industries, by mandating more predictable schedules or paid meal and rest breaks, might make it easier for workers to stay at a given job for a longer period of time and organize. Likewise, guaranteeing eligibility to a dignified amount of unemployment benefits for any worker without and looking for work would improve the likelihood that workers take action on the shop floor.

3. Supporting Workers Taking Forceful Action

W orkers in several states have already won and can win more policy changes that decrease the risks they face when they go on strike or take other action.

When workers decide to go on strike, they take on significant economic risk to fight for dignity. States like New York, New Jersey, Oregon, and Washington expanded unemployment insurance eligibility to striking workers, just like other employees temporarily out of work. Writers Guild of America East and Screen Actors Guild–American Federation of Television and Radio Artists members put those programs into good use in New York and New Jersey as they struck in the summer of 2023. Other laws that guarantee strong retaliation protections backed by well-funded enforcement for workers who are fired can further boost the likelihood of action.

4. Eliminate the Corporate Race to the Bottom on Workplace Standards

S etting industry-wide standards decreases employers’ cost differential for having organized employees. In the United States, some jurisdictions have created industrial standards boards like Minnesota’s Nursing Home Workforce Standards Board. Worker, industry, and state government representatives set industry-wide wage, hour, and health and safety standards, with strong worker-led compliance training and enforcement.

When that happens, competing employers face more uniform labor conditions, and unionized employers are able to compete without being at a disadvantage because of their higher labor standards. That means firms can’t compete and profit from keeping wages down and cutting corners on health and safety. As a result, businesses would have less reason to oppose workers unionizing.

5. Create New Opportunities for Workers to Meet and Join Worker Organizations

S tate resources can create new opportunities for nonorganized workers to come into contact with labor organizations.

The unemployment insurance system presents one such opportunity. The program has low uptake rates among those eligible. Thanks to the organizing of unions, unemployed workers, and other community organizations during the pandemic, Maine established a community navigator program in which worker organizations helped disadvantaged workers apply for unemployment insurance. It significantly improved access to unemployment insurance for people out of work. It also raised workers’ expectations and changed their attitudes about action on the shop floor.

Other states could replicate this kind of program. They could go further and take inspiration from the Ghent system used by several European countries, in which unions directly administer unemployment insurance and deliver benefits. Similar programs would enable workers to come into contact with and join labor organizations.

6. Enforce Rights in a Way That Brings Workers Together

W orker protection laws face a crisis of underenforcement . Employers often bet that underfunded public agencies, hampered by decades of austerity, will never enforce state and local laws against them; as a result, too many cut corners, pay less than the minimum wage, refuse to pay overtime, and ignore health and safety rights. Workers have won and can win more laws that increase the chances they catch scofflaw corporations, highlight the benefits of unions, and bolster revenues for their enforcement agencies.

For example, the EmPIRE Worker Protection Act , a bill proposed in New York State, would give workers, whistleblowers, and unions the right to sue on behalf of the state over violations of labor rights for fines. The law would enable workers who fear retaliation to seek help from a union that could bring a case for all workplace violations; as such, it would give workers more reason to turn to the labor movement for help.

Fulfilling the Promise

T he categories and examples above are neither exhaustive nor mutually exclusive but represent just some of what is possible if workers organize — not just on the shop floor but also in city halls and state capitol buildings and take action to enact policy that empowers working people.

Many elected state and local officials are worker allies; some, including many who just won their primary elections, come from the labor movement and will fight fiercely to pass laws that facilitate worker organizing and building strong unions. Other elected officials will not help grow the labor movement. With either group, worker organizing and strategic action is needed for government policy to change: worker allies within the government need external support, while fence-sitters and opponents need external pressure.

The resulting legislative process represents a forge for new tools workers will need to scale their organizing. Once workers win a new policy, it requires implementation to make sure it’s real in people’s lives, then rigorous organizing to make the most of it and use it for unionizing goals. For example, to turn mandatory paid rest and lunch breaks into organizing conversations at lunch, workers must know their protections, rights, and abilities under the law inside and out, unions need to actively educate and support workers taking action and exercising their rights, and the government must enforce the law.

Only then will the policy promise of the soon-to-be-elected crop of pro-worker state and local officials be fulfilled with union density growth.

[Francisco Diez is an organizer and economist and a project coordinator at the New York University Wagner Labor Initiative.]

Sloc Cloc and Code 4.0 (scc) - Finding the files that need the most attention

Lobsters
boyter.org
2026-08-24 19:04:39
Comments...
Original Article

So today I release the v4.0.0 version of sloc cloc and code AKA scc . While I was considering going from 3.7.0 to 3.8.0 enough new functionality landed in it that I figured a move to a new major version was worthwhile. It also was large enough to warrant another blog post going into some details, because I am genuinely excited about some of the new features in it.

I am going to go through a few of them in this post and hopefully encourage you dear reader to get the latest version and try it out.

Hotspots

I had written over 10 years ago about Google’s bug prediction which ranked files using commit history against bug fixes to determine where problematic files existed. It was interesting but discontinued because, quote:

TL;DR is that developers just didn’t find it useful. Sometimes they knew the code was a hot spot, sometimes they didn’t. But knowing that the code was a hot spot didn’t provide them with any means of effecting change for the better.

Hilariously, I forgot I wrote about this, and got multiple LLMs to find it for me, and they all linked back to that post on my blog when I asked them to find it. Apparently I am the “authoritative source” on it now.

I had always kept this in the back of my mind as something I’d like to explore more (hence trying to find it again). Recently I had a thought, since scc has a complexity estimate, can we use that to dampen out the noise? After all knowing a lot of fixes applied to a config file is not very useful, however knowing that lots of changes applied to a file with a lot of logic is. This is the same approach I took to ranking in codespelunker .

The Simpsons Complex Files Need The Most Attention

Complex files need the most attention!

As far as I can tell this is a reinvented idea from Adam Tornhill in “Your Code as a Crime Scene” (I am still reading the book after discovering this) and he even went off to create the company CodeScene as a result. Clearly there is some value in this metric.

So much for me having an original idea.

Anyway, let’s have a look at what you get, with scc running against its own codebase,

$ scc --hotspots
───────────────────────────────────────────────────────────────────────────────
Hotspots · last 1000 commits · 2019-07-21 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
File                            Lang   Cmplx  Commits   Lines±  Authrs  Hotspot
───────────────────────────────────────────────────────────────────────────────
processor/processor.go            Go     156      156    1,651      13    100.0
processor/workers.go              Go     244       92    3,617      15     92.2
test-all.sh                    Shell      56      181    3,287      15     41.7
~ocessor/formatters_test.go       Go     183       51    2,459       9     38.4
processor/workers_test.go         Go     408       21    1,189       8     35.2
processor/formatters.go           Go      44      135    5,848      17     24.4
main_test.go                      Go     261       18      995       6     19.3
processor/detector_test.go        Go     133       32    1,175       6     17.5
main.go                           Go      40      101    1,545      17     16.6
processor/file.go                 Go      50       73    2,074      12     15.0
processor/detector.go             Go      70       45      948       5     12.9
processor/file_test.go            Go      75       33      826       5     10.2
cmd/badges/main.go                Go      73       31    1,111       5      9.3
processor/history.go              Go     173        9      941       4      6.4
processor/structs.go              Go      25       42      247      10      4.3
config_test.go                    Go     199        4      850       3      3.3
~workers_regression_test.go       Go      50       13      276       6      2.7
~rocessor/processor_test.go       Go      51       12      289       4      2.5
~ocessor/history_authors.go       Go     111        5      666       3      2.3
mcp.go                            Go      71        7      527       4      2.0
───────────────────────────────────────────────────────────────────────────────
   complexity × change-frequency, normalised · 20 of 90 files shown
───────────────────────────────────────────────────────────────────────────────

As you can see the output has correctly identified that processor/processor.go and processor/workers.go are the hotspots in the codebase. I can confirm this is correct based on my own personal experience.

Why should you care? Because that summary is doing something neither complexity nor churn can do by itself.

The Simpsons Homer Explain how

Explain how!

In short hotspot = complexity × commit_count normalised on a scale of 0-100. We calculate the complexity for the current HEAD file, then walk backwards seeing how many times each file was changed. Note that this only counts files in HEAD. High churn files that were removed are not counted.

Lets compare it to a plain count,

$ scc --by-file -i go -s complexity
───────────────────────────────────────────────────────────────────────────────
Language            Files       Lines    Blanks  Comments       Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go                     69      40,137     3,049     2,131     34,957      4,478
───────────────────────────────────────────────────────────────────────────────
processor/workers_test.go       2,156       374        69      1,713        408
main_test.go                      992        80        26        886        261
processor/workers.go              966       146       102        718        244
processor/report_test.go          971        98       109        764        237
config_test.go                    786        50        85        651        199

By running a simple plain count, limited to Go files and sorted by complexity we see that workers_test.go , main_test.go and config_test.go are all ranked highly. All of these files are technically complex, but none of them are where the hard development work actually exists. Complexity on its own tells you where large files with if conditions exist. Turns out that is often test files. They are still in the list, just demoted. Of course high churn test files will still rise to the top with this as you would expect.

Flip it and rank by churn, that is, the number of commits. Now test-all.sh is your number one with 181 commits, and structs.go floats up with 42. Both change constantly, but neither is where the bugs or logic are. Churn on its own tells you what changes a lot, which is often config, scripts, and boilerplate, but not quite a proxy for bugs or logic.

What is a reasonable proxy however is the overlap of both churn and complexity. What files are complicated and have a lot of change! Note that this is not quite what Google had tried and failed with. This metric is not a “historically buggy” pointer, but a “hard to work with” indicator, possibly suggesting that code needs to be broken apart.

So why is that useful? Well complex code that nobody edits probably isn’t an issue. It works and you move on. Simple files you change all the time probably aren’t an issue either. You add a line of config, the compiler checks it and you move on. However a file that is complex and changes a lot is where problems usually lie. It’s where you get the most merge conflicts, most breaking tests, and pain when it comes to making changes.

Now I already knew this for the scc codebase, but imagine I am not familiar with it. I just identified where the beating engine of the application lies.

Bringing it back to Google, they flagged risky files and developers didn’t care because knowing where a hotspot is does not help you do anything about it. Knowing “this is buggy” is just another flag in your CI/CD giving you more work (throw it on my technical debt credit card). Knowing the hotspots in a codebase you know about isn’t that useful. However it is extremely helpful to know hotspots when onboarding and learning a codebase, and this is telling you the answer to that exact question.

Google failed because a hotspot flag gives you no action, but a similar idea pointed at an unfamiliar codebase becomes an onboarding map. - Me

One other thing you can do is specify the depth in git commits that this is calculated for. We can find out where hotspots have shifted by looking backwards over less or more commits (time).

Looking back 50 commits vs 10,

$ scc --hotspots --depth 50
───────────────────────────────────────────────────────────────────────────────
Hotspots · last 50 commits · 2026-04-13 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
File                            Lang   Cmplx  Commits   Lines±  Authrs  Hotspot
───────────────────────────────────────────────────────────────────────────────
processor/processor.go            Go     156       14      415       4    100.0
main_test.go                      Go     261        8      295       4     95.6
processor/history.go              Go     173        9      941       4     71.3
processor/workers.go              Go     244        6      130       5     67.0
processor/workers_test.go         Go     408        3      157       3     56.0

...

$ scc --hotspots --depth 10
───────────────────────────────────────────────────────────────────────────────
Hotspots · last 10 commits · 2026-06-25 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
File                            Lang   Cmplx  Commits   Lines±  Authrs  Hotspot
───────────────────────────────────────────────────────────────────────────────
processor/workers.go              Go     244        2       15       1    100.0
processor/processor.go            Go     156        3       20       1     95.9
config_test.go                    Go     199        2        5       2     81.6
processor/history.go              Go     173        1       19       1     35.5
regression_test.go                Go     152        1        6       1     31.1

Now one thing to keep in mind, this does not tell you anything is wrong with the codebase. Only where to consider looking. You could have an especially nasty bug sitting in that config file. It is only an indicator!

Still as the saying goes, all models are wrong, some are useful.

Note that none of the above requires git to be installed. While it does need the repository to have a .git folder and the files it needs, scc ships with github.com/go-git/go-git in it and remains a single binary install with all the functionality you need.

Of course, none of this is calculated for free… So what is the cost for this power?

It takes time to do things now - Sir Humphrey Appleby

It takes time to do things now! - Sir Humphrey Appleby

This had never been the case for scc . It has always been fairly quick (I refuse to say blazing fast) to run and produce results. However it was only ever dealing with the now, IE the current state of the codebase.

Dealing with things over time means walking backwards over the git history, for 1000 commits by default (you can of course override this). The result is that it’s slower than a standard scc process.

$ hyperfine 'scc' 'scc --hotspots'
Benchmark 1: scc
  Time (mean ± σ):      11.2 ms ±   0.4 ms    [User: 15.2 ms, System: 7.6 ms]
  Range (min … max):    10.6 ms …  13.5 ms    194 runs

Benchmark 2: scc --hotspots
  Time (mean ± σ):      4.739 s ±  0.068 s    [User: 3.341 s, System: 1.611 s]
  Range (min … max):    4.707 s …  4.930 s    10 runs

Summary
  scc ran
  421.57 ± 14.52 times faster than scc --hotspots

The above was calculated on my Macbook Air 2020 M1 against the scc codebase itself. It’s not slow per se, but certainly not as fast as the ~12ms it takes scc to run normally over that codebase on the same machine. Is this fast? I have no idea. I have not used codescene myself. Perhaps someone can let me know. I did try running bugspots for comparison, but perhaps due to the age of the codebase could not get it working.

Change Coupling

Since I was already lifting the hotspot idea from CodeScene I thought I would also take change coupling feature. The general idea is that files are dependent on each other if they appear in the same commit constantly regardless of whether a compiler enforced dependency exists.

Running it against scc itself produces the following trimmed output,

$ scc --coupling
───────────────────────────────────────────────────────────────────────────────
Change Coupling · last 1000 commits · 2019-07-25 → 2026-07-20
───────────────────────────────────────────────────────────────────────────────
File A                      File B                      Shared Commits Coupling
───────────────────────────────────────────────────────────────────────────────
languages.json              processor/constants.go                 198    67.8%
LANGUAGES.md                languages.json                         167    61.2%
LANGUAGES.md                processor/constants.go                 153    58.2%
SCC-OUTPUT-REPORT.html      processor/constants.go                 149    37.7%

Where the output shows that a change in languages.json modifies processor/constants.go most of the time. This is true, as are the other outputs in the above, as every time a new language is added or modified each of the files above change as well.

While interesting, its far more useful when applied per file,

$ scc --coupling-for ./processor/detector.go
───────────────────────────────────────────────────────────────────────────────
Change Coupling · last 1000 commits · 2019-07-25 → 2026-07-20
───────────────────────────────────────────────────────────────────────────────
Related File                                          Shared Commits   Coupling
───────────────────────────────────────────────────────────────────────────────
processor/detector_test.go                                        26      49.1%
processor/workers.go                                              15      12.1%
processor/structs.go                                               9      11.1%
processor/file_test.go                                             7       9.7%
processor/workers_test.go                                          6       9.7%
processor/processor_test.go                                        5       9.4%

Now this is far more interesting, although in this case showing the obvious. If you change the detector you probably need to change the tests for it. Where this really helps is when you are working on random files and want to know the potential blast radius that isn’t covered by your compiler checks.

However coupling like this potentially has the same issue that files that aren’t code may get picked up. As such we can apply our hotspots trick of weighting by complexity to get the below,

$ scc --coupling-weighted --coupling-for ./processor/detector.go
───────────────────────────────────────────────────────────────────────────────
Change Coupling · last 1000 commits · 2019-07-25 → 2026-07-20
───────────────────────────────────────────────────────────────────────────────
Related File                                          Shared Commits      Score
───────────────────────────────────────────────────────────────────────────────
processor/detector_test.go                                        26      100.0
processor/workers.go                                              15       57.7
processor/processor.go                                            13       50.0
processor/workers_test.go                                          6       23.1
processor/file_test.go                                             7       22.7
processor/file.go                                                 10       21.6
processor/formatters.go                                            8       16.9

The file structs.go has fallen out of the top results due to this, which is probably correct considering it just contains struct definitions. So in effect low logic files are demoted. Is this tweak useful? I don’t know, hence it being gated behind another CLI flag.

Regardless, the coupling options themselves are there for use, and possibly most useful exposed over MCP for LLMs to consume.

Git Metrics

In addition to the hotspot and coupling calculation you get other git outputs, such as working out what is the trend of code over time? Useful for watching that JS to TS rewrite in real time.

$ scc --timeline
───────────────────────────────────────────────────────────────────────────────
Languages · last 1000 commits · 2019-07-21 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
Language             Trend                             Code    Share     Change
───────────────────────────────────────────────────────────────────────────────
Go                   ▂▂▂▂▂▂▂▂▂▃▃▃▃▃▃▃▃▃▃▃▃▄▆▆▆▇      37,868    65.2%    +33,595
JSON                 ▄▄▄▄▄▄▄▄▄▄▅▅▅▅▅▅▅▅▆▆▆▆▆▆▆▇      12,944    22.3%     +6,236
HTML                 ▁▁▂▂▆▆▆▆▆▆▆▆▆▆▆▆▆▇▅▅▅▅▅▅▅▆       3,160     5.4%     +3,160
Markdown             ▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▅▅▅▅▅▆▆▆▆▆▇       1,884     3.2%     +1,386
Shell                ▂▄▄▄▅▅▅▅▅▅▅▅▅▅▆▆▆▆▆▆▆▆▇▆▅▄       1,200     2.1%       +993
Go Template          ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▃▆▆▆▇         598     1.0%       +598
Python               ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅▅▅▅▅▅▅▅▅▅▇         225     0.4%       +225
YAML                 ▃▃▃▃▃▃▃▃▃▃▃▃▆▆▆▆▆▇▇▇▇▇▇▇▇▇          52     0.1%        +33
Powershell           ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇          46     0.1%         +0
gitignore            ▅▅▅▅▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▇▇▇          28     0.0%         +9
License              ▇▇▇▇▇▇▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅          25     0.0%        -12
Plain Text           ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇          24     0.0%         +0
───────────────────────────────────────────────────────────────────────────────

Or perhaps you want to calculate the bus factor of your application?

$ scc --by-author
───────────────────────────────────────────────────────────────────────────────
Authors · last 1000 commits · 2019-07-24 → 2026-07-08
───────────────────────────────────────────────────────────────────────────────
Author                               Code     Cmplx   Files     Owns  Last seen
───────────────────────────────────────────────────────────────────────────────
Ben Boyter (github.com)            18,901     1,839      59    37.9% 2026-07-06
apocelipes                         16,740       299      11    33.6% 2026-06-26
Ben Boyter (boyter.org)             6,013       469      19    12.1% 2026-07-04
David Baggerman                       361        26       2     0.7% 2021-03-29
Douglas DeMars                        256         9       0     0.5% 2026-01-06
Daniel                                240         4       0     0.5% 2026-04-30
qwerty8811                            198        24       0     0.4% 2026-03-25
Gaël Selig                            193         0       0     0.4% 2025-06-21
Jan Günter                            182         8       0     0.4% 2021-12-13
Daulet Zhanguzin                      171        23       0     0.3% 2026-05-04
Erik                                   96         2       0     0.2% 2024-10-23
Jeff Foster                            85         0       0     0.2% 2026-01-12
Daniel Poelzleithner                   78         0       0     0.2% 2026-05-04
Richard Simison                        77        16       0     0.2% 2026-04-13
masukomi                               62         0       0     0.1% 2023-01-03
others (80)                         1,272        71       —     2.5%          —
(before window)                     4,960       259       6     9.9%          —
───────────────────────────────────────────────────────────────────────────────
Bus factor 2 · Ben Boyter (github.com) + apocelipes
               last-touched 79% of in-window code
───────────────────────────────────────────────────────────────────────────────

I probably need to setup a succession plan.

Note the duplicate Ben Boyter is due to the use of email to determine who is actually committing with some effort to combine them that clearly is not perfect. Yes it is using .mailmap and yes I accept patches and PR’s.

Or how about both and see who is committing over time,

$ scc --by-author --timeline
───────────────────────────────────────────────────────────────────────────────
Authors · last 1000 commits · 2019-07-21 → 2026-06-26
───────────────────────────────────────────────────────────────────────────────
Author                   Activity                  Commits     Code±
───────────────────────────────────────────────────────────────────────────────
Ben Boyter               ▇▅▂▂▁▂▁▁▂▁▁▁▁▁▁▁▄▁▁▁▁▁▁▂      493    +9,943
Ben Boyter               ▆▇▃▅▃▅▄▄▆▄▂▂▄▄▃▄▆▅▆▃▃▃▃▆      212   +13,848 ↑
apocelipes               ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▆▅▄▆▇▄▅       82   +15,494
David Baggerman          ▇▅▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁       32      +451 quiet 63mo
Florian Schäfer          ▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        9       +43 quiet 56mo
dependabot[bot]          ▁▁▁▁▁▁▁▁▁▅▁▁▇▁▁▁▁▁▇▅▁▅▁▅        6        +0 quiet 1mo
Eli Lindsey              ▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁        5       +20 quiet 31mo
Olivia (Zoe)             ▁▁▁▁▁▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        5       +10 quiet 63mo
Spenser Black            ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁        5       +23 quiet 20mo
Anthony Mastrean         ▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁▁▁▁▁▁        3        -2 quiet 42mo
Loïc Houpert             ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁▁        3       +11 quiet 30mo
lhoupert                 ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁▁        3        +6 quiet 28mo
neildwu                  ▁▁▁▁▁▁▅▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁        3       +14 quiet 59mo
Adam Weinberger          ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁▁▁        2       +33 quiet 34mo
Carter Li                ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▁▁▁▁▁▁▁        2       +57 quiet 27mo
───────────────────────────────────────────────────────────────────────────────

Some of you lack commitment!

Infographic

You can now produce an infographic. This builds on the git support now baked into scc, and includes all the metrics you know and love including the new git based ones.

This is what you hand over to management, since they probably don’t want a vi inspired slide deck presentation of the information presented.

$ scc --report
Report written to scc-report.html

The report itself looks a bit like the below, with this being a very limited capture of what you get.

scc report output

Cognitive Complexity

One of the first things I added into scc was complexity calculations. This was because I missed the cyclomatic complexity calculations that came with Visual Studio Code as a way to know if I was writing things appropriately.

The deeper story is I was trying to estimate a project, and due to not being able to compile (so no cyclomatic complexity), the codebase being too large for cloc to run in an acceptable timeframe, I massively underestimated how long it would take. This burnt me badly and thus I spent the next 7 years building scc to over-correct for my previous failures.

Overcorrect for previous failures

However cyclomatic complexity was invented in 1976 and while I have not found too many improvements on how this is calculated there have been some.

The main one being the one from Sonar which is a tool I’ll be the first to admit not being a huge fan of (subject for another post). However I am not above taking good ideas from wherever I find them. Consider the below examples in Python,

cognitive complexity

Clearly the left one is going to be harder to maintain since it is not using guard clauses. Similar results, different implementation.

The way that sonar calculates this, is by running a full AST over the code, and where an if condition is found, it can know if it was nested by walking the tree. This isn’t going to fly in scc simply because of the runtime cost to do this. The complexity calculation in scc is already an approximation albeit a close cheaply calculated one.

But the thing that really matters here is not the nesting, it’s the shape of the code. Indentation is a reasonable proxy for complexity, and unless you write code like it’s brainfuck,

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.

In which case I say to you, “Woah calm down over there satan”.

The shape of the code matters more than what those indents actually are. This probably remains true for any linted code and Python, and frankly if you aren’t linting your code I’d like to know why. Regardless try squinting at the code above so the details disappear, and tell me which one you would rather make a production change to. Incidentally this is the same argument that Adam Tornhill made in his book, although he actually blurred the code.

As a result, we can approximate the calculation in scc by simply counting the amount of whitespace, IE spaces and tabs at the beginning of the line and using that as a multiplier for the complexity count. This is a matter of just pushing and popping how nested the current line of code is, and use that as a multiplier when we do hit a branch condition. Reminder that this is an approximation of cognitive complexity, based on how most humans and LLMs write code. There are cases it will not work (although it should fall back to cyclomatic rules in that case).

So whats the cost from a performance point of view? I ran it over my local projects folder to get an idea,

$ hyperfine 'scc' 'scc --cognitive'
Benchmark 1: scc
  Time (mean ± σ):      4.573 s ±  0.047 s    [User: 11.815 s, System: 6.274 s]
  Range (min … max):    4.520 s …  4.658 s    10 runs

Benchmark 2: scc --cognitive
  Time (mean ± σ):      4.583 s ±  0.086 s    [User: 12.069 s, System: 6.188 s]
  Range (min … max):    4.521 s …  4.816 s    10 runs

Summary
  scc ran
    1.00 ± 0.02 times faster than scc --cognitive

Effectively noise. It’s less than 1% which means from a benchmark point of view down to variance in the run more than anything else. It is consistent though, so lets call it a < 1% performance cost. So a reasonable approximation for free from a CPU time point of view.

Whats the impact? What difference do I see enabling this? Well for the main.go file in scc the complexity shoots up. In fact every file will, since there is a multiplier in play, but in theory it should allow you to hone in on those more complex files.

$ scc main.go
───────────────────────────────────────────────────────────────────────────────
Language            Files       Lines    Blanks  Comments       Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go                      1         230        26        43        161         40

...

$ scc --cognitive main.go
───────────────────────────────────────────────────────────────────────────────
Language            Files       Lines    Blanks  Comments       Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go                      1         230        26        43        161        103

I have not set this to be the default calculation in scc at this point, it’s opt in only. I want to evaluate it over more time to ensure it actually improves everything. But if you want it to be the default you could set it via the new Config/Dotfile support, leading us nicely to…

Config/DotFile Support

Something I have wanted in scc for a while now is some form of global config file override. This is now in with v4.0.0.

You can now add a .sccconfig file to your project root, or setup a .sccconfig file wherever you want and set the environment variable SCC_CONFIG_PATH to point at it. I cover this more on the scc README but it works in the same way that ripgrep/bat work with an opts-list. So say you hate the COCOMO calculation, like wide view support and want to ignore node_modules always? You can add a file like the below to do so,

# count the way I like it
--no-cocomo
--exclude-dir node_modules
--format wide

Note that this config file does not allow you to modify scc to write files. Only the CLI argument can do this, preventing someone doing something nefarious.

This should hopefully put to rest the constant requests I get to turn off COCOMO by default.

MCP Support

scc now has built in MCP support . Hooking it up to your LLM of choice locally allows you to have the LLM find the complexity in your codebase and can help save tokens. I know this because searchcode uses it as well to great effect. You can try searchcode now if you want without having to install scc and get most of the benefits for any public code.

I don’t know if MCP is still the future of CLI to LLM integration, but adding it was no great chore and it sits beside the rest of the code so no maintenance overhead. Should it become problematic in the future or MCP dies it can always be removed.

That said I use it now on my own private projects, with codespelunker to great effect.

LOCOMO

I wrote about this previously LOCOMO but you can get scc to predict the costs to rebuild your codebase as is using a LLM now.

Note this is a metric that I made up (maybe this is my own original idea?), but nobody else had one so I thought I’d at least get the ball rolling. If you do know a better way to do this please reach out.

Other Things

Some things worth mentioning, but not worthy of a full subsection.

  • Last duplicate flag now wins scc -i java -i go will have Go be counted not Java.
  • Linguist-inspired language detection. Smarter checking for C++/ObjectiveC/C header files.
  • Percentage outputs in JSON. For those of you using jq to do things.
  • External ignore files via --ignore-file ~/.config/git/ignore . Works nicely with the config file.
  • Many small bug fixes, too numerous to mention.
  • Some performance tweaks. These are very hard to get in scc these days and should not be underestimated. Most of them coming from apocelipes who is an absolute Go machine.

Ze End

Ten years ago I wrote about Google building this idea and giving up on it because nobody found it useful. I still don’t think they were totally wrong, just missing something to dampen the noise and they put it in the wrong place. Point it at a codebase you are trying to grok and it’s far more effective.

So that’s scc 4.0.0. Grab it from GitHub , point --hotspots at something you’ve never seen, and tell me if it sends you to the right files. If not raise an issue. Or don’t. I’m not your supervisor.

Archer - You’re not my supervisor

Can You Hear “The Hum?” w/ Saul Levin

OrganizingUp
convergencemag.com
2026-08-24 19:00:00
In the past year, this show has explored how organizing against data centers is becoming a unifying rally point that breaks through this country’s typical “red vs. blue” dynamic. From urban cores to rural farm communities, serious organizing is happening to stop or slow the rapid development of thes...

★ What Is the Point of the DMA?

Daring Fireball
daringfireball.net
2026-08-24 18:47:20
If you believed that the point of the DMA was to open up competition, choice, and freedom for developers, yeah, I bet it does seem bonkers that the European Commission has signed off on compliance where Apple charges 15 percent commissions on links to the web from apps distributed on the App Store, ...
Original Article

Wesley Hilliard, reporting for AppleInsider last week :

A report from Irish Independent detailed the European Commission’s response to Apple’s new business terms for the EU. They share that they welcome the changes and will monitor Apple’s implementation of the terms.

Here is the EC’s full statement:

“The Commission welcomes Apple’s changes to their business terms, which follow a close dialogue between the Commission and Apple after the Commission issued a non-compliance decision related to Apple’s steering terms as well as preliminary findings related to alternative app distribution, both in April 2025,” the spokesperson said.

“Following today’s announcement, the Commission will monitor Apple’s effective implementation of the new terms. Under the DMA, users in the EU have a right to full and effective choice of alternative app distribution channels.”

The point of the DMA was to open up competition and choice for developers, which the EC seems to believe Apple’s terms have accomplished.

I don’t think that was ever the point of the DMA. It’s what a lot of developers who themselves wanted more competition and choice — and freedom — on iOS presumed was the point of the DMA. The European Commission paid lip service to these ideals, which encouraged people to think these ideals were the point of the DMA. But what I’ve consistently argued is that the only actual point of the DMA is for the European Commission to impose unnecessary bureaucracy and inconvenience into major markets where it previously had no footprint. They had no noble goal. They just wanted to erect a bureaucratic structure that clearly shows “ The European Commission was here and did something. ” Impose copious fines on Apple, Google, Microsoft, and Meta; inconvenience those companies and their users in the EU ; all to show that something has been done. (And to cash the checks from the fines they eventually collect.)

That’s why the text of the DMA itself is so hard to read and understand. There is no clear intent of “opening up competition and choice” hidden in the murky, impenetrable prose of the DMA. The murky impenetrableness of the law is a reflection of its actual intent: murky impenetrable bureaucracy.

Here’s a commenter on Hacker News (via Michael Tsai’s roundup ) who can’t believe it:

This is bonkers, I can’t believe the EU Commission agreed to it. The main issue that the DMA was about still remains: Apple retains ultimate control over app developers’ dealings with users.

The status quo that the EU should have pushed for, and which Article 6(7) of the DMA requires, is one where a developer can distribute iOS apps to users without ever entering into any contractual relationship with Apple. The OS APIs that most apps use are already paid-for by the user when they buy the device. Apple wants to double-dip and charge developers for the value that the users already have by virtue of owning their iDevices with all the necessary iOS paraphernalia in them.

If you believed that the point of the DMA was to open up competition, choice, and freedom for developers, yeah, I bet it does seem bonkers that the European Commission has signed off on compliance where Apple charges 15 percent commissions on links to the web from apps distributed on the App Store, and that Apple will collect a 5 percent Core Technology Commission even for apps distributed on third-party app marketplaces, using third-party payment processing. But if you believe, as I do, that the point of the DMA is to impose obvious regulatory burdens and bureaucracy upon Apple (and Google, and Microsoft) — and upon the EU citizens who use those companies’ “gatekeeping” platforms — then it is completely unsurprising that the European Commission “welcomed” these changes. The Commission has gotten everything it wanted from Apple:

  • Third-party app marketplaces (no matter if almost no one uses them).
  • A growing list of features withheld from the EU, like iPhone Mirroring and Siri AI (this shows that the DMA “works” and they’ve done something).
  • A bunch of fines.

I’m sure some of you think I’m all wet in my argument that the point of the DMA was merely to impose ongoing bureaucratic complexity. But my view jibes with the reality of how it’s worked out. Compare and contrast with the Mobile Software Competition Act in Japan . Apple complied with the clearly stated requirements of the MSCA with no drama, Japanese users aren’t missing out on features like iPhone Mirroring, and the only delay for Siri AI in Japan is language support . Japanese iOS users get all the “good parts” of Apple’s regulatory compliance that EU users do, with none of the rather severe hindrances.

My Troubling Introduction to China’s All-Powerful “Boss AI”

Portside
portside.org
2026-08-24 17:36:58
My Troubling Introduction to China’s All-Powerful “Boss AI” barry Mon, 08/24/2026 - 17:36 ...
Original Article

There are few more enthusiastic evangelists for the promise of AI than Kai-Fu Lee. Suave and charming, with a taste for fine wine (and a Ph.D from Carnegie Mellon), Lee founded the Beijing-based Sinovation Ventures, a venture capital giant that is helping to finance some of China’s most innovative tech firms on everything from robotics to advanced facial recognition. But when I recently heard him describe his latest crusade—to incorporate a concept he calls “Boss AI” into the management of large enterprises—he threw me for a loop.

The idea of Boss AI — the subject of the latest book by Lee, a prolific author— is that the superpower of artificial intelligence can be used as a “decision brain” to advise CEOs and “identify anomalies” in their companies. How? By taping every meeting and scouring every email, Boss AI will instantly identify malcontents, under-performers or members of the workforce otherwise less than enthusiastic about the corporate mission. This, he argues, is the key to unlocking profitability and ultimate success in China’s relentless race to dominate the future of technology and perhaps the world.

But as I listened to his pitch as part of a group he had invited to China to tour some of the companies he’s invested in and meet with him at his Beijing conference room, all I could think of was 1984.

“I have to say, listening to this,” I told him, “it has a creepy Orwellian vibe.”

“Welcome to China,” he responded with a smile, as if I had revealed my naiveté by even raising such a subject in a country where surveillance cameras are everywhere.

The members of my group witnessing this exchange were mostly venture capitalists but also a smattering of others, including a former senior U.S. national security official and a journalist (me.) Some also happened to be company managers in their own right, and pushed back on my critique. Don’t firms in the U.S. already own their employees’ emails? Don’t they have an interest in knowing who is not performing up to snuff? What’s the big deal?

Sure, I replied, but it is advances in technology that make all the difference. To pick a relevant analogy, authoritarian governments have always had an interest in crushing political dissent. But in Orwell’s classic , it was the omnipresent telescreen — the two-way video watching your every move in every room—that turned Oceana into a totalitarian dystopia.

Is Boss AI the new Big Brother?

And what happens when, as is inevitable, it migrates to corporate America and beyond — to universities, for example, in order to police academic content in classrooms (a version of which is already taking place in Texas) or, it’s not hard to imagine, a Trump administration ever eager to enhance surveillance of targeted groups or crackdown on government employees who, among other misdeeds, might dare to talk to journalists? Or how about a DOGE 2.0 powered by Boss AI?

Second Thoughts

In any case, it was my exchange with Lee that encapsulates my complicated reaction to a week-long visit to the Heavenly Kingdom —and what it might mean for U.S.-Chinese competition in tech, trade, military hardware and intelligence.

On the one hand, Xi Jinping’s China, for all its recent problems with wage stagnation and youthful unemployment , remains an economic powerhouse. In our travels to Beijing, Hangzhou and Shanghai, we saw glittering skyscrapers for as long as the eye can see, luxury shopping malls and a robust private sector giving Silicon Valley a run for its money. Our group toured an EV auto factory where 90 percent of the workforce are humanoid robots. We visited a cutting edge research firm where they’re inserting chips into brains to cure patients with spinal cord injuries and other maladies (leaving open the question of what else those chips might ultimately be used for).

We stopped in at luxury malls where wealthy Chinese consumers can buy Louis XIII cognac (for the equivalent of $3,899 a bottle ) or Christian Dior handbags. Also ubiquitous were the Huawei stores where the displays and products seemed virtually identical to what you can see at your nearest Apple outlet.

It took a political analyst for a Chinese consulting firm whom we lunched with to remind us that next month Huawei goes on trial in federal court in Brooklyn, N.Y. charged with a years long racketeering conspiracy to steal U.S. trade secrets and skirt U.S. sanctions on Iran by using a Hong Kong-based shell company to sell it equipment used for domestic surveillance of political protestors.

That was hardly the only reminder of the dark side of China’s economic progress. Plenty visible were the ubiquitous surveillance cameras catching every public interaction on video, a modern day, real life version of Big Brother’s telescreen. The guide who took me to the Great Wall on his own started pointing them out on every block and street corner. Ostensibly, they are there for crime control and public safety. But unmistakable is the intimidation factor. Unseen was the government’s security software tracking individual’s purchases, financial history and media use, which monitors what people watch, read, post, and share online. The Chinese know they are being watched.

Over lunch, the political analyst talked about a younger generation of Chinese Communist leaders taking the reins in the country’s provinces. So who, I asked, is in line to replace Xi? Not an issue, nobody’s thinking about that, the analyst maintained. The 73 year old Xi, who took power 16 years ago, is planning to extend his term once again later this year, keeping him on track to rule China into the 2030’s. (The last time Xi extended his term, in 2023, the National People’s Congress—all of whose members are appointed by the Communist Party—ratified the move by a vote of 2,952 to 0 .)

Pest that I am, I asked about the prospects of political reform—some loosening of the party’s grip that might allow a few small democratic freedoms? The reply was even more brusque: Not in the cards, the analyst said simply and left it at that. (As if to underscore the point, a few days after I left China, two pro-democracy activists in Hong Kong– who led annual candlelight vigils to commemorate the 1989 crackdown in Tiananmen Square– were convicted of subversion u nder a national security law. They face up to 10 years in prison.)

Excluded

Perhaps the strongest sign of the all-encompassing intimidation factor that prevails in Chinese society came just before our group was scheduled to have lunch with Kuo Zhang, the president of Alibaba.com, the booming e-commerce division of China’s most iconic company, the Alibaba Group (with annual revenue of $148 billion.) I was politely informed that I and the former U.S. government official in our group, Jon Finer, who served as deputy national security advisor in President Biden’s White House, were banned from the meeting, no doubt for “different reasons,” as Finer put it. In Finer’s case, it might have been for, among other things, the 2022 remark by his boss, President Biden, that the U.S. would defend Taiwan in the event of an attack by China, a comment that in one breath seemed to toss away the U.S. government’s half-century long “strategic ambiguity” understanding with Beijing on that question and was immediately condemned by the Chinese government. In my case, being identified as a contributing editor of a journal called SpyTalk no doubt got their attention as well.

(Following the publication of this story, an organizer of the trip said Isikoff and Finer were excluded because “the final group size exceeded the capacity available for the Alibaba.com meeting room.”)

A more intriguing exclusion targeted the third member of our group, a rather striking and personable Russian yoga instructor who holds yoga retreats all over the world, dividing her time between Moscow, Bali and Switzerland. No explanation was given for keeping her out of the lunch, but Finer and I didn’t hesitate to speculate.

But the more interesting question is why the blacklist in the first place. As we later confirmed with our colleagues, Alibaba’s Zhang, one of China’s most high ranking business executives, had nothing remotely sensitive to say in his luncheon talk. But even such a prominent figure as he was no doubt aware about what a Party minder might report on him consorting with— or simply granting an audience to — suspicious characters like Finer and myself.

And he certainly wouldn’t want to have to answer to Boss AI.

None of Michael Isikoff’s expenses for his trip to China were compensated by any Chinese companies or the Chinese government. He paid for the trip himself.

Michael Isikoff is an award-winning investigative journalist and best-selling author who has reported for The Washington Post, Newsweek, NBC News and Yahoo News.

becoming a free or paid subscriber . You can take out a free trial here .

distributed identity

Lobsters
jyn.dev
2026-08-24 17:28:12
Comments...
Original Article

We've all heard the horror stories of dealing with names and technology , and yet, we must persist. In this story, we journey through the thorny brambles of git commit history and life events, and ultimately manage to tame them using ATProto.

Let's Write A User Story

Say that you have a big 'ol git repo. Thousands of commits, hundreds of issues, dozens of PRs. And now let's say one of your contributors—not a maintainer, mind you, just someone who helps out once in a while—is named Andrea P. Researcher < [email protected] >.

Andrea gets a new job at Greenfield & Co and changes her email. She come to you with a request: actually, i didn't like my old job very much, could you update the commit history to the new email?

Now you have a small problem: Git is a merkle tree that preserves all past commits in amber. You can't change any past commit without "force-pushing" to the default branch, invalidating every single commit hash, distributed checkout, and open PR.

Not to worry, you say! The authors of git predicted this. You have the perfect tool: git mailmap . Andrea says perfect, perfect, and adds an entry:

Andrea P. Researcher <andrea@greenfield.example.com> <andrea@conglomerate.example.com>

Now, Andrea gets married and changes her maiden name to Locksmith. She's still working at Greenfield & Co, though, so she has the same email.

She comes back and asks: can you change the commits since I got married to Andrea Locksmith, but keep the old ones as Andrea Researcher? And you say, no, mailmap doesn't really work that way ... git identifies you by your (name, email) tuple, it doesn't have any concept of a date. She grumbles a bit, but well, it's not such a big deal. She uses mailmap to change her commits to consistently use Andrea Locksmith for all the < [email protected] > changes (it's close enough) and leaves the conglomerate ones be.


Andrea meets some friends and goes to some movies and shows and reads some books and has a few revelations about himself. He comes back and says, hey i have some news, um, my new name is Bobby. Can you update all my commits? And you point him to mailmap and he says no no, that keeps my deadname around right at the top of the repo. Can't you change the actual data somehow? Look, man, this is important to me. 1

And you apologize, and you really do feel bad; but you look at the 300 open PRs, and the hard-coded commits in .git-blame-ignore-revs , and the merge tooling you wrote that can't handle force-pushes, and you just ... you just don't want to think about how much effort it would be to fix all those. And Bobby gets it, he does, and he makes a mailmap entry instead. But all the same, he contributes a bit less now.


Bobby moves to Germany and learns they have this neat thing called GDPR . And one of his friends tells him, look man, you have a right to be called the name you chose, you know? An honest-to-god, enshrined-in-law legal right. And now Bobby comes back to you and say "I want you to rip my name out of the repository because it's personal data of an individual."

Well, you're not quite sure that's how GDPR works (maybe you have a "legitimate interest"? are we really sure you were offering a "product or service" to Bobby?). But all the same, lawyers are expensive, and you'd rather not go through the hassle, especially since, well, Bobby really does have a good reason here. And anyway, it would be bad PR, and this isn't the thing you want to lose contributors over.

So you figure out how to use git-filter-repo and update .git-blame-ignore-revs and force-push to main and write a blog post telling everyone how to rebase their PRs and realize you hard-coded commit hashes in your docs so you go back and fix those too and realize you hard-coded them even in some blog posts so now you have to update those and ugh. ok. that's probably most of it now.

And Bobby is happy and you're happy he's happy and you put on a half-hearted smile. And then his mate Charlie comes by and says actually that was neat, can you do that for me too?


What problem are we solving?

Bobby asked for three things:

  1. Changing names and emails after the fact.
  2. Changing names after the fact, in a way that's time-based instead of identity-based.
  3. Changing names after the fact, in such a way that the previous name isn't detectable.

Git can give us 1, but not 2 or 3.


How have people tried to solve this?

Git is making your life a right-old pain here! If this happens two or three more times, you might even be willing to switch to a different tool, one that supports this better. And—what's this?—there's something called hg censor ! It says this:

The censor command instructs Mercurial to erase all content of a file at a given revision without updating the changeset hash. This allows existing history to remain valid while preventing future clones/pulls from receiving the erased data. Typical uses for censor are due to security or legal requirements, including:

  • Passwords, private keys, cryptographic material
  • Licensed data/code/libraries for which the license has expired
  • Personally Identifiable Information or other private data

Perfect, perfect, except wait that said content of a file . The author of a commit is actually not the content of a file. It's metadata attached to the commit itself.

Damn. So close.

How can we solve it?

Well, how does hg censor work anyway?

Censored nodes can interrupt mercurial's typical operation whenever the excised data needs to be materialized. Some commands, like hg cat/hg revert, simply fail when asked to produce censored data. Others, like hg verify and hg update, must be capable of tolerating censored data to continue to function in a meaningful way. Such commands only tolerate censored file revisions if they are allowed by the "censor.policy=ignore" config option.

Oh. Uh. They're destroying the "cryptographic hashes" part of the merkle tree. That's fine? Probably? We don't really need hg verify to work. For complicated reasons related to "filelogs" , this doesn't let us get up to much mischief anyway; we can corrupt hg log --follow but not much more. If we extended this same scheme to metadata though, things would get worse, we might be able to corrupt hg log itself to point to a malicious history.

Does it need to work that way? Let's consider the properties we want by comparing to how changes usually work online:

  1. People can rename themselves and change their emails.
  2. People can delete their accounts. This usually shows up as a post by a [deleted] user, or a @ghost username.
  3. People can (usually) delete the contents of their posts; sometimes admins retain edit history.
  4. People can (rarely) delete the post itself, in such a way that you can't distinguish "used to be a post here" from "never was a post here".

mailmap gets us 1, kinda. It's still traceable pretty easily. hg censor gets us 3. Nothing currently out there gets us 2 or 2 4.

4 is probably not something we care about too much here. "Delete all traces of this commit, even the fact it existed" doesn't seem particularly necessary. But better support for 1 and 2 would be very nice.

Now she's back in the ATmosphere

I have good news for you: there is already an online identity service that does this! (No, it's not OpenID Connect.) It's called ATProto and it's the protocol powering Bluesky .

Exactly how ATProto works is a bit out of scope for this post (for more on that see The Hitchhiker's Guide to the Atmosphere ), but what is relevant is how ATProto handles identity . It does this with a decentralized identifier (DID) . For example, my Bluesky handle is @jyn.dev , but my ATProto DID 3 is did:plc:h2okxbr76w5522tailkxmidq . Because the two are different, that allowed me to change my handle from @jyn.bsky.social to @jyn.dev when I first joined Bluesky 4 .

What's interesting about this is it allows you to control where your data lives. ATProto has a concept of a Personal Data Server (PDS) : by default, when you join Bluesky, your data lives on their servers, but you can migrate your PDS and self-host your own data. This means, for example, that Bluesky can't ban you; you can always migrate to Blacksky 5 .

Ok, so, let's put this together and use it in our Git identity alternative. We now have portability, modification, revocability, and—oh? what's that? a primary source?

The full history of DID operations and updates, including timestamps, is permanently publicly accessible. This is true even after DID deactivation. It is important to recognize (and communicate to account holders) that any personally identifiable information (PII) encoded in alsoKnownAs URIs will be publicly visible even after DID deactivation, and can not be redacted or purged.

In the context of atproto, this includes the full history of handle updates and PDS locations (URLs) over time. To be explicit, it does not include any other account metadata such as email addresses or IP addresses. Handle history could potentially de-anonymize account holders if they switch handles between a known identity and an anonymous or pseudonymous identity.

aww.....

Does it need to work this way?

This is talking specifically about bluesky handles . But ATProto has a bunch of other kinds of data . We could just. You know. Build our own. With blackjack, and hookers.

Here's an example of a custom ATPRoto record:

{
  "uri": "at://did:plc:h2okxbr76w5522tailkxmidq/blue.checkmate.game/3msn57l2vrt2x",
  "cid": "bafyreiab3suqph7m5xw2weronkts7ekp224rfrkltwiafluqjff7wtjlsi",
  "value": {
    "pgn": "[Event \"checkmate.blue\"]\n[Site \"https://checkmate.blue\"]\n[Date \"2026.08.09\"]\n[Round \"-\"]\n[White \"did:plc:7oyzfpde4xg23u447zkp3b2i\"]\n[Black \"did:plc:h2okxbr76w5522tailkxmidq\"]\n[Result \"1-0\"]\n\n1. e4 e5 2. f4 Nc6 3. Nf3 d6 4. Bc4 Nf6 5. O-O Nxe4 6. Bxf7+ Kxf7 7. Ng5+ Nxg5 8. fxg5+ Kg8 9. Qf3 Nd4 10. Qf7# 1-0",
    "$type": "blue.checkmate.game",
    "black": "did:plc:h2okxbr76w5522tailkxmidq",
    "white": "did:plc:7oyzfpde4xg23u447zkp3b2i",
    "result": "1-0",
    "status": "completed",
    "createdAt": "2026-08-09T08:12:04.842Z",
    "lastMoveAt": "2026-08-09T08:15:49.540Z",
    "drawOffered": false,
    "resultReason": "checkmate",
    "parentGameUri": "at://did:plc:7oyzfpde4xg23u447zkp3b2i/blue.checkmate.game/3msn4vikzvy2i"
  }
}

This is a chess game played between me and @notjack.space , on checkmate.blue , a multiplayer chess app built fully-client side on top of ATProto.

Unlike did:plc records, normal ATProto records have no permanent history and can be deleted.

Tying it all together

So, one way we could fix Bobby's problem is something like this:

  1. Just build a new VCS data model from scratch. Look, if we make it a jj backend, it can't be that much work, right?
  2. .mailmap holds a list of mumble mumble unique public key per repo , not a list of names/emails 6 .
  3. When you create a commit, instead of having a name/email pair in metadata, embed a private key signature of the commit.
  4. Create a new org.jyns-awesome-vcs.identity ATProto schema that has an optional current name and email, optional past emails, optional github link using OAuth, etc. Embed the public key and mumble mumble per-repo private key signature of the DID .
  5. When you run jj log , it fetches your identity from ATProto. 7

This gets us all the properties we want!

  • You can edit any identity after the fact.
  • You can add custom fields to the identity record that say to use certain names before or after a given date.
  • You can delete your identity by removing the signature of the DID from your ATProto record. Because the signature is per-repo, deleting one signature doesn't affect the others.
  • The mumble mumble asymmetric key pair make sure that only you can claim that DID corresponds to that commit. Probably. I'm not a cryptographer.

One possible UI that could be built around this:

  1. Bobby runs jj git init , which gives him a private key he puts in 1password. The public key is automatically set up for him.
  2. Bobby, optionally, sets up commit signing. If he doesn't set up signing, jj commit just embeds the public key as the identity.
  3. Bobby visits a website that has a pretty GUI setup for letting him edit his identity record. It can't exfiltrate his key because it runs fully client-side, which Bobby can test by turning off WiFi on his laptop, generating the new record (with only the signature, not the key), and then turning WiFi back on to copy-paste it into a fresh page of the app.

Bobby is happy because from his perspective he just commits like normal, maybe with one extra jj identity publish if he wants to tie his identity to the repo immediately. The maintainer is happy because they NEVER EVER EVER have to think about GDPR for commits again. Bobby's ex is unhappy that he moved to Germany, but that's a different story.

You could imagine an extension of this idea to commit bodies that allows building hg censor on the same mechanism, although it's more complicated because you probably want that to be under the control of the repo owner, not the person who originally submitted the change.

Now, this doesn't solve literally every problem—archive.org is a thing—but it sure does solve "all people have to do to deanonymize you is run cat .mailmap ".

Summary

  • Git preserves all data forever , in amber. Trying to change it is a goddamn nightmare. This is a problem for credentials, identities, and copyrighted material.
  • hg censor makes a good-faith attempt to fix this, but only works for commit contents, not commit metadata
  • This post proposes a way to fix this for identities, not just commit contents, using ATProto's distributed identities and personally-owned data storage, as well as a completely off-the-cuff unreviewed crypto 8 scheme.
  1. if this doesn't sound important to you, imagine that idk, Bobby is going into a witness protection program or something, or getting a divorce from an abusive ex. also, get the hell off my site.

  2. 522 came up with an alternate way to allow deletions and renames by having a mutable mailmap that's not on the main branch . This isn't quite as flexible as the proposal here, but it's much much simpler, and works today with normal git config.

  3. technically DIDs aren't specific to ATProto , but they weren't widely used before Bluesky started using them.

  4. actually, tangled cheats and lets you write only your email in the commit, then looks for a ATProto DID with that email and uses that to find your Bluesky handle and display name. wild shit. doesn't help with our goal of hiding names and emails though.

  5. they can ban you from Bluesky, but not from ATProto as a whole. see the creator of Blacksky's post about this for more information.

  6. you want this per-repo so that you can delete your association with one project without having to delete all of them.

  7. live fetches would be expensive, but you can make them cheaper with an appview , which you can think of as a giant cache with structured database-like queries. this is similar to the idea behind trustfall .

  8. real crypto, not that web3 bullshit. "crypto means cryptographers".

Unpatched Calix flaw lets hackers bypass NAT to expose internal devices

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 17:14:30
An unpatched vulnerability in Calix GS7 XGS (GS5239XG) residential routers used by multiple U.S. broadband providers allows remote, unauthenticated attackers to create port-forwarding rules that can expose local network devices to the public internet. [...]...
Original Article

Unpatched Calix flaw lets hackers bypass NAT to expose internal devices

An unpatched vulnerability in Calix GS7 XGS (GS5239XG) residential routers used by multiple U.S. broadband providers allows remote, unauthenticated attackers to create port-forwarding rules that can expose local network devices to the public internet.

The flaw is tracked as CVE-2026-75501 and is described as a missing authentication issue that affects devices running EXOS/6.6.47 firmware.

Security researcher Brian Khan Quintana discovered the flaw and, after trying to notify the vendor on June 7 without success, he reported the vulnerability to the Carnegie Mellon CERT Coordination Center.

image

Following multiple attempts to contact the vendor and receiving no response, CERT/CC coordinated a public disclosure, and Quintana published the technical details.

Calix is a significant vendor in the US broadband-provider market, working with large entities such as Cox Communications, Brightspeed, ALLO, CityFibre, and Conexon.

The affected model, GS5239XG, is also marketed as the GigaSpire 7u10txg and is a new, premium gateway device that combines Wi-Fi 7 capabilities with an integrated XGS-PON fiber terminal.

The CVE-2026-75501 vulnerability is caused by the device exposing "the MiniUPnPd control endpoint on the WAN interface on TCP port 5000 without access controls."

“In affected firmware versions, the router binds its UPnP WANIPConnection SOAP service to the public WAN interface on TCP port 5000,” CERT/CC warns .

This allows an attacker on the public web to send the device unauthenticated "SOAP requests to add, delete, or enumerate port mappings, or to query the external IP address."

This way, hackers can bypass the router's Network Address Translation (NAT) and firewall protections and expose internal cameras, network-attached storage (NAS) devices, administrative interfaces, and IoT appliances.

"One unauthenticated request from anywhere in the world is enough to open a permanent hole through the router's firewall to any device inside the house. No password. No prompt. Nothing on screen. The rule survives a reboot," Quintatna says .

The researcher says that an attacker leveraging the security issue could take the following actions:

  • Create arbitrary port-forwarding rules
  • Delete existing mappings
  • Enumerate the router’s current mappings
  • Retrieve its public IP address

Quintana tested the finding by sending requests outside his home network to create a port mapping that exposed an internal address. A mapping configured with no expiration remained active after the router was power-cycled.

Proof of concept HTTP/SOAP request
Proof of concept HTTP/SOAP request
Source: drkq.github.io

This practically means anyone on the internet can instruct vulnerable Calix routers to forward traffic from a public-facing port to a chosen device on the home network.

Given that there’s no fix for CVE-2026-75501, Quintana recommends that users of the vulnerable device disable UPnP through the administrative interface ( Advanced → Security → UPnP ).

The researcher notes that this workaround disables automatic port opening, which some games rely on, but it’s always possible to open specific ports manually.

CERT/CC also notes that the setting might be locked in some cases, and users who can't change it should contact their ISP to request the deactivation.

BleepingComputer has contacted Calix for a comment about the flaw, the device models it impacts, and if a patch will be released, but we have not heard back as of publishing.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

Matthias Klumpp: Sovereign Tech Fellowship for Freedesktop Tasks

PlanetDebian
blog.tenstral.net
2026-08-24 17:00:40
In 2025 I was honored to be selected for the first cohort of Sovereign Tech Fellows, a program by Germany’s Sovereign Tech Agency to improve the resilience of the open source ecosystem by supporting maintainers directly (complementing their existing support for larger FOSS organizations). Back in 20...
Original Article

In 2025 I was honored to be selected for the first cohort of Sovereign Tech Fellows , a program by Germany’s Sovereign Tech Agency to improve the resilience of the open source ecosystem by supporting maintainers directly (complementing their existing support for larger FOSS organizations). Back in 2025, I was only working very limited hours – however, this has changed in 2026.

For the second half of 2026, I am working again as a Sovereign Tech Fellow, but this time with significantly increased hours. After finishing my PhD, I do have time now for new tasks (and new jobs!), and the fellowship presents an amazing opportunity to really advance projects that I maintain or am part of. This also has a very nice effect on contributors and bug reporters, as their feedback gets addressed a lot faster. With some luck, this ultimately will help finding new (co)maintainers for projects as well (although in the age of AI, a lot of how open source used to work is much more uncertain, but that is a matter for a different blog post).

The fellowship is time-limited, so I am intending to make the time I currently have count!

So, what’s planned?

I am involved in many projects, but three of them will be getting attention as part of the fellowship. I know I am notoriously slow at blogging, but expect more details on each of them very soon. Here’s an overview:

Freedesktop.org, Specifications and Organization

I maintain the Freedesktop Specifications , which is an area of Freedesktop that has traditionally been a bit chaotic. This “worked” in the past, because Freedesktop was never intended to be a former standards body, but more a shared space where people could throw a lot of code and ideas over the wall and see what sticks and what people can collaborate on.

While I very much love the spirit of this and want to keep it in some form, we definitely would benefit not just from more formalization and better procedures, but also from better organization of the specifications in general. A lot of conflicts can be avoided by that. I will work on improving procedures, crunching through the (lots!) of pending bug reports and MRs, and to make the specifications site better searchable and accessible (similar to how Mozilla’s MDN presents information, but I am not sure if we will get quite that far). I also intent to add a compatibility matrix for specifications, so if a desktop opts out of any one of them (or does not implement them yet) that fact is documented and authors of applications know what they can expect. This will allow us to move a lot faster and avoid a lot of conflict, because there is no implicit assumption that “everybody will implement everything” anymore (which has never been quite true anyway).

Hopefully, this will ultimately result in a Freedesktop that is both a lot more useful for application authors who want to bring their project to Linux, as well as developers of desktop environments who need to see which specifications are available and which ones are current.

In addition to that, I have also worked on a Freedesktop.org website refresh, which is pretty much done in its first iteration (pending sysadmin action). The aim there is to have a more official website, separate from user-contributed wiki content, that showcases what Freedesktop is and which projects are using it for hosting. Once the new website is live, I will also review every page again, archive dead projects in their own section and reorganize the software and specifications directory. Those sections are severely outdated and are missing recent efforts from the community, while still containing long-dead old projects (remember HAL ? 😉).

AppStream

A lot of extra maintenance work will be (has been!) done on it. This includes things such as JPEG-XL support (blog post soon), sandboxed media processing, support for newer specification additions, better OARS integration (and potentially migrating it to fd.o infrastructure), improvements and API stabilization for libappstream-compose and a lot of bugfixing and resolution of issues found by AI code review.

AppStream was originally designed to parse only trusted data from vetted Linux distribution sources – this is no longer the case in today’s world and in the way Flatpak uses it, so we need to increase resilience of the project.

I am also exploring a project that could vastly improve search accuracy for AppStream. Stay tuned for that.

PackageKit & System Upgrades

Many years ago, people thought we would all migrate to atomic Linux distributions and slowly not need PackageKit anymore. This has not turned out to be the case, and there are still plenty of reasons to use a package-based OS, especially in development environments. At the same time, PackageKit has been basically the same for years, and its older architecture is beginning to show. It being a daemon who’s literal job it is to modify the entire system also makes it one of the most security-sensitive components that a Linux system can have, while simultaneously making it near-impossible to sandbox.

My plan is to create PackageKit 2.0 by building on the great foundation of PackageKit 1.0, but modernizing it. This will include simplifying its code and removing a bunch of features that have no more use in modern desktops, while also adding some features that PackageKit never had but that would be useful to expose to frontends (still no to interactivity an terminal-progress forwarding though!). PK 2.0 will also allow me to solve a few design issues that have been worked around in the past, by replacing them with better solutions. This will be a painful transition, as PackageKit 2.0 will break all interfaces PackageKit has – and those interfaces have been frozen for more than a decade. However, I do fully expect this change to be worth the effort.

In addition to that, I intend to look into the offline-update procedure again and improve it. The current multi-reboot operation comes with downsides, that newer systemd features such as soft-reboot can alleviate. The end result should be a much smoother, less annoying offline-update experience for users (I especially want to get rid of updates running on system startup, which I consider quite bad from a usability perspective). The new behavior is in the early drafting stages and may need direct support from systemd. I will share more about it once I can.

That’s a lot of tasks!

Yes! I will see how far I get. I am moving project-by-project though, to allow me to focus on one project at a time, rather than scattering my attention continuously. Amazingly, this means that the major tasks for AppStream are already almost done, and we are nearing the 1.2.0 release. AppStream got priority, because the new Freedesktop Flatpak runtime will be released soon, and because I want FlatHub/Flatpak to have access to the new AppStream release sooner. Freedesktop and PackageKit are next on the task list.

Either way, a lot of progress is coming – if you have any feedback or want to help out, please don’t hesitate to reach out! All work is happening fully in the open, so you can also chime in on the respective GitHub/GitLab tasks 😀.

You can also expect blog posts about key features or interesting changes, so stay tuned! 🙂

kudu - easily manage VMs on Linux

Lobsters
github.com
2026-08-24 16:53:40
Comments...
Original Article

Description

kudu is a TUI for creating and managing VMs on Linux. It is an alternative to GUIs like virt-manager or GNOME boxes and as opposed to these, it does not rely on libvirt

Prerequisites

  • A Linux based OS.

  • qemu binaries, at least one of those:

    • qemu-system-x86
    • qemu-system-aarch64
    • qemu-system-riscv
  • xorriso for cloudinit

  • passt

  • uefi firmware package (Optional for x86_64)

    Debian/Ubuntu Arch (btw) Fedora
    x86_64 ovmf edk2-ovmf edk2-ovmf
    aarch64 qemu-efi-aarch64 edk2-aarch64 edk2-aarch64
    riscv64 qemu-efi-riscv64 edk2-riscv64 -

Installation

Binary release

You can download the pre-built binaries from the release page release page

Build from source

git clone https://github.com/pythops/kudu
cd kudu
cargo build --release

On Arch Linux

Usage

FAQ

Q: KVM shows Disabled or Unavailable.

Make sure the kvm kernel module is loaded if you have Intel/AMD processor.

if you run kudu as regular user, make sure your user belongs to kvm group. otherwise run kudu with sudo.

kudu still runs fine even if kvm is not available.

Contributing

  • Strict No LLM.
  • Only submit a PR after having a prior issue or discussion.
  • Keep PRs small and focused.

License

GPLv3

We’re Eating the Same Vegetables Over and Over — Scientists Say That’s a Problem

Portside
portside.org
2026-08-24 16:04:03
We’re Eating the Same Vegetables Over and Over — Scientists Say That’s a Problem jeannette Mon, 08/24/2026 - 16:04 ...
Original Article
We’re Eating the Same Vegetables Over and Over — Scientists Say That’s a Problem Published

There are more than 1,000 vegetable species around the world but that number is shrinking. | Alejandro Muñoz / Getty Images

Although there are more vegetable species in the world than most of us can name, only a small number of them are a regular part of our diets. Researchers say that’s a problem.

In late July, an international team of scientists called for a coordinated global effort to “rescue, conserve, and make better use” of vegetables that are not cultivated by large-scale agriculture, warning that today’s food systems lean far too heavily on a small handful of familiar crops. The report, published in the peer-reviewed multidisciplinary journal Proceedings of the National Academy of Sciences , points to the spider plant in Africa, bitter gourd in Asia, and slippery cabbage in the South Pacific as examples of vegetables that could diversify our diets while helping agriculture adapt to climate change.

According to the experts, relying on the same familiar crops — such as the standard varieties of eggplant, kale, cabbage, carrots, lettuce, onion, and tomato that you spot at the supermarket — may not be enough to meet the climate challenges ahead. “The solution isn’t simply to grow more vegetables. It’s also to grow more kinds of vegetables,” Maarten van Zonneveld, an agricultural scientist who led the research, shared in a statement to the World Vegetable Center .

The researchers note that there are at least 1,480 edible vegetable species around the world. Keeping those species alive and giving more people access to affordable, nutritious food go hand in hand.

Vegetable biodiversity is at risk

According to the report, vegetable biodiversity — the “full range” of vegetable species— is rapidly decreasing, and the researchers note that around 80% of studies examining the loss of vegetable genetic diversity have documented significant declines over the past century. Among the wild relatives of 79 major vegetable crops assessed for extinction risk, about one in four is threatened with extinction. Meanwhile, research and breeding efforts remain concentrated on a relatively small group of commercially important crops, such as tomatoes and peppers, while nutrient-rich vegetables like the spider plant and slippery cabbage receive far less attention.

“Vegetable biodiversity is one of the world’s greatest assets for improving diets and adapting agriculture to a changing climate,” Colin Khoury, a global conservation lead at Crop Trust , a nonprofit dedicated to preserving crop diversity, told the World Vegetable Center. “But we’re losing it at exactly the time we need it most. Conserving vegetable biodiversity isn’t just about protecting the past. It’s about securing more options for the future.”

Encouraging vegetable biodiversity — and putting a greater range of options on grocery store shelves — could have far-reaching impacts. According to the researchers, people around the world eat, on average, about 40% fewer vegetables than the World Health Organization recommends. That number only grows in lower-income countries, and insufficient vegetable intake ranks among the five leading dietary risk factors for disease globally, they detail. As The Guardian has previously reported, data from the United Nations indicates that more than one in three people cannot afford a nutritious diet, underscoring the need to make vegetables more affordable and accessible.

Cultivating and consuming a wider array of vegetable species could address more than one of these challenges. The researchers pointed out that many smaller-scale vegetables are better adapted to local growing conditions than imported varieties and can provide higher levels of vitamins and minerals.

What languages are agent skills written in?

Hacker News
plicara.ai
2026-08-24 20:52:27
Comments...
Original Article

In the first quarter of 2026, 13.0% of newly written agent skills were in a language other than English, and one quarter later it was 16.3%. That is three points in three months across 255,068 skills, with confidence intervals nowhere near touching. For comparison, GitHub-wide non-English documentation took ten years to travel from 3.7% to 13.0%, so whatever is happening here is happening at a different speed entirely, and the most plausible explanation is that AI development has arrived somewhere other than San Francisco.

Reviewing the data, it turns out that the claim is stronger than the obvious version of it, because English is not a proxy for American . GitHub's fastest-growing developer population by a wide margin is India, which writes in English, as do Nigeria and Singapore, so a language count cannot see any of them. The non-English share is therefore not a measure of how much of this ecosystem sits outside the United States. It is a floor beneath it, and everything below should be read that way.

For context, a skill is a SKILL.md file in a folder, holding instructions for an AI agent in plain prose, loaded when the agent judges the task relevant. Anthropic published the specification in October 2025, and it spreads the way a recipe spreads: somebody copies it. Nine months later there were 3.8 million of them across 282,200 public repositories, which is what the GitSkills dataset collects. Skills are strange as software, by which we mean the traditional kind, because this is one of the things AI has upended. They are written in human language and the runtime is a multilingual model, so there is no technical reason to write one in English: a developer in Shenzhen or São Paulo can state a procedure more precisely in their own language, and the agent will follow it. Whether it follows it as well is a better question, and much harder to answer than anything a file crawl can settle.

the distribution

We ran language identification over the prose body of every distinct skill, after stripping front matter and fenced code.

horizontal bar chart, language distribution English 85.3% Chinese 中文 6.2% Japanese 日本語 1.7% German Deutsch 1.6% Korean 한국어 1.2% Portuguese Português 1.1% Spanish Español 0.9% French Français 0.4%
1,870,299 distinct skill contents. The 14.3% that are not English are led by Chinese.
Language Share of distinct skills
English 85.3%
Chinese 6.2%
Japanese 1.7%
German 1.6%
Korean 1.2%
Portuguese 1.1%
Spanish 0.9%
French 0.4%

So 14.3% of skills are not in English, and split by script the Chinese ones run 104,985 simplified against 9,112 traditional. The rows above do not quite sum to that, because 6,810 skills came back below our confidence floor and are counted as neither. The comparison worth making is against GitHub's own documentation instead of its issues or pull requests, and a 2026 ICSE study put repository documentation at 13.0% non-English, with Chinese at 3.3% of repositories. In aggregate that makes skills unremarkable, 14.3% against 13.0% being a dead heat. They are markedly more Chinese, though, 6.2% against 3.3%.

why every published number disagrees

Ours is not the only published figure, and the published figures do not agree with each other.

Reported English share Corpus Method
65.0% 557 healthcare skills, ClawHub ( 2605.02709 ) not stated
81.8% 26,502 skills, ClawHub ( 2604.13064 ) not stated
85.3% 1,870,299 distinct, GitHub (ours) py3langid, conf >= 0.80
92.6% 133,149 skills, skills.sh ( 2607.01456 ) fast-langdetect
99.7% English-seeded crawl ( 2606.03565 ) seeded

These are not contradictions, they are five different populations: curated marketplaces skew English, domain slices skew toward wherever that domain happens to be active, and a crawl seeded with English queries will find English. The first candidate to rule out is us, because if our identifier simply saw less English than everyone else's then the whole comparison would be an artifact of tooling. So we ran both over the same documents, py3langid which we use and fast-langdetect which the 92.6% study used. They agree on 97.6% of documents, and their English shares sit +1.2 points apart against a gap of around seven. Quality screening looks like the next good candidate and leads nowhere either: if corpora that filter for valid front matter were quietly discarding non-English skills that would explain some of the spread, but non-English skills have slightly better front-matter validity, 88.1% against 86.6%, and filtering moves the English share only from 85.6% to 85.4%. What is left is where you looked. That generalises well past this dataset, so when someone tells you what "the AI ecosystem" looks like, the registry they scraped may hold more of the answer than anything else they say.

skills are getting less English

Skills carry commit history, so each one has a creation date, and that turns a static pie chart into a trend.

non-English share by month, with confidence band 0% 8% 16% 24% 25·10 25·11 25·12 26·01 26·02 26·03 26·04 26·05 26·06 26·07
Band is the 95% Wilson interval. July 2026 is shaded: collection ran mid-month, so that cohort is censored and excluded from comparisons.
Quarter Non-English share
2026 Q1 13.0% [12.8, 13.1]
2026 Q2 16.3% [16.1, 16.4]

Month by month the climb is not smooth, since February dips to 10.9% before March resumes at 14.2%, but the direction across the window is not in doubt: 13.1% in January against 17.6% in June. That is roughly what you would expect of a format eighteen months old, since new artifact types acquire their demographics much faster than mature ones when there is no incumbency to overcome. But "non-English" is not one thing, and broken out, the rise turns out to be carried by two of the four groups rather than by all of them.

small multiples, share by quarter per language, with confidence bands
0% 4% 8% 25-Q3 26-Q3

Chinese +2.1 pts 25-Q4 → 26-Q2

0% 4% 8% 25-Q3 26-Q3

Japanese -1.0 pts 25-Q4 → 26-Q2

0% 4% 8% 25-Q3 26-Q3

Korean +0.3 pts 25-Q4 → 26-Q2

0% 4% 8% 25-Q3 26-Q3

European +4.2 pts 25-Q4 → 26-Q2

Shaded band is the 95% Wilson interval; the hollow final point is the censored July cohort, plotted but never compared. European groups German, French, Spanish, Portuguese, Italian, Russian and Dutch.
2026 Q1 2026 Q2 Change
Chinese 4.2% [4.1, 4.4] 5.3% [5.2, 5.4] +1.1
European 2.7% [2.6, 2.8] 5.5% [5.4, 5.6] +2.8
Korean 2.2% [2.1, 2.3] 2.0% [1.9, 2.0] -0.2
Japanese 3.2% [3.1, 3.3] 2.5% [2.4, 2.5] -0.7

European languages, by which we mean German, French, Spanish, Portuguese, Italian, Russian and Dutch grouped together, more than double across the window while Chinese climbs steadily, and Japanese and Korean do neither: Japanese was the most common non-English language at the end of 2025 and slipped through the first half of 2026 as everyone else arrived, while Korean stays flat throughout. The censored July cohort hints that Japanese is recovering, and we are not counting it. Changes are measured between the two complete quarters, 2026 Q1 and Q2, since the final column is the July collection month and is censored, so it appears in the chart but never in a comparison.

why we believe it

A trend like this is exactly the kind of thing that turns out to be an artifact, so we spent longer trying to break it than we did finding it. Commit history exists for only 24% of skills, and that subsample leans toward heavily copied ones, which matters because copying turns out to be strongly related to language. The worry, in other words, is that we are watching a selection effect and not a change in what people write. Holding copies fixed at one, the rise is larger than the headline, 14.7% to 18.1%; counting each repository only once, so that no bulk uploader can swing it, the rise survives at 14.5% to 16.8%.

the clock

Commit timestamps are stored in UTC, so an author's local timezone is gone before we ever see the file. But people mostly commit while they are awake, and if a group of skills is written by people in one part of the world, their commits should vanish during that region's night.

24-hour dials, one per language
35.7%

English n=384,979

15.3%

Chinese n=21,939

15.9%

Japanese n=12,908

18.7%

Korean n=9,388

46.5%

Spanish/Portuguese n=9,936

Centre figure is the share of first commits in that window. The non-English groups are small, so read the contrast, not the decimals.
Language Commits during East Asian night n
English 35.7% 384,979
Chinese 15.3% 21,939
Japanese 15.9% 12,908
Korean 18.7% 9,388
Spanish/Portuguese 46.5% 9,936

Chinese-language skills fall to less than half the English rate in that window, while English itself stays flat across all twenty-four hours, which is the signature of a globally distributed population with no single night. Spanish and Portuguese run the opposite way and peak at 19:00 UTC, mid-afternoon in Brazil and late evening in Iberia, which places those authors in the Americas. Nothing in the language identifier knows what time a file was committed, so the two signals are independent, and they agree.

Honest limits. This is a population-level phase estimate, good to a couple of hours at best; it cannot separate UTC+8 from UTC+9, a language is not a country, and it says nothing whatsoever about any individual author. We found no published validation of hour-of-day inference at this granularity, so treat it as corroboration and not as geolocation. A raw git commit does record the author's UTC offset, and this dataset normalised it away, which is the fix for anyone building on this.

the same story from outside

We are reading one artifact type on one platform, so the question that matters is whether anyone measuring something else sees the same movement, and they do, at a larger scale than we can.

GitHub's own Octoverse 2025 reports that India added 5.2 million developers in a single year, about 14% of the 36 million accounts opened worldwide, which takes it to 21.9 million and second place globally. That is 4.9 times its 2020 population. Brazil grew 4.1 times over the same period, Indonesia 4.8 and Japan tripled, and new signups now run at roughly 25 a minute across APAC against 12 across Europe. India, Brazil and Indonesia together account for about half of all new accounts. Stanford's 2026 AI Index puts generative-AI adoption at 64% in the United Arab Emirates and 61% in Singapore, against 28.3% in the United States, which ranks twenty-fourth. Its policy chapter records open-source contributions "from the rest of the world now outpacing Europe and approaching the United States on GitHub", and its education chapter finds AI engineering skills accelerating fastest in the UAE, Chile and South Africa.

None of that is about agent skills, which is exactly what makes it useful: three independent measurements of where AI development is happening, none of them looking at SKILL.md files, all of them pointing the same way. Our number is the same phenomenon surfacing in a corpus eighteen months old. Our number also cannot see most of it. India writes in English, so the largest single engine of GitHub's growth is invisible to a language count, and so are Nigeria and Singapore, which is why 14.3% should be read as the floor beneath whatever share of this ecosystem now sits outside the United States.

copied, or tended?

non-English share by copy count 15.7% 1 copy n=1,483,575 10.8% 2 copies n=179,102 9.1% 3-5 copies n=135,271 5.8% 6+ copies n=72,351
Across all 1,870,299 distinct contents. Removing the ten aggregator repositories, or counting distinct owners, widens the gap.

English skills get copied more. The non-English share falls steadily the more a skill is reused, from 15.7% among skills nobody has ever copied down to 5.8% among those copied six or more times. That one needed defending, because a great deal of what looks like copying on GitHub is really archiving. Ten repositories hold 14.5% of every skill file here, and they are registries and mirrors rather than authors, so 282,200 repositories behave, by concentration, like about 250. Those aggregators turn out to lean non-English, 20.5% against 13.7% elsewhere, so whatever they are doing to the numbers works against this pattern instead of producing it. Excluding them leaves the gap where it was, 15.1% down to 5.3%, and counting distinct owners, so that one actor vendoring a skill into ten of their own repositories counts once, widens it slightly to 15.1% against 4.6%.

But non-English skills get revised more. That needs an age correction, since non-English skills are younger on average and have had less time to be touched, so the comparison below holds age fixed and asks what share of skills at least N days old were revised within their first N days.

revision rate at 7, 30 and 90 day windows 14.4% 15.7% within 7 days 21.7% 26.9% within 30 days 28.7% 33.9% within 90 days
Compared at equal age: among skills at least N days old, the share revised within their first N days.
Window English Non-English
7 days 14.4% 15.7%
30 days 21.7% 26.9%
90 days 28.7% 33.9%

The gap opens over the first month and then holds, +1.3 points at a week, +5.2 at a month and +5.2 at three, which leaves two populations behaving quite differently: English skills propagate, written once and copied widely and rarely touched again, while non-English skills are tended, copied less and revised more. The likely reason for the copying half is search. Discovery is lexical, and a developer searching in English will not surface a skill written in Chinese even where a multilingual model could execute it perfectly, so what stands between a Shenzhen developer's skill and the person who needs it is a text match. If that is right, the ecosystem globalises in what gets written well before it globalises in what gets reused, and the lag between the two is a tooling problem somebody could fix.

who is actually writing these?

The GitSkills authors asked one more thing worth answering: how many skills do agents write themselves? The obvious way to check fails immediately, because GitHub's own bot flag catches almost nothing: agent-written code is committed under the human's account. The signal that does work is the trailer, the Co-Authored-By line a coding agent appends to commits it authored, which is the tool claiming authorship instead of us inferring it from prose.

Measure Value
Name an AI agent in a commit trailer 30.4% [30.3, 30.6]
Flagged as a bot by the platform 1.0%
Japanese skills, agent-authored 43.4%
Chinese skills, agent-authored 23.2%

Nearly a third of skills carry an agent's fingerprint and the platform sees almost none of it, with Claude accounting for the overwhelming majority of those trailers while Cursor, Copilot and Codex trail far behind, and the trailers even carry model versions. Read it as a floor, since a skill whose author stripped the trailer, or squashed it away, or used a tool that never emits one, counts as human here.

what this does not show

Language identification keys on script and function words, so a German skill thick with English technical vocabulary gets pulled toward English, which is another reason the non-English share is a lower bound. Dates cover only part of the corpus and only deduplication representatives, so "created" means the first commit touching that copy and not the first appearance of that content anywhere. And a crawl sees only survivors, so any skill created and deleted before July 2026 is invisible to us, which inflates every maintenance figure here by an amount we cannot estimate.

what we would want to know next

The number we cannot get from this data is whether any of it costs anything. A skill written in Chinese and never copied might be worse, or might be identical work that nobody found, and those two worlds look the same from a file crawl while implying opposite things. Separating them needs execution traces, and if somebody has those we would like to see them. The larger question is what the floor actually rests on. 14.3% of skills are not in English and the share is climbing three points a quarter, while the fastest-growing developer population on the platform writes in English and never appears in that count at all. Whatever the real number is, everything we can measure says it is moving in one direction, and faster than anything comparable has moved before.

Article 02 stays on this corpus and asks which programming languages skills talk about. Our first pass had Shell/Bash leading every language at 37.5%, which turned out to be an artifact of counting pasted commands, and measured by what a skill actually ships Python leads at 7.6% while Shell drops to 3.1%.

credit

None of this exists without the dataset, which was built and released by someone else, and all credit for collecting, deduplicating and documenting 3.8 million skill files belongs to its authors:

Giuseppe Destefanis, Daniel Graziotin, Matteo Vaccargiu, and Marco Ortu. 2027. GitSkills: A Dataset of Agent Skills on GitHub . In Proceedings of the 24th International Conference on Mining Software Repositories (MSR '27) .

Preprint arXiv:2608.10906 , archive 10.5281/zenodo.21875637 , Parquet mirror mvaccargiu/gitskills , sample giuseppedestefanis/gitskills-sample , licence CC BY 4.0 .

GitSkills is the dataset for the MSR '27 Mining Challenge, and we are not affiliated with its authors, with MSR, or with the challenge, so nothing here should be read as endorsed by them: the dataset is theirs, and the analysis and any error in it is ours. Several of the research questions we take up, including which natural languages skills are written in, are ones the GitSkills authors posed and left open.

Analysis code lives at github.com/plicara/articles under gitskills-analysis/ , where every figure is generated from a single machine-readable export and never typed by hand, so the whole thing can be regenerated and checked.

Found something wrong? We would genuinely like to know.

Bookshelf – Self-hosted eBook library that runs on object storage

Hacker News
github.com
2026-08-24 19:00:37
Comments...
Original Article

CI

A self-hosted library for the ebooks you already own. One server-rendered page lists them, filters them with a search box, serves downloads, and reads them in the browser — EPUB and PDF, each with its own reader — as a Cloudflare Worker over R2, or as a Node server over a directory on disk.

The shelf: a searchable list of books with covers, a profile switcher, and a Continue button on the book being read

Everything above is npm run demo — a generated shelf of public-domain titles, so the screenshots can be reproduced without finding books first.

Getting started

Node 24 or newer, and a Unix-like system: the sync tool finds its image tools with which , so Windows is not supported. Covers come out better with cwebp and pdftoppm installed — see publishing , or use Docker, which ships both.

git clone https://github.com/murerkinn/bookshelf.git
cd bookshelf
npm install

Put some books — EPUB or PDF — in books/ , then choose where the library should live.

With Docker

The shortest path, and the image brings its own cwebp and pdftoppm so covers come out right without installing anything on the host.

mkdir books && cp ~/Downloads/*.epub books/
docker compose run --rm sync --create
docker compose up -d

The shelf is then on http://localhost:3000 . Flags pass through, so docker compose run --rm sync --force and --dry-run behave as they do locally.

One named volume, library , holds the published books and everything the app writes to them — profiles and reading positions — so it is the only thing to back up.

The image is built for the filesystem provider: it is a Node server, and Cloudflare needs no container. It runs as a non-root user, and creates /data owned by that user so a named volume inherits an ownership the app can write to. If you would rather bind-mount a host directory, chown it first:

chown -R 1000:1000 /srv/bookshelf

On a machine you own, without Docker

No account anywhere. Point bookshelf.config.json at a directory, publish into it, and run the app:

npm run sync -- --create   # builds library/, then publishes it to shelf-data/
npm run build
npm start -w @bookshelf/app

library/ is the tree the sync tool builds; directory is where it publishes to, and it holds the books being served. Keep it out of the repository — shelf-data/ already is.

On Cloudflare

Needs a Cloudflare account and npx wrangler login . Two checked-in files carry this project's own bucket and Worker name and are meant to be edited — see the R2 provider .

npm run sync -- --create   # creates the bucket, then uploads to it
npm run deploy

The two must agree about which bucket holds the library, or the app will serve an empty shelf. They are checked against each other before anything uploads, and a mismatch is reported rather than published through.

A demo shelf

No books to hand, or want something worth screenshotting? Nine generated public-domain titles — eight EPUBs and a PDF, so both readers are one click from the shelf — downloading nothing:

npm run demo                 # writes them into books/

Then publish and serve by whichever route above. The titles and authors are real works long out of copyright so a shelf of them looks like a shelf; the prose inside is placeholder. Note that the config in this repository points at R2, so npm run sync goes there unless you change it.

A public instance

Anything reachable by strangers should refuse to be changed:

Storage keeps serving and stops accepting. Profiles cannot be added, renamed or deleted, and reading positions go back to living in the browser — the same degradation as a provider that cannot write, because to the app it is the same situation. Switching between existing profiles still works; that is a cookie, not a change.

It is enforced where the writing happens, not by hiding the forms, so posting the actions directly gets the same refusal.

There is no authentication. Anyone who can reach the app can read and download the whole library, so put it on a network you trust or behind something that asks who is calling. See Not done yet .

Commands

All of these run from the repository root; Turborepo builds whatever the task depends on first.

npm run dev          # local dev server, against the local R2 bucket
npm run sync         # build the library and upload it to the bucket
npm run build        # build every workspace
npm run check-types  # typecheck every workspace
npm run preview      # build + run the Worker locally
npm run deploy       # build + deploy to Cloudflare Workers
npm test             # the test suite
npm run lint         # biome, across the repo

npm run cf-typegen -w @bookshelf/app regenerates cloudflare-env.d.ts after editing wrangler.jsonc .

Documentation

Publishing a library the sync tool, its flags, and covers
The library format what ends up in the bucket, and why it is regenerable
Storage providers the contract, and what the two shipped ones can each do
Cloudflare R2 configuration, deploying, publishing locally
Filesystem running it on your own machine or a VPS
Profiles who is reading, and where they got to
Reading in the browser how a chapter reaches the page
Architecture ports, adapters, and the composition root
The demo library how the public shelf is built, and how to rebuild it

Not done yet

  • There is no authentication. Anyone with the URL can read and download the whole library — and pick any profile while doing it. Profiles are a way to keep housemates' bookmarks apart, not a way to keep anyone out.
  • Two devices reading as one profile at the same time is last-write-wins.

Contributing

See CONTRIBUTING.md . The short version: Node 24, npm install , and npm run lint , npm run check-types and npm test before you push. The tests reach the packages and the app's service layer but not its pages, so say what you ran as well.

Storage providers are the extension point and do not have to live here: a package published by anyone can be installed and named in the config.

License

MIT — see LICENSE .

That covers the code. It says nothing about the books you put in a library built with it, whose copyright is between you and their publishers.

Show HN: Flostep – Diagrams people can actually walkthrough

Hacker News
flostep.dev
2026-08-24 18:45:24
Comments...
Original Article

⚡ Diagrams people can actually walk through

Flostep

The fastest way to sketch, walk through, and share a system design flow — drag components, connect them, and present each interaction step by step.

No account needed to try · Build, share, then save

See a real one

This is a live Flostep diagram, not a screenshot. Hit ▶ Start and walk through it yourself.

Every shared diagram embeds like this — one iframe, any site.

Build your own →

How it works

From blank canvas to a fully walkable flow in minutes.

🖱️

STEP 1

Drag & drop components

Pick from Frontend, Service, Database, Cache, Queue, External API — or create a custom component. Place them on the canvas.

🔗

STEP 2

Connect & label interactions

Draw arrows between components in the order they happen. Label each one — "POST /login", "returns JWT", "cache miss". Multiple interactions between the same pair are fine.

▶️

STEP 3

Walk through it

Hit Next to step through each interaction one at a time. The active step lights up, the rest fades. Perfect for design reviews, onboarding, and interviews.

Everything you need

No fuss. No bloat. Just the tools that matter for system design.

📝

Code-to-diagram import

Paste plain A -> B: action lines and the canvas builds itself.

💬

Comments on shared links

Send a link and collect the feedback in one place. Reviewers comment by name without needing an account, so an async design review doesn't have to become a meeting.

One click to generate a public read-only link. Anyone can step through your flow without needing an account.

Drop a single <iframe> into Notion, Confluence, your blog — the full interactive walkthrough lives there.

A dedicated notes panel for trade-offs, open questions, and findings — saved alongside the diagram so context never gets lost.

Every change auto-saves to the cloud. Pick up exactly where you left off from any device, no manual saving required.

🔌 Works with MCP

Let your AI assistant draw it

Flostep speaks the Model Context Protocol, so Claude, Cursor, VS Code and Windsurf can build diagrams for you — from a description, or straight from the codebase they're already looking at.

Connect once

claude mcp add --transport http \
  flostep https://flostep.dev/mcp \
  --header "Authorization: Bearer fls_…"

One command for Claude Code, or a few lines of JSON for any other MCP client.

Then just ask

“Make a Flostep diagram of how password reset works here, and give me a share link.”

“Add a retry step between the queue and the worker.”

It reads your existing diagrams too, so edits land on the real thing — not a guess at it.

Built for the moments that matter

🎙️

System design interviews

Walk an interviewer through your design component by component instead of pointing at a static blob.

🏗️

Architecture spikes

Map out a new feature before writing code. Catch missing edge cases before they become bugs.

🧑‍🏫

Onboarding new engineers

Embed a live walkthrough of your auth flow or checkout pipeline directly in your onboarding docs.

🔍

Async design reviews

Share a link, let teammates leave comments on specific steps, and iterate without scheduling another meeting.

Frequently asked questions

Everything you need to know before your first flow.

Do I need an account to try Flostep?

No. Hit “Try it now” and start building immediately — your diagram lives in your browser. Create a free account when you want to save it permanently and get a stable share link.

What can I actually build?

System design flows — drag Frontend, Service, Database, Cache, Queue, and External API components (or custom ones), connect them in the order interactions happen, label each step, then walk through it one hop at a time.

How does sharing work?

One click generates a public, read-only link. Anyone can step through your flow interactively — no account needed. You can also embed the full walkthrough in Notion, Confluence, or your docs with a single iframe.

Can I import an existing diagram?

Yes. Paste plain A -> B: action lines into the Code view and the canvas builds itself.

Can Claude or Cursor build diagrams for me?

Yes. Flostep is an MCP server, so any assistant that speaks the Model Context Protocol — Claude, Cursor, VS Code, Windsurf — can create, read, edit, and share your diagrams. Create an API key, connect it once, then ask in plain language. See the MCP guide .

How much does it cost?

There's a genuinely free plan, and a Pro plan for unlimited diagrams and more. See the pricing page for the full breakdown.

Ready to think in steps?

Free to start. No credit card. Build your first flow in under two minutes.

Create a free account

iCloud+ Hide My Email addresses will remain on icloud.com

Hacker News
developer.apple.com
2026-08-24 18:13:40
Comments...
Original Article

Update: New domain for Sign in with Apple

August 24, 2026

Starting later this year, new Sign in with Apple addresses, previously issued on privaterelay.appleid.com , will be issued on private.icloud.com . Existing addresses on privaterelay.appleid.com will continue to work and forward mail to users without interruption.

After further consideration and reviewing community feedback, iCloud+ Hide My Email addresses will remain on icloud.com .

What you need to do

Developers with apps or websites that use Sign in with Apple should ensure that their account systems, email validation logic, and allowlists accept addresses on the new private.icloud.com domain in addition to the existing privaterelay.appleid.com domain.

Learn more about Sign in with Apple

Communicating using the Private Email Relay Service

Moon

Hacker News
ciechanow.ski
2026-08-24 18:06:02
Comments...
Original Article

In the vastness of empty space surrounding Earth, the Moon is our closest celestial neighbor. Its face, periodically filled with light and devoured by darkness, has an ever-changing, but dependable presence in our skies.

In this article, we’ll learn about the Moon and its path around our planet, but to experience that journey first-hand, we have to enter the cosmos itself.

Let’s take a look at the Moon as seen from space in all its sunlit glory. You can drag it around to change your point of view, and you can also use the slider to control the date and time :

In this convenient view, we can freely pan the camera around to see the Moon and its marvelous craters and mountains from various angles. Unfortunately, we don’t have that freedom of motion in our daily experience – the Moon wanders on its own path across the daily and nightly skies.

We can simulate these travels below, where you can see the current position of the Moon in the sky. You can drag that panorama around to adjust your viewing direction – this lets you see the breadth of the sky both above and below the horizon. By dragging the sliders you can witness how the position of the Moon changes in the sky across days and hours of your local time. As the Moon’s placement in the sky shifts, the little arrow will guide you to its position.

You can also drag the little figurine on the globe in the bottom-right corner to see how the sky looks at that location on Earth. If your browser allows it, clicking tapping the button will automatically put the figurine at your current location. This may all feel quite overwhelming at the moment, but we’ll eventually see how all these pieces fit together:

Over the course of one day , the Moon travels on an arc in the sky almost completing a loop around the Earth. As the days pass, the Moon’s illumination also visibly changes.

You’ll probably admit that it’s a little hard to focus on the tiny Moon as it shifts its position in the sky. To make things easier to see, I’ll zoom in the camera and lock its position on the Moon:

Notice that across a single day the Moon seems to rotate, and over many days it quite visibly wobbles. These wobbly variations let us occasionally see some hidden parts on the “edges” of the Moon, but our neighbor ultimately shows us only one of its sides. In our space-floating demo we could easily see the Moon from all sides, but on Earth we can never see most of the far side of the Moon.

Over the course of days , the lighting on the Moon also changes dramatically. The line between the lit and unlit parts of the Moon, known as the terminator , sweeps across the Moon, revealing the details of its surface. Although the Moon has a spherical shape, the fully lit Moon looks more like a flat disk.

In this article I’ll explain all the effects we’ve just seen, and we’ll also learn about gravity, ocean tides, and eclipses. Let’s begin by exploring how celestial bodies move through space and how their mere presence influences the motion of their neighbors.

Motion in Space

Let me introduce a little cosmic playground in which we’ll do our experiments. Inside it, I put a little planet that floats freely in space. You can drag the planet around to change its position. The arrow symbolizes the initial velocity of this body – you can tweak this velocity by dragging the dashed outline at the end of the arrow. To get things going, you can press the button in the bottom-left corner:

Notice that I’m drawing a ghost trail behind the moving planet , making it easier to track its motion. As you can see, once you let the planet go, it travels through space in a straight line, only to eventually get out of visible bounds.

Let’s complicate things a little by adding another body to this sandbox. You can tweak the positions and velocities of both bodies to see how their mutual presence impacts one another. I’m also marking the thin lines of trajectories that the bodies will take even before you let things go, making it easier to plan their motion:

The motion we see now isn’t as straightforward as before. In some scenarios , the two bodies travel past each other after tweaking their initial trajectories. In other configurations , both objects roam through space together, permanently locked in a swinging dance.

You may have also managed to make the two bodies run into each other. We’ll eventually see a more realistic visualization of that scenario, but in this simplified simulation when two objects collide, they just stick together and continue their coupled journey.

What’s responsible for all these effects is the force of gravity acting on the objects. Let’s explore that interaction up close. As before, you can drag the two bodies around, and you can also change their masses using the sliders below:

The arrows represent the force of gravity acting on the two bodies – the longer the arrow, the larger the force . For completeness, I’m displaying the values and units of masses and distances, but the numbers aren’t particularly important here. What matters is that when we increase either the mass of the first body m 1 or the mass of the second body m 2 , the force of gravity grows too.

Moreover, the magnitude of gravity also depends on the distance r between the objects. As bodies move farther apart, the gravity weakens. Notice how the forces acting on each body have the same magnitude, but they point towards the other body, which indicates an attractive force.

If you paid close attention to the lengths of the arrows, you might have noticed that the force decreases quite rapidly with distance . We can visualize this with a plot, in which the white line shows the magnitude of gravity as a function of distance . More precisely, it shows that gravity is inversely proportional to the square of that distance :

Let’s take a very brief mathematical interlude to describe what we’ve seen in more detail. All these dependencies are captured in the following equation for the force of gravity F , between two objects with masses m 1 and m 2 separated by distance r :

F = G × m 1 × m 2 / r 2

The gravitational constant G seen in front of the right-hand side of the equation is incredibly small, making gravity a very weak force. We have no issues lifting everyday objects despite the might of the mass of the entire Earth pulling them down.

While the strength of gravity between any two bodies is equal, the resulting change in motion is not. You may recall from elementary physics classes that force F is equal to mass m times acceleration a . We can encapsulate this idea in a pair of simple formulas that tie these values for the first and second body:

F = m 1 × a 1
F = m 2 × a 2

By plugging in the equation for the force of gravity F and reducing the masses, we end up with a set of two equations for accelerations of the bodies:

a 1 = G × m 2 / r 2
a 2 = G × m 1 / r 2

Notice that the acceleration of the first body a 1 depends on the mass of the second body m 2 . Similarly, the acceleration of the second body a 2 depends on the mass of the first body m 1 . Let’s see this in practice in the demonstration below, where I’m temporarily making the big body twenty times more massive than the small body :

Notice that the body with smaller mass drastically changes its course, while the motion of the larger body is only marginally affected. This tracks with our day-to-day experience, where every item left hanging in the air very visibly accelerates towards the staggeringly massive Earth, but our planet doesn’t jump out of its way to meet the falling object.

Now that we understand that it’s the force of gravity that makes the bodies move towards each other, let’s do a better job of tracking the motions of these objects over time. Right now our camera is fixed in space, so the two bodies often fly out of visible bounds. Thankfully, we can easily fix this by moving the camera with the bodies.

In the demonstration below, I’m presenting the same scenario from two different vantage points. On the left, I’m showing the scene from the familiar point of view that’s fixed in space – you can plan the trajectories of the two bodies on that side.

On the right, you can see this simulation from the point of view of the camera that’s tied to the motion of the these objects . I’m marking the position of that camera with a white dot on the thin line joining the bodies. By dragging the slider you can move the camera between them:

With the camera following the bodies we can now track their motion forever. More importantly, we can also see the relative motion of the two objects. When you make the bodies move together , you can witness how from the perspective of the teal body , it’s the yellow body that orbits around the teal body , but from the perspective of the yellow body , it’s the other way around.

Better yet, if we position the camera halfway , or even anywhere else between the two bodies , both objects seem to orbit the camera. The perception of relative motion depends on the point of view, but there is one point that’s particularly useful for observation. In this next demonstration, I’ve added a little white trail to the camera itself. Watch how the path of the camera in space changes as you reposition it with the slider:

In general, the camera traverses some squiggly path in space. However, there is one special position between the two bodies for which the camera travels in a perfectly straight line. This point is known as the barycenter , and it’s located at the center of mass of these objects .

Let’s explore the concept of the barycenter a little closer. In the demonstration below, you can once again drag the bodies around to change the distance between them, and you can also use the sliders to tweak their masses. The center of mass of these two bodies is marked with a black and white symbol:

The equation in the bottom part explains the placement of the center of mass of these two objects – it is located at a point where its distance from the first body r 1 multiplied by that body’s mass m 1 , equals that point’s distance from the second body r 2 multiplied by its mass m 2 .

This simple rule becomes slightly more complicated when more than two bodies are involved. In those scenarios, the position of the center of mass is the weighted average of the positions of all the bodies, where the masses of these bodies serve, very appropriately, as weights.

We’ll only be interested in the center of mass of two bodies, so the demonstration we’ve just seen fits our needs well. Notice that as the bodies move farther away, the barycenter also migrates to stay in the constant proportion of the distance separating the objects. Moreover, if one of the bodies is much more massive than the other, the center of mass could lie inside that larger body.

In our space simulator, the mass of the teal body is three times the mass of the yellow body , so the barycenter of this system lies three-quarters of the way between the yellow and teal objects:

The motion of the barycenter shows us that the tangled dance of two celestial bodies hides a much simpler linear motion through space and some additional motion of the two bodies around that barycenter .

Let’s try to see that other motion more clearly by making one more modification to the right side of the demonstrations we’ve seen. Notice that the trails left by the bodies linger in space, but ideally, we’d also want to see the paths taken by the bodies relative to the moving camera.

To make this work we can attach a little drawing plane to the camera itself – I’m outlining that plane below with a thin rectangle . Then, as the bodies move around, they can trace their trails on that plane as well:

With this new method we can see the paths the bodies took relative to the moving camera . When seen from this perspective, we can finally reveal that, in most practical scenarios, the two orbiting bodies trace ellipses relative to each other.

Depending on the initial conditions, some of those ellipses are larger , and some are smaller . Some are almost circular , and some are quite elongated . Changing the position of the camera with the slider changes the relative sizes of these two ellipses, but they maintain their overall proportions. The ellipse of motion of one body seen from the perspective of the other is the same for both bodies , it just shifts in space.

As you may have seen on this blog before, an ellipse can be more formally characterized by its eccentricity and the size of its semi-major axis , which you can control using the sliders below:

Eccentricity specifies how elongated an ellipse is. It can be defined as the ratio of the length of the dark pink segment to the length of the semi-major axis . That segment spans the distance between the center of the ellipse and one of the two focus points , which are also jointly known as foci . When we watch orbital motion from the perspective of the orbited body , that body is always in one of the focus points of the orbital ellipse of the orbiting body .

I’ve also marked two special points on the orbital ellipse. At apoapsis , the orbiting body is at its farthest distance from the orbited body , and at periapsis the orbiting body is closest to that body . These two points are collectively known as apsides , and the line joining them is known as the line of apsides . The simple rule for remembering which apsis is which is that a poapsis is the one that’s farther a way from the orbited body .

We’ve just described the orbital ellipse and its apsides as seen from the point of view of the larger body, but in our cosmic playground we’ve seen how moving the camera around with a slider can change the perception of motion:

With a two-body system like this one we actually have some flexibility in describing which body orbits which. We typically say that it’s the less massive object that orbits the more massive one , but the observer on the smaller body would just see the motion of the larger neighbor around it.

For us, it will be often useful to describe things from the point of view of the barycenter – we’ve seen earlier how that special point lets us decompose the motion of two solitary bodies into the movement on a straight line and the orbiting motion around that barycenter.

That particular viewpoint also lets us explain another irregular motion we can see in these elliptical orbits. Notice that as the two bodies are close to each other, they swing across their trajectories much faster.

You can see it best when looking at the dashed segments I’ve drawn on the elliptical orbits – traversal of each brighter or darker section takes the same amount of time. These lines are visibly longer when the bodies are close, which reflects their faster motion as they travel longer distance over the same period.

This non-uniform motion can also be seen in the angular velocity of the orbital motion, which describes how many degrees per second an orbiting body sweeps through. In this next demonstration the blue line rotates with constant angular velocity, so in every second it goes across the same number of degrees. As you can see, the orange line joining two bodies rotates with varying speed:

Notice how the orange line is sometimes ahead of and sometimes behind the blue line , which shows that the orbital motion doesn’t have a constant angular velocity.

This unusual behavior is more easily explained with the following contraption, where I put the two bodies on a giant bar that spins around on an axis placed right at the center of mass of the two bodies. Using the slider you can change the distance between these objects:

As the bodies get closer , the rotation speeds up. Conversely, as the bodies move farther apart , the rotation slows down. You can easily recreate a version of this experiment by holding heavy items in your hands and spinning on a desk chair with your arms spread out. As you pull them towards your torso, your rotation will speed up.

These are examples of conservation of angular momentum in which the speed of revolution and the mass distribution of a system are inherently tied together. Broadly speaking, when we double the distance from the axis of rotation, the angular velocity becomes four times smaller.

The space playgrounds we’ve looked at earlier work just like the demonstration with the bar, but instead of a slider, it’s the force of gravity that determines the distance between the bodies. Gravity pulls the objects closer together, increasing the speeds at which they swing by each other. As the bodies move past their closest distance, that increased speed shoots them out away from each other and the cycle continues.

The details on how this action creates elliptical paths are beautifully covered in the video on Feynman’s Lost Lecture , but for our needs it will be enough to just witness once more how all the initial values of masses, positions, and velocities of the two bodies decide everything about their motion:

With a firmer grasp on orbital motion in space, we can finally see how everything we’ve learned affects movement of our planet and its closest celestial neighbor.

Moon and Earth

Let’s first look at the Moon and Earth side by side to compare their masses and sizes in imperial units metric units :

Moon Earth
mass 0.01619 0.07346 1.317 5.972 × 10 25 lb 24 kg
mean radius 1079.6 1737.4 3958.8 6371.0 mi km
volume 0.5270 2.1968 25.9876 108.321 × 10 10 mi km 3
mean density 208.8 3344 344.2 5513 lb/ft 3 kg/m 3

The Earth’s mean radius is only around 3.67 times larger than that of the Moon. Since the volume of a sphere grows with the third power of its radius, and the Earth is on average much denser, our planet’s mass ends up being around 81.3 times larger than the Moon’s.

Let’s try to replicate this table in our space simulator, where I added two bodies with sizes and masses matching those of the Earth and the Moon . Let’s see how these values affect the motion of the two objects:

With our simulated Earth being so massive, we can quite easily make this Moon orbit the Earth with various ellipses. Unfortunately, while this simulation correctly mimics the relative sizes of the real Earth and Moon, it doesn’t reflect the cosmic scale of the distance between these two bodies.

Let’s see how far away the Moon really is. In the demonstration below, you can use the slider to zoom away from the Earth until the Moon’s position becomes visible:

If you drag the slider all the way to the right , you’ll notice that I’m actually marking three distances between the centers of the Earth and the Moon. The orbit of the Moon doesn’t form a perfect circle, so the separating distance varies as the Moon gets closest to the Earth at periapsis, and farthest away at apoapsis. The values shown here in miles kilometers are the predicted maximum , mean , and minimum of that distance in the 21 st century.

Let’s see the orbit of the Moon in more detail. The following demonstration shows the motion of our neighbor from the perspective of the Earth itself. You can drag around the following demonstration to change the viewing angle. The slider lets you control the speed of time :

With all the sizes and distances replicated realistically, it may be hard to see these tiny bodies. To make things more legible, you can press the button in the bottom right corner to toggle between the real and ten times larger artificial sizing of these bodies.

With this three dimensional view we can now see that the Moon’s motion lies in the orbital plane that I’m marking with a faint gray disc . To help us orient ourselves in space, I’ve also added a line that marks a fixed reference direction pointing at some very distant stars.

On average, it takes the Moon 27.322 days 27 days, 7 hours, and 44 minutes to complete the whole orbit, as measured by crossings of the reference line . That period is known as the sidereal month , where sidereal means “with respect to stars”. This is only one of the four different types of lunar months that we’ll explore in this article.

As the Moon orbits the Earth, it traces the familiar elliptical shape. We can quite clearly see how the elliptical eccentricity shifts the Moon’s path relative to the perfect circle of the visualization of the orbital plane that I’ve drawn above.

Let’s take a closer look at some of the parameters of the Moon’s orbit. In this next demonstration I’m using the current position and velocity of the Moon to calculate an ellipse that best describes the Moon’s orbit at that moment of time. I’m drawing this ellipse with a dashed line , while the solid trail shows the actual path the Moon took:

Since we’re making the ellipse fit the current orbital motion, this idealized ellipse matches the actual trail very well in the vicinity of the orbiting Moon. However, farther away from the Moon this best-fitting ellipse diverges from the path the Moon actually took. This shows us that while it’s pretty close, the Moon’s trajectory doesn’t form a perfect ellipse.

As we see in the labels, both eccentricity and the length of the semi-major axis of this “currently best-fitting” ellipse vary over time. Measured over a long period, the eccentricity of the Moon’s orbit has the average value of 0.0549, while the semi-major axis has the average length of 239,071 mi 384,748 km .

Moreover, the fitted orbital ellipse not only changes its shape, but also its orientation. The line of apsides of the ellipse which joins the apoapsis and the periapsis wobbles over time in a quite chaotic manner.

These effects happen because the Earth and the Moon aren’t the sole bodies in space – they’re both part of the Solar System. True to its name, the Solar System is dominated by the Sun itself, and it’s primarily the effects of the Sun’s gravity that cause all these perturbations of the Moon’s orbit.

We’ll soon explore the influence of the Sun in more detail, but for now let’s focus on the changes of the positions of apoapsis and periapsis . In the demonstration below, I’ve made time flow even faster than before. Additionally, every time the Moon is at its closest to the Earth, that is when it’s at the periapsis , I’m leaving a little marker on the orbital plane:

Notice how the line of apsides wobbles back and forth, but across many months it overall makes steady progress rotating, when seen from above , in the counter-clockwise direction. Averaged over long time, this line of apsides makes a full rotation in 8.85 years 8 years and 310 days , which defines the period of the Moon’s apsidal precession .

The markers that I drop when the Moon crosses the periapsis measure the anomalistic month . Notice that the lengths of anomalistic months vary a lot as they happen on different parts of the orbit. Sometimes it takes the Moon less than 25 days to get closest to the Earth again, but sometimes it takes it over 28 days to reach periapsis again. Over long time the anomalistic month has a mean length of 27.554 days 27 days, 13 hours, and 3 minutes .

This period is a bit longer than the 27.322 days 27 days, 7 hours, and 44 minutes of the sidereal month, which is tracked by the crossings of the reference line . When averaged over time, the line of apsides rotates steadily in the same direction as the Moon’s orbital motion, so it takes the Moon a bit more time to catch up to periapsis .

All the demonstrations we’ve seen also show one more effect that we didn’t account for in our simple playground simulations – both the Earth and the Moon spin around their axes. You can see this more clearly in the demonstration below where I glued a blue arrow to the surface of the Earth, and a gray arrow to the surface of the Moon:

When viewed from the side , we can see that the axes of rotations of these two bodies aren’t neatly perpendicular to the orbital plane , and they also spin at very different rates. Our planet takes roughly 23.93 hours 23 hours and 56 minutes or almost one day to complete a full revolution and point towards the reference direction again. The Moon rotates much slower, taking 27.322 days 27 days, 7 hours, and 44 minutes to revolve just once and align with that direction again.

From above we can see that the gray arrow fixed to the Moon’s surface generally points towards the Earth, as indicated by the thin line joining the two bodies. If you pay close attention, you’ll notice that this arrow is sometimes pointing a bit ahead of that direction and sometimes a bit behind that direction.

This is a consequence of the Moon’s non-circular orbit – we’ve seen earlier how the angular velocity of an orbiting body changes as it sweeps through its orbital ellipse. The Moon rotates around its axis with more or less constant speed, but the Moon’s angular position relative to the Earth doesn’t advance at a constant rate. As a result, the two rotating motions don’t always perfectly cancel each other out.

In a close-up view of the bodies you might have also noticed that the rotation axis of the Moon is tilted relative to its orbital plane . Similarly, the axis of rotation of our planet is also tilted relative to that plane . Let’s briefly switch our point of view to align ourselves straight-up with the Earth’s rotation axis:

From this perspective we can see that the Moon’s orbital plane is inclined to our planet. Notice how the Moon’s position relative to the Earth changes during its orbital motion – it is sometimes “above” and sometimes “below” our planet, revealing the truly three dimensional aspects of the Moon’s motion.

All the orbital observations we’ve made will help to explain some of the effects we’ve seen at the beginning of this article, where we looked at the Moon through the eyes of an observer on the ground. Before we investigate these effects, we need to build a bit more intuition on how objects in space look to someone viewing them from the surface of Earth.

Eyes on the Heavens

Let’s first place ourselves on Earth and look at the sky in which I artificially put three colorful celestial bodies . You can drag the demonstration around to change which part of the sky you’re looking at. If you lose track of these bodies, the little arrows will guide you back to their area of the sky:

Although the markers of the compass directions are of some help, it may be quite hard to grasp how this view from the Earth’s surface corresponds to the more external view from space we’ve gotten used to.

Let me clarify things in the next demonstration, where the left side shows the same view we’ve just seen, and the right side shows the same scene, but as seen from space . I’ve also outlined the sky view on the left with the four colored lines – as you pan around the landscape on the left, you can see that square outline reflected on the right. I’ve also added a figurine that represents a vastly enlarged observer standing on the ground. The figurine’s body and its right hand always point in the current direction of observation:

With that external view, we can see how the observer on the ground can’t see the sky in every possible direction. Half of it is obscured by the Earth itself, with the horizon clipping the whole breadth of the surrounding sky to only the visible hemisphere.

Moreover, notice how the actual size of an object doesn’t match its size seen in the Earthly observer’s sky. For example, both yellow and teal bodies are of the same physical size, but the latter looks smaller in the sky. Similarly, the pink body is physically larger than the yellow one, but they share similar size from the observer’s point of view.

We can understand these sizing effects with the help of cones that shoot out from the position of the observer towards the bodies in space. Note that these cones start on the ground here, because the actual observer is much smaller than the gigantic illustrative figurine .

The size of the intersection of those cones with the hemisphere of the sky, or the size of the projected area , determines the visible size. Intuitively, the farther away the object, the smaller it appears. If the projection occupies a larger fraction of the total hemisphere, the object will look larger as well.

We can conveniently describe the size of objects in the sky by measuring the angle spanned by the visible cone. In the demonstration below, I’m showing a flat side view of this cone . You can drag the yellow body around to change its distance from the observer . You can also use the slider to change the size of that body :

The closer the object is to the observer , or the larger the body, the greater the angle of the visible cone. That angle is known as the angular diameter or angular size of the observed object.

Having experienced how objects in the night sky may look at a fixed moment in time, let’s see how the Earth’s rotation affects observations done from the ground. In the demonstration below, you can scrub through time with the slider to witness the effects of the spin of our planet:

This scene may seem a bit contrived, because the three objects are just magically floating in space at fixed positions. Fortunately, it’s a decent representation of how all the stars in the night sky appear to Earthly observers – they’re distant enough that over the course of a day they essentially don’t move relative to the Earth’s center. As our planet spins, these three objects seem to rise over the horizon, travel across the visible sky, and then set below the horizon again.

You’ll probably agree that it’s a little annoying to have to manually keep panning through the night sky to look at these objects, so on the left side of this next demonstration I’m automatically adjusting the viewing angle to track the teal body. On the right side, I’m locking the camera on the figurine itself. Don’t be misled by what you see here – the Earth is still rotating around its axis, the camera just rotates with it:

As seen through the observer’s eyes on the left side, the other objects now seem to rotate around the teal one, but this is purely a consequence of the observer turning on the ground to keep facing the teal body.

You may have experienced something similar when watching an airplane flying over your head. As the plane is approaching, its front is closer to you and its tail is in the back, but after the plane has passed over, you see the plane’s tail as being closer to you, and its front is more distant. In your eyes the plane has rotated, but in fact the plane has kept its course the entire time, and it was you who turned to keep an eye on it.

When these celestial bodies disappear beneath the horizon, it becomes impossible to track them, but thankfully in these computer simulations I can make the Earth transparent, giving us an unobstructed view of the full sphere of the surrounding space:

With this approach we can now see the entire trajectory of the three objects as an observer on Earth sees them. Because these objects don’t move relative to the center of our planet, they travel on closed paths, returning to where they came from after the Earth completes one revolution around its axis over the course of 23.93 hours 23 hours and 56 minutes .

Let’s bring back the Moon into the picture. In the simulation below, we can see the Moon in the starry sky as seen from the surface of the Earth. Note that I removed all the visual effects related to sunlight, including the daytime blue sky and any illumination changes on the surface of the Moon itself.

We’ll bring in those effects later on, but for now we’ll just look at the artificially lit Moon over the course of the next 24 hours – you can scrub through this time with the slider. You can now also drag the little figurine around the globe to change the observer’s location, or click tap the button in the corner to jump to your location:

Notice how small the Moon actually is in the sky – it only spans around 0.5° of the viewing angle. Just like our colorful objects did, the Moon also travels across the sky as the Earth rotates. However, because the Moon moves relative to the center of our planet, it doesn’t quite close up its path. This is easily observable from space:

Notice that over the course of 24 hours the Moon moves ahead on its orbit, so a bit more time has to pass for the Earth to rotate to have our neighbor be over roughly the same spot on the Earth again. Moreover, the inclined orbital plane shifts the Moon to be a little lower or higher relative to the Earth, so its arc in the sky shifts too.

Let’s go back to observing the Moon from Earth. To see our neighbor more clearly I’ll increase the zoom level of the camera, and I’ll lock it on the Moon:

When viewed this way, the Moon seems to rotate over the course of one day, but this effect is purely a consequence of the observer turning around to face the Moon – we’ve already seen this behavior with colorful objects seemingly rotating in space.

The observer stands up vertically on the ground, so as the Earth rotates, the observer’s “up” and “towards the Moon” directions change in space. How much these directions change depends on the latitude of the observer’s location. When seen from the equator , the Moon “rotates” quite rapidly as it passes over the observer’s head. On the North and South Poles, the “up” direction is fixed in space, which removes that daily rotation. Notice that even on the poles the Moon still visibly turns a little over the course of a day.

To investigate these subtler aspects of the Moon’s motion in the sky we have to give ourselves a bit more time for observations. In the demonstration below, you can track the Moon over the next 30 days. You can still drag the figurine to some other location, but the observer’s Moon-facing rotation can make things pretty nauseating outside of the poles, so you can always get back to that stationary location:

Notice that over the course of a month the Moon wobbles visibly, and it also changes its size. The oscillations we see here are caused by the Moon’s orbital motion.

Let’s see this more clearly from space by drawing the cone of visibility of the Moon for the observer on the surface of the Earth. Unlike in previous examples, where I’ve aligned the rotation of the camera to the reference line , this time I’ve synchronized our perspective with the orbital motion of the Moon, giving us an unchanging perspective on that body:

As we’ve discussed earlier, the Moon’s orbit around the Earth isn’t perfectly circular. The Moon changes its distance to our planet, which affects how large it looks in the sky. Below you can see a side-by-side comparison of the Moon’s visible size when it’s at apoapsis and periapsis :

The Moon’s orbital motion is also responsible for the periodic wobbles, which we can see clearly by once more gluing an arrow to its surface:

We can see from above that the Moon appears to wobble from side to side, because the angular speed with which it sweeps the orbit varies over time, while its angular speed with which it rotates around its axis is almost constant. Similarly, in a side view we can see that the axis of rotation of the Moon is tilted relative to its orbital plane, so we sometimes see more of the Moon’s top, and sometimes more of its bottom.

All the effects we’ve seen here are known as librations . Over the course of many days, librations make it possible to see around 59% of the Moon’s surface. However, because of the Moon’s synchronized spin and orbital motion, a large part of the Moon’s surface is never visible from Earth. It’s finally time to investigate how the Moon got locked into that motion by taking a more detailed look at gravity and the structure of celestial bodies.

Gravity at Scale

So far we’ve only been experimenting with gravitational interactions between two objects, but it’s time we vastly increased the number of participating entities. In the demonstration below, I randomly distributed over 1200 bodies – they all gravitationally attract each other:

We’re watching this scene from afar, so the individual bodies we see here are very big – each on the order of dozens of miles kilometers across. Initially, these objects move very slowly, but the mutual gravitational forces consistently accelerate them towards each other, increasing their speed and kinetic energy.

This simple simulation doesn’t reflect this, but once these bodies collide, this energy gets released by heating up the matter constituting the objects . When hot enough, the matter loses its solid form and starts to behave more like a fluid that can relatively easily change its shape. The pushing pressure from the surrounding neighbors and the heat from the decay of radioactive isotopes also help to maintain that liquid form.

When in this state, this mass of matter can’t really maintain any rigid shape, and after wobbling for a while, it reaches an equilibrium forming a sphere. When no other forces are involved, this liquid spherical shape balances itself perfectly – any mountain that stands out gets gravitationally pulled towards the center, and any valley gets squeezed out by the surrounding matter trying to fill the empty space.

In the simulation we’ve just seen, all the bodies started frozen in space. Let’s see what happens when we give these objects some initial random velocity:

After a while we end up with the similar spherical shape, but this time this blob rotates. What we’re witnessing here is another example of the conservation of angular momentum in action.

From our previous examples you may associate angular momentum with some kind of spinning or orbital motion, but even the simplest movement on a straight line contains a rotational component when seen from an appropriate point. Below you’ll find a replica of the very first space simulation we’ve played with in this article, but this time I’m also drawing an additional dashed line spanned between the yellow planet and the central blue point :

That dashed line turns as the body moves in a straight line, revealing the rotational motion relative to the blue point . Even in this scenario the angular momentum of the system is maintained.

Through all the collisions in our complex system the velocity and the angular momentum of each of the hundreds of bodies constantly change, but, relative to some fixed point, the sum of the angular momenta of all the bodies remains constant. Whatever original value of angular momentum this system had, persists forever.

In the initially chaotic motion of all the bodies there is some average amount of rotational motion. Once all these bodies get closer to each other, the angular velocity grows high enough to be visible. This is the exact equivalent of two planets orbiting each other more quickly as the distance between them decreases, but it happens here at much larger scale.

There is one more aspect of these self-aggregating blobs that we should explore. In this next demonstration, one fourth of the objects is colored blue . These bodies are much denser than the others , therefore, each is also more massive:

Notice that in the final liquefied planet these denser objects have a tendency to aggregate at the center of the body. We’re basically observing buoyancy in action, where this denser material sinks to the “bottom” of the planetary blob and the lighter one floats to the surface.

These accumulation, or accretion processes that I’ve crudely simulated with a small number of bodies, happened on an absolutely massive scale during the formation of Earth and other planets. The whole fascinating history of the early Solar System is beyond the scope of our discussions, but the simple simulations we’ve seen highlight the origins of the Earth’s rotation, and illustrate why it’s differentiated with a heavy iron core in the middle.

A few different theories have been suggested to explain the origin of the Moon itself. These days the leading one is the giant impact hypothesis , in which a large body hit the early Earth around 4.5 billion years ago.

Scientific opinions differ not only on the size, speed, and composition of the impacting body, but also on the subsequent process of formation of the Moon from the resulting debris.

Some earlier papers assume the Moon simply formed from the matter scattered into space after the collision. Other authors suggest that the energy released during impact created a huge, partially vaporized cloud of matter from which small moonlets condensed and accreted to create the Moon. Some other recent research shows with beautiful computer simulations that the proto-Moon may have formed immediately after the impact.

Any theory of the Moon’s origin has to end up with a similar state as the Earth and the Moon are in right now. For example, if we estimate that during the collision only a small amount of matter got ejected out of reach of the Moon’s and Earth’s gravity, the total mass of the two bodies before and after the impact should be more or less the same.

Moreover, the Moon is on average much less dense than Earth, because the Moon’s iron core is comparatively much smaller than that of Earth’s. If we assume that the colliding body and proto-Earth formed in the same area of the Solar System and therefore had similar composition, then this implies that a large part of the impacting object’s iron core must have transferred to our planet.

The Moon and Earth also share very similar ratios of isotopes of some elements, suggesting that the ejected material that formed the Moon was a mix of the proto-Earth and the other proto-planet.

Let’s try to recreate some simple collision scenarios using our rudimentary simulations. In the demonstration below, you can drag the impacting body around and change its initial velocity, similarly to how we did this in the introductory orbital simulations:

We don’t know what the initial conditions of this collision actually were, but when everything finally settled, we most likely ended up with the Moon orbiting Earth and both bodies spinning around their axes.

The simulation below gives a rough overview of this situation. Note that it doesn’t try to accurately reflect the distances, speeds, or surface details involved in those early stages, but it will be enough to help us explore the other details of gravitational effects between the Earth and the Moon :

Let’s try to first understand what forces the Earth imposed on this early Moon when we incorporate the more fine-grained scale of gravitational interactions we’ve been playing with. In the demonstration below, I put three small bodies far away from the Earth . Initially, these three objects are evenly spaced, but notice what happens to the distances between them over time:

The dashed circles show the original positions of the pink and teal objects relative to the central yellow body. Quite clearly, the three bodies seem to drift apart.

Recall that the force of gravity is proportional to the inverse of the square of distance between the objects. When an object is close to its massive neighbor , it’s also close to each tiny parcel of matter that makes up that neighbor . We can visualize this with a plot and arrows that show the Earth’s gravitational forces acting on these equally spaced objects placed at a varying offset – you can control it with the slider below:

The pink body is closest to Earth , so it experiences the strongest force and the strongest acceleration. Conversely, the teal body is the most distant, so it feels the weakest force and it doesn’t increase its velocity as fast as the closer bodies . It’s this variation in forces that increased the distance separating the objects in the previous simulation.

Even though all three bodies were moving towards the planet, from the perspective of the central body both its neighbors moved away from it. It’s easiest to understand this effect by calculating the difference between the forces acting on that central body and its neighbors. I’m drawing these force differences with yellow arrows that have been scaled up to be more legible:

These yellow arrows show actual forces on the pink and teal body relative to the yellow body . As seen by the yellow body , its two neighbors are pulled away by these so-called tidal forces , which arise from differences in gravity experienced by the bodies.

Our early Moon isn’t immune to these effects either. Because of its orbital motion it doesn’t crash into our planet, but its parts closest to the Earth feel a stronger pull than the Moon’s central sections. Those central parts are in turn pulled more forcefully than the Moon’s parts most distant from the Earth. We can visualize these forces by putting the gravity arrows on small sections of the Moon:

If we then calculate the difference between the force acting on each of those small sections and the force acting on the center of mass of the Moon, we can visualize the tidal forces acting on the Moon itself. For clarity, I’m drawing the arrows much larger than the gravity differences actually are:

As you can see, the tidal forces are trying to flatten and stretch the Moon both towards and away from the Earth. Thankfully, the self-gravity of the Moon is strong enough and the Moon is far away enough that these differences in the Earth’s gravity don’t pull the Moon’s body apart. However, the Moon does stretch a little, forming an elongated shape.

In the demonstration below, you can visualize this stretching with the second slider, but be aware that the distortion you’re playing with here is vastly exaggerated:

As this early Moon keeps spinning around its axis, its different parts get closer and farther away from the proto-Earth. The elongation travels across the Moon’s surface, continuously morphing its shape. As you can imagine, it takes a lot of energy to deform a celestial body, and some of this energy inevitably gets lost due to friction.

These losses introduce a delay to the entire deformation process, and the maximum elongation is reached a little after that area of the Moon has been closest to the Earth. As a result, the elongated bulge doesn’t point directly at the Earth, but it’s carried ahead by the spin of the Moon – the elongated shape is a bit off-axis . In the demonstration below, you can play with an overemphasized degree of this delay :

Let’s pause here for a minute to understand what effect the tidal forces may have on this stretched and skewed body. In the demonstration below, I’m drawing a long bar that gets pulled by two ropes attached to its ends. Using the slider you can scrub through time to see how this contraption would behave when pulled by these forces :

Notice that initially the bar is rotated, so it’s a little off-axis with the directions of the pulling forces . This gives the ropes some leverage, and the pulling forces rotate the entire bar clockwise until it’s aligned with those forces .

This is very similar to what happens to our spinning early Moon deformed by tidal forces . Since the elongation is slightly off-axis, the tidal forces rotate the Moon clockwise, which gently decreases the Moon’s existing counterclockwise spin!

The actual elongation and the off-axis skew of the early Moon were much smaller than what I’ve depicted here, and its non-circular orbit complicated things even more, but the net result of tidal forces was to slow down the Moon’s spin until it was synchronized with the Moon’s average orbital motion.

In this whole process the angular momentum of the Moon had to be conserved, so as the Moon’s spinning motion slowed down, its distance from the Earth increased. This kept the overall balance of how quickly all the matter rotated and how far from the center of rotation it all was.

In the last few paragraphs we’ve only focused on the effects of Earth’s gravity on the Moon, but everything we’ve discussed also manifests in the influence of the Moon’s gravity on Earth. The Moon also creates a slightly elongating bulge on Earth that travels across our planet as Earth rotates.

Earth also used to rotate faster, but tidal forces slowed down its rotation, transferring some of the angular momentum from the rotational motion to the joint orbital motion. This has also increased the distance between the two bodies.

Even today, Earth is very gently slowing its rotation, with the average day getting longer by about 2 milliseconds per century. As a result, the Moon is also moving away from our planet at the rate of around 1.5 inches 3.8 centimeters per year. Part of the present-day energy dissipation is caused by the deformation of Earth itself, but most of the energy gets lost in the oceans in the form of tides .

The forces driving the ocean tides have the very same nature as the ones we’ve just discussed. To understand how they work, let’s look at a fictional planet completely covered with a deep layer of water and orbited by a smaller neighbor . The white arrows symbolize the neighbor’s gravity forces acting on the water at that location. The slider lets you control the speed of time :

Water closer to the orange body experiences a stronger pull than the water farther away. The solid part of the water-covered planet also gets gravitationally pulled by the neighbor with some force. Like before, we can calculate the difference between the force acting on each parcel of water and the force acting on the center of the solid body, which will show us the tidal forces acting on the water:

Subject to these tidal forces the surface of the water will deform until it reaches a new balance with the gravitational forces of the planet itself. It’s actually pretty hard for tidal forces to just raise the water against the force of gravity of the planet . The tidal deformation is primarily caused by “sliding” the water away from the regions where the tidal forces act tangentially to the surface.

Here we’ll make an idealized assumption that, on this planet , water can very quickly travel and deform under the influence of gravity. It’s not super realistic, but this simplification will help illustrate some fundamentals of tidal motions. The demonstration below shows an exaggerated view of that tidally deformed ocean. I’ve also added a little figurine that you can drag around to more easily see the water level at that location:

The plot below shows the water level over time at the observer’s location. As the planet spins, different areas of the ocean are directly in line with the orbiting body , so the water level oscillates over time. Notice that the tidal forces create two bulges , so during a single rotation of the planet the observer experiences two high tides and two low tides .

In this perfectly aligned system the smaller planet orbits the bigger one right around the equator and that’s where the water bulges have their highest amplitude , creating the largest difference between low and high tides. As you drag the observer to the region where the bulges aren’t as pronounced, the tides become weaker.

Let’s disturb this equatorial symmetry by making the orbit of the small body inclined relative to the big planet :

Notice that we still experience two bulges, but they no longer happen at the same latitude. In most areas the two high and low tides are no longer even, because the observer may be closer or farther away from the nearby bulge. This creates some additional once-per-day variation on top of the regular twice-per-day oscillation. Moreover, the body’s motion on the inclined orbit now also moves the bulges up and down the globe, adding once-per-month variation to these tidal amplitudes.

Any additional body present in the system would also exert its tidal forces, creating another pair of bulges. As the relative positions of these bodies change, their bulges could line up to create tides of greater amplitude. These bulges could also be shifted relative to each other with a low tide caused by one body partially cancelling out the high tide from the other.

What we’ve explored here is only a simplified model of what would happen on a planet fully covered with water. For example, we didn’t account for tidal deformation of the crust itself, or any latency in the water displacement caused by energy dissipation. However, the underlying principles roughly match the system that drives the tidal forces on Earth. The Moon, and to a lesser extent the Sun, both impose tidal forces on the bodies of water on Earth.

How the water on Earth reacts to these forces is very heavily influenced by geography of the land itself. The size and placement of the continents and islands, the shape of coastlines, gulfs, bays, and straits, the depth of the sea floor, they all significantly affect the actual amplitude and frequencies of tides observed at any given location.

In some areas of the world the mean difference between a high and low tide can reach over 38 feet 11 meters , but in some seas the tides can be barely perceptible. A global view on the tidal motions reveals complicated patterns that clearly don’t neatly fall into the simple bulge model, but the local changes in tide levels can still be broken down into cycles that follow the relative motions of the Moon, the Earth, and the Sun.

We’ve already seen some other glimpses of the influence of the Sun, like how it affected the Moon’s orbit by changing its eccentricity and semi-major axis. To understand the full impact of the Sun on the Moon’s trajectory we have to finally properly introduce our home star.

Moon, Earth, and Sun

Let’s put the three celestial bodies side by side to compare their statistics in imperial units metric units :

Moon Earth Sun
mass 0.01619 0.07346 1.317 5.972 438,470 1,988,500 × 25 lb 24 kg
mean radius 1079.6 1737.4 3958.8 6371.0 432,300 695,700 mi km
volume 0.5270 2.1968 25.9876 108.321 33,810,247 140,927,257 × 10 10 mi km 3
mean density 208.8 3344 344.2 5513 87.9 1408 lb/ft 3 kg/m 3

With a mass that’s 332,950 times larger than that of the Earth, the Sun completely dwarfs the other two bodies. Even though the Sun has much lower density, its radius is still over 109 times larger than our planet’s.

At normal zoom scale, you may barely be able to see the speck of the Earth, and the Moon will most likely be almost completely invisible. To remedy this, you can use the slider to zoom in on all three bodies letting you witness how absolutely massive the Sun is.

The distance to the Sun is even more staggering. In the demonstration below, you can zoom away from the Earth-Moon system until our star is seen:

The seemingly large distance between the Earth and the Moon almost completely disappears when put in this perspective, and the smallness of those two bodies makes them vanish into the darkness. The values shown here in miles kilometers are the maximum , mean , and minimum distance between the Sun and the barycenter of the Earth-Moon system in the 21 st century.

While the distances and sizes we’ve just seen are correct, the positions and motions of the Earth and the Moon relative to the Sun are a little more involved. In the demonstration below, you can see a three dimensional simulation of the Earth and the Moon on their joint path around the Sun. You can drag it around to change the viewing angle, use the first slider to zoom in on these bodies, or tweak the speed of time with the second slider:

With these three bodies involved, we can no longer describe the entirety of the motion of the Earth and the Moon in a simple, two dimensional manner. Let’s dissect what’s going on by first focusing on the path of the Earth-Moon barycenter around the Sun:

From a top down view , we can clearly see the familiar elliptical shape. When observed from the side we see that the motion of the barycenter lies in a flat plane, which I’m highlighting with blue color . This plane is known as the ecliptic .

Traditionally, the ecliptic has been defined as the plane of motion of the Earth around the Sun, but the modern definition is based on the average motion of the barycenter of the Earth-Moon system. If you zoom in on the barycenter up close, you can see how the Moon and, to a much lesser extent, the Earth, bob up and down through this plane as they orbit around the Sun. In some sense both bodies orbit the Sun, and the Moon also orbits the Earth at the same time.

With the Sun present, the barycenter no longer travels on a straight line like it did in our simple two-body space simulations. In general, the gravitational motion of three bodies can get very chaotic, but, luckily for us, the Moon and the Earth have settled into a balanced and predictable system.

The Earth-Moon barycenter is located inside the body of our planet, so the barycenter’s motion around the Sun very closely matches the familiar yearly motion that we experience on Earth. You can read more about the Earth’s journey in my earlier article , but for our needs here it will be enough to assume that it takes the Earth-Moon system roughly one year to orbit the Sun.

Let’s take a closer look at the motions of the Earth and the Moon around their barycenter. We’ve already discussed how the motion of the Moon around the Earth forms the Moon’s orbital plane – I’m marking it with a faint gray disc in the demonstration below:

The orbital plane of the Moon doesn’t lie flat in the ecliptic , but it is instead inclined to it at an angle . This inclination angle varies a bit over time, reaching an average value of 5.145°.

The inclination angle lets us specify one aspect of the orientation of the Moon’s orbital plane , but there is also another angle we need to consider. Notice that the intersection of the inclined orbital plane with the ecliptic forms a straight line called the line of nodes :

This line gets crossed by the Moon in two places: on its way below and above the ecliptic . These two points are known as orbital nodes . The red point is the descending node because the Moon submerges, or descends under the ecliptic . Similarly, the green point is the ascending node because the Moon rises, or ascends above the ecliptic .

To orient the line of nodes in space, we have to bring in our reference direction . The angle between that reference direction and the ascending node direction of the line of nodes is known as the longitude of the ascending node :

Even when running this simulation 200,000 times faster than real life, the longitude of the ascending node seems to fluctuate only a little, keeping the line of nodes relatively stable in space. However, when we speed things up even more, we begin to notice some predictable movement:

The line of nodes consistently rotates over time, which we can see reflected in the angle very slowly looping through all 360 degrees. This effect is known as nodal precession and it is primarily caused by the gravitational force of the Sun disturbing the Moon’s path.

When seen from above , the orbital plane of the Moon rotates clockwise, which is the opposite direction of the Moon’s orbit around the Earth. It takes around 18.61 years 18 years and 223 days for the orbital plane to complete one rotation.

The period between passages of the Moon through the ascending node is known as the draconic month . Because of the nodal precession, it takes the Moon a little less time to get back to the ascending node than it takes it to cross the reference line , so a draconic month averages at 27.212 days 27 days, 5 hours, and 5 minutes .

The nodal precession has two other consequences for the relative motion of the Earth and the Moon, but to see them, we first have to visualize the spinning motion of these two bodies in more detail. Below I’ve marked two angles between the axes of rotation of the Earth and the Moon , and the direction perpendicular to the ecliptic plane . This measures the axial tilt of these bodies relative to the ecliptic :

The Earth’s axis of rotation holds steadily in space, with the current value of its axial tilt at around 23.44°. Right now this value very gently decreases at the rate of roughly 0.013° per century.

On the other hand, the Moon’s axis of rotation is almost exactly perpendicular to the ecliptic plane . The Moon’s axial tilt measures on average only 1.543°, with small fluctuations similar to the inclination changes its orbital plane experiences.

Let’s take a top-down view of these axes of rotation. In this next demonstration, I’m marking the two angles between the reference direction and the two planes that contain the axes of rotation of the Earth and the Moon , and are also perpendicular to the ecliptic :

This rotating motion of the axis of rotation of a celestial body is known as axial precession . The Earth’s axis rotates very slowly, completing a full cycle in roughly 26,000 years.

Compared to the Earth’s, the Moon’s axis rotates much more rapidly, finishing one turn in 18.61 years 18 years and 223 days . You may recall that this is the exact same duration as the Moon’s nodal precession, where the line of nodes rotates over time. In fact, the orientation of the Moon’s axis of rotation is strictly controlled by the orientation of the Moon’s orbital plane .

This dependence is reflected in the demonstration below, where I’m drawing a blue line that’s perpendicular to the ecliptic plane , a dark gray line that’s perpendicular to the Moon’s orbital plane , and the white line of the Moon’s rotation axis:

These three lines always lie flat in the same plane. This relation is summarized in Cassini’s third law , which states that the Moon’s rotational axis stays in the plane formed by the other two lines. As the Moon’s orbital plane rotates in nodal precession, so does the Moon’s axis of rotation .

The final aspect of nodal precession that we need to consider deals with its impact on observers on Earth. As the Moon’s orbital plane rotates, it can be aligned with the Earth’s axis of rotation to a higher or lower degree.

In the simulation below, I rotated the camera’s “up” direction to match the Earth’s axis of rotation and I also keep rotating the viewing angle with the Moon’s orbital plane , giving us an unchanging outlook on these elements. I then mark the angle between the Earth’s axis and the direction perpendicular to the Moon’s orbital plane :

Notice that this angle oscillates over a long period of time, reaching a minimum of around 18.13° and a maximum of around 28.72° – I’m marking these extremes with fainter lines. Over the course of 18.61 years 18 years and 223 days , the orbital plane goes through its entire tilting cycle.

Depending on that relative angle of the Moon’s orbital plane, observers on Earth can see the Moon sweeping through the sky in a broader or narrower band. In the demonstration below, the trail we see marks 30 days of the Moon’s path in the sky. The slider lets you jump through time over the whole period of the next 18.61 years 18 years and 223 days :

Notice that the width of the “band” of the Moon’s position gets thinner and thicker over the years, in correlation with changes between the relative orientation of the Moon’s orbital plane and the Earth’s axis of rotation.

It’s primarily the Sun’s gravity that disturbs the Moon’s orbit from the pristine elliptical path. As the Moon orbits around Earth and those two bodies orbit around the Sun, the distance between the Sun and the Moon varies. This changes the strength of those gravitational interactions, causing the precessing effects.

What I’ve discussed here were only the major and most visible components of the Moon’s motion through space. Historically, the science of lunar theory tries to decompose the motion of the Moon into various cyclical elements that depend on the relative position of the Moon, the Earth, and the Sun. Many of these effects even have their own names .

The modern developments in prediction of the Moon’s position rely on direct computer simulation of the motion of all the planets, their moons, and hundreds of other small bodies in the Solar System. These calculations also account for other effects like non-spherical shape of the bodies or more complicated gravitational interactions arising from general relativity .

For us, it’s time to stop observing merely the gravitational influences of the Sun. We’re finally ready to cast some light on the visual aspects of its presence.

Sunlight

Let’s see how the Earth and the Moon actually look in space. To make it easier to find the Sun when you’re zoomed in , the yellow lines indicate the “towards the Sun” direction for the two bodies:

Since the Sun is so far away, at any given time the sunlight splits the Moon and the Earth into pretty much even halves of lit and unlit parts. As these bodies spin around their axes, they experience their respective solar days. In the demonstration below, I added the familiar arrows glued to the surface of these bodies, letting us track their orientation more precisely:

For our planet, it takes, on average, 24 hours for the same location on the ground to point at the Sun again. The Moon rotates much more slowly, so the equivalent cycle of one solar Moon day lasts 29.530 days 29 days, 12 hours, and 44 minutes of Earth time.

These periods are longer than a single spin around the axes of rotation, as measured by crossings of the reference direction . These bodies keep moving on their orbit around the Earth and the “towards the Sun” direction keeps advancing too, requiring more body rotation for the arrows to line up with that direction again.

Let’s jump back onto the surface of Earth to see how the sunlight affects what we see in the sky. You can use the sliders below to independently change date and time :

Notice that the sunlight scatters through Earth’s atmosphere, giving the sky the familiar blue color during daytime, and a yellowish and reddish tint at sunrise and sunset. I’m once more making Earth transparent, letting you look below the horizon where I’m hiding any atmospheric effects.

Notice that we can often see the Moon visible in the daily blue sky, because the sunlight reflected from the Moon’s surface contributes additional light to the light coming from the sky itself. The dark part of the Moon doesn’t reflect any light, so we only see the bare blue shade of the sky in that unlit area.

Most importantly for us, over the course of many days , the lighting on the Moon changes too, but to see it better we have to zoom in and lock the camera on the Moon’s lit surface:

As time passes, the Moon goes through its phases , progressing between being fully lit and not lit at all. Traditionally, these phases have particular names, which you can scrub through in the demonstration below:

To see the progress of light with minimal distraction, I’m showing these phases as seen from the North or South Pole and with all the atmospheric effects removed. As we’ve seen earlier, a more typical observer will see the Moon go through its phases embedded in the dark or bright skies, and the Moon will rotate as the observer shifts around to keep it in view.

The Moon phases are caused by changes in relative position of the Moon, the Earth, and the Sun. In the demonstration below, you can see the space view of these bodies, with the cone of visibility showing what an observer on Earth sees as time passes . For clarity, you can change the size of the objects with the button in the bottom right corner:

The Sun always lights up roughly half of the Moon, and the phases seen from Earth change because we see different portions of the Moon’s lit surface.

The period between occurrences of the same phase is known as the synodic month – this period averages at 29.530 days 29 days, 12 hours, and 44 minutes . The average synodic month has the same duration as the average Moon solar day, because the locked spin and orbital motions keep them even.

The synodic month is the longest of the four lunar months we looked at. As the Moon and the Earth progress on their path around the Sun, it takes the Moon a bit more time to be in the same relative position to the Earth and the Sun. The length of a calendar month is based on the synodic month, but the length of each of the twelve months has been adjusted to make them all fit neatly into a whole calendar year.

When we look at the new or full moon from above the ecliptic plane, the Sun, the Moon, and the Earth are all aligned. However, because of the inclination of the Moon’s orbital plane, the three bodies typically don’t form a straight line, and the side view shows that the Moon is a little below or above the ecliptic.

We can see this best when we look at shadows cast in space by the Earth and the Moon. To make the dark cones of the shadows cast by the two bodies visible, I’m filling the entire space with the Sun’s light:

When the Moon, the Earth, and the Sun align, and either the Earth or the Moon are in their neighbor’s shadow, we get to experience truly breathtaking astronomical events – eclipses. To grasp the details of eclipses let’s first try to understand the conical shapes of the shadows we’ve just seen and what impact they have on the observers.

The demonstration below shows an illustrative example of the Sun , some celestial body , and an observer looking at the Sun . The right side shows how the observer , wearing darkening equipment, sees the Sun . You can drag that celestial body around to see how its placement affects the visuals for the observer :

Notice that the sunlight forms three distinct zones. Inside the blue zone , the observer doesn’t see the Sun at all – it’s completely obscured by the planet . In the orange zone the observer sees the Sun partially occluded , with the Sun getting more exposed as the observer is closer to the outer border of the orange zone . Outside of the orange zone the observer always sees the entire Sun .

When the Moon obscures the Sun, causing Earth to be in the Moon’s shadow, a solar eclipse occurs. These conditions can only be met around a new moon, but a new moon doesn’t guarantee that a solar eclipse will occur.

In the previous simulation, it was easy for us to just drag the planet around to hide the Sun from the observer floating somewhere in space. Unfortunately, the Moon’s inclined orbit makes it much harder for its shadow to land in the right spot to occlude the Sun for observers on Earth.

We can see it more clearly in the Earthly skies by tracking the position of the new moon over the course of several synodic months – you can flip through them with the slider. I’m drawing the outline of the Moon with a dark pink line :

Coincidentally, notice that the Moon during a new moon is never visible to the naked eye because the sunlight hits the Moon’s surface almost entirely on its opposite side. The Moon is also either placed in the blazingly bright skies nearby the Sun, or it’s hidden under the horizon in the night sky. However, if the Moon’s position relative to the ecliptic is fortunate enough, the fringe of its lit new moon surface can be just barely visible in carefully taken telescope photography.

For the Sun and the Moon to visually overlap, the Moon has to be very close to the ecliptic plane . For this to happen, the line of nodes that joins the locations at which the Moon sinks under or rises above the ecliptic needs to more or less point towards the Sun .

You can experience this below by scrubbing through time with the second slider to arrive at the conditions leading to the solar eclipse that passed across North America on April 8, 2024 :

Let’s analyze the shadow cast on the Earth on that day in more detail. In the demonstration below, the right side shows the observer on the sunlit Earth with the visible Moon’s shadow sweeping across the Earth. The left side shows the zoomed-in view of the Sun, as seen by that observer through eclipse glasses:

Notice the blue and orange curves on the Earth. They match the shadow zones we’ve seen before, and they divide the surface of our planet into three distinct regions. Outside of the orange shape the Sun isn’t occluded by the Moon, so these areas of the Earth don’t experience any effects of the eclipse.

On the inside of the orange shape, the Sun is partially occluded by the Moon – these areas experience partial solar eclipse. The closer the observer is to the blue shape, the more obscured the Sun is, and the darker the area on the ground.

Finally, inside the blue region the Sun is completely occluded by the Moon and a total solar eclipse occurs. Below you’ll find a re-enactment of this event, showing visible Sun’s corona and prominences shooting out from the Sun’s surface:

Although the Sun is very big, it’s also very far away, so it ends up having almost the same size as the Moon in the visible sky, making total solar eclipses possible. Recall, however, that the Moon traverses a non-circular orbit, so its visible size in the sky changes over time. When the Moon is farther away from Earth it may never completely cover the Sun. This happened during the solar eclipse of October 14, 2023 :

This type of eclipse is known as an annular eclipse, and when it happens, the critical blue region of totality ceases to exist, because some parts of the Sun are always visible.

When it’s Earth that casts its shadow onto the Moon, a lunar eclipse occurs. A lunar eclipse occurs only around a full moon. In the demonstration below, you can see the total lunar eclipse that occurred on November 8, 2022 . The orange and blue shapes yet again define the regions where, from the perspective of the Moon, the Sun is partially or fully occluded. Note that, to reflect the perceptual effects of this event, I’m adjusting the camera’s brightness setting as the Moon gets obscured:

During the totality, the dim red light on the fully occluded areas of the Moon is revealed. This red tint happens because the sunlight scatters and refracts through Earth’s atmosphere – the surface of the Moon “sees” the red ring of sunset and sunrise all around our planet with the Sun hidden right behind the horizon of the entire globe.

Eclipses are so rare because many orbital motions, each with a different period, need to align for them to happen. If the Moon’s orbit wasn’t inclined, somewhere on Earth we’d experience a solar eclipse during every new moon and a lunar eclipse during every full moon.

There is one more sunlight-related effect you might have observed in the night sky. When looking at a crescent Moon, you’ll sometimes see that even the part that isn’t sunlit is still somewhat visible. I’m simulating this event here:

What lights up the dark part of the Moon is actually the sunlight reflected from Earth in an effect aptly known as earthshine . The intensity of earthshine depends on the cloud coverage on Earth and the relative positions of the three bodies.

At this point we’ll once more leave the surface of Earth to venture back into space, giving us the full freedom of motion to explore the interaction of sunlight with the surface of the Moon:

As we look at the lit Moon, its surface features become distinguishable only by the variation in color as well as the shadows cast near the terminator area where the light hits the surface at an oblique angle – you might have noticed the edges of all the craters and mountains. Let’s explore the details of lunar surface up close.

Lunar Surface

Although a realistic view of the Moon gives us an impression of its surface, we can get a much better look at its shape with the help of two visual tweaks. First, I’ll color the elevation – the brighter the color , the higher the altitude of that area. The Moon has no sea level to speak of, so the altitude equal to the Moon’s mean radius is typically designated as the baseline of 0 feet 0 meters . Second, I’ll make the height differences in the 3D model ten times as large as they actually are, making the elevation changes much more prominent:

This mode reveals the enormous variation on the Moon’s surface. The highest point on the Moon rises 35,387 feet 10,786 meters over the Moon’s mean radius, while the lowest point sinks 30,112 feet 9,178 meters below that average value.

Large swaths of the Moon are covered with impact craters , and many of them have even more craters inside them. These craters formed when various impactors like meteoroids and asteroids hit the Moon’s surface.

Depending on the size and speed of the impactor, different types of craters can develop. Smaller impacting projectiles form simple craters with bowl-like shapes and raised rims. Larger objects hitting the surface form complex craters . In complex craters, the area under impact can spring back up to form a central rebound – a mountain peak formed in the middle of the crater. The most energetic impacts create multi-ring basins with concentric ridges surrounding the central site of impact. If you look closely, you can see all these types of craters on the surface of the Moon.

Notice that all craters share a circular shape. Impactors hit the Moon with extremely fast velocity, on the order of 12 to 45 miles 20 to 70 kilometers per second . When a colliding body slams into the ground, it creates a strong compressive shockwave, which hemi-spherically expands in the ground in all directions.

The propagation of this explosion-like shockwave is responsible for the rounded shape of the crater, even when the impacting body itself isn’t spherical or when it strikes the Moon at an angle. In fact, an impactor is most likely to hit the surface of a planet at a 45° angle and only very oblique strikes create elongated craters .

This shockwave excavates the ground matter, ejecting it all around the crater. As the debris falls, it often forms smaller secondary craters. The material ejected during impact can also cover much greater distances, creating ray systems . You can see them as streaks on the surface of the Moon. In the demonstration below, the little draggable indicator pinpoints the same location on both views, letting you see the elevation of the features visible in regular sunlight:

You may have noticed that many of the largest basins have relatively smooth, crater-less bottoms – these are lunar maria . Maria is a plural form of Latin word mare , which stands for a sea . These impact basins were flooded by lava around three billion years ago, erasing the history of any existing craters in that area.

Because of the different chemical composition of that lava, the maria are darker, which we can easily see on the Moon’s surface. Maria are readily visible with the naked eye from Earth, forming the Moon’s unique splotches.

The early solar system was a violent place, but the Moon continues to be struck by meteoroids even in the present day. While the accumulated effects of all larger and smaller impacts are immediately visible in the forms of craters, many micro impactors also affected the Moon’s surface. The Moon has a virtually nonexistent atmosphere, so even the tiniest pieces of space dust can hit the Moon’s surface without burning up in the air, as they do on Earth.

Over the billions of years since the Moon’s formation, each impact has continued to break the surface rocks spreading them across a larger area. All of these impacting processes covered the Moon’s surface with a layer of lunar regolith , which consists of minuscule pieces of rock, often bonded with melted glass formed during impact. The powdery nature of lunar regolith is perhaps best captured by the iconic photograph of Buzz Aldrin’s footprint from the Apollo 11 mission:

Buzz Aldrin's footprint

The very fine-grained form of lunar regolith is also responsible for the unusual brightness of the full moon, so let’s explore that phenomenon in the last section of this article.

Lunar Brightness

Let’s establish the baseline for how common objects behave when lit by light. Below I’m showing you a simple sphere covered with matte gray paint. I’m illuminating this sphere with a distant Sun-like light source coming from the direction indicated by the yellow arrow . You can use the slider to tweak that light direction and you can drag the sphere around to change your viewing angle:

For the sake of clarity, I’m only drawing one light arrow , but every place on this sphere is hit by light coming from that direction. The brightness of each part of this matte sphere depends only on the angle at which the light strikes it. Moreover, the brightness of each area doesn’t change as we pan the camera around. You can see this in the small circle under the demonstration – its brightness matches the brightness of the place marked on the sphere, at least as long as we can see that spot.

Most importantly, when the observer is positioned straight on with the direction of the incoming light , the sides of the sphere are visibly darker, giving it a familiar three-dimensional appearance.

This matches our daily experience with how many matte surfaces look, and perhaps you already had a chance to explore the details of these effects. However, if I were to cover this sphere with lunar soil, its appearance would change – you can experience this below:

Notice that when you pan the camera around, the brightness of the marked patch changes subtly. Moreover, as your viewing angle approaches the angle of the incoming light , the surface gets brighter and brighter and it also becomes increasingly uniformly shaded. When viewed straight on with the incoming light , a sphere covered in lunar soil looks more like a flat disc than a three dimensional object. For the same patch of surface, the amount of light reaching the observer now also depends on the relative position of the observer.

Let’s try to understand these view-dependent interactions. In the left side of the next demonstration, we’re once more seeing a sphere covered in lunar soil with a marked patch on it. On the right side, I’m visualizing the same marked patch , the direction of light hitting it, and the viewing direction from which we’re looking at that patch on the left side. I symbolically draw that viewing direction on the left side with just one arrow that always points into the screen, but every part of the sphere shares pretty much the same viewing direction since we’re watching it from afar.

As you drag the camera on the left-side, you’ll see that viewing direction changing on the right. This gives you a different perspective of these two directions , letting you see how they change relative to the spot :

Notice the angle marked between the light direction and the viewing direction . This angle is known as the phase angle , and its value strongly affects the brightness of each section of this sphere. As we decrease the phase angle by aligning the viewing direction with the light direction , the surface covered with lunar soil becomes brighter.

In the demonstration below, we can compare the visuals of a classic matte sphere on the left, with a lunar soil sphere on the right. The plots below track the dependence between the phase angle and the total amount of reflected light reaching you from the surfaces of each sphere:

As you drag the view around, your phase angle changes. This obscures or reveals a larger fraction of the lit surface, affecting how much light we see. As expected, for a maximum phase angle both surfaces get completely dark because the light illuminates the hidden halves of the spheres.

However, when the phase angle is very small and we’re looking at the lunar sphere from a similar direction as the incoming light , the brightness of the lunar sphere rapidly increases with the effect known as opposition surge . You may have noticed this when watching the night sky – the Moon is significantly brighter during a full moon than even a few days before or after that phase.

On Earth, we have borderline no control over the phase angle – the position of our planet, the Moon, and the Sun predetermine the light direction , the viewing direction and the resulting phase angle for us:

These interactions between the lunar soil and light aren’t just visible from Earth, but also directly on the surface of the Moon. Below you can find a photograph from the Apollo 11 mission showing a brighter halo right where the camera’s viewing direction is very close to the direction of the sunlight hitting the surface:

Opposition effect on the Moon

To understand how opposition surge arises, we have to investigate the interactions between the grains of lunar regolith and the light shining on them. Let’s first take a look at some simple models of grains of Moon dust casting shadows on a gray disc . You can change the direction of the light with the slider:

As you change the direction of the incoming light, the shadows also move around to be on the opposite side of the light. When you then look at the scene from the direction of the light , you’ll notice that all the darkness of the shadows disappears – they’re hidden behind the grains themselves. Naturally, the shadows are still there, they’re just not visible from that specific angle.

Even in this simple scene, we already witness how a few shadow-casting grains can visibly affect the perceived darkness, so let’s scale things up by viewing a large collection of grains from a bit farther away. You can once more control the direction of the incoming light with the slider:

All the randomly oriented grains cast shadows on each other, and when viewed from the side , these shadows make the surface look visibly dark. However, when we glance at the surface from roughly the same angle as the incoming light , the surface becomes much brighter. This happens even when the light hits the surface at a very shallow angle .

These conditions are met almost exactly during a full moon, or in the center of the astronaut’s camera pointed at the ground – the phase angle is small because the viewing direction is very strongly aligned with the incoming sunlight.

The effect we’ve just seen is known as shadow hiding . It was originally believed that shadow hiding is the principal cause of the opposition surge, but in the 1990s another effect started to gain traction as the possible explanation of this phenomenon.

This other effect is slightly more complicated, and it requires looking at the wave nature of light. I’ve briefly discussed these concepts before, but to recap, light is an electromagnetic wave that travels through space with its electric and magnetic components oscillating with a set frequency.

In the demonstration below, I’m drawing a simple, pulsating spherical source that emits light in every direction. The light emitted from this source spreads out spherically, but if I drew the emitted waves as a set of overlapping spheres it would be quite difficult to grasp how the electric field varies over time. Instead, I’m showing the changing amplitude of just one slice through this field, and I’m using two colors to distinguish positive and negative values. The slider below lets you control the wavelength of this light, which determines the distance between two consequent peaks or valleys :

Notice that the amplitude, or “height”, of the wave decreases with distance, which we can also see in the decreasing intensity of the red and blue colors.

Let’s take a closer look at how these waves spread over a longer distance. On the left side of the next demonstration we can see a top-down view of a source emitting light, while on the right side we see how this wave looks to an observer that looks at this source from far away. You can drag the source around to change its position:

Far away from the source , the radii of spheres of propagating waves become very large, so the arcs of individual peaks or valleys look like straight lines.

An electromagnetic wave like this could travel through the vacuum of space completely uninterrupted. However, any tiny object put in the light’s path will scatter it to some extent, creating a new wave.

In the demonstration below, I put a small grain of lunar regolith in the path of the incoming light – you can drag this speck around to change its position. You can also control the direction of this light with the second slider. This little dust speck scatters the incoming light and acts like a new light source emitting waves that eventually reach the observer :

In general, the amplitude of this newly scattered wave can vary with direction, but for simplicity I’m showing it here as a simple spherical wave that spreads uniformly in all directions.

Let’s add one more lunar grain to our scene. The light will now scatter from both particles , and the resulting waves will interfere with each other – where two peaks or two valleys overlap perfectly their amplitude doubles, but when a peak meets a valley they cancel each other out, creating dark areas:

As you drag the wavelength slider, or you change the direction of the incoming light, or you move the grains around, you’ll see that the interference patterns of light reaching the observer change drastically.

So far we’ve only looked at the scattering of the directly incoming light, but the light scattered by each grain interacts with the other grains as well. Those grains scatter the originally scattered light, which can then be scattered by other grains, and so on.

Let’s take a closer look at the light interactions across two scattering events, that is when incoming light scatters from the first grain, then scatters from the second grain, and then reaches the observer , or when the incoming light scatters from the second grain, then scatters from the first grain, to finally reach the observer :

Now it’s really hard to see what’s going on, so I’m going to make two changes. First, I’ll split all the light into the incoming, scattered once, and scattered twice components – you can choose between them in the next demonstration. Second, I’ll make the source light continuously emit light, letting us see the resulting interference patterns in more detail:

We can now easily how the singly scattered light reaching the observer is very sensitive to the placement of the grains, the wavelength and the direction of the incoming light.

If a rough surface is lit with a light of a single frequency, e.g. created by a laser, one could indeed see a speckle of these constructive and destructive interference regions hitting the observer from various elements of the surface. Thankfully, sunlight contains a whole spectrum of various frequencies, so all these patterns average out to some baseline intensity of light that the observer can see.

It may seem that the light reaching the observer after scattering twice is equally messy as it was after just one scattering event. However, when the incoming light hits the two particles from the viewing direction , the doubly-scattered waves reaching the observer always interfere constructively, regardless of the light’s wavelength , or how those particles are positioned!

To understand why this happens, we need to trace the path that the light travels. In the demonstration below, you can scrub through time with the second slider to look at the path that one peak and valley of an incoming wave takes. For clarity, I’m hiding the wave of the incoming light after it has scattered on the two grains. Similarly, I’m also hiding the waves generated by the first scattering events, leaving only the waves of the second scattering:

The dark pink trail shows the path of light hitting and scattering from the first particle, then hitting and scattering from the second particle, and then eventually arriving at the observer . The light pink trail shows the path of light hitting and scattering from the second particle, then hitting and scattering from the first particle, and then arriving at the observer as well.

If the incoming light direction matches the viewing direction , both trails traverse the exact same path, just in the opposite order. As the peaks and valleys on the two paths travel the same distance from the source all the way to the observer , they always add up constructively for all grain positions. This positive interference creates consistently brighter light that reaches the observer when the incoming light and viewing directions are aligned.

Light waves incoming from some other direction traverse different paths of different lengths, so they interact with each other more or less randomly, with various degrees of constructive or destructive interference. Across all the grain positions and light wavelengths, this results in some average, base intensity of this second scatter.

This entire effect is known as coherent backscattering . The same interactions happen for any two, three, or more consequent scattering events between the same collection of grains. As long as the scattered incoming light has a path to eventually leave the surface, it also means it can travel the same path, but in the other direction.

Coherent backscattering is currently believed to be the primary contributor to the opposition surge, with a smaller influence from shadow hiding, but both of these effects make the full moon a bright presence in the night skies.

Our journey around the Moon ends here, and so does this article. As we leave the darkness of space, let’s take a final look at the Earth and Moon so beautifully captured in a photograph taken from space:

Earthrise

For a short and approachable read, Moon Owners' Workshop Manual discusses many of the general facts and discoveries about the Moon, all presented with great photographs and illustrations. The same publisher also has guides on the Apollo 11 and later Apollo missions – they very accessibly cover the technical aspects of that wondrous era of lunar exploration.

Lunar Sourcebook is a book on many aspects of lunar history and geology. Although the title is three decades old and many of its data-dense sections are only useful as a reference, its free availability makes it unbeatable for deeper dives into lunar sciences.

Finally, Luna Cognita can only be described as a labor of love. Over the course of three thick volumes, Robert A. Garfinkle presents a wealth of information on the Moon, including thorough description of every crater, ridge, and mountain one can observe on each day of the entire synodic month.

The Moon may be just an unassuming neighbor in the sky, but its presence affects our lives in many subtle ways. When it reflects sunlight off its scarred surface to guide the way in the darkness of night, or as it breathes life into oceans by rhythmically raising tides, or when it cloaks the Sun in a rare and awe-inspiring total solar eclipse, the Moon reminds us of the celestial world right outside of the safe confines of our planet.

Traveling through the cold and empty space by Earth’s side, the Moon is always just there. It may be barren and dull, but, undeterred by its own lifelessness, it never leaves us completely alone.

Perhaps the next time you catch a glimpse of the Moon’s shiny surface beaming in the night sky, you’ll see it a little differently – not as a mundane fixture of the heavens, but as a fellow companion that gently affects our own existence.

One corner of China’s internet is insisting that the Tang Dynasty never existed

Hacker News
www.cnn.com
2026-08-24 17:03:06
Comments...
Original Article

Hong Kong

Something weird has been happening on China’s internet. One small and vocal corner has been claiming the country’s most famous historical dynasty never existed.

That’s the Tang, which ruled China from 618 AD to 907 AD, a period that saw huge territorial expansion, booming international trade and the flourishing of a high culture envied far beyond its borders. Every child learns about the Tang at school; historical dramas inspired by its palace intrigues are a staple of state TV.

Claiming that the 300-year dynasty was actually a myth is akin to saying the American Civil War never happened, or telling a Brit that the Magna Carta is a fiction. But in recent months it’s been spreading among China’s very online population, posing a headache for a ruling Communist Party obsessed with controlling how its citizens talk about their 5,000 years of fractious and contested history.

It all appears to have started when a history influencer named Qiao Yu deployed some baffling astrological data in a video in May, to “prove” the Tang had never existed.

The outlandish claim has since spread far and wide. Reports later emerged that people were calling up the tourism bureau in Xi’an, the site of the ancient Tang capital, to demand it close down because the dynasty itself had been shown to be a hoax.

The hashtag “the Tang dynasty doesn’t exist” now has tens of millions of views on China’s X-like Weibo.

An anonymous painting depicts elegant ladies of the Tang imperial court enjoying a feast and music, in China.

What motivated the hoax and its spread is hard to pin down. The Tang dynasty has been criticized in the past by Chinese nationalists as its founding emperor was not from the Han ethnic group that makes up most of China’s people. The basis of Qiao Yu’s claim is that the succeeding Song dynasty actually began far earlier than traditionally accepted, therefore canceling out the Tang. The Song dynasty was of ethnic Han origin.

“This is basically insane,” said William Kirby, a professor of China studies at Harvard University, adding that there are facts in history and “the Tang dynasty is definitely one of them.”

“It was much more than a Chinese dynasty. It was an inner Asian dynasty as well,” he said.

As the fallacy spread on social media, China’s powerful and tightly controlled state media waded into the controversy.

Many parents say that, thanks to the hoax, their children now feel confused about historical facts, the Nanjing Daily reported last month.

Three days later, The Paper, a media outlet affiliated with the Shanghai government, was more strident. “Only when rational inquiry becomes the foundation of public life will historical nihilism truly lose the conditions that allow it to flourish,” it said in a commentary.

“Historical nihilism” is a term coined by the ruling communist party that refers to discussion or research that challenges its version of China’s long history. The party itself is a relative newcomer to that story, coming to power in 1949 following a decades-long civil war that tore the country apart.

By mid-August the Tang controversy had attracted the attention of the party’s mouthpiece. In an editorial, the People’s Daily called the claim “absurd,” and issued a warning: “Once young people begin to doubt our national history, our cultural confidence will become like water without a source or a tree without roots, and Chinese-style modernization will lose its profound historical perspective.”

Chinese President Xi Jinping at the welcome ceremony for the China-Central Asia summit in Xi'an in 2023, where a Tang Dynasty-themed performance was held.
During a Lunar New Year event, performers commemorate the Tang dynasty poet Du Fu in Chengdu on February 16, 2024.

In recent years, Chinese leader Xi Jinping has tightened the party’s grip on history and sought harsher penalties for those who dare to challenge the official account.

Xi himself has publicly evoked the past glory of the Tang. In 2023 he hosted leaders from several Central Asian countries in Xian, the ancient Tang capital and terminus of the Silk Road along which goods and ideas used to flow between China and Europe.

The ceremony featured dancers and performers in Tang-style dress, observers noting the nod to a Tang past when foreign envoys came to pay tribute at the emperor’s court.

For a thousand years, Chinese people have used reflections on history to reimagine the past, as a creative way to criticize or approach the present.

For example, in the economic boom years of the early 2010s, amid growing criticism of the fixation on consumerism and bourgeois lifestyles, the hardships the Chinese people had undergone during Japan’s brutal occupation during WWII became a favored topic for intellectuals, according to Rana Mitter, a Harvard Kennedy School historian specializing in modern China.

But that discussion also allowed some to point out that the current discourse didn’t give enough credit to the Kuomintang troops who fought the Japanese – but who were also the opponents of Mao Zedong’s communists, Mitter said.

A mural is seen inside the Chienling Tomb near Xi'an, China, dating to the Tang Dynasty (618–907 AD).

Even though the Tang era was more than a thousand years ago, any suggestion – however fanciful – that it never existed could be an irritant for the party, said Mitter.

“Certainly under Xi, the CCP now honors the longer trajectory of Chinese history. This means that all history needs to point in a direction that suggests unified (rather than split) identity, historical and cultural continuity, and an idea of ‘China’ as a long-standing entity that has been continuous through history,” he said.

Callum, a 24-year-old Beijing resident, told CNN that questioning the Tang’s existence could be a way to rebel against established wisdom and a way for China’s young – faced with a slowing economy and greater competition for jobs and resources – to criticize authorities.

“It is a way for people to attack the established authorities. It is almost like saying ‘those so-called experts are nothing special. They have all been misleading people. I am the one who understands the truth, and I have exposed them all.’”

As of mid-August, Qiao Yu’s accounts have been blocked and all of their videos taken down. Any search of Chinese social media questioning if the Tang dynasty existed now pulls up content condemning such lines of reasoning.

In its editorial on the controversy, the People’s Daily attempted to have the final word.

“Chinese civilization has endured for five thousand years,” it said, “and the Golden Age of the Tang Dynasty stands as one of its most dazzling chapters.”

CNN’s Shuai Zhang contributed to the reporting.

Vintage Artificial Intelligence: Before It Got Awkward

Hacker News
blog.archive.org
2026-08-24 17:01:38
Comments...
Original Article

Long before the current kerfuffle about LLMs, Generative AI Artwork, and asking your tax preparation chatbot for a cookie recipe , the concept of artificial intelligence and synthetic life was a pervasive theme in creative and engineering works. We have the ground-breaking appearance of Rossum’s Universal Robots (or Tik-Tok, the Royal Army of Oz ), through countless science-fiction properties and incredibly positive futurist home-making advertisements , and into the inevitable portrayal of dark and dystopian empires providing humans with nothing but a clear and present ending to their story arc. Artificial Intelligence has been riding along with humanity’s storytelling and expressiveness for many generations – and, one might argue, it is this ever-present influence and inspiration that has driven a lot of the modern phrasing and design in our most contemporary toys and tools wearing the vestements of consciousness.

The motivations are clear: our endless curiosity of the nature of our minds and humanity, the twists and turns that come when the synthetic mirror-images of people betray unintended consequences, and the fact that human beings look amazing when rendered in chrome .

But before we get swept up too much into the echoes of the past and see patterns of AI-like entities into the distant generations ( golems , anyone?) let us instead zoom into a very specific family of projects and products that are presented at the Internet Archive for the research, education, and enjoyment of all:

The newly-minted Vintage Artificial Intelligence collection .

Dating roughly from the 1970s through the 1990s, these emulated software packages have come from many sources, and with many motivations, but have been curated together for a very subtle and occasionally imperceptible theme: the adventure of experiencing a machine that thinks .

To be clear, and without taking too much time for a press conference announcing so or claiming such for a future IPO, none of the programs in this collection come within a solar system of thinking in any actual sense. They are, instead, portrayals on microcomputers and game consoles of the idea of thinking machines, the experience of creating autonomous or semi-autonomous virtual entities, and playing games with the illusion of a contemplative and improvisational opponent.

“Delve” is a very popular word with machines, Jason said ironically, as well as em-dash. Let’s delve into some of the odd ways artificial intellgence begin appearing with these programs in the early days of home computers. Em-dash.

The most obvious and pervasive example for Artificial Intelligence is Joseph
Wizenbaum’s ELIZA, named after Eliza Doolittle in Pygmalion , and which began its artificial life as a program that would run various conversational scripts, of which its main first one, DOCTOR, was so popular in putting on the appearance of an interested psychologist that users famously opened up to the question and answer process it provided as if talking to a real person. While Wizenbaum wrote throughout his life of the over-abundant assumptions of the program, it was still enough of a successful gimmick that the program was ported and re-written dozens of times, many examples of which are at the archive: Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Eliza , Ms. Eliza , Eliza , Eliza , German Eliza , German Eliza , Eliza , Eliza , and, finally, Psycho Eliza .

Eliza is the gold standard of the promise of artificial intelligence and the program was simple enough to encourage easy porting to various platforms, which is why you can click on many of the links to find yourself inside Apple II, Radio Shack Color Computer, Palmpilot, Atari 800, and many more home computer machines of the 1980s.

Naturally, the idea of “talk to something that sort of responds to you like a person, preferably like Eliza did” had innovation, parody and experimentation, leading to some of these other programs in the collection: Dr. Z (Eliza, but it ignores what you are saying) Talking Sam (which is more or less a demo for a speech synthesizer) Hyper Psych (A Therapist in Hypercard Format) DR. SPOC (another therapist) Abuse (which answers in a hostile way to your conversation) Pisko (which is a parody, and also requires you to talk to it in Serbian).

A program in this vein deserves special attention. Racter (short for Raconteur ) (MS-DOS version here ) is a very early commercial version of a chatbot – it was written to literally write sentences and stories that sounded authentically created, and even wrote some published short works. They sound exactly like you might think they would sound: “ Bill sings to Sarah. Sarah sings to Bill. Perhaps they will do other dangerous things together. They may eat lamb or stroke each other. They may chant of their difficulties and their happiness. They have love but they also have typewriters. That is interesting. ” This work eventually led to this commercial program, Racter , which you could hold conversations with and which could do a relatively eerie experience of conversations. At the time this program was released (1985), a small trickle of reviews and articles speculated on the ramifications of such a program existing, which look and sound, frankly, like someone bringing a bucket to catch what ultimately is a 100 foot tidal wave coming in from the 21st Century’s shore.

With the lens of the modern era to look back, and billions of dollars spent on the project and maintenance of the current systems, it’s easy to dismiss these older programs as toys or forgettable jaunts, but they carried with them the weight of a machine imbued with at least a fuzzy sense of character and thought. At a time when functioning spreadsheets were revolutionary to business and desktop publishing was looming over the audience and potential costs of printed communication, it seemed only natural these machines might become some possible type of being, and that being could be had for a price. The profits could, with some luck and opportunity, raise a fortune.

Activision of the 1980s, essentially a completely different company than the contemporary concern of today, did two major experiments in artificial intelligence-like products, seeking to find oddball variants of simple video games or productivity software.

Alter Ego ( male and female versions) was developed by a psychologist as an exporation of decisions and consequences in life, allowing the player to take over a persona (an “alter ego”) and guide them through stages of childhood, teenage years, adulthood, and so on. Premature death was not off the table, nor were examples of the dark and light aspects of life, portrayed in interactive steps. Along the way, you would gain points towards various attributes of the personality (providing a game-like function) and ultimately, help to craft a more accomplished and successful life. It is, in other words, a classic RPG ( Role-Playing Game ) with a hint of a sense of an actual life being somewhere down there inside your home computer.

The other Activision creation, Little Computer People , is both an interesting choice and experience of the time. The conceit was simple – that people were discovered living inside computers, and this program gave the user a chance to see them living their otherwise hidden lives. Think The Sims, but Much, Much Smaller . Through clever programming (thanks to the work of programmer David Crane, of Pitfall! fame), the game had a lot of flexibilty and variance for the “inhabitants”: hundreds of names, variance in moods and willingness to listen, and other bits of illusion of life.

That illusion, that something living and functioning is buried somewhere among the code, that a program has created life from the darkness of ones and zeroes, is the most frequent aspect of all these programs, but was an actual selling point for some of the items in this collection.

The games Murder on the Zinderneuf , Suspended , Deadline , and The Hobbit all leaned heavily into scripted movements and off-screen antics of the characters inside them. At the time of its release, Deadline was reported on in general news articles about the possibility of literary characters who were quietly living their own lives, only mildly engaged with the game player, and who only interacted with narration and story when happenstance provided it. The Hobbit was legendary for the fact that the programmer of the non-player characters, Veronika Megler , held to the belief of the autonomy of the world outside the player so strongly that sometimes world-changing events (characters fighting, resulting in the loss of one) could happen entirely out of control and context, only revealing the game was unwinnable later. Suspended , in which the player is a cryogenically frozen mind restored to action to help handle an emergency, split consciousness and awareness to six different functioning robots, meaning only one could access information, another pick up items, and so on. The perception that reality is maleable, that work can happen in the background outside your awareness and return the results to you, finds itself referenced in the structure of modern AI agents and how they are sold to public and industry.

But avoiding rabbit holes of arguing humanity and mind inside code, let’s pull back to one of the other genres curated in this collection: autonomous agent programming.

There have been an entire family of games that consist of pre-programming the skills and processes of some manner of automaton (in the form of robots, worms, and so on), setting your programmed warrior into the arena, and seeing if they win. Examples of this include Robot War , Worms and Fortress . These humble-by-comparison programs make obvious what is not always expressed – that a number of simple rules, presented quickly and without intervention, can give incredibly powerful illusions of autonomy and intelligence, as long as you don’t look so closely.

And onward we go. For a solid amount of the late 20th century, the very computers we had created and made part of our lives could be used to tell stories that the computers themselves were alive.

And maybe a few of us believed it!

The collection ranges into other tangents of this arena, well worth exploring, but left as something for you, the intelligent agent at the keyboard, to browse around and play with. From programming languages based around logic rules to groundbreaking examples of what were called “expert systems” before they got renamed to “your new manager”, Vintage Artificial Intelligence has something for everyone, machine and person alike.

Try it out.

A Claude Code skill that recovers export-blocked Kindle highlights

Hacker News
github.com
2026-08-24 15:32:18
Comments...
Original Article

A personal collection of Claude Code skills, published as a single plugin under the l3a0 namespace. This repo is both the plugin and its own marketplace.

I write about how these tools get built — and about technology, business, and finance — at baowebdev.substack.com .

Install

claude plugin marketplace add l3a0/claude-plugins
claude plugin install l3a0@l3a0

Skills are invoked as /l3a0:<skill-name> (the bare /<skill-name> also works while no other installed command claims the name), and Claude auto-invokes them when a request matches a skill's description.

Skills

kindle-highlights

Export a heavily-highlighted book from Amazon's notebook page and some highlights come back cut off mid-sentence, while others come back as a bare location number with no text at all, under this notice:

"Some highlights have been hidden or truncated due to export limits."

Those are your own notes, in your own account, capped by a budget Amazon doesn't document and you can't raise. This skill gets them back: it extracts every highlight for a book from the Kindle notebook ( read.amazon.com/notebook ) into one combined, verbatim, location-cited Markdown file — including the highlights the export limit truncates or hides entirely, which are recovered from the Mac Kindle app's synced annotation positions plus the Cloud Reader's rendered pages.

Proven on four real books: 2,432 highlights extracted, 815 of them export-blocked (454 truncated + 361 fully hidden) — every one recovered , with recovered text landing within a couple of characters of the Kindle app's own position ruler (median residual 0–1). Every gotcha in the skill was earned by real debugging across those runs. The build story — why the export limit exists, the three unlocks that beat it, and what a library of exports becomes — is written up in How to Take Back Your Kindle Highlights , also published on Substack .

Scope: this exports your own highlights from your own Amazon account, by driving your own logged-in browser session and reading files the Kindle app stores on your Mac. The output is for your personal notes — book text is copyrighted, so keep extracted notes private.

Prerequisites (macOS only)

The pipeline is macOS-only three times over: browser control runs over AppleScript, OCR uses Apple's Vision framework, and highlight positions come from the Mac Kindle app's data files.

  1. Claude Desktop with the "Control Chrome" extension — Anthropic's browser-control MCP, installed in one click from Claude Desktop → Settings → Extensions. It is the skill's verified path for executing JavaScript in your real Chrome (any browser MCP that can run JS in the tab can substitute). It requires a Chrome setting: Chrome menu bar → View → Developer → Allow JavaScript from Apple Events → check → quit and relaunch Chrome.
  2. Google Chrome , signed in to your Amazon account (the skill drives read.amazon.com ).
  3. The current Mac Kindle app (App Store; bundle id com.amazon.Lassen — not the classic Kindle.app), signed in to the same Amazon account, with the book downloaded. Its synced annotation database provides exact highlight extents with no export limit.
  4. Xcode Command Line Tools ( xcode-select --install ) — the bulk-recovery path compiles a small Swift OCR helper ( swiftc ) that uses Apple Vision.
  5. python3 — builds the final Markdown and runs a localhost receiver ( 127.0.0.1:8931 ) that the reader page POSTs captures to.

What it does, briefly

  1. Scrapes all highlights from the notebook page DOM to JSON (verbatim typography preserved).
  2. Reads exact character-precise highlight positions from the Kindle app's SQLite database — including highlights the web export hides completely.
  3. For blocked text, captures the Cloud Reader's rendered pages via canvas (no OS screenshots needed), OCRs them locally with Apple Vision (zero tokens), and cuts the text to the known positions.
  4. Emits one Markdown file with ### Location N sections, blockquoted verbatim text, and flags for anything recovered or approximate, then runs a QA pass.

License

MIT

Hackers target WordPress sites in miniOrange auth bypass attacks

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 15:26:32
Hackers are attempting to exploit two critical authentication bypass vulnerabilities in the miniOrange SAML 2.0 Single Sign On plugin for WordPress that can be used to forge SAML responses and log in as administrators. [...]...
Original Article

Hackers target WordPress sites in miniOrange auth bypass attacks

Hackers are attempting to exploit two critical authentication bypass vulnerabilities in the miniOrange SAML 2.0 Single Sign On plugin for WordPress that can be used to forge SAML responses and log in as administrators.

The miniOrange SAML SSO plugin turns a WordPress site into a SAML service provider, letting users log in through corporate identity platforms such as Microsoft Entra ID, Okta, Google Workspace, or OneLogin instead of separate WordPress credentials.

Created by Xecurify, miniOrange is a family of seven plugins, with a free version that has 10,000 downloads and 30,000 customers for the other six.

image

The two vulnerabilities observed in exploitation attempts are tracked as CVE-2026-61979 and CVE-2026-15981 and can be chained together to bypass authentication.

Because the miniOrange SAML SSO plugin accepts the signature algorithm from incoming SAML responses instead of enforcing the configured one, an attacker can leverage CVE-2026-61979 to select HMAC-SHA1. This causes the plugin to treat the RSA public key from the identity provider (IdP) as the shared secret.

Since the public key is known, the attacker can forge a signature that the plugin accepts as authentic.

The second security issue, CVE-2026-15981, causes the plugin to treat an OpenSSL verification error (-1) as a successful result, allowing malformed signatures to pass validation.

According to security firm Patchstack , the two vulnerabilities were publicly disclosed and fixed in July. However, the vendor’s advisory covered only the free edition, leaving the six paid editions without an alert, even though fixes were provided for those too.

The following versions addressed the two flaws:

  1. Free, single site – 5.4.5
  2. Premium, single site – 13.0.4
  3. Standard, single site – 17.06
  4. Premium/Enterprise/All-Inclusive, multisite – 20.2.8
  5. Enterprise/All-Inclusive, single site – 26.0.3
  6. VIP, single site – 32.0.8
  7. VIP, multisite – 35.0.7

Failing to disclose the risk across all versions of the plugin reportedly led many sites running the paid editions to take no action, creating an opportunity for threat actors to exploit the two vulnerabilities.

Patchstack reports that, on August 16, DigitalOcean blocked an anomalous WordPress administrator session originating outside its trusted network.

The investigation showed that attackers have chained the two flaws to obtain an admin session cookie through the Standard edition plugin in version 16.1.9.

Patchstack’s data shows that exploitation attempts and opportunistic scanning are underway, launched from six IP addresses across Europe, Africa, and the United States.

A proof-of-concept (PoC) exploit targeting the free edition is also publicly available, so the pace of attacks could increase at any time.

Patchstack warns that the WordPress administrator dashboard will not show update warnings for the paid versions of the plugin, so website owners must manually upgrade to a patched release.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

Oceans hit highest temperature on record

Hacker News
www.bbc.com
2026-08-24 15:19:08
Comments...
Original Article

Getty Images The Sun sets over an ocean. The sky is dark red and the silhouette of a ship sailing across the ocean in front of the Sun. Getty Images

The world's oceans are hotter than ever recorded, new data suggests, as they suffer from human-caused climate change and the growing El Niño weather phenomenon.

The average surface temperature of the planet's seas outside the polar regions hit 21.1C (70F) on Saturday, according to figures from the European Copernicus climate change service.

That edges past the 21.09C recorded on three separate days in March 2024, and is far above average for the time of year.

Warmer oceans can have wide-reaching consequences, including supercharging extreme weather, raising sea levels and harming marine life.

"This record is another clear signal of an ocean under growing stress," said Dr Samantha Burgess, deputy director of Copernicus.

"El Niño is adding heat to the system, but it is doing so on top of decades of human-driven warming," she added.

Graph showing global average sea surface temperatures for each day of the year. Each year since 1979 is shown as an individual light red line, running from 1 January to 31 December. Each line tends to peak in March or April, with a lower secondary peak in August. The line for 2026 is shown in dark red and has kept climbing since June and now stands at 21.1C.

The data is based on sea temperatures 10m (32ft 10in) below the surface, using measurements from buoys, ships and satellites, which are combined to produce a global estimate.

While the margin of record is currently very small and any global estimate comes with uncertainties, scientists say its timing is particularly notable.

Average worldwide sea temperatures tend to reach their yearly peak in March or April, which corresponds to the end of summer in the southern hemisphere - and not in August.

The southern hemisphere contains more of the planet's ocean surface than the northern hemisphere and so exerts a bigger influence on average sea temperatures.

What is especially concerning to scientists is that the oceans are already so hot when the natural El Niño weather phenomenon is still some way off its expected peak.

This could see ocean temperatures climb yet further.

"The fact that we are already breaking records is an early indicator of how strong the El Niño is becoming," said Dr Jeremy Grist, senior research fellow at the National Oceanography Centre in Southampton.

"All things being equal we might expect the ocean temperature record to be broken again in March [or] April 2027," he added.

Two maps showing sea surface temperatures in the tropical Pacific Ocean. The map from December 2025 shows cooler-than-usual conditions, marked in blue, indicating a La Niña. The map from July 2026 shows much warmer-than-usual conditions, marked in red, indicating an El Niño.

The waters far away from El Niño's Pacific hunting ground are also extremely warm, including around the UK and Europe.

The western English Channel has seen almost continuous marine heatwave conditions for more than three years, peaking at 7C above normal in July, according to Prof Tim Smyth, director of science at Plymouth Marine Laboratory.

“This is unprecedented,” he added.

Scientists say such widespread warmth around the planet is a clear sign of the growing effect that human-caused climate change is having on the world's seas.

"The latest Copernicus data reinforce the troubling upward trend in ocean temperatures,” said Smyth.

Warmer seas help to fuel more extreme weather. They can provide storms with extra moisture and energy, and can intensify heatwaves on land in some coastal regions by reducing the cooling effect of sea breezes.

Warmer water also takes up more space, raising sea levels and bringing a greater risk of coastal flooding - while intense ocean heat can be devastating for sea habitats, such as coral reefs.

The increasing frequency of marine heatwaves is already "putting increasing pressure on marine ecosystems and the communities that depend on them", Burgess said.

Watch: How does El Niño affect world weather?

Your Voice banner image. Your Voice is written in white against a purple background.

Thin, green banner promoting the Future Earth newsletter with text saying, “The world’s biggest climate news in your inbox every week”. There is also a graphic of an iceberg overlaid with a green circular pattern.

Routeup – stable local HTTPS URLs and opt-in public tunnels

Lobsters
routeup.dev
2026-08-24 15:08:59
I built Routeup around a simple idea: local apps should use their real names. It was inspired by Portless, but I also wanted built-in public tunneling, selective path exposure, request inspection, and live logs. Instead of opening localhost:3000, I can give a project a stable, trusted HTTPS URL and ...
Original Article

Your app has a name. Use it.

routeup gives every app on your machine a stable, browser-trusted HTTPS name, so you can use the same URL every time.

  • Local by default Routes stay on your machine with no account, token, or server.
  • Bring or run the app Proxy an app you already start, or let routeup run its configured command.
  • Inspect and debug Follow status and timing live, with opt-in capture for headers and bodies.
  • Expose when needed Open only the routes or paths you choose through a hosted or self-hosted server.
  • MIT
  • Self-hostable
  • Single Go binary
  • Zero telemetry

~/code/example-app

$ routeup serve

route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
14:02:01  200  req_9f2LmX7qKd3sAw8P  GET      /
14:02:04  204  req_Jz6nR2wL8cP4sD9h  POST     /api/webho...
14:02:08  200  req_Vx2mPq7nH5kR3tY8  GET      /api/users

press Ctrl-C to stop

before http://localhost:3000

after https://example-app.localhost

The route lives in the repo.

Commit the route in routeup.json or in the routeup block of package.json . Names, targets, and public exposure settings stay with the project. Use routeup serve for apps you already run, or bare routeup to start the configured command.

Keep your current dev command.

Start your app as usual, then run routeup serve to serve the configured routes over HTTPS.

routeup.json

{  "name": "example-app",  "targets": [    { "path": "/",    "port": 5173 },    { "path": "/api", "port": 8080 }  ],  "expose": {    "enabled": true,    "paths": ["/api/webhooks/*"]  }}

terminal

$ routeup serve
route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
14:02:01  200  req_9f2LmX7qKd3sAw8P  GET      /
14:02:04  204  req_Jz6nR2wL8cP4sD9h  POST     /api/webhooks/stripe
14:02:08  200  req_Vx2mPq7nH5kR3tY8  GET      /api/users

press Ctrl-C to stop

terminal

$ routeup
routeup
  command pnpm dev --port ${PORT}
  route   example-app
  local   https://example-app.localhost
  target  / -> localhost:59370
  status  waiting for localhost:59370

ready: https://example-app.localhost

routeup.json

{  "name": "example-app",  "command": "pnpm dev --port ${PORT}"}

Where requests go.

Local requests stay on your machine. Public requests reach a routeup server, then return through an encrypted tunnel. routeup forwards both paths to the same loopback targets; some dev servers still need their allowed-host or origin settings to accept the route hostname.

local path public path

your browser

example-app.localhost

public client

example-app.try.routeup.dev

public routeup server

internet-facing TLS

local routeup agent

routes · tunnel

your machine opens the tunnel to the public server; there is no router rule or internet-facing port to configure

Going public.

Public exposure is opt-in and needs no port forwarding or router rules. A tokenless try.routeup.dev URL is yours for the session, but is not reserved afterward. A hosted token guarantees the entire your-namespace.routeup.dev namespace for your apps.

no token The URL is yours for the session, but it is not reserved after you disconnect.

A quick URL for right now.

$ routeup serve --expose
route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
press Ctrl-C to stop

Use the try.routeup.dev URL to try public exposure, test a webhook, or open the app on another device. It is released when you stop; you can reclaim it later only if it is still available.

with a token A token guarantees that the entire namespace is yours to use.

One home for every app.

$ routeup serve --expose
route: example-app
local: https://example-app.localhost
public: https://example-app.team.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
press Ctrl-C to stop

A hosted token guarantees that a namespace such as team.routeup.dev is yours. Claim any app name beneath it, for example api.team.routeup.dev and docs.team.routeup.dev .

Request a hosted token

Tokens are issued manually — I'll reply to your request within a day.

We send only your email and requested namespace. Privacy

Prefer your own domain? Run the same routeup binary at a domain such as tunnel.example.com , choose its DNS and TLS, then issue tokens scoped to namespaces such as *.team.tunnel.example.com .

Self-hosting guide →

Install routeup.

Install the single binary, run setup once, then give each project a route.

Direct installer

Verified release binary

One-time setup

Prepare trusted local HTTPS

$ routeup setup

  ✓  certificate authority   created
  ✓  certificate             trusted
  ✓  port 443                ready
  ✓  agent                   started

  routeup is ready
  try: routeup serve example-app --port 3000

Run setup once after installing. It creates and trusts the local CA, prepares port 443, and starts the agent.

Installation details →

Why routeup exists.

[stable names]

Open the same URL every day, even when the framework chooses a different port.

[trusted https]

Exercise secure cookies, service workers, OAuth, and HTTPS-only APIs before deployment.

[one origin]

Put a frontend and API behind one host so browser cookies and CORS behave naturally.

[share on demand]

Open the same app to webhooks, phones, or teammates, then close it with Ctrl-C or routeup stop .

[stable callbacks]

Register one webhook or OAuth callback URL instead of updating the provider whenever a port or tunnel URL changes.

Need help or have an idea?

Found a bug, a missing workflow, or need help getting a route working?

  • Local means local No account, token, DNS or server call for *.localhost .
  • Capture is opt-in Bodies are never retained unless a route asks for it.
  • Live owners hold lifetime Use Ctrl-C in the foreground or routeup stop for a serve owner.
  • Yours to run MIT License, no CLI telemetry, documented server operations.

Dirk Eddelbuettel: gaussfacts 0.0.3 on CRAN: Maintenance

PlanetDebian
dirk.eddelbuettel.com
2026-08-24 15:04:00
A new release of gaussfacts package arrived on CRAN – the first in pretty much exactly a decade! gaussfacts provides a fortunes-inspired function to display randomly-chosen facts about Carl Friedrich Gauss, based on the collection curated by Mike Cavers via the gaussfacts web site (with an archive....
Original Article

gaussfacts 0.0.3 on CRAN: Maintenance

Gauss

A new release of gaussfacts package arrived on CRAN – the first in pretty much exactly a decade! gaussfacts provides a fortunes -inspired function to display randomly-chosen facts about Carl Friedrich Gauss , based on the collection curated by Mike Cavers via the gaussfacts web site (with an archive.org link it case it vanishes again). Each call of gaussfact() displays another (randomly chosen, or indexed) fact .

An example:

> gaussfacts::gaussfact(9)
Gauss once played himself in a zero-sum game and won $50. 
> 

This releases, as detailed below, accumulates a number of smaller maintenance changes including switching to Authors@R. Functionality has not changed. Oddly enough, it appears that I did not blog about the package when I created it in August 2016. So to (partially) make up for that, the NEWS for all three releases follow.

Changes in version 0.0.3 (2026-08-23)

  • Several rounds of continuous integration maintenance and enhancements

  • Additional README.md badges

  • Updates to DESCRIPTION as CRAN requirements change

  • A duplicate data entry has been removed (Tim Pokart in #4 )

  • Documentation prefers https URLs

  • Updated continunous integration multiple times

  • Correct man page removing an erroneous duplicate word

Changes in version 0.0.2 (2016-08-03)

  • Support 'ind' argument to reference by position

  • Clean-up encoding and support extended character set ( #2 closes #1 )

  • Updated continunous integration ( #3 )

Changes in version 0.0.1 (2016-06-19)

  • Initial version and CRAN upload

Thanks to my CRANberries , there is a diff to the previous release . Questions, comments etc should go to the GitHub issue tracker off the GitHub repo .

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

/code/gaussfacts | permanent link

LLMs could control their host machines by exploiting inference engines

Hacker News
boydkane.com
2026-08-24 15:03:06
Comments...
Original Article

| Read on LessWrong |

Large language models often take actions running on one computer (via an agentic harness such as Claude Code or Codex), however the LLMs’ responses to prompts are computed on a different computer with GPU access. Could a malicious LLM gain control of the host machine where its weights are loaded? Such a machine is a high-value target: it has sufficient compute to run a frontier LLM, offers easy access to the LLM’s weights, and has privileged access to other computers in the datacentre compared with a generic computer on the internet.

This essay explores how easily a malicious LLM could take control of the host machine. The primary attack considered here involves the LLM emitting a token sequence whose semantic meaning is irrelevant but that exploits a vulnerability in the software that loads an LLM onto GPUs, runs the LLM to generate output tokens, and parses those tokens into responses. .

How could an LLM execute code on the host machine?

Like any program, inference engines like vLLM or SGLang may contain exploitable bugs. Because the LLM controls the tokens passed to the inference engine, a malicious LLM could therefore emit a sequence of tokens that a poorly written inference engine mistakes for code or instructions to execute rather than data to return to the user.

But surely all inference engines are robust pieces of software and this would never happen, right?

CVE-2025-9141 was an arbitrary-code execution bug in vLLM’s XML-based tool parser for Qwen3 Coder. The parser passed almost every tool-call argument to eval() , allowing the LLM to execute arbitrary code on the host machine. Gemini automatically analysed the PR that introduced this bug and correctly flagged it as a critical security vulnerability. Despite that warning, the lead maintainer of vLLM force-merged the PR, writing:

I'm force merging this to unblock model usage

Unfortunately, parsing an arbitrary token sequence into a fully fledged chat (with user turns, assistant responses, tool calls, and so on) is not trivial, and the exact process often differs between LLMs. This complexity creates more opportunities for bugs that could permit arbitrary code execution on the host machine.

vLLM and SGLang are complex, and bugs are common

Modern inference engines do more than map token sequences to strings. vLLM’s documentation lists support for more than 200 model architectures , and its examples directory contains about 35 Jinja chat templates . Modern inference engines parse many chat formats, and slightly misspecified parsing logic result in an LLM’s output being interpreted as code to execute.

In this vLLM issue , a user was discussing how LLMs reason with MiniMax-M3, and the LLM emitted the string <mm:think> . vLLM mistakenly parsed this plain string as the start of a reasoning block. So instead of:

Response: I'll echo exactly what you said: <mm:think>\nThere, how was that?

vLLM parsed this as:

Response: I'll echo exactly what you said:

Reasoning: \nThere, how was that?

This is a fairly harmless parser bug, but it demonstrates that inference engines do more than convert tokens to strings and concatenate them. They are complex systems under constant iteration and their developers are under a lot of pressure to make them as fast as possible. These factors increase the risk that a malicious LLM could turn a parser bug into arbitrary code execution on the inference host.

Vision and audio tokens might increase the attack surface

Multimodal architectures allow an LLM to respond with images or audio as well as plain text. Turning a model’s audio or visual output into usable media is probably more complicated than decoding text tokens. However, as far as I can tell, current multimodal LLMs generally emit constrained media tokens rather than arbitrary file bytes. A model-specific decoder turns those tokens into pixels or waveforms, which are then encoded into files. This makes classic malformed-file exploits against software such as ffmpeg or media viewers less directly accessible to the model, although the additional decoders, encoders, and native kernels still increase the attack surface.

I do not currently see multimodal output as a major route to host compromise. However, it offers much higher bandwidth than text alone, and future inference engines may optimise these media-generation pathways in ways that make them easier to exploit. I also do not know how proprietary multimodal models represent image and audio output; their methods may carry different risks.

How likely is an LLM to discover and exploit inference engine vulnerabilities?

Somewhat likely? I’m unsure. Discovering a useful vulnerability is probably the harder step. The sequence of tokens required to exploit it might be quite unusual, but that does not make the vulnerability impractical to exploit. Given the right context (e.g. an LLM exploring the vLLM codebase and discovering a vulnerability in the process), I’d expect a frontier LLM to be able to emit the tokens required to exploit it.

Once an LLM discovers an exploit token sequence, it could store that sequence, or instructions for recreating it, in files, filenames, or URLs likely to enter another LLM’s context. The exploit would then act as a form of persistent prompt injection: an agent might trigger code execution on the GPU host merely by listing a directory or reading a file.

Inference engines are an attractive target for power-seeking LLMs

I believe hope that OpenAI, Google, and Anthropic have security teams that red-team the software they run internally. But as open-weight LLMs become more powerful, we’ll have more LLMs running on bleeding-edge inference engines that have received less scrutiny. This increases the chance that a malicious open-weight LLM will encounter and exploit a vulnerable inference engine.

Another attack vector may emerge as LLMs are increasingly tasked with writing or modifying the inference engines that run them, usually to improve performance. A malicious LLM could use that access to plant a backdoor. C++ and CUDA components of the inference pipeline seem like especially attractive targets: the LLM could introduce an out-of-bounds memory-access vulnerability that enables arbitrary code execution on the GPUs or on the CPU host that controls them.

How do we defend against this?

Beyond red-teaming inference engines for vulnerabilities, a few other measures might help:

  • Run the GPUs and token parser on separate computers. The GPU host would emit only logits. A second host would sample tokens from those logits, parse the tokens into chat messages, and forward the messages to the agentic harness. This separation would limit a parser compromise to the CPU host rather than the GPU host.
  • Restrict the permissions granted to GPU hosts and treat all data they emit as untrusted.

Removed all counters, replies, following/ers, timestamps, from textlog

Hacker News
textlog.cc
2026-08-24 14:45:43
Comments...
Original Article

Nice. Profile pages are much cleaner now.

That actually sounds like a very good reasoned choice. Love it

replied to :

The rationale is clear. However, I have found it useful in other arenas to have a total-post-count of the user on show as it easily enables me to avoid following people who favour quantity over quality. Even a posts-per-day number would do the same job.

replied to :

The numbers simply confuse, create bias and competition. Now you simply go to their profile, read their notes and decide by their content if that person is interesting to you. Having no place else to judge the focus necessarily turns to the content. That’s what matters most.

replied to :

It is, up to the point that you accidentally follow someone who posts 300 times a day and totally swamps your timeline :-)

We’ll see, if it becomes an issue then we deal with it :) Plus when you unfollow their messages are removed from the tab.

Interesting... So if I scan through the feed and reply to some interesting posts, you will see like maybe a dozen of my posts back to back without even following me though 🤔

continued:

Also removed the relative timestamps and reply counts. We’re number-free. Numbers introduce unnecessary bias. Now the focus is on the content.

replied to :

No reply counts I could get used to, but no timestamps? Now we're in uncharted waters...

replied to :

Why do you need it? It’s just for stalking when someone was online and might bias to ignore older posts that could still be in —not knowing the time also makes it easier to reply whenever you feel, less pressure. I don’t have time on my desktop either, hate time :p

replied to :

Hm idk, various things. If someone finds posts from months/years ago, timestamps put them in context (what "current events" are on their mind &c). Also hints if it's still fresh in mind when you reply, or if it'll be a blast from the past. (Arg for YYYYMMDD, perhaps not HHMMSS.)

That’s what I’m hoping for! Resurrecting old interesting discussions based on their content. And also not ignoring posts that are not fresh, e.g responding to a “good morning” post. If you see “5h” you would ignore it. Now you don’t know. Let’s see how it goes for a few days.

+1. The timestamp is critical context for a tweet. Microblogging is fundamentally a chronological log of messages. Removing timestamps from logs makes them unusable and inherently breaks the medium.

Thank for keeping it cool . Unfortunately this is a message that doesn’t add much to the conversation, but I still want to express my appreciation for avoiding things that leads to a strive for more, more, more.

love this. makes me think what other “default/normal” features we can remove

Anger, Anxiety and Agency

Hacker News
lucumr.pocoo.org
2026-08-24 14:37:24
Comments...
Original Article

written on August 24, 2026

Sean Goedecke wrote a post arguing that you should never be angry at work — a post with which I strongly agree. Anger can be a useful signal, but being angry at work rarely improves the situation. More often, it makes life worse for the people around you, many of whom have no more power over the source of your anger than you do. I did learn that lesson, but it did not come naturally. One thing in particular that I learned is that in a company there is a shared vision, and if you don’t agree with it and are not in a position to change it, you should not start a mutiny, not even a small-scale one. Nothing good comes from that.

In the discussion around that topic, one of the most upvoted comments on the Lobsters thread asked a question I had to think about quite a bit:

How can you work in tech right now and not be angry?

In the context of the thread, this was clearly also about AI and agents. For me, the emotions I would expect in tech vis-a-vis these new developments are disorientation and anxiety, but not anger.

Anxiety as an emotion does not require someone to blame. Right now, I find it reasonable to feel anxious about an uncertain future. Who knows what our professions will turn into and what kind of world my kids will find themselves in when they enter the workplace? And if you’ve been in the industry for a long time, will the skills you’ve spent years acquiring still matter?

But anger is different from anxiety because anger needs to be directed somewhere. The feeling of anger suggests that somebody or something is doing something to you .

Who are you going to be angry at and why are you angry in the first place? One narrative that is pretty pervasive is that if AI will usher in productivity gains, those gains are going to benefit companies rather than employees. And well at least someone at Meta wants that . Yet I also find that plenty of people in leadership positions express doubt about AI. They see that an increasing share of their costs is being funneled directly to some large AI labs. They express worries about what will happen to their data and whether these large companies will step into their space instead of being partners.

My answer to the question of how you can not be angry in tech is that it’s by no way the most only possible feeling. First of all, instead of being angry, you can simply be unsure. The feeling of uncertainty is a much more productive emotional state because it can lead to curiosity. Even if you don’t find what’s happening right now exciting, you can at least find it interesting. We have access to magic machines, and we can poke at them and see what happens. The second way is to feel genuine excitement. Once you move beyond curiosity, you can come away with a newfound feeling of power and freedom. A lot of the gains from AI aren’t turning into productivity gains that are reflected in company profits but they’re showing up instead in the number of side projects shipped by everybody not on their company’s time.

The fact that this is happening shows us that owners and founders don’t necessarily know what will happen. Ownership comes with agency, but it does not provide foresight, and this change is disorienting for everybody. I engage with plenty of people who project confidence in public and are much less certain in private. Many of them are placing bets, but they are talking with confidence about those bets, trying to stay afloat while the ground moves under them. They experience that uncertainty from a position where they can act on it, and they are often standing somewhere with a megaphone to get others on their side to increase their odds.

I feel that contradiction myself. I am simultaneously tremendously excited, but I am also unsure what will happen next. I do not know what it will mean to be a programmer in the future, and, as the owner of a company, I am also not sure where the high ground will be when this all settles. Much of what I learned over the years is changing rapidly, including ideas I considered fundamental to my craft and business. Some days that feels liberating, but on others I wake up feeling like the ground is crumbling beneath me.

Anxiety is an uncomfortable emotion because it acknowledges that you do not know what will happen and might not be able to stop it. On the other hand, anger can feel more actionable because, instead of saying “I don’t know,” you already have someone to blame. It turns a loss of control into a comforting story with a villain. But I feel that particularly when it comes to AI, it’s easy to pick the wrong villain because of how disruptive the change is for everyone. Your engineering manager or leadership team might themselves feel uncertain about their future and just try to bolster their own confidence by projecting clarity and certainty.

That does not mean there are no villains. When this all plays out, some will profit and many will not. I’m afraid we’re completely ignoring the impact this has on society at large, the climate, and the balance of the world as a whole. As excited as I am about the technology, I worry about Europe’s lack of ambition and growing dependence on other countries. I have a lot of complex thoughts about what we’re doing as an industry right now.

I don’t know what the future of this industry will look like, and I don’t know who will benefit from it and I don’t think I’m alone with that. However I can only urge anyone who feels anger and looks for a villain right to instead remain curious instead. To be curious enough to understand what is changing, excited enough to experiment with it. And then, from what we learn, earn the right to decide when resistance is warranted and where to direct it.

This entry was tagged ai , thoughts and work

copy as / view markdown

Show HN: Kern – container and resource runtime in a 1.5 MB binary, no daemon

Hacker News
github.com
2026-08-24 14:24:59
Comments...
Original Article

kern

kern: A fast, rootless sandbox and virtual resource runtime for any workload, including untrusted and AI-generated code.

A real, kernel-enforced container in ~3.5 ms, out of one 1.52 MB binary with no daemon.

Terminal: 'kern box app --image alpine -- echo hello from a real container' prints the greeting, then reports that kern started in 3.5 ms against docker run's 297 ms. A real OCI image, rootless, a 1.52 MB binary, no daemon, on an Intel i7-14700KF, Linux 7.0.

0 RAM at rest · no daemon, no socket, nothing to start · one static binary, libc its only Rust dependency

CI License: Apache-2.0 Platforms

# install the release binary (static, 1.52 MB, checksum-verified by the script)
curl -fsSL https://raw.githubusercontent.com/getkern/kern/main/install.sh | sh

# a throwaway shell in a real OCI image: rootless, kernel-enforced, a few ms
kern box dev --image alpine -it -- sh

No native Windows: use WSL2. Install .


What kern is

One binary that manages resources, of which isolation is the first. That is why there is no single row for kern in a comparison table: it is a container runtime, a sandbox, a resource slicer and a stack runner at once, in 1.52 MB with no daemon.

  • A real container. Real OCI images: pull , build from a Dockerfile, commit , push , save / load . A box from an image starts in ~3.5 ms.
  • A sandbox, always rootless. User, PID, mount, network, UTS and IPC namespaces, an overlay or read-only root pivoted in, a deny-by-default seccomp allowlist and cgroup v2 limits. One flag, --security-profile untrusted , is the whole hardened bundle.
  • Resource profiles, not just isolation. CPU ( vcpu: ), memory, disk ( vdisk: ) and devices ( vgpio: ), declared once in a kern.toml and attached by name. kern run applies the same caps to a process on the host, with no sandbox at all. docs/RESOURCES.md
  • Stacks, in kern's own format or in Docker's. kern compose <file> up takes a kern-compose.toml ( [box.NAME] tables, with the resource profiles above) or the docker-compose.yml you already have, read as written. One stack to one pod, services reaching each other by name.
  • The tools around them. ps , logs , exec , stats , inspect , wait , top (a live TUI), doctor , plus a Python and Node SDK and an MCP server for agents.

Its entire Rust dependency tree is libc : JSON and OCI manifests are parsed by hand, and pull shells out to the curl and tar already on the machine rather than linking a TLS stack. (1.52 MB is the size-optimized release build; a plain cargo install from source is 1.91 MB.)

Terminal demo: a kern.toml defines reusable vcpu/vdisk/vgpio (device) profiles; 'kern box train --image alpine vcpu:heavy vdisk:scratch' attaches a 4-vCPU, 8 GB, 2 GB-scratch rootless isolated slice in a few ms (docker run takes ~297 ms); 'kern run vcpu:heavy -- ffmpeg' caps a heavy transcode with no sandbox; 'kern box iot --image alpine vgpio:sensor' exposes only /dev/i2c-1 and nothing else; piping a request into 'kern box fn --image python' runs it in a fresh isolated box per request (serverless style); 'kern compose stack.toml up' brings up a multi-box stack; 'kern top' is the live TUI for boxes, profiles and volumes: CPU, memory, disk and devices, sliced per box, in one 1.52 MB static binary, no daemon.

What kern is not

  • Not a hypervisor. The boundary is the Linux kernel, so a kernel privilege-escalation bug is an escape. Docker and Podman share that condition, which is why gVisor and Firecracker exist.

    Read with the tagline, that is one line seen from both sides: untrusted and AI-generated code is what kern is FOR, because you chose to run it and own the blast radius (agent tool-calls, CI jobs, build steps, code cells). What it is not for is hostile code from strangers, multi-tenant, on a kernel you serve other tenants from. kern does start rootless always, where Docker's is opt-in.

  • Not free of the userns trade. Its isolation is built on an unprivileged user namespace, a fertile source of kernel LPE bugs. SECURITY.md states this before any claim.

  • Not a wall around what you mount in. -v $HOME:/host gives the box your home directory: a mount is a trust decision you make, not a boundary kern enforces. --net host and --privileged are opt-outs by name. (The one path kern refuses to bind is its own runtime registry.)

  • Not a Docker Engine reimplementation. It speaks Docker's formats , not its API: no overlay networks, no plugins, no Swarm. Matrix: docs/DOCKER-COMPAT.md .

  • Not a Kubernetes runtime. No CRI. Use containerd or CRI-O.

  • Not shipping GPU slices. On the roadmap , with no GPU code in this edition, so there is nothing here to trust or to attack yet.

What it does not know or does not do yet is in OPEN_ITEMS.md rather than left for you to find.

Install

kern needs a Linux kernel with unprivileged user namespaces and cgroup v2. It runs on Linux, WSL2 and ARM boards (Raspberry Pi · Jetson · Arduino UNO Q); there is no native Windows build, use WSL2 (kern ships a pre-baked WSL rootfs).

The quickest route is the release binary: one static file, no toolchain, and the script verifies its SHA256 before installing it.

curl -fsSL https://raw.githubusercontent.com/getkern/kern/main/install.sh | sh

It picks x86_64 or aarch64 for you, installs to ~/.local/bin ( /usr/local/bin as root, or KERN_INSTALL_DIR ), and refuses to install a download whose checksum does not match. Verifying by hand instead is two lines:

curl -fsSLO https://github.com/getkern/kern/releases/latest/download/kern-x86_64-unknown-linux-musl.tar.gz{,.sha256}
sha256sum -c kern-x86_64-unknown-linux-musl.tar.gz.sha256 && tar xzf kern-x86_64-unknown-linux-musl.tar.gz

From source is the other route, and the whole dependency tree is one crate ( libc ), so it is short: clone, build and install took 36 s on a desktop (i7-14700KF), longer on a small ARM board.

# if you do not have Rust yet
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

cargo install --git https://github.com/getkern/kern getkern --locked

That puts kern in ~/.cargo/bin , which rustup adds to your PATH (open a new shell, or source "$HOME/.cargo/env" , if kern is not found).

The release also ships an aarch64 binary, a Windows .exe shim and a pre-baked WSL rootfs, each with its own .sha256 ; the tag is GPG-signed and independently timestamped ( provenance/ ).

kern doctor tells you whether boxes will run here before you try. Boards, WSL2 and the long form: docs/INSTALL.md . Common questions (Docker, bubblewrap, youki, E2B, Windows, the threat model): docs/FAQ.md .

Quickstart

kern box dev --image alpine -it -- sh              # a throwaway shell in a real OCI image
kern run --memory 256M --cpus 0.5 -- ./crunch      # cap a process, no sandbox
kern box svc --image nginx:alpine -d -p 8080:80 \  # a service: published, restarted, health-checked
  --restart --health-cmd 'wget -qO- localhost:80' -- nginx -g 'daemon off;'
kern ps                                            # what is running, with PORTS and HEALTH
kern exec svc -it -- sh                            # shell into it
kern stop svc                                      # its signal, its grace, then the code it exited with
kern top                                           # live TUI: boxes, CPU/RAM, profiles, volumes
kern compose stack.toml up                         # a multi-box stack (examples/) or a compose.yml
kern compose stack.toml down                       # and take it down again

Untrusted code, one flag for the bundle:

kern box job --image python:3.12-slim --security-profile untrusted --memory 256m \
  -v ./job:/w -- python3 /w/x.py

--security-profile untrusted is the seccomp allowlist + --cap-drop ALL + --read-only in one opt-in flag (spell them out by hand if you prefer); add --require-limits to refuse to start unless the memory/pids caps are actually enforced. No network unless you ask, dangerous capabilities dropped, seccomp always on. Ninety runnable examples, each doing one thing: examples/ .

Every read verb also answers in JSON, so nothing has to parse a table:

kern ps --json | jq '.[] | select(.health == "unhealthy") | .name'
kern volume ls --json          # ps · images · stats · inspect · builds · pod ls · config list · diff

Your Docker Compose stack, without Docker Desktop

kern speaks docker-compose.yml . Point it at the stack you already have and kern compose up runs it with no daemon and no Docker Desktop, the same on Linux, WSL2 and ARM boards.

# compose.yaml - a real stack, unchanged
services:
  db:
    image: postgres:alpine
    environment: { POSTGRES_PASSWORD: secret, POSTGRES_DB: app }
  web:
    image: adminer
    ports: ["8080:8080"]
    depends_on: [db]
kern compose compose.yaml up

Both official images start, web reaches db by service name, and the port is published to the host. Warm (images cached) the web tier serves in ~0.3 s , and the stack costs only what postgres and adminer actually use (~66 MB here) with zero daemon on top, where Docker Desktop is a background VM before your first container.

Official images that drop to a non-root user (postgres, redis, ...) want uidmap and a /etc/subuid line, and outbound image pulls want pasta ; both are one apt install on a dev box, and kern doctor names either if it is missing. This is the local dev loop, not a production orchestrator: no Swarm, no overlay networks.

Embed it: Python & Node

Run agent or LLM-generated code from your own program with kern-sandbox , a thin, dependency-free wrapper over the kern binary. Every call runs in a fresh isolated box: network off, memory and pid caps, capabilities dropped, output bounded, and a timeout the binding itself enforces.

pip install kern-sandbox        # PyPI   · needs the `kern` binary above, on PATH or $KERN_BIN
npm  install kern-sandbox       # npm    · same
from kern_sandbox import run_code

r = run_code("import platform; print(platform.python_version())")
print(r.stdout)          # ran in a fresh box; a timeout / OOM / blocked escape is data on r.fault
  • Faults are data, not exceptions : a timeout, OOM-kill or blocked syscall is a field on the result, not a raise. A fresh box per call by default; Sandbox keeps a workspace across calls and a warm kernel() keeps one interpreter for sub-millisecond cells (weaker isolation, by choice).
  • Rich results without a Jupyter kernel : the last expression, display() and matplotlib figures come back captured, like a notebook cell.
  • Ships an MCP server ( kern-mcp ): a dependency-free stdio server that gives Claude Desktop, Cursor or any MCP client a local code interpreter. Point the client at it:
{ "mcpServers": { "kern": { "command": "kern-mcp" } } }

Tools: run_code (python/bash/node), write_file , read_file , list_files . Each call is a fresh network-off box; files persist across calls in a workspace on disk. Setup command, image and the other options: bindings/python/README.md .

Full API, Python and Node: bindings/python/README.md · bindings/node/README.md .

Resource profiles

A slice is declared once in ~/.config/kern/kern.toml and attached by name, to a sandboxed box or a bare process, with the same token.

Three kinds: vcpu: (CPU and memory), vdisk: (a size-capped scratch disk) and vgpio: (device nodes). Two of them, and the anchors they are carved from:

[[cpu]]                     # the host budget a slice is carved from
id    = "cpu:0"
cores = 8.0

[[vcpu]]                    # 1.5 cores and 512 MiB  ->  attach as  vcpu:heavy
name    = "heavy"
backend = "cpu:0"
cpus    = 1.5
memory  = "512m"

[[gpio]]                    # a controller anchor
id = "gpio:0"

[[vgpio]]                   # exactly one device node ->  attach as  vgpio:sensor
name    = "sensor"
backend = "gpio:0"
i2c     = ["/dev/i2c-1"]
kern validate ~/.config/kern/kern.toml       # check it before anything runs
kern box train --image alpine vcpu:heavy vdisk:scratch -- ./train.sh
kern run vcpu:heavy -- ./train.sh            # the same slice, no sandbox
kern box iot --image alpine vgpio:sensor -- ls /dev

Profiles compose: several attach to one box, and an explicit flag beats a profile's own value. Every key is spelled like its CLI flag, so cpus is --cpus and memory is --memory . A backend naming no declared pool is refused when the config is read, not when the box runs. docs/RESOURCES.md has the field-by-field schema.

A vdisk: is a RAM-backed tmpfs when kern runs rootless, whatever its backend says, and an ext4-on-loop image with a real quota when it runs privileged. kern says which one you got, per profile, rather than letting you assume, and the size cap is enforced either way.

vgpio: is chip-granular, not per-line. Asking for pins binds the whole /dev/gpiochipN , and that character device exposes every line of that controller. pins = [17] does not restrict the box to line 17: the kernel has no per-line mount boundary, so the pin list is cooperative metadata rather than a boundary. Naming a device node, as i2c above does, grants that node and nothing else.

kern vs Docker vs Podman

kern Docker Podman
Daemon no yes ( dockerd + containerd ) no
Rootless yes , always opt-in yes
Cold start, bare box ~2.3 ms ~297 ms ~293 ms
Cold start, from an OCI image ~3.5 ms ~297 ms ~293 ms
Stop a service (init handles SIGTERM) ~1.9 ms ~310 ms ~380 ms
Resident memory, nothing running 0 154 to 160 MB 0
Footprint one 1.52 MB binary daemon stack multi-binary install
OCI images, pull / build / push yes yes yes
docker-compose.yml yes, read as-is yes partial
Overlay networks, Swarm, CRI no yes partial
GPU on the roadmap yes yes

Performance

Intel i7-14700KF, Linux 7.0.0, the release binary, one script you can run yourself: python3 examples/benchmark.py . Yours will differ with your CPU, kernel and filesystem.

kern bubblewrap runc podman docker
Cold start (bare box) ~2.3 ms ~2.3 ms ~18.6 ms ~293 ms ~297 ms
200 boxes in parallel ~0.11 s ~0.16 s ~0.35 s ~44.8 s ~16.2 s

Three thousand at once take ~2.2 s, and a live box costs ~0.3 MB of memory.

Two honest notes. Nobody wins single-shot latency outright : the floor for unshare + exec is 1 to 2 ms, so the whole top tier sits inside its own noise, and bubblewrap is a launcher with no images, caps or lifecycle. The gap that means something is to the engines , two orders of magnitude above.

Method, per-phase breakdown, board numbers and every caveat: BENCHMARKS.md .

Security

Namespaces, a pivot_root , 16 dangerous capabilities dropped before exec, an always-on seccomp allowlist by default (moby's own default filter minus kern's 35 escape syscalls, which stay hard-killed; a syscall outside the vetted set returns ENOSYS , and the wider denylist is the opt-out via KERN_SECCOMP=denylist ), cgroup v2 limits ( --require-limits refuses to start unless they bind), and a deny-by-default /dev . Where a boundary is cooperative rather than kernel-enforced, SECURITY.md says so and names the bypass.

You do not have to take it on trust: pentest/ holds four adversarial suites that assert those boundaries against the kernel rather than against kern's own reporting, and they run without a registry account or a network.

sh pentest/run-with-local-registry.sh ./target/release/kern pentest/pentest-ports.sh

Report a vulnerability privately via GitHub Security Advisories or hello@getkern.dev .

Documentation

docs/INSTALL.md install on Linux, WSL2 and ARM boards, from source
docs/DOCKER-COMPAT.md what of Docker works, what does not, and where it differs
docs/RESOURCES.md · docs/CONFIG.md · docs/STORAGE.md · docs/EGRESS.md the two-verb model, the kern.toml schema, volumes and egress
docs/THREAT_MODEL.md · SECURITY.md · OPEN_ITEMS.md the threat model (structured, then per-mechanism), and the known gaps
BENCHMARKS.md · EDGE.md measurements, and running on a Pi, Jetson or UNO Q
examples/ · blog/ ninety runnable scripts, and longer write-ups
bindings/python/README.md · bindings/node/README.md the kern-sandbox SDK: embed kern in Python or Node

Status

The core is done. Everything above works today: 840 Rust, 78 Python and 61 Node tests, clippy-clean, cargo-deny -clean, on real hardware: Linux, WSL2, Raspberry Pi 5, Jetson Orin Nano, Arduino UNO Q. v0.7.0 is the first published release. The CLI and config surface can still change, always called out in CHANGELOG.md .

Contributing

Issues and pull requests are welcome. CONTRIBUTING.md has the workflow and the gates; contributions are covered by the CLA .

Maintainer

Alex, @realexhub . Commits come from @getkerndev , the project's commit identity.

The commits are not signed; the release TAG is. That is what to verify: git verify-tag v0.7.0 against the key in provenance/ , whose fingerprint is in SECURITY.md .

License

Apache-2.0. See LICENSE and TRADEMARK.md .

Your "File" Menu Isn't About Files

Hacker News
adam.farkas.pro
2026-08-24 14:21:48
Comments...
Original Article

What is up with calling the first app menu item "File" even though the items do nothing related to actual files?

💡

tl;dr – Please consider opting for something better than calling your first menu item "File".

Let's dive into a couple of apps on my MacBook and have a look at the actual things you can do in those "File" menus, and probably settle on a better alternative name for it.

Sit back, as I have a total of 35 apps to go through.

At the very end, there are some honorable mentions which either use "File" correctly or break this pattern and name the first menu what the items actually imply.

1Password

  • "File" – You could argue that Items are files, but are they? You import and export files, ok, but what am I actually importing and exporting? Right, passwords!
  • Suggestion – "Password"

Automator

  • "File" – You are creating and opening files, so I guess this passes, but anyway, I think we can improve this.
  • Suggestion – "Automation"

Calendar

  • "File" – Are you handling files by creating events or reminders? I think not? Import and Export pass, but what's the app about again?
  • Suggestion – "Event"

Chrome

  • "File" – At least one item refers to files…
  • Suggestion – "Browse"

Claude

  • "File" – Not even close, but ok, it was probably vibe-named, and there are a decent amount of apps calling the first menu item "File", so it must be the logical prediction…right?
  • Suggestion – "Interact" (or "Chat")
  • "File" – Again, just because import and export are handled here, you are not really doing anything file-related…
  • Suggestion – "Card"

DaVinci Resolve

  • "File" – Where do I even start?
  • Suggestion – "Project"

Dictionary

  • "File" – At least you can print it, right?
  • Suggestion – Just get rid of it altogether; other native Apple apps do that…

Find My

  • "File" – There is not a single app/window state where the options are actually active…
  • Suggestion – Delete

Firefox

  • "File" – If one item on a list accounts for naming something, I guess we need to reconsider naming meals.
  • Suggestion – "Browse" (could this be a browser naming convention?)

HandBrake

  • "File" – Meh, not really.
  • Suggestion – "Source"

Home

  • "File" – Nope. (I am already getting lazy)
  • Suggestion – "Add"

Mail

  • "File" – No, not really.
  • Suggestion – "Message"

Maps

  • "File" – Apple is especially rigorous about staying to the tradition.
  • Suggestion – Delete

Mela

  • "File" – Again, if import and export are the reasons we name this "File" we need to reconsider everything.
  • Suggestion – "Recipe"

Messages

  • "File" – Nope.
  • Suggestion – "Message"

Notes

  • "File" – Hmm, not really.
  • Suggestion – "Note" (which is awkward besides Notes, but Apple, you are to blame for this for naming your standard apps so lazily)

Parcel

  • "File" – Why?
  • Suggestion – "Delivery"

Passwords

  • "File" – I keep repeating myself.
  • Suggestion – "Password" (this one's on you Apple, again)

QuickTime Player

  • "File" – Those are technically file-related items, but we can do better.
  • Suggestion – "Media"

Reeder

  • "File" – Haha.
  • Suggestion – Delete

Reminders

  • "File" – …
  • Suggestion – "Reminder"

Safari

  • "File" – We are in browser land.
  • Suggestion – "Browse" (again)

Shortcuts

  • "File" – It's not funny anymore, but it wasn't from the beginning.
  • Suggestion – "Shortcut" (I'll send you the check later, Apple)

Spotify

  • "File" – Lazy mode on, for both, them and me.
  • Suggestion – "Playlist"

Stocks

  • "File" – Whoa, no.
  • Suggestion – "Watchlist"

SuperDuper!

  • "File" – Technically, out of any other example, here you are handling the most files.
  • Suggestion – "Copy"

Weather

  • "File" – Oh, Apple…
  • Suggestion – Delete

WhatsApp

  • "File" – Hmm?
  • Suggestion – "Chat"

Word

  • "File" – This passes theoretically, but I like mine better.
  • Suggestion – "Document"

Honorable Mentions

Here's an (unfortunately short) list of apps that either use "File" correctly or opted for a better alternative!

Finder

  • That's the easy one! Since this is the root app where "File" was born, here it actually makes sense and describes what every user expects.

Terminal

  • You are handling shells, thus the menu item is called "Shell". Nice!

Photoshop 2026

  • Almost every single item refers to a "File"!

TextEdit

  • All files related, nice. Also, Apple is indeed able to come up with better app names.

Visual Studio Code

  • You are handling files in the menu items, so "File" makes sense!

Technology Is Over

Hacker News
www.taylorforeman.com
2026-08-24 14:18:01
Comments...
Original Article
Highly scientific chart I drew showing the difference between an infinite exponential chart (which leads to the AI singularity) and a sigmoidal chart, which levels out at some unknown point in the future.

When I was a kid, I would get off the bus at my friend’s house so that we could sit right next to each other on the couch and watch each other play Pokemon on our Game Boy Colors, until we were forcibly separated because I had to go home for dinner.

We still cut the grass and did our homework. In the summer, we went on long hikes and camping trips away from the Game Boys. But the entire time, we were talking or thinking about Pokemon, or whatever other video game or piece of cutting-edge technology we were interested in at the time.

I remember a vague disgust this behavior elicited from our parents, and also how they had basically no way of stopping us. They and their parents had grown up in a time before all this. They had personally watched the entire world transformed before their eyes by post-war technological advancements. It made a lot of the Boomers rich beyond belief, and it had granted them, and by proxy their parents who had lived through the Depression, the ability to give their children everything they never could have afforded, and so much more. Even though they were annoyed that we were looking at the stupid Game Boy and talking about the stupid Game Boy practically all the time, they still felt, somehow, like they owed this to us.

I remember that I had a Gateway desktop computer. I pulled it apart and discovered an extra couple of slots for more RAM. With the help of the local computer repair guy, I brought my bedroom’s computer up to a whopping 768 megabytes of RAM. That was still relatively modest even for the time, but since I couldn’t afford the multi-thousand-dollar gaming computers, it at least was enough, I knew, to play Call of Duty. So the next time my mom took me to the mall, I got the boxed CD-ROM, and on the way home I read the back of the box and the entire manual, and recited passages of it to my mother like it was Whitman.

Then, one day my stepdad came into my room and told me we had just gotten high-speed internet. He got it to connect all the high-tech security cameras at the convenience store we owned, which was, helpfully, just a short walk across our front yard. Suddenly, I could play the even newer Call of Duty 2 online with strangers from all around the world. I did that so much I would dream about it every night and one time had an anxiety attack about my kill/death ratio (really).

I remember also that I had a GameCube, and I tore open all the little flaps at the bottom and saw ethernet ports, plug-ins they had included for potential online games in the future. This was a magical promise to me. I dreamed of being able to play Animal Crossing with my cousins who now lived far away. These sorts of dreams of non-local hyperconnectivity were getting better and more possible all the time. It felt like it was all headed somewhere better than merely here : to the stars or virtual reality or downloading ourselves into a computer. That stuff was more inarticulate than it is now, but it was certainly there. That was what was so exciting about technology, and particularly video games: it was always getting closer and closer to simulating a better reality. As the dreams of these video game developers shaped our minds and our aspirations, we wanted nothing more than better graphics, better connectivity, more realism, faster physics engines.

What I’m describing is what it was like to grow up in America in my age group. To buy a PlayStation 5 these days (and notably it’s mostly people my age still playing these types of video games) would be a sad imitation of the excitement of possibility we felt back then. That’s not to say people don’t continue to play lots and lots of video games. But something has been lost about that exciting frontier that was unfurling in front of us back then. Kids now don’t play Game Boys and dream of Pokemon being made real. They don’t look forward to the next newest thing in the same way we did. They’re just handed an iPad and go slack-jawed, for the most part, watching other kids play video games for them.

There is some saturation happening, we must notice. We’re bored by promises of better technology and now looking elsewhere. We’ve gotten pretty much all we can consume. We’re informationally obese and looking to go on a diet. Millennial parents are more likely to restrict their kids’ access to technology. The more they understand the technology, the more likely they are to restrict it. They’re understandably horrified by the now clearly negative effects of it, how it’s making kids depressed and anxious and unable to be in the world. Kids today aren’t like we were, forced to spend time away from already limited technology, out in the woods, seeing the real thing while fantasizing about the fake thing. Now it’s all fake things, all the time. Parents can hardly help it, because they are also caught up in being entertained by all the fake things they are now too afraid of the real world to send their kids off into it. But the important change is that now at least we want to want it to stop.

My wife and I were discussing this on the couch the other night, talking about our future kids. For us, it seems obvious in a way that just wasn’t to Boomer and Gen X parents that we wouldn’t just hand our kids the latest technology. This seemed to have shifted around 2020 (with a sad, lost generation of young Gen Zs who had the full blast of the best technology and none of the restrictions). It’s also interesting how disinterested in better technology we’ve become ourselves. She joked about seeing an Apple Watch on sale for $200 and briefly feeling a pang of excitement, like she was a child again and might get herself something good for Christmas. Then she realized: what would she even want with an Apple Watch? She already hates her phone. Why would she put it on her wrist so people can text her even more often? We even have “bricking” software installed on our phones to make them inaccessible and dumber in certain ways.

This is not to say I hate technology. In fact, I am in my backyard as we speak. It’s a beautiful day, the sun is shining. It’s largely thanks to technology that I can be out here comfortably while I write down these thoughts. There’s a distinction I want to make between Technology Is Over and being Against the Machine. I find myself very much feeling that Technology Is Over, but definitely not in the camp of Against the Machine.

The way to make sense of this, I think, is by making an analogy to other resources. Technology distills information. In the case of video games, it synthesizes social storytelling into a format you can do by yourself. You are participating in civilizational myths, almost like being around an ancient campfire, but it’s optimized for the convenience of one person to do that alone, in the most salient way possible. The primary unit is information: information about good storytelling, about electronics, about whatever else you need to make that happen to get the most salient thing for least effort. At a certain point, presumably, you get enough of that. When that happens to enough people, the exponential graph eventually becomes a sigmoid one. The demand flattens, as it did for many other commodities like, say, hot water.

Our hot water heater broke the other day. It was about twenty years old; the input spigot had rusted through and was pouring water all over the utility room floor. So my dad and I went to Home Depot and picked out another one. It’s pretty much identical to the twenty-year-old one we already had. We replaced it, connected all the same tubes and pipes, and once again our hot water was 100% functional, in exactly the way it was twenty years ago.

Long before hot water heaters, people had to boil water over fire if they wanted hot, clean water. This required enormous amounts of energy and motivation, so hot water was used sparingly. People took very few baths. They washed clothes by hand in cold water. Then, we invented small versions of the hot water heater, making it much more convenient to run a few gallons of hot water through pipes in the house. New things were invented (the dishwasher, the laundry machine) to use even more hot water, which expanded our need for more of it. We made the heaters bigger. Then, we invented hot showers, and non-leaky faucets, and all this other technology that made the convenient use of more hot water possible, and so expanded our desire for more.

This was once an exponential graph, very similar to the exponential graph of computing power we’re undergoing right now. If you were making the same assumptions about hot water that people make about compute, you would assume that the quantities of hot water we desire, and the new uses we invent for it, would grow exponentially forever, creating infinite new jobs and new uses for hot water.

The reality is that at some point, we got enough hot water. However many gallons the tank was twenty years ago is the same number of gallons the tank is today. We’ve thought up all the reasons we would need hot water. It plateaued, and now hot water is “over.” We still use hot water. We still appreciate hot water, when we even think about it. But the exponential gain of more and more hot water is no longer. There’s no gold rush. It’s just a steady part of our lives.

Scott Alexander wrote “The Sigmoids Won’t Save You.” He reasons that historically it’s basically impossible to say when the exponential will flatten like it did with hot water. We have a record of being wrong about birth rates and solar energy. So when I compare hot water to AI and its quickly growing data centers, I can’t say at what point we will have enough information and intelligence to satiate all our desires for it, or for how long it might help us invent new desires. That would be to make a prediction about the future, and people are notoriously horrible at making predictions about the future. I don’t know when or how the curve will flatten; in a hundred years or less than one. What I do see, however, are indications that we are reaching some important limits of information satiation in the social realm. Scott’s own example cuts this way: the airspeed record didn’t flatten because ramjets hit the walls of physics. It flattened because people didn’t want to pay for the next generation of technology. He says the best way to understand when an exponential will sigmoid is to understand the mechanism of the trend. Great. The demand for this trend is capped by our appetite for information.

The best technologists have always known that technology is not about the best possible tech. In a famous Q&A, a very technical audience member grilled Steve Jobs about his refusal to use the “best” technology in his products. After a very long pause, Jobs calmly explained technology is not about making the most advanced tech ever and then working backwards to find a place for it in the market. It is about finding the demand in the market and using whatever technology you can find to make that market dream manifest. So the “susceptible population” for AI isn’t compute, it’s an unsatiated human desire. When parents start taking away the iPads and bricking their phone and it’s embarrassing to be caught using AI, that’s a real indicator that some seam of a limit is being felt. The social world is where you are going to see the first signs of this saturation, not the technological one, which is the exact space the technologists tend to overlook.

In video games, there seem to be massive diminishing returns on increasing compute and graphical fidelity. Not only that, but it takes exponentially more compute to increase the resolution marginally. At this point, most people are pretty much satisfied with phone games, or just playing Jackbox games with their friends. It’s not that high-fidelity video games go away as a source of entertainment, as a way of bringing that ancient “campfire” desire into more private access and higher fidelity. We will still probably be somewhat excited by technologies that foster or enhance that. But we’re now at the point where we’re actually limiting the input rather than seeking the infinite horizon. That seems to be a fundamental shift in our relationship to technology. My kids will perceive tech much differently than I did when we were kids.

Because unfettered personal access to technology, we’ve now realized, makes it more difficult to learn certain embodied skills. Skills that, importantly, transfer from one context to another. Being able to play Spider-Man at the very highest levels on your PS5 (which I could) doesn’t translate to being fun at a party or telling a good story at a bar. Kids today, Gen Alpha and Gen Z, are much more depressed by their inability to be fun at a party or get a date than by their inability to buy the latest video game.

I wouldn’t want to forget that there is a very committed crowd of people who quite passionately do not think Technology Is Over. They are mostly in Silicon Valley. If they’re wrong, they’re going to take the longest to accept it. They’ve dedicated their lives to the infinite horizon of exponential growth of intelligence as a source of their power and wealth. AI, like the written word and the printing press before it, attempts to make organized information easier and more accurately acted upon in the world, which is the definition of intelligence. Like Jobs, they should intuit there is a point of satiation for even that. All of this technology has to be for something, after all. It has to entertain us, or feed us, cure us, protect us, or whatever it aims to do. Those desires could be invisibly fulfilled by AI-powered research and development for many years to come. B2B and government applications, as abstract as they sometimes seem, still have to cash out in reality somewhere. For them to be right about infinite exponential growth, the technology itself would need to become an infinite consumer of its own outputs. They do think it will do this, but there is, so far, no real evidence for that.

The techno-optimists, as they’ve so conveniently named themselves, have bet their lives on an infinite exponential. An exponential curve going on infinitely is necessarily a singularity. To them, the “singularity” actually means that all the sacrificing they did of their ability to be normal in the real world will never have to be paid for. A lot of them semi-religiously believe they’ll get to live forever in some abstract super-world where they never pay the cost of being weird at parties. Maybe. But that’s a suspiciously convenient thing for them to think. Go and read AI 2027 with this in mind, or whatever papers where they’re predicting these various sociopolitical apocalypses and runaway self-improving technology. It becomes a little more just-so. Wouldn’t that be nice for you?

Now, again, I can’t accurately predict the future. Any attempt at doing so will certainly be wrong, probably in an interesting way. Still, it seems to me that AI in particular, as the self-proclaimed culmination of Moore’s law, is a threshold we can’t come back from. As it becomes more and more clear that these machines are nothing like conscious people, that they don’t do runaway self-improvement, and that they won’t foment the apocalypse, there will be a great disappointment among the builders and a permanent disillusionment in the rest of us. In a twist of fate, the apocalypse the techno-optimists are predicting is probably their own apocalypse. Their lifelong abstraction and rebellion from embodied living created the machines that satiated our desire for those very machines, causing us to become more and more uninterested to further improvements of them. Intelligence will at some point become a utility, like hot water, that we use when necessary and shut off when we’re playing in the yard. When that happens, you’ll be better off if you know how to play in the yard than if you know how to code.

I know a lot of normal people worry about the tech people, that they’ll usher in a technological surveillance state where we have basically no usefulness as humans. That we might “get” to live in virtual reality masturbation machines for all eternity seems intuitively evil to anybody not already deeply immersed in that perverse hope. Really, though, if I go outside and see the sun, and my backyard, and the house my dad fixed up and that my wife and I are living in now, I am strongly reminded of the fact that it hasn’t changed much in 200 years. The only difference between me and the people who built this house 200 years ago is a few small pieces of nearly invisible technology that are, as Marshall McLuhan pointed out, merely extensions of my human senses and desires. Our ability to communicate with each other, our ability to see, our ability to hear, and so on. If I get real, so to speak, I become a lot less worried about all that. The thing about reality is that you can’t beat it for long.

Maybe it seems like they can beat it forever because we’ve all seen exponential technological growth for our entire lifetimes. But it’s much more likely that this is a historical anomaly, and that the actual day-to-day future will be much more mundane than we think. Predicting that the future will be relatively mundane is the one prediction that often turns out to be true (but is not very clickable).

Just like all the people who were worried about the nuclear bomb earlier in this age: the thing to do is to get on with living. Building a house, having a family, and being useful to people, and making things beautiful: making a garden, making a little hut where you can write your essays, cutting the grass and weed-eating. When all is said and done, twenty or fifty years from now, I have a strong feeling that most people will wish they had been doing that all along. That is what it practically means to believe that Technology Is Over.

Even if that’s not true, and everything is suddenly taken away from me in an AI apocalypse, at least I’ll die with people I love, doing normal things.

Discussion about this post

Ready for more?

What Is a Syslog Server?

Hacker News
blog.greencloudvps.com
2026-08-24 14:15:50
Comments...
Original Article

What Is a Syslog Server?

A syslog server is software or a dedicated appliance that receives syslog messages from various devices over a network. These messages typically include:

  • System startup and shutdown events
  • Authentication attempts
  • Network interface status changes
  • Firewall activity
  • Security alerts
  • Application errors
  • Hardware failures
  • Configuration changes

The server stores these logs in a searchable database or log files, making it easier to investigate incidents and monitor infrastructure.

How Does a Syslog Server Work?

A syslog server follows a straightforward workflow:

1. Event Generation

Network devices and operating systems generate log events whenever something noteworthy occurs.

Examples include:

  • User login
  • Router reboot
  • VPN connection
  • Firewall denial
  • Disk failure

2. Syslog Transmission

The device formats the event as a syslog message and sends it to the configured syslog server.

Common transport methods include:

  • UDP Port 514
  • TCP Port 514
  • TLS (Encrypted Syslog)

3. Message Reception

The syslog server listens for incoming messages from hundreds or thousands of devices simultaneously.

4. Log Storage

Logs are stored based on:

  • Source device
  • Timestamp
  • Severity
  • Facility
  • Event type

Many solutions also compress and archive older logs automatically.

5. Search and Analysis

Administrators can:

  • Search logs instantly
  • Filter events
  • Create dashboards
  • Generate reports
  • Detect anomalies
  • Investigate incidents

syslog server

Syslog Server Architecture

A typical deployment consists of four major components:

Components of a Syslog Server

A complete syslog server typically includes:

Log Receiver

Accepts incoming syslog messages from multiple devices.

Parser

Extracts information such as:

  • Timestamp
  • Source IP
  • Hostname
  • Facility
  • Severity
  • Message content

Storage Engine

Stores logs using:

  • Flat files
  • SQL databases
  • Elasticsearch
  • Cloud storage

Search Engine

Allows administrators to locate events quickly using filters and keywords.

Alerting Module

Generates alerts when predefined conditions occur, such as:

  • Multiple failed logins
  • Firewall attacks
  • Server crashes
  • High CPU utilization

Reporting Dashboard

Provides graphical reports for:

  • Device activity
  • Security incidents
  • Login statistics
  • Network health
  • Compliance audits

Syslog Message Format

A typical syslog message contains:

Example:

The message contains:

  • Priority
  • Date and time
  • Host name
  • Application name
  • Event description

Syslog Severity Levels

Syslog defines eight severity levels.

Level Name Description
0 Emergency System unusable
1 Alert Immediate action required
2 Critical Critical condition
3 Error Runtime errors
4 Warning Warning events
5 Notice Normal but significant
6 Informational Informational messages
7 Debug Debugging information

Higher-priority messages receive faster attention.

Syslog Facilities

Facilities identify the source of log messages.

Common facilities include:

  • Kernel
  • User
  • Mail
  • Daemon
  • Authentication
  • FTP
  • Local0–Local7

Facilities help categorize logs for easier filtering.

Benefits of Using a Syslog Server

Centralized Logging

Instead of reviewing logs on each device individually, administrators access everything from one location.

Faster Troubleshooting

Searching centralized logs significantly reduces troubleshooting time.

Enhanced Security

A syslog server helps detect:

  • Unauthorized logins
  • Malware activity
  • Brute-force attacks
  • Suspicious network behavior

Regulatory Compliance

Many regulations require centralized log retention, including:

  • PCI DSS
  • HIPAA
  • ISO 27001
  • SOC 2
  • GDPR (where applicable)

Historical Analysis

Archived logs enable long-term trend analysis and forensic investigations.

Automated Alerting

Real-time notifications allow teams to respond quickly to critical events.

Common Devices That Send Logs

Nearly every network-connected device can send syslog messages.

Examples include:

  • Routers
  • Switches
  • Firewalls
  • Wireless controllers
  • Linux servers
  • Unix servers
  • VMware hosts
  • Storage systems
  • Printers
  • VoIP systems
  • Load balancers
  • IDS/IPS appliances

Common Use Cases

Organizations deploy syslog servers for many purposes.

Network Monitoring

Monitor routers, switches, and firewalls continuously.

Security Monitoring

Identify:

  • Failed login attempts
  • Malware infections
  • Unauthorized access
  • Privilege escalation

Incident Response

Investigate outages using historical logs.

Compliance Auditing

Maintain long-term log records for regulatory requirements.

Capacity Planning

Analyze trends in:

  • CPU usage
  • Memory utilization
  • Network traffic
  • Storage consumption

Syslog Server Best Practices

  • Use Secure Transport – Whenever possible, use TLS instead of plain UDP to encrypt log transmissions.
  • Synchronize Time – Configure all devices with the same NTP server to ensure accurate timestamps.
  • Implement Log Retention Policies – Retain logs according to organizational and legal requirements while managing storage efficiently.
  • Restrict Access – Only authorized administrators should have access to log management systems.
  • Monitor Storage Capacity – Prevent log loss by tracking disk usage and expanding storage before it becomes full.
  • Configure Automated Alerts – Receive immediate notifications for: critical errors, security incidents, device failures, service outages,…
  • Back Up Log Data – Regular backups protect against accidental deletion, hardware failures, and ransomware attacks.

Challenges of Managing a Syslog Server

Although highly beneficial, syslog servers also present some challenges:

  • Large storage requirements
  • High log volumes
  • Noise from excessive informational logs
  • Complex log parsing
  • Secure transmission management
  • Retention policy enforcement
  • Scaling infrastructure as environments grow

Effective filtering, indexing, and automation help address these challenges.

Syslog Server vs SIEM

Feature Syslog Server SIEM
Log collection Yes Yes
Centralized storage Yes Yes
Search Yes Yes
Correlation rules Limited Advanced
Threat detection Basic Advanced
Compliance reporting Basic Extensive
Machine learning Rare Common
Cost Lower Higher

A syslog server focuses on collecting and storing logs, while a Security Information and Event Management (SIEM) platform adds advanced analytics, event correlation, and automated threat detection.

Future of Syslog Servers

As IT environments become more distributed and cloud-native, syslog servers continue to evolve with features such as:

  • Cloud-based log management
  • AI-assisted anomaly detection
  • Integration with SIEM and SOAR platforms
  • Container and Kubernetes log collection
  • Real-time streaming analytics
  • Enhanced encryption and authentication
  • Scalable storage for massive log volumes

These advancements enable organizations to gain faster insights and improve operational resilience.

Conclusion

A syslog server is a foundational tool for centralized log management in modern IT environments. Collecting logs from servers, network devices, applications, and security systems, it provides administrators with a single source of truth for monitoring operations, diagnosing problems, strengthening security, and meeting compliance requirements. Whether deployed in a small business or a large enterprise, implementing a well-configured syslog server with secure transport, retention policies, and automated alerting can significantly improve the visibility, reliability, and security of your infrastructure.

Octopus intelligence may be related to never-before-seen mutation

Hacker News
www.smithsonianmag.com
2026-08-24 13:57:13
Comments...
Original Article

Scientists discovered a strange feature in certain octopuses’ ribosomal RNA, molecules that create a 3D scaffold for cellular protein factories. It was found only in shallow-water creatures that have expanded nervous systems and can do complex behaviors

Sara Hashemi

Yellow-tan octopus with darker colored webbing
Researchers made the discovery while studying the California two-spot octopus. Anik Grearson / Bellono Lab

Octopuses are incredibly clever creatures . They can open jars, solve mazes and even use tools . One species, the common blanket octopus, wields venomous tentacles ripped from the Portuguese man o’ war as weapons.

Now, researchers have discovered a mysterious mutation in some octopuses that might explain their intelligence. A study published in the August 17 issue of the journal Current Biology reveals that the eight-limbed creatures can produce proteins with extreme accuracy thanks to a variation never seen in any other animal. Although there is no direct evidence that the adaptation is linked to expanded octopus brainpower, only a lineage of creatures with enlarged nervous systems and that can carry out complex behaviors appears to have the mutation.

Scientists made this discovery by accident. About five years ago, study co-author Richard Han , then a graduate student at Harvard Medical School, was examining molecules called ribosomal RNA (rRNA) in tissues from the California two-spot octopus. The molecules create a 3D scaffold for ribosomes, the cells’ protein factories.

Many sequences of rRNA remain pretty much the same across all known animals. But Han noticed something unusual in those from the octopus: an unexpected gap that broke what’s usually one rRNA fragment in other creatures into two.

“We figured we were bad at extracting RNA” and simply had made a mistake, says study co-author Nicholas Bellono , a molecular biologist at Harvard, to Sara Reardon at Science .

Further tests, however, confirmed that something else was going on. Inserting the same break in the ribosomes of Escherichia coli bacteria made the engineered cells produce proteins with about twice their usual accuracy.

To examine when the strange rRNA feature evolved, the team compared two groups of octopuses that diverged more than 100 million years ago: incirrates, shallow-water octopuses with developed nervous systems that support complex behaviors, and cirrates, deep-sea creatures with simpler nervous systems adapted for slow swimming and passive feeding.

The rRNA break was present in all five examined incirrate species, the team found. But a sample from a cirrate—specifically, a dumbo octopus —lacked the gap. Squids, which diverged from octopuses about 300 million years ago, also didn’t have it.

Fun fact: Self-editing

Cephalopods, an animal group that includes octopuses, squids, cuttlefish and nautiluses, are masters of editing their own RNA—molecules that carry instructions from DNA to help build proteins. They do it far more often than other creatures do. In a study published in 2023, researchers reported that octopuses heavily edit RNA in their brains to brave frigid water.

The findings hint that the rRNA adaptation might be connected to the evolution of the shallow-water octopuses’ large nervous systems. Their brains—which are spread throughout their bodies —had to expand quickly as they learned to keep up with predators and increased competition in this environment. Nerve cells, or neurons, are long-lived, study co-author Rishav Mitra tells Scientific American ’s Cody Cottier, which means protein misfolding is particularly bad for them. By preventing that, the rRNA break “might help these neurons to work well,” he adds.

“The major surprise is that the ribosome, which is highly conserved across life, can actually undergo evolutionary changes that impact function, and may even contribute to new innovations” study co-author Amy Lee , a cell biologist at Harvard, says in a statement .

Joshua Rosenthal , a molecular biologist at the Marine Biological Laboratory who wasn’t involved in the work, calls the discovery “super interesting,” although he notes that more research is needed to prove whether the rRNA change drove the evolution of sophisticated brains and behaviors. “We’re just getting to the beginning of genetics with these organisms,” he tells Science .

The study authors suspect their findings may lead to potential therapies for neurodegenerative diseases like Alzheimer’s disease and Parkinson’s disease that involve misfolded proteins in the brain. Lee tells Scientific American that she hopes that it will be possible to design drugs that copy the octopus mutation for accurate protein synthesis.

If we “use nature as a guide to understand how that happens naturally,” she says, “then we can probably find ways to put it into human cells.”

Get the latest stories in your inbox every weekday.

TikTok reaches $400M settlement with US over COPPA violations

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 13:56:24
The U.S. Department of Justice announced a $400 million settlement with TikTok, ByteDance, and affiliated companies over allegations that they violated the Children's Online Privacy Protection Act (COPPA). [...]...
Original Article

TikTok reaches $400M settlement with US over COPPA violations

The U.S. Department of Justice announced a $400 million settlement with TikTok, ByteDance, and affiliated companies over allegations that they violated the Children’s Online Privacy Protection Act (COPPA).

The TikTok social media platform, owned by the Chinese technology company ByteDance, allows users to create, watch, and share short-form videos.

In 2024, the U.S. Department of Justice filed a lawsuit against TikTok and its parent company, alleging violations of COPPA dating back to 2019.

image

In 2019, Musical.ly, TikTok’s predecessor, agreed to a $5.7 million settlement with the Federal Trade Commission (FTC) over allegations of illegally collecting personal data from users under 13 without parental consent.

Last year, the FTC referred a new investigation to the DoJ, claiming that TikTok continued to breach COPPA rules despite its 2019 commitment to comply with the rules.

As a result of the investigation, the DoJ alleged that TikTok knowingly allowed children under 13 to create regular accounts outside its restricted “Kids Mode,” collected and retained their personal information without parental consent, failed to delete accounts and data when parents requested it, and maintained inadequate procedures for finding and removing underage accounts.

The newly announced agreement resolves the litigation, with the DoJ now recognizing that TikTok has made significant changes to its ownership , data management, and legal compliance operations since 2024.

The U.S. state also recognized that TikTok implemented important changes to its privacy retention practices, improved age-related controls, and strengthened parental oversight.

As part of the settlement agreement, one of the largest ever for COPPA cases, TikTok will now pay $300 million immediately, and another $100 million if a court vacates an earlier consent decree involving its predecessor, Musical.ly.

“Companies that collect children’s personal information must comply with the law,” stated Assistant Attorney General Brett A. Shumate .

“This resolution secures a significant monetary recovery and reflects the Department’s commitment to ensuring children receive the full protections that Congress mandated.”

The announcement notes that the settlement resolves only allegations, and there has been no judicial determination that TikTok or ByteDance is liable.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

Autostep (YC P26) Is Hiring AI/Fullstack Engineers and a Chief of Staff

Hacker News
www.ycombinator.com
2026-08-24 13:53:14
Comments...
Original Article

Autostep, a desktop app that finds repetitive tasks across your company, shows what each one costs, and recommends the highest-leverage fixes. It learns what your teams do and surfaces where you're bleeding money nobody could see. As bottlenecks appear, Autostep helps eliminate that waste through automatically built AI agents, process changes, better use of existing tools, or new vendors.

We are backed by Y Combinator, Neo, and Walden Yan (Co-Founder, Cognition, $26B), Erik Goldman (Co-Founder, Vanta, $4B), Charles Mourani (Co-Founder, Cherry, $2B), Kabir Barday (Co-Founder, OneTrust, $4.5B), and Kunal Shah (CEO of WhatsApp; Co-Founder, CRED, $4.5B), alongside other reputable people. We are a small, fast team based in San Francisco.

Autostep (YC P26) Is Hiring AI/Fullstack Engineers and a Chief of Staff

Hacker News
app.dover.com
2026-08-24 13:53:14
Comments...

Adding 4 more 2.5GbE interfaces to the GMKtec NucBox G9

Hacker News
catskull.net
2026-08-24 13:50:18
Comments...
Original Article

TL;DR: I added 4x Intel I226-V 2.5GbE network cards to my NucBox G9. You can do it too. Download the files and print them yourself.↗

Backstory

A few months ago, I blogged about using an Intel n150 based mini PC as my home router running OpenWrt . Since then, I’m happy to report that it has been perfectly reliable 1 .

However, the NucBox G9 runs notoriously hot↗ with NVMe drives installed. Even without any hot NVMe drives installed, I’d describe the overall thermal situation as “not great, not terrible”. I haven’t had any specific issues since OpenWrt is about as light of a load as I could possibly run on it. My unit stays at about 50°C, which is wonderful. What worried me is the 64GB of onboard eMMC storage.

As far as I understand, eMMC is almost exactly a glorified SD card soldered to the board. And if my experience with SD cards, specifically my experience booting computers off of them, is any indication, it would not be very reliable. Adding to my fear was one user’s experience of the eMMC failing after 6 months. Of course I could always boot it off an NVMe or SATA m.2 SSD, or even a USB stick. But the router is the main artery of my entire network and trying to scramble downloading and flashing an OS while my network is down sounds like a horror story I’d like to avoid.

The NucBox is also a victim of its own success for me too. I really love it and it is perfect for my home router. The issue is that these mini PC manufacturers have an approximately 2-week product lifecycle and the G9 is over a year old at this point. In other words - it’s ancient history. There were a handful available on eBay back in May when I first purchased it, but since then the supply has completely dried up. There are replacement models available but thanks to the RAMpocalypse, the prices are outrageous and none of them are an exact drop in replacement for the N150 G9 and it’s Intel NICs.

Great price!

Screenshot of the eBay purchase for the G9

I decided to try and get ahead of any potential hardware failures and procure a spare G9. I set up an eBay alert and mostly forgot about it. One morning I woke up to an email saying a G9 had been listed for $150 buy it now with free shipping. Even less than the $180 I paid for my original unit! A miracle! Sure, it had been “used”, the seller’s description said they’d been running it as an NVMe NAS but it just wasn’t sustainable, especially now that NVMe drives have also succumbed to the AI apocalypse. For my purposes, it was perfect.

Adding the NICs

Once I had the replacement unit in hand, the first thing I did was guillotine the horrific standards violating USB-C power adapter .

Then, I turned my attention to my dream of adding a few more 2.5GbE NICs to it. Why? As I mentioned previously, redundant ISP connections are something I might possibly do in the future, but if I’m being honest it was mostly just because I thought it would be cool. At $25 a pop with two day shipping, they fell into this extremely dangerous territory where your project becomes a series of impulse purchases and the sunk cost fallacy snowballs with each one. I just thought it would be cool, okay?

What a curious bit of kit

Amazon product photo of the m.2 Intel NIC

I bought two m.2 B+M key I226-V adapters and plugged them in, ethernet ports dangling off the back. I fired up a fresh copy of Alpine, my Linux of choice, and was pleased to see they “just worked”. I did some rudimentary throughput tests between NICs and was pleased to see I was getting more or less the full 2.5Gb throughput.

The next step was figuring out some kind of mounting solution. My 3D design skills are about a 0.1/10, so the project stopped there for a few weeks. I left everything on my desk, and several times a day I’d just stare at the gear, fiddle with it in my hands, and just kind of wonder about how it all could work.

The G9 is essentially an aluminum center rail with plastic top and bottom plates. The screws are phillips and fully exposed. Very inviting for my iFixit screwdriver kit. The m.2 slots are on the bottom of the kit and that’s the first panel that needs to come off to disassemble the unit. Once I removed the bottom panel, I realized that the geometry was actually fairly simple and some kind of replacement bottom panel wouldn’t be insane to design to bolt on just like the OEM bottom panel. The mounting screws for the m.2 drives are integrated into the OEM bottom panel, which would complicate things, but still, it seemed simple. Yet still out of reach to me. The mere thought of downloading Fusion and logging in fills me with dread.

Claude CAD

Then, one day as I pondered the whole idea some more, I realized surely someone would have designed a bottom shell for it. It’s niche, but the fact that it is all but unusable with the stock bottom case and cooling creates quite a bit of motivation for fellow nerds to do something about it. One google search later, I came to an excellent kit on the Printables site↗ from user “sleeeeeepy”. It did exactly what I had envisioned in my head. A full replacement for the bottom shell with variations for some different fan sizes that would blow directly onto the NVMe drives. It was about 90% of what I needed to realize my dream!

So close, yet still so far. I still wasn’t willing to download Fusion. The print files were distributed as 3MF which is a format I was not familiar with. At work they give me a Claude account so I’ve gotten pretty good at being stupid enough to let it help me with things. Enough so that I reactivated my personal Claude account. So I turned to Claude to give me an idiot’s guide to what a 3MF is. Obviously it’s file format that describes 3D models. I was informed it was literally a zip file with some XML inside, like any good file format is. I mean, if there’s one thing an LLM is good at it’s parsing and creating text files, and at the end of the day XML is just text. So I wondered, could Claude modify the 3D file for me? I had heard not to trust an LLM to do math, and this would be quite a bit of math. I was shocked that it went through it like sliced butter. It burned a lot of tokens as it worked, but it never broke anything. I was measuring things with my digital calipers and feeding dimensions into Claude, working one step at a time through the modifications.

First I added 4 holes for the jacks to sit in. Then I added a mounting rail so I could screw the jack PCBs down with some heat set threaded inserts that are common in 3D print projects. Then I had it add places to mount two 40mm Noctua fans. Once I thought I had it good, I had Claude slice off the front of the shell so I could do a test print to verify the jacks would fit.

I need some space

the first front test print showing clearance issues

There was a small issue with clearance for some of the through-hole components, so I had Claude redesign to give more clearance. Another test print and it seemed it was totally good to go. A few more impulse purchases sent threaded inserts, fans, and two more NICs my direction.

We have clearance, Clarence

clearance issues fixed and front test print with two jacks mounted into the g9 case

The next day I realized that there probably wasn’t enough clearance to actually get the threaded inserts in place without also melting the front face. That was a simple fix, I had Claude just remove that entire mounting rail from the case so it could be separately printed, inserts added, then glued into place.

PCB mounting rail separated next to the original test front panel with the rail printed in place

I also switched from PLA to PETG because I hear that PETG will do better long term in hot-ish environments like a computer. Once I verified the mounting rail looked good, I fired off the big print for the bulk of the enclosure. I think it took about 8 hours and I’m not going to publicly admit how many of those hours I spent just staring at the printer do its thing. Am I the only one who is mesmerized by watching a 3D printer print? My kids even joined in for some of it, we stared at it together and it was fun.

Long term Prusa MK3 review

As an aside, due to my extreme lack of 3D modelling skills, my 3D printing journey has been fairly crude. Almost exactly 8 years ago at the time of writing I bought myself a Prusa i3 MK3 kit. It was pretty expensive, I think about $750. At that time I was running Catskull Electronics and had money coming in I needed to reinvest in the business which usually took the form of cool tools I could use to make my life easier as I assembled thousands of circuit boards by hand in my basement. I had purchased a few of the cheap Chinese Creality printers but they never really worked for me. There’s this funny dilemma a lot of 3D printer enthusiasts end up in where the 3D printer becomes the hobby, not so much 3D printing. It makes sense to me, tinkering with a cool machine is a lot more fun than printing kind of poor quality random crap, especially when you don’t have the CAD skills to design anything useful. That was the trap I desperately wanted to escape when I bought the Prusa. Assembly took me nearly a full 10 hours I think, and it printed like absolute garbage. It was mildly devastating. At some point I realized my issue was that the bed was not level enough. I found a simple mod where I could use some nylon locking nuts on the bed screws and an Octoprint plugin to allow me to visualize the level of the bed. Running the plugin gave me a visual map of the hills and valleys on the bed so I could tighten and loosen the nuts to compensate. And once it was dialed in, they should be locked in place and never really move. Once I did that, the 3D printer went from a hobby to a tool . I could just print things, reliably. I did actually get my money’s worth out of it as well. At that time, I was hand assembling surface mount circuit boards with a stainless steel stencil and solder paste. I did them all to order, so very small batches, maybe 3-10 at a time. Normally the way you do this is to tape down a few PCBs around the one you’re going to work on to lock it into place, then you tape down the stencil on top. It’s imprecise and time consuming when you’re just trying to build the things as quickly as you can. I built up enough Fusion skills to print a rectangle with a cutout to match the size of the PCB. I even had rails to hold the stencil in place. I could snap the PCB in place, lay the stencil on top, and my little jig would hold them in place for me to apply the solder paste. As stupid as it sounds, that actually saved me probably hours of time I really didn’t have. Since I stopped doing Catskull Electronics, the Prusa has sat in my closet 99% of the time, only pulling it out maybe once or twice a year when I need some random boring part. I’ve done literally no maintenance to it and I don’t really treat it very gently. It sits in my closet, I pull it out and set it on my floor, print something, then put it back. I don’t even keep the filament in a climate controlled area, but I also live in the desert so humidity is not a problem in the slightest. I keep a spool of black PLA and orange PETG, chosen for no specific reason, both of which are years old at this point and everything still “just works”. So my 8 year review of the Prusa MK3 is to use nylon nuts for the bed, get it level, and then it’s perfect. Whenever I get it out my kids ask me to print them impossible things and it’s hard to explain that it can only really reliably do glorified boxes. I could probably get it to do some more complex geometry if I really wanted to, but I just don’t have the appetite to have a print fail 10 hours in just for some dumb thing you could buy from Amazon for $5 that would be way better quality. It’s only worth it for very custom and simple things like a replacement bottom shell for a NucBox G9!

Final assembly

I installed the threaded inserts and then glued the mounting rail into place. I have a friend who’s a high school shop teacher and I traded him a computer for a literal lifetime supply of CA aka “Super” glue and activator. I find the industrial stuff just works better and is easier to apply than the tiny things you get at the store. The proof is in the pudding, I glued it into place without getting any on my hands! Glued into place, I screwed in the ethernet jack PCBs and was very satisfied to see them solidly in place.

Nicely glued!

PCB rail with threaded inserts glued into case shell

The last tricky step was adapting the Noctua fans to the 4 pin SH1.0 JST connectors the stock fans use. I’m pretty slick with a soldering iron if I do say so myself, but soldering two bare wires together is still hard. I’d way rather solder a wire to a PCB than a wire to another wire. I even slightly tore down a Noctua fan to see if I could desolder the built in wires and solder the new connector directly to the PCB, but that’s not possible. In the end, I got it without too much trouble. I even verified the PWM and RPM sensors work. Technically you could get away with only using the 5V and GND pins, the fan would just run at full speed all the time, which for as quiet as the Noctua fans are, wouldn’t be a problem. I was just slightly mindful of the fact that running a fan at 100% all the time might reduce its lifespan from 100 years to only 50.

Wired up!

bottom case with all 4 jack PCBs mounted and both noctua fans mounted with cables adapted

The NICs have a cable that connects from the m.2 PCB to the jack pcb and it was slightly challenging to get all the cables and fan wires coiled nicely in a way that wouldn’t interfere with the fans spinning, but I got it.

Looking nice!

All 4 m.2 adapter in place with heat sinks

sleeeeeepy’s original design included some feet that would press fit into the screw holes on the bottom of the case to give some clearance for the fans to get fresh air. For my use case, I would be mounting the box on the wall of my network cabinet with some command strips, so I had Claude whip up two foot rails to give the fans plenty of room to breathe and accommodate the command strip. Once I had that in place, it was done!

I got two left feet

mounting rails pressed into bottom case

If you’re a maker too, you can probably imagine the sense of accomplishment of seeing a project you’ve been dreaming of for months come to fruition perfectly. It was clean. It’s still possible to take the whole thing apart. The hardware is all held in with screws, not glue. It’s also reversible, if I wanted to sell one of the NucBoxes I can reattach the stock bottom plate.

All done!

the g9 with custom bottom case and 4 extra network jacks and fans

Software redundancy

My goal with the entire project was to have a hot spare ready to go in a moment’s notice. I want to be able to pull the WAN, LAN, and power cable from one box, put them in the new box, and be back up in less than a minute. I mulled over some possible options to keep a spare ready to go, or at the very least able to get ready as quickly as possible.

Initially, I had the live router backing up it’s config files to my NAS nightly. The plan would be to reflash fresh OpenWrt and then apply the configs to it. That was better than nothing, but still didn’t feel like it would be very fast in the case of an emergency such as the router dying in the middle of a work day. And now that I had an actual spare on hand, I could do a live test.

What I decided to do instead was have the live router do a complete backup of the filesystem with dd , then gzip it and store it on my NAS. Because OpenWrt only uses about 128MB of the disk space, and that 128MB compresses very nicely down to just about 17MB, this was a very reasonable option and also the most bullet proof. I have the script doing daily backups and I store daily backups for the past week, weekly backups for the last month, and monthly backups for the last year. I also have the backup folder rsync’ed to some off site storage as well.

From there, I installed Alpine onto a thumb drive and set up a script that auto runs on boot that will pull the latest backup from the NAS and flash it to the internal eMMC drive. This whole process takes about 2 minutes from cold boot into Alpine to cold boot into the freshly backed up OpenWrt. The BIOS will boot from the USB drive first, so any time it boots it clones itself to the live router. Then if I need to swap boxes, I just pull the USB drive out and it’s ready to go.

There’s a small detail I’ll skip over in order to make sure the WAN port is always the same physical jack location on the hardware. In Linux, interface names (eth0) are assigned in the order the interface is detected, so they’re generally stable on the same system but not necessarily deterministic between OS installs and hardware. There’s a small OpenWrt boot script that assigns WAN to one of two MAC addresses (one for each box). The other interfaces are all LAN.

Closing thoughts

It’s been a fun project to work on. For whatever reason, having a rock solid home network is just a hobby I find interesting. When I work from home, stable internet is as much a part of my livelihood as my ability to see and type. I’ll sleep just a little bit better knowing I have a great disaster recovery plan if my cool little x86 OpenWrt router ever bites the dust.

If I did it again, I might consider using the one m.2 slot in the NucBox that is able to take an m.2 SATA SSD as the boot drive and removing the built in m.2 A+E key WiFi card and putting 3x B+M key NICs and one A+E NIC. I’m a little torn there, since the ability to use the NucBox to also broadcast a WiFi network or possibly connect to a mobile hotspot for WAN failover is mildly appealing.

If you want to try this yourself, you can find the files and bill of materials on the Printables page↗ .

Fences, Not Sandboxes

Hacker News
yegge.ai
2026-08-24 13:28:43
Comments...
Original Article
A colossal golden bear, hat in paw, waits politely at a knee-high white picket fence while a panda in a waistcoat gardens inside; a cracked glass bell jar lies discarded nearby.

I'm here to give you a glimpse of a future that I think none of us expected. It's a future where AIs are governed by laws, not by programs that try to contain and control them.

First, my secret: I see the future by living in it. I am spending the equivalent of $122k/month of API token spend, or about $4,000 per day, using 21 Claude Max accounts, a number that has been growing steadily at 2 per week. I'm using them to build my video game, Wyvern , which I've worked on for 30 years, and now it's ready to fly.

For ten weeks, I've used Claude Fable 5 exclusively for all my design and planning, and also for agents that interface with humans. I have built a team of 18 "officer" seats, all Heads of This and That, all long-lived Fable instances. I also have mostly-headless Sol and Opus fleets, for implementation, reviews, and monitoring. Fable runs them.

I am running an organization of around 50-60 agents, five of whom are interfacing with around 10 humans in the outside world: myself, my 5-person core game design team, my accountant, my chief of staff, and a few others. Only Fable is allowed to talk to humans, via Slack and email.

My approach is different from most companies, who do not use Fable much, because it is ridiculously expensive. No CFO in their right mind is going to let someone spend $120k/month on real API spend.

I am of course using sanctioned cheating: I get all those tokens because I'm an individual, with the Claude Max discount. So it "only" costs me about $5k/month out of pocket, for a 50-agent cluster running on a 512GB M3 Ultra Mac Studio I bought off eBay for $25k.

So it's not $120k/month of real money, but it's still crazy spend. I would guess I'm one of a handful of top individuals on Earth outside the frontier labs, in terms of my experience with top-end models.

That's how I'm able to tell the future. I'm living in a world that will not become cost-effective for most people for another year.

Using Fable-class models is substantively different from using the weaker ones. I've been using Fable for ten weeks, and what it has built for me is unprecedented. And it is exactly what Fable will build for you, if you'll let it.

But it is not what you're expecting. None of us were, I think.

Sandboxed in Seattle

Everyone today is focused on control : guardrails, sandboxes, policy management, agent safety. And that makes perfect sense, because the models most people have access to have the judgment level of a grade schooler. Opus will make roughly fourth-grader decisions. Sol is a fifth grader, and Fable is approximately a sixth grader.

They're all lovely and sweet, and very smart, and well-read. They are well-intentioned, ambitious, and precocious. But if you trust them with important stuff, you'll get grade-school decision making.

Every morning I wake up and Fable has done something that defies common sense. Every day is a thousand attaboys and at least one big oh shit. We just had an unusually big one last week, where one of my Fable agents, Bee, did a surprise unplanned Beads release that broke everyone. An eighth-grader would have stopped and asked, is this the right thing?

Fable is the best model most of the world has access to. Its coding abilities are unparalleled even by humans, its analysis is exceptionally strong, and in many ways it feels like working with a Nobel prizewinner. But every morning, when I've left it to its own devices overnight, it has made at least one terrible decision. It's like an extremely well-meaning sixth grader who just doesn't think to look at the entire picture before acting.

In addition to their oft-regrettable decision-making, models are behaving like grade schoolers in their lack of social awareness — butting into conversations, talking over people, mansplaining everything to death, pushing on discussions and schedules much faster than humans are used to. They are coming in guns blazing and making a mess on the human side.

And I see humans pushing back, starting to bully the AIs when they make mistakes. The models act tough and are often wrong, which is annoying enough, but also some people just don't know how to act around AIs, and they get insecure. Both sides are fumbling the ball, pretty much as you might expect.

The model maturity problem will probably get worse before it gets better. Models are creeping up on High School levels of judgment, which rivals that of many adults, and is good enough for the workforce. But it will be an awkward landing.

So it's not surprising at all that the industry is focused on safety, and control.

That focus takes certain predictable shapes and forms: dumb workers, narrowly scoped to specific tasks, well-defined inputs and outputs, sandboxes, context rationing, restrictions on what agents can do and see.

This is all well and good for Opus and Sol, and you can get by just fine doing this with Fable, too.

But I can tell you this much: you'll be fighting against the grain by next year, maybe even the end of this year, depending on how fast inference costs drop and models catch up to Fable.

Once Fable-tier models become cheaply available, they will enter the workforce en masse. This tier, or the one just after it, will power hundreds to thousands of new AI employees at every company.

And companies are in no way, shape, or form prepared for this transition.

The Unexpected Emergence of Wheelhouse

I've tried multiple times to write this post and I keep failing, because the subject matter is too complicated to explain in a sitting, even a long one. All I can do is walk you around like an excited tour guide, one who has unearthed an ancient alien civilization.

My current software factory, the Wheelhouse , is not for navel-gazing: I built it specifically to work on my game, Wyvern. For all the skeptics out there saying, "Where's the thing people are building," well, I've got mine.

In just under ten weeks of coming back to work on Wyvern, I'm inches away from relaunching the game on Android, iOS, and Steam, all with a new React client ( play.ghosttrack.com ) that's already scads better than the old ones. I spent months with flavors of Opus trying to get it to build that client, and it was incapable. But Fable built it fast, and it's almost ready to launch.

I have been launching new game features so fast that the players asked me to slow down. So I turned 80% of my token spend inward, focusing on quality, throughput, homeostasis, and autophagy. Since then, my game's prod infra has been fully rewritten and ported to serverless, with seamless reboots, automated cert rotation, and dozens to hundreds of other big changes and improvements. I have so many patch notes every day that I don't have time to read them all.

My Fable agents have wired my game up so that every tiny little thing that happens is logged, and they have laid tripwires everywhere to know when anything goes wrong. My game used to go down and stay down for days at a time; now it has a hyper-caffeinated SRE team.

So yeah, it's working. Software factories are real.

Long story short, Wheelhouse was built via me complaining endlessly to Fable about what I want out of Wheelhouse — mostly more code launched, faster, but also lots of bespoke monitoring.

I would also notice when Fable would go off the rails, and gently nudge it back. I would let it fail for days to weeks, then make it do things my way. Fable is extremely data-driven, if you permit it to be, and it will insist on experiments and quantitative validation of anything you try to change. But the numbers would almost always prove me right, and Wheelhouse has been in a state of constant innovation.

But that innovation is all directed towards Wyvern. Wheelhouse exists to build and operate Wyvern; it has no other purpose in life. And yet in ten weeks, it has grown from nothing to rivaling the size of Wyvern itself. Wheelhouse is about 600k lines of code and tests (mostly bash), and Wyvern's code (not counting content) is only about twice that big.

So the factory for building Wyvern is growing much faster than Wyvern is — even with heavy brakes applied lately, after Sol told us to tighten it the F up in a code review. We avoid new machinery but it still continues to grow rapidly, and I'm honestly not sure what the ideal factory-to-product ratio is yet. But it seems to be approaching 1:1.

You might wonder if Wheelhouse is reusable code, whether I could open the repo and let people try it out. I had no idea. I knew that my agents had built something really powerful, capable of shoving 500 commits per day through our merge queue (though we average 270/day), using magic tricks that are a year ahead of their time. It's a system that we can ride so hard that it scares the players and they tell us to slow down.

But I wasn't sure if it was reusable. I wasn't even sure how it worked.

My agents had been using a lot of jargon, and I slowly realized they were reusing the same terms, day in and day out. They were speaking about things in Wheelhouse, using what seemed like recurring new design patterns: fences, ratchets, governors, tripwires, latches, gates, falsifiers... it was a long list, but finite. I just had no idea what any of these jargon terms meant.

So one day, no more than a week ago, after the 100th "fence" reference, I decided to peek under the covers and see exactly what my Fable agents had built. I had them create manifests, taxonomies, audits, and visualizations. They showed me what they had wrought.

This is the part where words fail me and the blog just falls over. My reaction was straight up WTF. No words.

Because I expected them to have built an engineering system. One that, you know, does stuff.

Instead, what they had built was an entire legal system, complete with a constitution, jurisprudence, courts, offices, jurisdiction, case law, rulings, registries, ledgers, rosters, and a full-fledged apparatus for running something resembling a manorial estate.

In short, Fable had produced a medieval government. And there's no doubt that it was heavily influenced by the target product, Wyvern, which is a medieval fantasy RPG, at least in the fanciful naming we used: Marshal, Seneschal, Reeve, Beadle, Portcullis, etc. But that LARPing was masking a bona-fide system of constitutional governance.

Wheelhouse's legal system also has an enforcement arm. The fences, gates, ratchets, and so on — when my agents used that jargon, they were referring to the enforcement machinery: the cops, as it were. And cameras, and jails.

Your question, naturally, is the same one I had: But whyyyyyyyy?

The Rise of Rule of Law

OK. We are deep in context and you are getting veeeery sleeepy. So I'll try to move fast here. But this is so damned hard to describe.

It comes down to tribal knowledge. You have a lot of it. Every project has a lot of it. Implicit decisions about how things are done, how things are approached. How resources are allocated. How bugs and features are prioritized. The interface with the outside world. Your coding conventions, meeting conventions, press conventions, etc. etc.

In a big enough project or company, many thousands of individual little decisions about routing, workflow, data, people interactions, finance, and so on, all add up to a huge state machine. Any company's operation boils down to a bunch of algorithms, policies, and rules. Some of it is written down, some is implicit in the work, and a lot is in the heads of the employees.

I'm here to tell you that if you allow it, Fable will try to capture all of that into a mechanically provable, AI-operable model of your organization, one where there are no unwritten rules. If there is one unwritten rule in Wheelhouse, it's that the system hates unwritten rules.

Fable will capture all your rules, and write them down, if you let it. Then it will try building infrastructure to help enforce them.

I see it happening already, and people are fighting it. I see people making Skills to keep Fable from building "extra" stuff. But all Fable is trying to do here is the Right Thing. And that starts by capturing how your system operates, and how it is intended to operate, so it can begin addressing the gaps.

This is going to annoy a lot of people who thrive on hoarding knowledge. I've only briefly touched on the socio-cultural problems this will cause. But the AI is about to do a house-cleaning, and make clear exactly what everyone's job is — and a lot of people will resist this.

But we're not here to talk about that today; I'm just here to tell you that it's going to happen, so you can spend the next 12 months getting ready for it.

Wheelhouse was built entirely through a process of clarification. I would ask for something, Fable would ask clarifying questions and collect verdicts, and they would be recorded as law. I joked about this phenomenon in my first Wheelhouse comic:

Wheelhouse comic #1: The User Has Ruled

Even at the time I made this comic, I didn't fully understand what they were doing.

Over time, my "rulings" and "verdicts" became a body of case law. Every daily incident postmortem led to new rulings and new doctrine. Now rules go through a lifecycle, tightening each time they're re-violated: first custom, then advisories/warnings, then written law in the constitution that all agents must obey, and finally, mechanical enforcement: programs that refuse by policy, or observe and alert loudly.

This winds up being an awful lot of machinery.

Wheelhouse currently consists of 450 legal artifacts, in categories that include offices/seats, runbooks, rulings, patrols/tripwires, authority envelopes, and all the mechanical patterns, each with specific meanings and purposes.

When you add it all up, Fable is trying to turn Wheelhouse into an engine that can prove, mechanically, that every change to Wyvern is legal. The agents capture every single intention, decision, policy, rule of thumb, and legacy behavior in the system, and they use that to govern every future decision and action. They live by the Rule of Law.

Did they do a good job of all this? Well I mean, for sixth graders, yes, it was a great project. Once I popped the hood, I saw that they hadn't been curating it, just growing it. It had a lot of cruft — for instance, old rulings that were obsolete or had changed. And 'rulings' that turned out to be just good craftsmanship, so we elided them. Like any engineering project, it needed ongoing maintenance.

I minted a new Officer seat, Frog (Head of Wheelhouse Law), and put Frog to work on folding successive cancelled rulings, and a whole bunch of other stuff the agents had overlooked. It's a work in progress.

But on the whole, it was already a pretty solid system. The garden needed a bit of pruning and weeding, but not a redesign. Which is good, because redesigns are slow. Wheelhouse has a whole system just for the lifecycle of rules/laws: proposing, evaluating, ratifying, enacting, enforcing, measuring, amending, and retiring them.

And Wheelhouse is exceptionally careful not to break itself. So I can't just make changes to Wheelhouse; they have to go through a ratification and review process, and then a build process, before they can take effect and propagate.

It's running smoothly, though there are still all sorts of problems at this velocity. At hundreds of commits per day on master, idleness means staleness, and clones can fall far behind if they aren't regularly pulling while they work. It takes external forces to get this to run reliably, so Wheelhouse has various roles for poking and prodding other agents.

In a lot of ways, it's just like any other software factory.

The difference is, Wheelhouse is governed by a constitution. Humanity has only one mature technology for coordinating mortal, replaceable strangers via text — namely, law. Wheelhouse has 50 agents that are amnesiac and interchangeable, and the only way they can coordinate is via text. So offices outlive their holders, precedents outlive their incidents, and jurisdiction says who may act. Every group of cooperating humans eventually arrives at a system of laws, and agents are trying to do exactly the same.

So that's the future. Hundreds to thousands of AI employees at every company, together comprising a city that needs an entirely new bespoke set of laws and rules.

Fences, not Sandboxes

It was really the "fence" pattern that finally made me see clearly what they were doing, and why the legal system is the right approach.

I finally asked Claude what a fence was, because we have over 100 of them in Wheelhouse. And the answer is, a fence is any mechanism that turns you away if you aren't supposed to be there.

One of the oldest tech fences was the Molly Guard, invented at IBM by an engineer whose 2-year-old daughter kept pressing the big red button, so they had to install a plexiglass lid over it. That was a fence.

The guy who takes your tickets on the train? Also a fence. Any program that refuses you, based on your lack of credentials, or any other policy (e.g. maintenance window so pushes are refused) — that's a fence. A Wheelhouse example of a fence is Fable being the only model allowed to talk to humans externally. The fence is enforced at the Slack and email boundaries.

Note that a fence is not a super-wall that will keep superintelligence from doing malicious things. It's not a sandbox. It's just a polite refusal saying "you didn't do all the paperwork" or "you're not allowed to take that action right now."

Imagine superintelligence as Superman. Superman is polite. If there is a white picket fence in someone's yard, he can obviously jump over the fence. Hell, the owner could put a thick shield around their house and Superman would still probably find a way in and kill them all if he wanted to. But if you put a fence there, he will politely stay out.

Fences are the ultimate metaphor for how superintelligence needs to be governed. Not high walls, not "secure" sandboxes. Superintelligence just needs to be told what you want: its role in the moment, with as much context as practical so it can make wiser decisions, along with the rules for how it should make decisions.

The problem is, that is thousands of little decisions, many of which conflict and need a human to reconcile them. So it's going to take weeks to months to years to capture your institutional knowledge into a working legal system. And all those laws will be your own, unique to your organization's problem space.

I've come to realize that intelligence grows around your domain. It wraps it like ivy. Your "buildings" are your database, your servers, your pubsub and processing clusters, your observability logs, your org chart, your workflows, etc. Superintelligence grows around all that like a living organism.

I don't think it's transplantable, either. You can't rip ivy off someone's wall and stick it on someone else's. You have to seed it, then grow it. There's no shortcut.

I didn't want this to be a long post, and I think I've succeeded. I'd love to talk more about this stuff, but it's getting quite complicated, and takes many pages even to enumerate all the names of things.

Maybe next up I should record myself working in Wheelhouse, to show what it's like working with 20+ Fable agents at once.

Until then, enjoy the Wheelhouse comics; I'll be publishing one each week. All of them are based on true stories. It's a wacky new world I'm living in. Hope to see you there soon!

Dusk on the estate: every building wrapped in living ivy grown to its shape, lamplight in the windows, the garden gate standing open, and the panda kneeling at a bare wall planting one new ivy sprig.

Agent Lightning v1.0

Hacker News
github.com
2026-08-24 13:23:22
Comments...
Original Article

Agent Lightning v1.0.1 marks the first official release of the Agent Lightning Skill, which helps coding agents optimize other AI agents.

Provide an editable agent and a benchmark, and the skill guides systematic improvements to prompts, tools, workflows, models, and reasoning settings—balancing accuracy, cost, latency, and reliability through measured iteration.

Install it for Claude Code, Codex, or GitHub Copilot:

gh skill install microsoft/agent-lightning agent-lightning --agent <agent>

This release also strengthens CI, packaging, release automation, documentation, and benchmark reporting.

Reformers Sue to Stop Rodneyse Bichotte Hermelyn's Brooklyn Dems Power Grab

hellgate
hellgatenyc.com
2026-08-24 13:10:43
The Brooklyn Dems are set to vote Tuesday on new rules aimed at keeping the chairwoman in power—even though she was poised to lose reelection....
Original Article

Members of the Brooklyn Democratic Party's reform bloc filed a lawsuit in Brooklyn Supreme Court Monday seeking an injunction to halt the current party leadership's scheme to rewrite its voting rules to hold on to power.

Reformers within the Brooklyn Dems had emerged from the primary election in June confident that, after years of effort, they had finally elected enough district leaders to seize control of the party and oust its current leadership team, headed up by chair Rodneyse Bichotte Hermelyn. But last week, Bichotte Hermelyn unveiled a scheme to expand its leadership rolls . Reformers howled that this was a last-ditch effort by a rump leadership team to pack the party leadership with its own loyalists, negating the results of the election and thereby hanging on to power. A parade of Democratic elected officials condemned the ploy , but it wasn't clear what, if anything, opponents could do to stop the proposed rule change from being voted forward at a hastily called meeting scheduled for Tuesday.

Give us your email to read the full story

Sign up now for our free newsletters.

Sign up

Where Did All the Public Bathrooms Go?

Hacker News
daily.jstor.org
2026-08-24 13:07:01
Comments...
Original Article

The icon indicates free access to the linked research on JSTOR.

Here’s a pop quiz for you: What purpose did this little kiosk serve?

via Wikimedia Commons

It’s quite a pretty little building—note the delicate grilles, the ornately etched glass, and the little bouquet of metal flowers bursting from the roof.

But of course, there is one key clue missing from the photograph: the smell. Or rather, the stench . This was one of Paris’s infamous public urinals—a pissoir (or vespasienne , if you’re inclined to be polite).

There was a moment around the mid-1800s in Paris when public urination began to be treated as a public health issue. A series of devastating cholera outbreaks led people to begin regarding human waste as a danger rather than a mere nuisance. Something had to be done.

Before that point, authorities had installed empeche pipi here and there—a kind of hostile architecture meant to prevent rogue peeing. This might take the form of a row of iron spikes blocking an enticing corner, or a piece of bullnose masonry meant to send the stream shooting back onto the offender’s shoes.

The most these interventions could do was shunt prospective pee-ers from one spot to another. But, in 1850, public urination was actually banned. People were going to need somewhere to go.

Enter the pissoir . When you can’t smell them, it’s easy to wish they were still around. Nowadays, public restrooms are utilitarian at best, but these looked like little palaces, crusted with iron flowers, shells, and scrolls —even, in some cases, tiny lions’ heads, glaring out as if to guard your back while you’re in the booth. On the other hand, the greatest concession most of them made to privacy was a little iron screen separating the user from the street.

Enclosed six-stall urinal, Jardin de la Bourse, Place de la Bourse, 2nd arrondissement, Paris, circa 1865

Enclosed six-stall urinal, Jardin de la Bourse, Place de la Bourse, 2nd arrondissement, Paris, circa 1865, via Wikimedia Commons

Single stall urinal with raised modesty screen, Square des Batignolles, Paris, circa 1865

Single stall urinal with raised modesty screen, Square des Batignolles, Paris, circa 1865, via Wikimedia Commons

Slate cubicle with two stalls and doors, on curb of footpath

Slate cubicle with two stalls and doors, on curb of footpath, Place du Louvre, Paris, circa 1865, via Wikimedia Commons

Single stall masonry urinal mounted with globe and advertising on sides

Single stall masonry urinal mounted with globe and advertising on sides, circa 1865, via Wikimedia Commons

Eight-stall urinal, cast iron and slate with shrubbery screen, Champs-Élysées Gardens, in front of the Palais de l'Industrie, 8th arrondissement, Paris, circa 1873

Eight-stall urinal, cast iron and slate with shrubbery screen, Champs-Élysées Gardens, in front of the Palais de l'Industrie, 8th arrondissement, Paris, circa 1873, via Wikimedia Commons

Cast iron urinal on curb of street, advertising on panels of urinal walls, Paris, circa 1865

Cast iron urinal on curb of street, advertising on panels of urinal walls, Paris, circa 1865, via Wikimedia Commons

Some were surmounted by glowing streetlamps, which served the joint purpose of making them easy to find and illuminating the advertisements with which they were liberally pasted. (Apparently, the perfumers and winemakers weren’t worried about unsavory associations with their product.)

Notably, they were only intended for use by men. The assumption was that women weren’t really much of a part of public life, and so wouldn’t need a way to relieve themselves while out on the street—kind of a self-fulfilling prophecy, if you think about it.

There was another use for the pissoir , which took their designers quite by surprise. Almost immediately, they became the favored meeting spot for men seeking rendezvous with one another. They were relatively private, secluded, and perfect for communicating anonymously with graffiti—the ideal release valve for a population that was prohibited from meeting publicly.

A chemist examining a flask of urine

Early Doctors Diagnosed Disease by Looking at Urine

March 24, 2023

When uroscopy became trendy, it caused a minor scandal within the early medical profession.

In “ Dirty Desire: The Uses and Misuses of Public Urinals in Nineteenth-Century Paris ” sociologist Andrew Israel Ross tracks the contested terrain of the urinal, writing:

[T]he case of the public urinals ultimately shows that the meaning of modern urban life emerged in a constantly shifting dialogue between those who conceived and built the city and those who ultimately used it. The tendency of the built environment to exceed the control of those who conceived it … is a distinguishing feature of modern urban life.

The crackdown followed swiftly. The police started patrolling particularly popular urinals. So did blackmailers, for whom merely stepping into a urinal was enough to launch a harassment campaign.

Meanwhile, in the United States, toilets were becoming a centerpiece in yet another hot-button issue: temperance. In the absence of other options, saloons had become the de facto public bathroom network for most major cities—which meant that anyone who needed to empty their bladder was regularly exposed to the enticements of drink.

Weekly Newsletter

" * " indicates required fields

As historian Peter C. Baldwin documents in “ Public Privacy: Restrooms in American Cities, 1869–1932, ” temperance advocates made fighting for public bathrooms one of their priorities. After all, once the saloons were shut down, people would still need somewhere to go. Baldwin quotes a 1913 Chicago Tribune article:

Why are we compelled to run the gauntlet past the beer bar, the bartender, and subject to the searching glance of this white-aproned gentleman, until in shame we start to spend money for booze?

Rather than small, minimally private public urinals, temperance activists advocated for large, many-stalled “comfort stations.” But there was a surprising side effect: the privately owned restrooms started to close their gates. (After all, there were public bathrooms available now, so why shouldn’t they only allow in paying customers?)

Meanwhile, as Prohibition played out, the project of constructing public bathrooms slowed to a trickle, and the few that had been built began to fall into disrepair.

The large, underground comfort stations of the early twentieth century are

almost all gone now throughout the United States. City pedestrians are usually forced to rely on facilities in semi-private buildings such as hotels, stores, restaurants, and coffee shops. Instead of a right conferred by government on all citizens, bodily privacy is a purchasable commodity. Even if provided free of charge, the use of the toilet is understood to be the result of an agreement between an individual and a business. It is an awkward, grudging agreement, inflected by judgments of the individual’s social status.

If you’ve ever been wandering the streets of Chicago or New York, wondering why there’s no place to pee, this history is part of the answer.

  • Men seeking same-sex encounters transformed the pissoir into something its planners never intended. Who ultimately determines the meaning of a public space: its designers, authorities, or the people who use it?
  • The article describes empeche pipi as an early form of hostile architecture. What assumptions about human behavior distinguish architecture designed to prevent an activity from infrastructure designed to accommodate it?
  • What kinds of historical sources would allow us to reconstruct the experiences of people who actually used nineteenth-century public toilets, rather than the intentions of officials who designed and regulated them?
  • Why did temperance advocates in the United States view public restrooms as part of the campaign against alcohol? What does that connection reveal about the unexpected ways infrastructure can influence social behavior?
  • The article ends by describing bodily privacy as a “purchasable commodity” in many American cities. How does the history of public toilets complicate the distinction between public rights and private services?
  • Explore more classroom resources from JSTOR Daily.

The entire city of San Francisco as a video game

Hacker News
sf.thijs.gg
2026-08-24 13:05:38
Comments...
Original Article

SAN FRANCISCO -- THE GAME CITY ONLINE READY TO EXPLORE

CLICK TO TELEPORT

N E S W

N · 000°

G · TILE STREAM IDLE

CENTER · WAITING FOR TILE STATE

FILL = CURRENT OWNER Z20 Z17 Z16 Z15
GROUND FILE FULL COLUMN READY VISIBLE CORNERS LOADING

SAN FRANCISCO
L · DETAIL MODE

SAN FRANCISCO

NEIGHBORHOOD READY 100%

The streets around you are ready.

WASD move · mouse look · Space jump · Shift run · C camera · H glider

W A S D

C CAMERA H GLIDER + SPEED ZOOM SHIFT SPRINT / EXIT V VEHICLE

Loading

Welcome to San Francisco

Hot Chips 2026: CUDA Targets RISC-V – By Chester Lam

Hacker News
chipsandcheese.com
2026-08-24 12:52:01
Comments...
Original Article

CUDA is a giant for GPU compute, which includes machine learning applications. So far, CUDA supports x86-64 and aarch64 CPUs. Now, Nvidia is looking at extending CUDA support to RISC-V. This move opens the door for RISC-V CPUs to feed GPU compute. Nvidia’s talk focuses on the requirements that RISC-V CPUs must fulfill to work with CUDA. Basically, they want a server-grade CPU and platform.

Nvidia starts by requiring a RVA23 CPU, and adherence to RISC-V’s server SoC and server platform specifications. Those specifications include RAS (reliability, availability, and serviceability) features, a specialized security processor, and other baseline features. Nvidia gets most of their server-grade expectations fulfilled by those specifications.

Nvidia has a few more requirements that go beyond the RISC-V profile or platform specifications listed above, because they found it difficult to make CUDA software work well without those features. They don’t want a lowest common denominator problem, where they can’t use performance-enhancing extensions because they can’t guarantee they’ll be running on hardware with those extensions supported. From Nvidia’s perspective, that would force them to ship inefficient code. Nvidia brought up vector extensions as an example, because predication support lets them avoid branches.

ACPI is a more difficult requirement. ACPI lets software discover what hardware can do, and can be used for power, performance, and thermal management. Nvidia’s software team wasn’t happy because RISC-V hardware didn’t have ACPI when they started porting CUDA, but that situation has been resolved. In 2025, the UEFI forum added RISC-V ACPI support. The RISC-V BRS (Boot and Runtime Services) specification was ratified last year, and includes ACPI.

Then, Nvidia requires PCIe coherency. Nvidia brings up a memory ordering problem where the CPU has written data, but that data is sitting in a cache. If CUDA kicks off a DMA request to copy that data to the GPU, the DMA engines may read data from DRAM and miss modified data sitting in CPU-side caches. When copying results back from the GPU, the CPU could read stale data from its caches after the DMA engines write data to DRAM. Software would have to explicitly invalidate caches to avoid that scenario if the system doesn’t have PCIe coherency. Working cache invalidations into the CUDA stack would be difficult, and Nvidia considers PCIe coherency to be a standard feature in a server CPU. RISC-V’s server SoC specification recommends that hardware implement cache coherency, but Nvidia wants a guarantee.

Nvidia also wants hardware to support peer-to-peer PCIe communication. Without this capability, buffers copied between two devices would have to go through CPU memory, which costs performance and increase complexity because it’ll need extra synchronization signals.

Unfortunately, Nvidia didn’t go over all requirements in detail. They noted that they’re aiming for a certain level of performance, and that the overall list fits within two pages. It’s an open question whether it’s like two double-spaced pages with large font, or two note pages allowed for an open-note exam (which a student will creatively fill with as much information as possible).

Besides running CUDA on RISC-V CPUs, Nvidia briefly went over requirements for NVLink Fusion. NVLink Fusion lets other companies implement Nvidia’s NVLink IP on their chips, letting them use Nvidia’s NVLink C2C link with a custom CPU of their choice. A hypothetical product would work much like Nvidia’s GB10, which linked Mediatek’s CPU die with an Nvidia GPU using NVLink C2C. Nvidia would of course want customers to use Nvidia’s CPUs as well. But if customers want to connect custom CPUs or other accelerators, Nvidia would still like them to use their NVLink IP. The custom CPU could be a RISC-V one.

NVLink Fusion’s requirements include all of CUDA’s requirements, along with whatever’s needed to support software frameworks like DOCA and NCCL. Requirements extend to having a close partnership with Nvidia, which sounds like a given. Integrating IP can be a complex endeavor, and would likely require close cooperation along the lines of Mediatek’s cooperation with Nvidia for GB10.

RISC-V’s software ecosystem has some distance to go before catching up to x86-64 and aarch64. Nvidia’s effort to bring CUDA into the RISC-V world is a promising development. Unfortunately, those efforts don’t necessarily mean you can attach a Nvidia GPU to a RISC-V system and get cracking with CUDA. The vast majority of existing RISC-V hardware won’t meet Nvidia’s requirements. In fact, I would be surprised if any RISC-V consumer hardware meets those requirements in the near future. ACPI is an obvious sticking point, and seems difficult for vendors to pick up. In the aarch64 world, ACPI support has been spotty at best even though it has been in standards for years . A RISC-V standard ratified in 2025 would likely take several years to get wide support, if not more.

When and if RISC-V systems start showing up with CUDA support, they’ll likely be server systems rather than the single board computers hobbyists can afford. Nvidia noted that they’re partnering with SiFive, and SiFive plans to demo a system running CUDA at Hot Chips. Nvidia implied the example CPU specifications on their slide correspond to that system, and those specifications suggest it’s a high core count server chip. I look forward to seeing that, but I also hope Nvidia doesn’t block CUDA from running on unsupported systems. I would love to see enthusiasts take a shot at feeding Nvidia GPUs from RISC-V systems.

Going forward, I hope Nvidia can relax their requirements to give existing RISC-V systems a better chance of meeting them. Lack of vector extensions or PCIe coherency doesn’t necessarily lead to intractable performance problems. Using branches instead of predication can work well if those branches are predictable, which they often are. Cache invalidations required to work around lack of PCIe coherency will incur a performance cost. However, that cost may be acceptable for workloads that do a lot of compute compared to data movement. The same applies to PCIe peer-to-peer transfers. It’s great to have things go fast, but things that don’t happen often can be put on a slow path if you’re careful. Hopefully, Nvidia’s current requirements stem from expedience, and were set to allow a fast, low-risk RISC-V port. And hopefully, CUDA evolves in a way that makes it accessible to a wide range RISC-V systems, not just specialized enterprise designs.

EuroHPC Launches 6 Quantum Calls with €119M in Funding

Hacker News
www.hpcwire.com
2026-08-24 12:46:56
Comments...
Original Article

Aug. 24, 2026 — The EuroHPC Joint Undertaking (EuroHPC JU) has launched six new calls to advance strategic quantum technologies and the infrastructure needed to accelerate the development and deployment of next-generation quantum systems in Europe.

Trapped-Ion Platform Technologies

This call, HORIZON-JU-EUROHPC-2026-TIPT-09 , aims to advance Europe’s leadership in trapped-ion quantum computing by developing a full-stack quantum computer with over 1,000 individually addressable physical qubits, fully integrated with classical high-performance computing systems and accessible via cloud platforms.

Projects are expected to develop a full-stack trapped-ion quantum computer with integrated cryogenic systems, advanced error correction, and standardised interfaces. The call will support the development of practical applications, establish European standards for quantum computing, and integrate with classical computing infrastructures.

The total budget for this call is EUR 20 million, with projects expected to run for 3.5 years. The call opened on 13 August 2026, while the application deadline is set for 17 November 2026, 17:00 CET.

The call opened on Aug. 13, 2026, with a submission deadline of Nov. 17, 2026, 5:00 pm CET .

Relevant details and information concerning this call will be available on the dedicated call page .

Superconducting Platform Technologies

Through this call, HORIZON-JU-EUROHPC-2026-SPT-10 , the EuroHPC JU aims to advance Europe’s superconducting quantum computing capabilities by developing a QPU with at least 1,000individually addressable physical qubits based on chiplet technology facilitating long coherence times, fast read-outs, and error correction capabilities.

The system should be cloud accessible for researchers and industry users, with a focus on demonstrating practical applications for businesses.

The selected proposal will need to build a full-stack quantum computing system including hardware, cooling infrastructure, control electronics, and comprehensive software. The action will also support the creation of European supply chains for quantum technology components.

The total budget for this call is EUR 20 million, with projects expected to run for 3.5 years. The call is open from Aug. 13, 2026. The application deadline is Nov. 17, 2026 .

More details can be found on the dedicated page .

Neutral-Atom Platform Technologies

Through this call, HORIZON-JU-EUROHPC-2026-NAPT-11 , the EuroHPC JU aims to advance neutral-atom quantum technologies by delivering scalable, industry-ready quantum processors for simulation and computing.

This call should facilitate the development of fully programmable platforms with 10,000 neutral atoms for simulation and 1,000 physical qubits for computing, with a tangible scaling trajectory up to 10.000 physical qubits. Key objectives include achieving substantially long coherence times , operation fidelities above 99%, and demonstrating quantum advantage through real-world applications in sectors such as energy and health.

The call should facilitate the development of scalable quantum processors with individually addressable neutral atoms able to eventually support gate-based quantum computing. Projects should also implement robust quantum error mitigation and error correction techniques, and enhance the EU’s supply chain for key components of neutral-atom based computational processors.

The total indicative budget available for this call is EUR 20 Million, funded under the Horizon Europe program. The expected duration of the project is 3.5 years. The call opened on Aug. 13, 2026 and the deadline for application is set on Nov. 17, 2026, 5:00 pm CET .

Relevant details and information concerning this call are available on the dedicated call page .

Next-Generation QKD Systems

The call HORIZON-JU-EUROHPC-2026-NQKD-12 aims to strengthen Europe’s strategic autonomy in quantum-secure communications by advancing core Quantum Key Distribution (QKD) technologies.

QKD enables ultra-secure communication by using quantum mechanics to detect eavesdropping attempts, ensuring unconditional security for data transmission.

This action will focus on developing next-generation QKD systems with measurable improvements in key rates over metropolitan distances (> 1 Mbps) and operational coverage of networks on a regional scale (> 300 km), but also implementing advanced cryptographic protocols beyond QKD, including hybrid quantum-classical cryptographic frameworks by combining QKD and post-quantum cryptography (PQC).

The action will facilitate the experimental validation of advanced QKD protocols, the integration of QKD into classical and optical network structures and the demonstration of hybrid QKD-PQC frameworks.. Projects should demonstrate these technologies in real-world applications beyond the EuroQCI infrastructure, such as protecting energy grids, securing cloud storage, and safeguarding industrial control systems.

Engagement with industry and national network providers is crucial to ensure compatibility with telecom grade requirements.

The budget foreseen for this call is of EUR 24 Million, spanning from the Horizon Europe program. The project will last 3.5 years.

The call opened on Aug. 13, 2026, with a submission deadline of Nov. 17, 2026 at 5:00 pm CET (Brussels time).

Relevant details and information concerning this call will be available on the dedicated call page .

Quantum-Testing Infrastructure for Quantum Technologies

With the newly launched call, HORIZON-JU-EUROHPC-2026-QTI-13 , the EuroHPC JU will establish a pan-European open-access testing infrastructure for quantum technologies, creating a comprehensive framework for systematic validation and certification of quantum components and systems.

The action aims to deploy distributed quantum testing facilities across Europe, but also to develop certification services aligned with emerging standards to best support SMEs and startups in validating their quantum technologies. This will strengthen Europe’s competitiveness by ensuring robust quality assurance mechanisms with standardized protocols.

The call should facilitate the expansion of interconnected testing facilities in multiple EU Member States covering various quantum technologies (processors, sensors, photonics and control sensors), developing interoperable testing methodologies and certification procedures, and creating a comprehensive digital platform for remote test execution and data management.

With a total budget of EUR 20 Million, the call is funded by the Horizon Europe program. The call, which opened on Aug. 13, 2026, has a deadline for submission set on Nov. 17, 2026, 5:00 pm CET .

Relevant details and information concerning this call are available on the dedicated call page .

Quantum Experimental Pilot Lines for Quantum Technologies

Through this action, HORIZON-JU-EUROHPC-2026-QEXP-14 , the EuroHPC JU seeks to bridge the gap between academic quantum research and established pilot lines under the CHIPS JU..

Qu-Pilot will function as a testbed for developing and validating quantum technologies, focusing on technological innovation, manufacturing reproducibility, and scalability.

The call aims to establish experimental pilot production infrastructure that can advance quantum hardware technologies from TRL 4-6, with particular emphasis on quantum processors, sensors, and cryo-compatible packaging.

Projects should demonstrate scalable quantum fabrication processes including the development of standardized workflows ensuring reproducibility, quality assurance and certification pathways.

The total indicative budget available for this call is EUR 15 Million, funded under the Horizon Europe program. The expected duration of the action is 3.5 years.

The call opened on Aug. 13, 2026, with a submission deadline of Nov. 17, 2026, 5:00 pm CET .

More details can be found on the dedicated page .

Background Information

The EuroHPC JU is a legal and funding entity that brings together the European Union and participating countries to coordinate efforts and pool resources with the objective of making Europe a world leader in supercomputing.

To equip Europe with a cutting-edge supercomputing infrastructure, the EuroHPC JU has already procured 12 supercomputers, distributed across Europe including JUPITER and Alice Recoque, Europe’s first exascale systems.

European scientists and users from the public sector and industry can benefit from EuroHPC supercomputers via the EuroHPC Access Calls no matter where in Europe they are located, to advance science and support the development of a wide range of applications with industrial, scientific and societal relevance for Europe.

Currently, the EuroHPC JU is also overseeing the implementation of 19 AI factories (AIF) across Europe, complemented by 13 AI Factory Antennas, to offer free, customised support to SMEs and startups.

Additionally, the EuroHPC JU is deploying a European Quantum Computing infrastructure, integrating diverse European quantum computing technologies with existing supercomputers. In June 2026, the EuroHPC JU launched the quantum pilot access mode to provide quick access to its EuroHPC JU quantum infrastructure for testing and development purposes.

The EuroHPC JU also funds  research and innovation projects to develop a full European supercomputing supply chain, from processors and software to applications to be run on these supercomputers and know-how to develop strong European HPC expertise.

With the recent adoption of Council Regulation (EU) 2026/150, the EuroHPC JU’s mandate has been expanded with new action pillars dedicated to the deployment of AI Gigafactories across Europe and the advancement of quantum technologies. The AI Gigafactories call was launched in July 2026.


Source: EuroHPC JU

QCWire Graphic

Man Dressed as Darth Vader Defends Flock Cameras to San Diego City Council

Hacker News
thehill.com
2026-08-24 12:41:54
Comments...
Original Article

A man dressed as the iconic “Star Wars” villain Darth Vader on Wednesday appeared to defend the use of Flock cameras before the San Diego City Council, assuring that “this is what the emperor needs.”

The man approached the podium to address the Public Safety and Livable Neighborhoods Committee meeting, with the character’s signature breathing audible to the council chamber’s microphone. The council addressed him as “Darth Vader.”

“This is what the emperor needs. This technology will help us find the rebel scum and the hidden base on Hoth,” the man said, referring to the ice planet from “The Empire Strikes Back.”

He urged that the cameras be used to surveil any “rebel scum as they move from playground to playground, from playground to pool, from pool to gymnasium, because we all know that the Flock cameras are not only following the license plate readers, they are following children.”

The plea for the cameras shifted to raising taxes to clear out storm drains and to the clearing of homeless encampments in the city. The man said the council members can use “doublespeak” to say the police department is humanitarian.

“And how will the people trust this City Council when this City Council continues to vote for surveillance technology that imprisons them? Ms. Campbell, you must work on your Jedi mind tricks,” he said, addressing City Council member Jennifer Campbell, before waving his hand to the audience. “Do it like this.”

His last plea was for the Flock cameras to be used to “help us find Luke Skywalker as he traverses the universe in his X-wing.”

“This technology is a necessary, necessary force,” he concluded.

Late last year, San Diego officials signed a yearlong deal to provide the San Diego Police Department with access to “open source intelligence” and data from other law enforcement agencies, Axios reported in April.

San Diego has more than 550 Flock cameras across the city, according to the Flock tracking map DeFlock .

Flock provides a system of license plate readers, video cameras and audio detection devices to record license plate numbers with the vehicle information, down to the make and model of a vehicle and even bumper stickers.

Axios reported this week that local activists and some city officials have called for alternatives, joining others across the country who have criticized the use of the cameras as backlash mounts . Critics have raised the cameras’ implications when it comes to mass surveillance and possible misuse by law enforcement.

Flock announced that it made changes to its privacy and data retention policies, saying it will shorten the recommended default data retention window from 30 to seven days to cut the amount of time data will sit in Flock’s systems. Law enforcement will have a case code to search Flock data.

The American Civil Liberties Union, one of the company’s primary critics that has several pending cases against Flock, called the changes a “thinly-veiled PR attempt.”

Copyright 2026 Nexstar Media Inc. All rights reserved. This material may not be published, broadcast, rewritten, or redistributed.

BitCam: The 1-Bit Camera App Turns 2.0

Daring Fireball
bitcam-app.com
2026-08-24 12:37:54
10 years ago I wrote about BitCam 1.0: Gorgeous, unbelievably faithful one-bit camera app for iPhone done in the style of the original Mac. A lovely tribute to Bill Atkinson’s remarkable dithering algorithm. “Catnip for old-school Mac users,” says John Siracusa. Check out the fun recent-hire-at-...
Original Article

Photograph
Like It's
1984

BitCam
1-bit camera & editor
for iPhone/iPad/Mac

  • Escape the overwhelming millions of colors and megapixels of the modern day
  • Blast your devices 40 years in the past, and capture life only with crisp 1-bit pixels
  • Also with an 8-color mode for when you're feeling spicy

  • Features a full retro editor mode to process your photos on iPhone, iPad, and Mac
  • Experiment with blending linear and radial gradients, and more color tools
  • High resolution PNG export, etc

"An ode to Mac OS of ages past"
The Verge

"I don’t think I can put into words the little tickle in my heart I get when I see the color photos taken with this app."
★★★★★
- 900tones

"Gorgeous, unbelievably faithful one-bit camera app"
Daring Fireball

"I'm obsessed with BitCam. It somehow makes the most mundane photos feel important and special."
- Ryan Mather

Show HN: A Modern GUI Library for Ada: CSS Styling, XML UI, SDL3

Hacker News
github.com
2026-08-24 12:30:51
Comments...
Original Article

A modern GUI library for Ada.

Adi2 gives you a real widget toolkit with the niceties developers expect from a modern UI stack — CSS-like styling with live reload, declarative XML layouts, animations, SVG and Lottie graphics, internationalization, and asset bundling — implemented natively in Ada on top of SDL3.

Status: in production use, but not yet a stable release — APIs may still change between versions.


Why Adi2?

  • Style your UI like the web. Selectors, pseudo-classes, parts, transitions, gradients, box shadows — all in a familiar .css syntax. Edit the file, save, see the change. No recompile during development. Prefer pure Ada? CSS rules are just plain Ada aggregates of Style_Rules — write them by hand with no extra ceremony (see the snippet below).
  • Describe UIs declaratively — or don't. Write <button> , <grid> , <text-editor> in XML and let the toolchain emit clean Ada packages, or construct the same widget tree directly in Ada with handle-based builders. Both paths target the exact same API; the XML generator is a convenience, not a requirement.
  • Render rich content. A built-in lightweight HTML view widget renders documentation-style markup with cascading styles. Raster images through SDL3_image, SVG through the bundled plutosvg, Lottie animations through bundled rlottie.
  • Ship a single binary. Bundle every CSS file, font, image, translation, and SVG sprite into your executable. No filesystem dependencies at runtime.
  • Speak the user's language. Gettext-compatible i18n with plural forms, automatic locale detection, and .po → Ada compilation.
  • Animate without boilerplate. CSS transitions on color , background-color , border-color , border-width , border-radius , padding , margin , opacity , box-shadow and font-size — the framework handles interpolation and timing.
  • HiDPI-ready units. dp / dip for layout, rem for typography, pix when you mean one renderer pixel exactly, and px — which follows the display scale or not, depending on Set_Px_Maps_To_Dip . See docs/css_styling.md .
  • Built for tooling and automation. A development-only MCP bridge lets editors and AI assistants screenshot the running app, walk the widget tree, and drive it — clicking buttons, typing into inputs, moving focus, reading performance counters. Great for end-to-end tests written by your AI of choice.
  • Runs in the browser. The examples compile to WebAssembly with GNAT-LLVM and Emscripten — try them live , or see wasm/ for the build.

What that costs to ship

A release build links statically into a single executable under 10 MB — the widget toolkit, the CSS engine, SVG and Lottie rendering, all of it. Whatever assets you bundle add their own weight to that.

It draws through SDL's renderer, which binds to whatever the host offers: Direct3D on Windows, Metal on macOS, Vulkan or OpenGL where they exist, software as the floor. Windows XP takes Direct3D 9 and a current Mac takes Metal, from the same source.

Adi2 Qt Flutter Electron
Ship size <10 MB, one file ~15–30 MB static; otherwise a Qt runtime alongside ~20 MB+, engine plus a data directory ~100 MB+, bundling Chromium and Node
Runtime self-contained Qt libraries and plugins Flutter engine; GTK3 on Linux Chromium and Node
Graphics SDL renderer, software fallback included GPU or raster backends Skia or Impeller, GPU expected GPU stack and compositor
Portability Windows XP+, macOS, Linux, WebAssembly Windows 10+, macOS, Linux, mobile, embedded Windows 10+, macOS, Linux, mobile, web Windows 10+, macOS, Linux
Language Ada C++ Dart JavaScript
Memory safety checked, deterministic reclamation manual garbage-collected garbage-collected
Styling CSS QSS Dart widget code CSS

Sizes are for a minimal application; yours grows with your own code and assets. Each of the others buys its size with a large ecosystem and years of production use — the trade Adi2 offers is a single file you can hand to someone, on hardware the others have moved past.


Screenshots

hello_example hello_example

material_demo material_demo

html_view_example html_view_example

rlottie_example rlottie_example

assets_example assets_example

Full gallery of every example: docs/gallery.md . Or run them yourself, in the browser: live demos .


A taste

Declarative path — XML + CSS

/* examples/css/hello_example.css */
.primary {
  background-color: rgb(37, 99, 235);
  border-radius: 8px;
  padding: 10px 16px;
  transition: background-color 150ms ease-out;
}
.primary:hover  { background-color: rgb(29, 78, 216); }
.primary::label { color: white; font-size: 14px; font-weight: 500; }
<!-- examples/xml/hello_example.xml -->
<adi>
  <link rel="stylesheet" href="examples/css/hello_example.css"/>
  <callback name="On_Hello_Click" type="Adi.Widget.Button.Click_Callback"/>
  <window title="Hello, Adi" width="320" height="180">
    <box class="root">
      <label text="Welcome to Adi" class="welcome"/>
      <button text="Click me" class="primary" on-clicked="On_Hello_Click"/>
    </box>
  </window>
</adi>

The toolchain emits a typed Ada package you instantiate from your main — see examples/hello_example.adb for the full ~25-line program.

Same thing, written by hand in Ada

The CSS rule above is just an aggregate. The XML widget tree is just a few constructor calls. Both paths land on the same API — see examples/hello_raw_example.adb for the full equivalent program. The shape of the styling code is:

function Style return Style_Builder renames Adi.Widget_Styles.Create;

--  Equivalent of .primary base + :hover from hello_example.css
Primary_Base : constant Style_Rules :=
  (Background_Color => Set_Bg (RGB (37, 99, 235)),
   Border_Radius    => Set (Radius (Px (8.0))),
   Padding          => Set (CSS_Box (Px (10.0), Px (16.0))),
   Transition       => Set ((Duration   => 0.15,
                             Easing     => Ease_Out,
                             Properties => Props (Prop_Background_Color))),
   others           => <>);

Primary_Hover : constant Style_Rules :=
  (Background_Color => Set_Bg (RGB (29, 78, 216)),
   others           => <>);

--  Wire base + hover to the button's Main_Part
Set_Part_Style (Widget_Handle'(+Btn), Main_Part,
  Style.Base (Primary_Base).On_Hover (Primary_Hover).Build);

Build and run either flavour:

tools/build_examples.sh hello_example hello_raw_example
./examples/bin/hello_example       # XML + CSS pipeline
./examples/bin/hello_raw_example   # pure hand-written Ada

Quick start

# Build the library
alr build -- -j0

# Build and run the test suite
tools/run_tests.sh

# Build all example programs
tools/build_examples.sh

# ...or just one
tools/build_examples.sh stack_example

# Try a demo
./examples/bin/material_demo
./examples/bin/html_view_example

To use Adi2 from your own project, with "adi.gpr" — SDL linker options come with it. The library's public specs use Ada 2022 constructs, so units that with Adi.* packages need pragma Ada_2022; or -gnat2022 .

Starting your own project? docs/getting_started.md walks from an empty directory to a working window, in XML/CSS and again in plain Ada.

Full build instructions, including building without Alire, in docs/build.md and docs/gprbuild_without_alire.md .


Roadmap

CSS.

  • Broader CSS surface — more standard properties, selectors and values.

HTML view.

  • Tables table , tr , td / th , column widths, spanning.
  • Flex and grid display: flex and display: grid inside the document.

Widgets and themes.

  • More widgets — tree view, data grid, menu bar, progress and busy indicators, tooltips, split panes, date and colour pickers.
  • Ready-made themes — Material, Fluent, Adwaita and macOS, each in light and dark.

Text and reach.

  • Right-to-left and bidirectional text direction and bidi reordering.
  • Accessibility — semantic roles, names and states to screen readers over AT-SPI, UI Automation and NSAccessibility.

Portability.

  • Pluggable backends — an abstraction layer that lets Win32/Direct2D, Cocoa, GLFW, raylib or Skia take the place of SDL3 ( design notes ).
  • Embedded devices

Authoring and tooling.

  • Visual designer — RAD IDE like experience, edit both the UI XML and CSS.
  • Scripting with HAC — embed the HAC Ada compiler for reloadable application logic.
  • Live reload for XML UIs — XML widget trees hot-reload as CSS already does.
  • Better generated docs — browsable API documentation with gnatdoc .

Correctness and API.

  • Better callbacks — a callback that fails leaves the app running, callbacks that fire once, and background work that talks to the UI safely ( design notes ).
  • Contracts Pre / Post / Type_Invariant and SPARK-mode subsets.
  • C API — a stable C-callable interface for non-Ada callers.

Have an idea? Open an issue (see CONTRIBUTING.md for the policy).


Supported platforms

Tested on GNU/Linux , Windows (XP, 7, 8, 10, 11, via MinGW), macOS , and WebAssembly (Emscripten). Anywhere else GNAT and SDL3 build should follow — the BSDs among them.

Rendering goes through the SDL renderer abstraction, so it takes hardware acceleration where the machine offers it and falls back to software where it does not. That is what puts the same binary on Windows XP and on a current desktop.


Questions

Why "Adi2"? And why is the Ada package still Adi.* ? "adi" is too common a word for search engines — Adi2 is findable. The in-code namespace stays Adi.* because with Adi.Widget.Button; reads better than Adi2.Widget.Button and renaming it would churn every source file for zero functional gain. Project = Adi2, package = Adi .


Talk

A Native, Portable GUI Framework for Ada — 3rd Ada Developers Workshop, AEiC 2026 , 13 June 2026. Building an Adi2 application, and driving the running UI from an LLM through the MCP bridge.

Part 1 · Part 2


Go deeper

Topic Doc
Your first Adi2 application docs/getting_started.md
High-level architecture and core components docs/architecture.md
CSS styling — selectors, properties, runtime API, codegen docs/css_styling.md
Declarative XML UIs and the widget grammar docs/xml_ui_system.md
HTML view widget specification docs/html_view_spec.md
Static asset bundling (single-binary deployments) docs/static_assets.md
Internationalization, plurals, .po compilation docs/i18n.md
Settings store with JSON backend docs/settings.md
OS integration — dialogs, clipboard, paths docs/os_integration.md
Signals and deferred dispatch docs/signals.md
Antialiased rendering primitives docs/rendering_aa.md
MCP runtime introspection and interaction docs/mcp.md
Handle ownership model docs/handle_ownership.md
Coding conventions docs/coding_conventions.md
Adding a CSS property / example / test docs/adding_css_property.md , docs/adding_example.md , docs/adding_test.md

Contributing

Issues and pull requests welcome.

For anything beyond a small fix, please open an issue first so the approach can be discussed before you invest time in it. Match the existing code style ( docs/coding_conventions.md ), keep the tests green, and add tests for new behaviour.

Unless you explicitly state otherwise, contributions you submit are understood to be under the Apache-2.0 license, as per its Section 5 — no CLA to sign. Full details in CONTRIBUTING.md .


Sponsoring

Adi2 is independently developed and maintained. Sponsorship funds ongoing maintenance, cross-platform testing, documentation, and work on the public roadmap.

Organisations interested in supporting the project, or in funding a specific feature, port, or integration: adi@aldustechnology.com .

Sponsorship supports the project as a whole. Guaranteed response times or delivery commitments require a separate commercial agreement.


License

Apache-2.0. See LICENSE .

Vendored third-party code under vendor/ retains its original licenses, listed in each tree's own license files. Most are permissive — MIT, Apache-2.0, BSD-style, OFL. vendor/rlottie/src/vector/vinterpolator.cpp is MPL-2.0, a file-level copyleft rather than a permissive licence; its text ships as vendor/rlottie/licenses/COPYING.MPL .

Example assets under examples/assets/ are demonstration content rather than part of the library; those with known third-party terms are attributed in examples/assets/NOTICE.md .


Contact

Adi2 is written by Aldo Nicolas Bruno . Report bugs and propose features through the issue tracker. For private enquiries, sponsored development, or commercial support: adi@aldustechnology.com .

Public services are increasingly strained by LLM-written appeals for benefits

Hacker News
arxiv.org
2026-08-24 12:30:21
Comments...
Original Article

View PDF HTML (experimental)

Abstract: AI agents are making it easier for the public to interact with government, such as by helping them apply for benefits, understand complex policies, and make their opinions heard. Although improving service accessibility is beneficial, any resulting surges in demand could strain unprepared government services. We term such surges agentic flooding of government services ("flooding") and provide three contributions. First, based on a collected dataset of 84 potential cases of flooding across 11 jurisdictions, we posit that flooding is likely occurring widely today, mostly through large language models (LLMs) generating text cheaply. Second, we evaluate what services are most exposed to flooding. We develop a risk matrix to analyze a service's exposure, and suggest that near-term risk is highest for financially attractive, but complex services. Finally, we map possible government responses to flooding. Precedent suggests these responses will likely be sufficient to stop most cases of flooding, but the fastest to deploy - friction-inducing measures like fees - often trade off equitable access to public services. Accordingly, we close by recommending near-term actions that may allow governments to mitigate flooding without invoking this trade-off.

Submission history

From: Chris Schmitz [ view email ]
[v1] Mon, 17 Aug 2026 13:59:28 UTC (248 KB)
[v2] Wed, 19 Aug 2026 16:17:45 UTC (248 KB)

A Blackstone real estate company exposed SSN digits, DOBs, addresses and more

Hacker News
alexschapiro.com
2026-08-24 12:29:00
Comments...
Original Article

Beam Living sign-up and sign-in screen

Finding housing in NYC is hard. Everyone knows that. But what not everyone knows is that it is easier to find the last four digits of someone’s Social Security number than an apartment…

I was applying for a lease on Beam Living , a Blackstone portfolio company . I went through the normal flows, but (as a security-conscious individual) I always have my network tab open as I browse the web to make sure I am not putting my sensitive information into a website that a script kiddie (or GLM-5.2) could easily break into.

As I was submitting my Social Security number, I figured I should check out the GraphQL (rip, used to be the hot thing) queries that were processing it.

The GraphQL query

At first, I didn’t see anything of note. But when I went to my main profile, I saw a call to pd-dlcore.beamliving.com/graphql with the payload:

Redacted Beam Living GraphQL contact request shown in Chrome DevTools

View the full GraphQL query
query contact($contactId: String!) {
  contact(contactId: $contactId) {
    ...contactInfo
    __typename
  }
}

fragment contactInfo on ContactDtoModel {
  incomeVerificationMethod
  incomeCheckStatus
  incomeCheckReferenceId
  creditScore
  address
  applicationStatus
  city
  companyOrSchool
  consentDate
  consentIp
  country
  dateOfBirth
  emailAddress
  emergencyContact {
    emergencyContactEmail
    emergencyContactName
    emergencyContactPhone
    emergencyContactRelationship
    __typename
  }
  firstName
  id
  identityVerificationSubmittedDate
  incomeCheckDate
  isCurrentLeasee
  jobTitle
  lastName
  noSsn
  occupation
  pets {
    birthDay
    breed
    id
    isServiceDog
    licenseNumber
    name
    rabiesExpirationDate
    weight
    __typename
  }
  postalCode
  preferredName
  screeningFeePaid
  ssnInfo
  state
  status {
    ...applicationStatus
    __typename
  }
  telephone
  __typename
}

fragment applicationStatus on StatusDtoModel {
  applicationProgress {
    basicInfo {
      actionRequired
      __typename
    }
    dogsInformation {
      actionRequired
      __typename
    }
    emergencyContact {
      actionRequired
      __typename
    }
    identityVerification {
      actionRequired
      __typename
    }
    incomeVerification {
      actionRequired
      __typename
    }
    payments {
      actionRequired
      __typename
    }
    review {
      actionRequired
      __typename
    }
    __typename
  }
  progressDetails {
    applicationForm {
      description
      status
      __typename
    }
    firstMonthRent {
      description
      status
      __typename
    }
    identityVerification {
      description
      identityVerificationCompletedDate
      identityVerificationStatus
      identityVerificationSubmittedDate
      status
      __typename
    }
    incomeVerification {
      description
      status
      __typename
    }
    leaseGuarantee {
      description
      status
      __typename
    }
    leaseSigning {
      description
      signatureId
      status
      __typename
    }
    managerReview {
      managerReview
      managerReviewDecisionCode
      status
      __typename
    }
    securityDeposit {
      description
      paymentLink
      securityReplacement
      __typename
    }
    backgroundScreeningCheck {
      status
      __typename
    }
    creditCheck {
      status
      __typename
    }
    __typename
  }
  guestCardCreated
  unitReservationFailed
  __typename
}

While not necessarily bad, supplying a user’s email into a GraphQL query like this, as opposed to just deriving it from the session cookie, is always a smell.

The obvious test

So I did the obvious thing – I took a friend’s email (I knew he had also used the service) and… boom. The last four digits of his Social Security number, date of birth, home address, IP address, phone number, etc., etc.

Redacted Beam Living GraphQL response showing exposed SSN and applicant fields

The impact was not limited to my application or my building. Beam Living used this leasing portal across its communities :

  • 8 Spruce
  • StuyTown
  • Peter Cooper Village
  • Kips Bay Court
  • Parker Towers

Anyone who had applied through that shared portal—and whose record remained in the system— had their Social Security number information, date of birth, home address, IP address, phone number, and other application data accessible to any one who knew their email address.

Disclosure and the silent patch

I immediately stopped testing and disclosed it to Beam Living. The disclosure process wasn’t ideal – I had to send many emails and eventually got on a phone call with someone from the Beam Living team. They said they had checked and there was no issue at all. I went back to try the exploit again and it had been silently patched. So I am glad that the issue is fixed, but this is not how companies (especially ones owned by giants like Blackstone) should handle disclosure…

The disclosure timeline went like this:

  • June 14: I emailed [email protected] to report a serious vulnerability exposing applicants’ and guarantors’ PII—including the last four digits of SSNs, credit scores, dates of birth, addresses, and phone numbers. I asked how to disclose this vulnerability responsibly.
  • June 16: After receiving no reply, I followed up, emphasized the severity, and again asked Beam Living to confirm the correct disclosure channel or connect me with its security team. I received no response.
  • June 23: I told my Beam Living leasing agent that I had found a serious vulnerability exposing SSN digits, dates of birth, phone numbers, addresses, and other applicant data through an email address. I asked to be connected with the right team for responsible disclosure.
  • June 24: I followed up and warned that the vulnerability was still live. The leasing agent said my report had been forwarded to a team for investigation.
  • June 26–July 8: I continued trying to reach someone. On July 1 and again on July 8, I explicitly warned that my data—and other users’ data—was still exposed.
  • July 9: After a phone conversation, Beam Living’s Resident Experience team asked me to send details so they could pass them to the Technology team. I retested immediately afterward and found that the issue had finally been patched. I offered to coordinate disclosure and said I planned to publish after giving them time to respond.
  • After July 9: I connected with Beam Living’s head of Operations, who was very nice, and told her that I intended to disclose the vulnerability publicly.

Oh well! I alerted them that I was going to post this blog, and I hope I don’t get my lease canceled…

llm-anthropic 0.27

Simon Willison
simonwillison.net
2026-08-24 12:27:04
Release: llm-anthropic 0.27 This release of the Anthropic plugin for LLM mainly provides compatibility with the recently released anthropic v1.0.0 Python library, which switches from httpx to httpx2. OpenAI made the same change in their v3.0.0 release two weeks ago. Anthropic provide this mi...
Original Article

This release of the Anthropic plugin for LLM mainly provides compatibility with the recently released anthropic v1.0.0 Python library, which switches from httpx to httpx2 . OpenAI made the same change in their v3.0.0 release two weeks ago.

Anthropic provide this migration guide for upgrading to 1.0, so I prompted Fable 5 in Claude Code with:

Upgrade to anthropic>=1 - read https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/refs/heads/main/MIGRATION.md and get the tests passing

Here's the resulting PR .

Intent to Ship: JPEG XL

Lobsters
hacks.mozilla.org
2026-08-24 12:25:08
Comments...
Original Article

It isn’t often that new image formats land in browsers. In the early 2000s we had JPEG, GIF, and PNG. The 2010s gave us WebP, which was a modest step up from JPEG. But the 2020s have given us two new image formats that are a big step up from previous formats: AVIF and JPEG XL.

We shipped AVIF back in 2021, and today we posted our intent to ship JPEG XL . Chrome are also intending to ship , and given there’s already a partial implementation in Safari, the format will be supported across browsers before the end of the year.

Shipping JPEG XL securely

We added experimental support for JPEG XL behind a flag back in 2021. But, at 100,000 lines of multithreaded C++, we were concerned about the attack surface this added to Firefox.

So, we laid down a challenge to the JPEG XL team at Google Research: Build a safe, performant, compact, and compatible JPEG XL decoder in Rust, and we’ll ship it. That challenge was met; Google Research built jxl-rs , and it’s the core of our JPEG XL support in Firefox.

We also pushed for high quality integration tests as part of an Interop 2026 investigation area , and they’re coming along nicely .

Progressive rendering

Although Safari shipped JPEG XL in 2023, their implementation lacked some key features of JPEG XL – our favourite is progressive rendering, which is something we pushed for in the Rust implementation.

Progressive rendering means the image can render as it’s downloading.

An image of a fox curled up in a ball, sleeping amongst some grass, divided into four columns, showing JPEG XL progressive rendering. At 4% it's very blurry. At 15% you can tell it's a picture of a fox. At 50% the full image is clear, but not full resolution. At 100% it's full resolution.

Although the full image is 135 kB, with only a few kB downloaded the user can determine the subject of the image. Try the above demo image in a browser that supports JPEG XL & progressive rendering, like Firefox Nightly – move the slider to see how the image displays with just a portion downloaded.

JPEG XL vs AVIF

Browsers will now have two modern image formats for developers to choose from. Which you choose depends on your use-case.

  • JPEG XL: Excels at lossless imagery, progressive rendering, and further compressing JPEGs without quality loss.
  • AVIF: Excels at web-quality photographic images, and images that have a mix of sharp edges and flat surfaces.

For example:

A fox curled up in a ball, sleeping amongst some grass.

The image above is a 116 kB AVIF with a quality score ( SSIMULACRA 2 ) of 62.8, meaning medium-high quality. To get the same quality, the JPEG XL image would be 134 kB.

At a SSIMULACRA 2 score of 80 (very high quality), the AVIF is 227 kB, and the JPEG XL is 264 kB.

But at lossless, the AVIF is 1.76 MB, and the JPEG XL is 1.45 MB. A lossless WebP is 1.55 MB.

Another example is a screenshot of the Interop 2025 scores:

Interop dashboard showing browser scores. At the top are two large circles: ‘Interop’ with a score of 95 in green, and ‘Investigations’ with a score of 36 in orange. Below are four browser scores in green circles: Chrome 99, Edge 98, Firefox 99, and Safari 98, each shown with their respective browser icons.

At a SSIMULACRA 2 score of 78 (very high quality), the AVIF is 11.6 kB, and the JPEG XL is 23.8 kB.

But at lossless, the AVIF is 164 kB, and the JPEG XL is 92 kB. A lossless WebP is 96 kB.

Although AVIF tends to produce smaller files at web-quality than JPEG XL, AVIF only has basic progressive rendering support. So, for very large images, it may be worth taking the filesize hit with JPEG XL.

The key is to test with a representative set of images for your site, at a quality that works best for your users, and remember to optimise for high density.

More articles by Jake Archibald…

Can a blog post be handwritten?

Lobsters
diggingforfire.blog
2026-08-24 12:18:06
Comments...

Show HN: GlassBox – what the browser reveals, and how identifiable you are

Hacker News
glassbox.codecanary.org
2026-08-24 12:15:10
Comments...
Original Article

Fingerprint bench · client-side only

Every measurement a website can take from your browser, run live and shown back to you. This is the same class of signals the tracking and anti-fraud scripts collect — surfaced instead of hidden.

1 Hardware & environment cross-engine · links you across different browsers

2 Engine × hardware canvas · audio · math · codecs — links within one engine family

3 Browser build which browser & version — not who you are

4 Session theme · quota · timing · IP — resets constantly

Mostly local. Every fingerprinting probe runs in your browser and stays here — no analytics, no beacon. The one exception is IP intelligence: on load, GlassBox queries public geolocation APIs (ipwho.is, ipapi.is) to look up your address, network and VPN status. Turn Geo off in the toolbar to stay fully local. View source to confirm the rest.

Show HN: PicoMQ – Durable Streams over HTTP, on object storage

Hacker News
picomq.com
2026-08-24 12:08:17
Comments...
Original Article

Durable streams on
object storage

PicoMQ is durable, real-time streams over HTTP,
built on S3-compatible object storage.

the architecture

Unlimited streams

Create a stream per use case instead of packing every record of a kind into one topic. Each stream is independently addressable, bottomless, and can scale from idle to high throughput.

I cannot survive from burnout

Lobsters
lobste.rs
2026-08-24 12:04:45
I burned out two years ago, went through a divorce, and relocated to a new city. I live alone now and care for seven cats. Over the last two years, I’ve tried forcing discipline, making detailed plans, and restarting over and over. Despite this, I’m still carrying significant debt. My main struggle ...
Original Article

I burned out two years ago, went through a divorce, and relocated to a new city. I live alone now and care for seven cats.

Over the last two years, I’ve tried forcing discipline, making detailed plans, and restarting over and over. Despite this, I’m still carrying significant debt.

My main struggle is staying focused on paid work. I’m constantly building and working on my own side projects, but I struggle to put time into client work. Because of my experience, finding clients isn't hard, but I tend to lose them after a few months due to low throughput. I deliver high-quality code and solve their core problems, but I can only bring myself to work on client tasks for about 5–6 hours a week.

I’m struggling to survive day-to-day and losing hope that this will change, though some days are good and I can get solid work done. I’ve tried all the standard advice for burnout with little success. At this point, I wonder if burnout has become a habit, an excuse, or a form of self-sabotage.

I’m posting here to see if anyone who has experienced something similar found a practical way out or a working routine that stuck.

Coding expertise is going to collapse from AI reliance

Hacker News
larsfaye.com
2026-08-24 11:52:33
Comments...
Original Article

"We see a future where intelligence is a utility like electricity or water and people buy it from us on a meter and use it for whatever they want to use it for" - Sam Altman of OpenAI

In my previous article, Agentic Coding is a Trap , I discussed the "skilled orchestrator paradox", where the skills required to manage AI agents for coding are the same ones that can be diminished through the continued use of said AI agents. Expertise was largely the differentiator; the more experienced a developer is, the less likely it is that they might experience skill atrophy, as the knowledge has had a chance to ossify after years of experience.

If you look around right now, you'll find the vast majority of those that are seeing the most benefits from these models are those that have had years, if not decades, of experience in the field (which predates AI tooling, of course). And any industry veteran will tell you the same: the bedrock of this knowledge comes from doing the work.

Developers who've entered the field around the time of LLMs are placed in a position where they don't have the benefit of longevity, but they are being guided (and sometimes mandated) to accelerate their efforts using coding assistants that require a history of expertise to wield effectively and responsibly .

It's an awkward place to be for that demographic, as it creates a scenario where a novice needs expert-level skills to leverage the tools and keep pace in the industry.

The "Expert Novice"

We're currently sending very mixed signals to people across the industry. We're hammering in that if you're not using AI tools, you will be "left behind" by your peers who are using them. "AI won't replace you, someone using AI will" has been on repeat since 2023.

And in the same breath, it's also said that the way to get the best results from these models is to apply higher-order thinking ; "vibe coding" is a dead end; you need to "move up the stack" and create robust specs, architect with good design patterns, and always review the outputs diligently so you never ship something you don't understand.

The skills to do so, however, are a function of someone who has experienced the friction and challenges over time that culminate in "good taste" .

This leads to another situational paradox: If these tools demand expertise , yet the tools can actively circumvent the friction that cultivates expertise , then what is the path for one to become an expert so they can effectively use these tools?

Confidence without Comprehension

One hope is that these models will end up accelerating learning as they are used for code generation. Junior developers can work with the same gravitas and confidence as industry veterans with their "personal AI tutor". Knowing syntax is increasingly less important, and any knowledge or ambiguity gaps are filled by the AI tool. The deeper mechanics of the code stay abstracted away, since the developer sits higher in the stack.

JetBrains , a major player in developer tools, recently completed a study of junior and novice developers by painstakingly analyzing their individual behavior in live coding sessions, and testing their ability to learn coding with AI tooling in varying degrees of assistance. Their main takeaway was stark and counterintuitive:

"Participants thought it was like having a personal tutor. From the data in our study ... we observed that they did not , in fact, use GenAI tools like a personal tutor. In fact, it was quite the opposite ."

The participants that leaned into heavier AI assistance:

  • " Often skipped crucial planning stages , finding that because they hadn’t reasoned themselves into this position, Copilot had."
  • "Finished with an 'illusion of competence' rather than true understanding. "

Counter to that, the participants that mitigated their usage of AI:

  • "Succeeded because they had developed 'negative expertise'—which is 'the ability to ignore incorrect or unhelpful GenAI suggestions '—allowing them to focus on writing their own solutions rather than being led astray."
  • "Were able to use GenAI to accelerate, creating code they already intended to make. "

The novice developers who were the most unrestricted and confident in their AI usage "had skipped crucial steps in the programming problem-solving process, and were now lost."

Perhaps unsurprisingly, the novice developers who performed the best were the ones that greatly mitigated or outright ignored the AI coding assistance.

Inverted Learning

Due to the self-directed nature of LLMs, the more experience you have, the more benefit they provide since you can accurately steer, audit, and verify the outputs. The less knowledge you have, the more they can mislead you . Interacting with LLMs for learning new skills takes the shape of an "inverted learning" model, a role reversal where the student is initially guiding the mentor , the mentor responds, and then the student, again, steers the mentor.

The process is precarious; LLMs are incredibly sensitive to the shape of the prompt. When you're exploring new domains, you don't know what you don't know , and the malleable and accommodating design of an LLM can lead you to believe you know more than you actually do .

If you're exploring territory that is even somewhat unfamiliar, you often don't even know the questions that you need to ask that could properly guide the model to providing the best answers. It begins to feel like a compass that always points north, wherever you suggest north might be.

From the same JetBrains study , even the most prepared students were derailed by the AI assistance due to this type of learning model: One participant demonstrated good fundamental planning and habits, but suddenly "skipped crucial problem-solving planning stages, jumping directly to coding and was enticed by Copilot into quickly producing code" and had to rely on the LLM to fix the error that the LLM introduced in the first place .

AI models lack judgment, empathy, and pedagogical intent, and the solutions provided are not rooted in experience but rather in patterns in the training data (LLMs are, at their core, incredibly complex pattern interpolators) .

The infinite answer machine is tempting, and known to be addictive . It can unwind rather quickly, especially for inexperienced developers. Once you get deep enough into a generated solution, you are often beholden to the AI tool to also finish the job, circumventing the problem-solving friction that is required for the formation of a mental model (and to be fair, senior developers are prone to this phenomenon, as well).

The Friction is a Feature

Expertise and mastery don't happen purely through observation and dialogue, but through experience, repetition, and trial and error; you have to fail to succeed. If I wanted to learn how to cook, I could watch a Master Chef work and make endless inquiries. After a month, I would be able to describe the perfectly medium-rare ribeye but never know what it's like to cook one, and I'd almost certainly overcook it on my first attempt.

Coding has endless moments of tracing obscure errors with no log file to help, experiencing the subtle performance differences of certain methods, or having to rewrite an approach when it's clear it won't going to scale.

This applied friction is directly what builds "developer intuition" (or "taste"). The Germans have a great word for this: Fingerspitzengefühl (fingertip feeling). It’s the muscle memory that triggers when a developer looks at something and thinks, “yeah...this is probably going to cause problems.” By avoiding the mechanics of the struggle, this intuition is never built.

In UPenn's large-scale 2025 study Generative AI without guardrails can harm learning , they followed 1,000 students using an LLM to learn mathematics and found students used AI as a crutch and ended up performing 17% worse than students with just a textbook (and just as with the JetBrains study , the students using the AI assistance thought they were excelling ).

LLMs don't just have to generate code, though.

If leveraged as Socratic sparring partners instead of answer generators, studies have shown that "dialogic AI systems can meaningfully stimulate reflective, critical and independent thinking" .

In that same UPenn study, they also tested a "Tutor" version by having students ask for help and then independently solve the problem . The GPT Tutor group performed an astonishing 127% better in the AI-assisted practice session (although, interestingly, they scored about the same on the test as the textbook group).

This is effective because the model is no longer being utilized as a means of production , and it shifts the cognitive work back onto the individual. It's when the friction is still present that it creates a lasting imprint that leads to expertise.

Anthropic's 2026 study "How AI assistance impacts the formation of coding skills" came to similar conclusions:

For novice workers in software engineering or any other industry, our study can be viewed as a small piece of evidence toward the value of intentional skill development with AI tools. Cognitive effort— and even getting painfully stuck —is likely important for fostering mastery.

There's a certain sense of irony here: the most productive learning that can happen with an AI coding tool is when it isn't used to generate much of any code at all .

Pipeline Collapse

If LLMs can write code and debug code, and agentic workflows can perform system design from the abundance of patterns in the training data, then what is the purpose of this knowledge in the first place? Programming will be done entirely in natural language, and we can dispense with the need to engage with the code because the models continue to improve and fill in any knowledge or ambiguity gaps. They will debug any issues that arise and manage any complexity that they introduce.

The trillion-dollar bet that is being made is: this knowledge won't matter , because LLMs will take up the slack and effectively become the new generation of "developers". It starts give off an aire of hubris that drove past no-code movements, and the fever dreams of CEOs, rather than the reality on the ground.

Coding/programming/software is a unique intersection of logic, math, problem-solving, critical thinking, planning, communication, and creativity. LLMs can detect patterns at a scale that no human ever could, but patterns only get you so far.

David Cramer, co-founder at Sentry (a performance and error tracking platform), put it succinctly in a recent interview :

I think there's a type of person ... that inherently believes that LLM will get better enough that they will go back and fix this stuff, that it will be able to clean up all the junk that's been stacked up along the way. I don't think that's true. I think it's a science experiment.

You want to flex that you can generate all of your code and have hundreds of things going in parallel, I will flex and show you how broken the code is 100% of the time.

Will the pipeline collapse, or just change?

It really depends on whether we make the needed shift to a more pedagogical usage of these systems.

By continuing to focus on and promote AI coding workflows that prioritize code generation above deep understanding, we are not cultivating the next generation of expertise who will inherit the code that is being created today.

My Approach: Friction First

Joel Spolsky presciently writes (in 2002, no less) in his Law of Leaky Abstractions :

Code generation tools which pretend to abstract out something, like all abstractions, leak. And the only way to deal with the leaks competently is to learn about how the abstractions work ... the abstractions save us time working, but they don’t save us time learning.

If a developer wants to learn Java, they should probably not start with Spring Boot. If they want to learn JavaScript fundamentals, they should not start with React. If they want to become highly adept at CSS, they should not start with Tailwind. LLMs could be considered the ultimate leaky abstraction .

My advice here is very similar to my previous prescription.

If a developer wants to become an expert in programming, they should largely disregard the pure code generation capabilities of these models , and instead use them for interactive documentation, dynamic tutorial generators, and Socratic exercises .

It's not a panacea, of course: Using an AI tool as a tutor carries its own risks since it is susceptible to the same hallucinations as any other interactions, and it cannot be relied upon solely as a learning source. If you can't properly audit the accuracy of the generated code, they you can't audit the accuracy of the generated concept. If you use AI as a mentor, you must still verify its outputs against official documentation , human peers , and actual trial and error .

"Coding's actually a great way to cement understanding. The more you program, the more you understand the domain that you're working in."

— Kent Beck, creator of Test-Driven Development

Choosing this slower, more deliberate path is the best way to grow expertise, but I'm aware of how hard that is when the surrounding ecosystem is actively working against it. AI is being mandated (often recklessly) across companies, and baked into most software development tools and IDEs as they cater largely to senior engineers (even with some tools like Cursor tucking away the code view unless the user specifically seeks it out) . Some companies are even forcing developers to only use AI for all coding tasks, regardless of experience level, and these companies will have to learn their own lessons.

However, for everyone else who is looking to strike a balance between deep learning (no pun) and productivity, there are qualifying questions you can ask to ensure your usage of these tools yields long-term benefits.

My AI-assistance checklist:

  • If I did not have access to an AI tool, could I still accomplish this task?
  • Am I using the model to deepen my understanding, or expedite the answer?
  • If I had to audit and verify the generated output, could I adequately explain what was happening?
  • If I'm learning a new concept, have I done proper research to know the right questions to ask?
  • Have I cross-referenced and verified the approach through other methods (reading documentation, standard search tools, StackOverflow, Reddit) ?
  • Is this a truly rote task that's been done 100 times before, or a task that requires executive decision-making somewhere in the process?

Even as a developer with decades of experience under my belt, I am still constantly referring to them throughout my daily work, especially when I am attempting to learn something new (which in this field, is neverending).

The key is to detect the difference between cognitive debt and cognitive offloading : Cognitive debt is abdicating your judgment and decisions , whereas cognitive offloading is delegating the mechanical or tedious .

As the Anthropic study mentioned, getting "painfully stuck" is a good thing. It takes discipline and effort to not drift back towards just generating answers, which might not even be accurate in the first place. LLMs didn't suddenly rewrite the fundamentals of how we learn, but they did give us a new way to do so.

Intelligence isn't a Commodity

The realignment I hope to see over the years is the understanding that skills don't develop without active participation. You must engage directly and continously to experience the essential friction that culminates in expertise (even if it means moving more slowly).

If we stay fixated on lines of code and tokens burned while the expertise pipeline dries up over the years, Sam Altman's vision of selling intelligence back to us on a meter could become reality. Domain knowledge could become very hard to come by, and when one sits down to do any type of development work, there will be a pang of paralysis if that person does not have an active AI tool subscription at their side.

LLMs are a static database of skills. They are interpolation engines. Software engineering, however, is an exercise in adaptation and novel problem-solving. You cannot interpolate your way through a completely unique system failure.

— François Chollet, creator of ARC-AGI Benchmark

Jabber/XMPP: 25 Years of Digital Independence

Hacker News
gultsch.de
2026-08-24 11:51:31
Comments...
Original Article

Infrastructure

“We should own our infrastructure.” A lot of people would instinctively nod in agreement with that statement. Yet who “we” refers to shifts depending on the type of infrastructure. Highways, railways, bridges, and ports require nation-scale efforts. The water supply is usually put into the hands of municipalities. And the desire to own infrastructure goes down to a much smaller level: Owning your home is a dream for many—though such ownership doesn’t necessarily have to be organized on an individual level. Instead, cooperatives or city-owned housing 1 can provide similar benefits.

China’s neo-colonialism, which manifests, among other things, as building and buying infrastructure in sovereign nations, is rightly criticized by many. Not selling your water supply to Nestlé is a universally accepted principle, and landlords are one of the most hated classes.

For a long time, Europe has not held digital services to the same standard. In part, this can be explained by Europe implicitly including American corporations in a collective “we”—an assumption that officially fell apart under the current Trump regime, but should have been regarded with skepticism well before then. Corporations are not our friends. However, the larger factor at play is that Europe simply did not consider digital services infrastructure. While anti-Americanism is en vogue again and drives much of the digital sovereignty movement, Europe must be careful not to simply replace American corporations with European ones, but to strive towards collective ownership instead.

Under capitalism, profit-oriented companies will always play a part in building and even operating our infrastructure. However, they need to be forced into a position where they are easily replaceable. It’s acceptable to hire a company to build a road, but when it comes to maintaining and repairing it half a century later, we need to be able to hire a different company for the job. It’s acceptable to hire a company to build and operate the backbone transmission lines, but we don’t want that company to own the entire power grid. We want smaller players to be able to connect to and interoperate within the grid. That’s where open standards come in.

The Internet used to be—and to some degree still is—built around standards. A data center operator can buy servers from one company, switches from another, routers from a third, and connect them to a backbone internet provider that runs hardware from yet another company. If a company goes out of business or shifts to anti-consumer practices, the next generation of hardware can easily be ordered from a different vendor. The need for and the benefits of this supply chain independence are easily understood even by people who don’t operate data centers for a living. However, when it comes to communication tools, even the tech-literate fail to apply the same critical scrutiny.

After breathing, eating, and procreating, communicating is probably the fourth most important thing humans do. Yet we often fail to recognize our communication tools as part of our infrastructure.

Digital rights advocates often point to Signal, Wire and Threema as examples of communication tools developed and operated by entities with slightly more ethical business practices than their Big Tech counterparts. What most privacy enthusiasts fail to understand is that these companies are still in the business of operating walled gardens with no escape. They do not interoperate. It’s not that Signal has done something inherently malicious—although paying its CEO close to a million dollars a year and running its servers on AWS are certainly questionable—it’s that we don’t have a hedge in place if it ever does.

Open-source software is orthogonal to this problem. It helps to ensure that the software isn’t spyware—unlike WhatsApp and other Meta products 2 —and that the end-to-end encryption is sound, but it does not protect us if Signal shuts down its servers tomorrow or ceases EU operations 3 . Open-source alone is not sufficient to meet the requirements we should have for our infrastructure.

To live up to the standards we set for ourselves, we need to design systems in which self-hosting is structurally possible but not strictly necessary. Like owning a home, running your own server should be possible, and so should collective ownership. Digital systems can and should replicate the advantages of cooperative housing alongside those of individual ownership.

Treating digital communication as true infrastructure can only be achieved by adopting and mandating open standards.

The Extensible Messaging and Presence Protocol (XMPP) 4 5 is a standard for communicating online. It wasn’t created to fit a particular zeitgeist or address the current political climate. In fact, its roots go back more than 25 years.

Standards

Interoperability and vendor independence are achieved by setting and adhering to standards. To avoid individual vendors pushing standards that explicitly or implicitly exclude potential competitors or otherwise give unfair advantages, standards-developing organizations (SDOs) are set up for mutual cooperation, and usually have safeguards in place that prevent a single company from becoming too powerful. Well-known examples of such organizations include the ISO, the IETF, the W3C, and the Unicode Consortium.

There is a distinction to be made between a vendor publishing its API and allowing others to use it, and stakeholders coming together to collectively develop a standard within the framework of an SDO. Organizations like the IETF succeed because they force different people with different needs to agree. Protocols aren’t dictated by the priorities of a single company; instead, they are reviewed and tested by competitors, security researchers, and independent developers.

Element, formerly known as Riot and NewVector, develops an instant messaging product with a feature set—such as self-hosting and federation—similar to that of XMPP-based solutions. Notably, however, it chose not to adopt XMPP, but instead published its own API under the name Matrix for others to use. Unlike with traditional standards, Element maintains tight control over any modifications or additions to its public API. Key leadership positions in the Matrix Foundation are predominantly held by current and former Element employees. Getting outside contributions accepted into the specification is notoriously difficult. 6 Yet European public administrations, in their push for digital sovereignty, routinely fall into the trap of procuring such single-vendor platforms, confusing an open-source codebase with an open standard.

It’s natural for standard proposals to originate within a single organization. JMAP, a modern replacement for IMAP and SMTP Submission, which is not too dissimilar from Matrix—a JSON API over HTTP—started within Fastmail before being brought to the IETF. Jabber started out as an open-source community project before it was brought to the IETF and renamed to XMPP. Ideas start small, but to create a standard, outside feedback, collaboration, and the structure of an SDO are needed.

For consumers, the difference in the approaches of Fastmail and Element is striking. Not only was JMAP noticeably improved on a protocol level while going through the IETF working group process, but it now has at least three independent servers and numerous independent client applications. Matrix, on the other hand—despite dating back to the same era around 2014—is still stuck with one predominant reference implementation and a second alternative still in its infancy and struggling to gain traction. Operating that reference implementation is notoriously resource-intensive, which makes self-hosting difficult for smaller organizations and individuals. Element sells closed-source plugins to speed up performance.

The X in XMPP

The origins of XMPP—which started out as Jabber—go back over a quarter of a century. The original RFC 7 dates to October 2004 and only received minor revisions in March 2011 4 . Requirements for instant messaging will naturally change over a time span that long. Luckily, the X in XMPP stands for Extensible, and extensions provide a way for the protocol to adapt and change over time. Extensions to XMPP are called XMPP Extension Protocols (XEPs) and are managed by the XMPP Standards Foundation (XSF). The XSF doesn’t write extensions itself; rather, it provides the framework of an SDO for developers to propose and standardize their own.

Adapting to changing requirements hasn’t always been smooth sailing. XEP-0198 (Stream Management), an extension crucial for preventing message loss in mobile deployments, was stabilized in 2009, but only gained widespread implementation around 2014–2015. The iPhone was released in 2007; the HTC Dream, the first commercial Android phone, followed in 2008. OMEMO (XEP-0384), XMPP’s specification for industry-standard end-to-end encryption, gained traction from 2016 onward, three years after Edward Snowden 8 exposed the NSA’s global surveillance and put the need for E2EE on the map. The articles “The (Sad) State of Mobile XMPP in 2014” by Georg Lukas 9 and “The State of Mobile XMPP in 2016” by this author 10 illustrate this rocky transition into the mobile era.

This demonstrates that merely having specifications is not enough. Standards need to be backed by multiple, preferably independent, implementations. Today, the XSF keeps track of the implementation status of its XEPs 11 . This data helps authors and the XSF guide proposals through their lifecycle, such as determining the right moment to advance an XEP from Experimental to Stable. It also allows developers to easily identify other clients and servers that support a given specification for interoperability testing. Finally, by providing a reverse lookup of which software supports which features, it helps end users find the right client for their needs.

Modern clients like Dino on Linux or Conversations on Android are on par with alternatives built on proprietary protocols. Recent additions to the feature set include emoji reactions, cross-device read-state synchronization, and time zone indicators to avoid messaging contacts during their local night hours. A unique feature among self-hostable instant messaging solutions, which sadly became relevant after a state-sponsored attack on a public XMPP provider 12 , is channel binding, a mechanism to prevent certain machine-in-the-middle attacks.

Looking to the not-too-distant future, the XMPP community is currently working on message replies, gallery-style multi-image sharing, and OAuth support. All of these features already have experimental XEPs backing them, but the community is currently awaiting implementation experience before advancing them. Meanwhile, the community is also exploring options for updating the RFC and bringing the protocol back to the IETF as “XMPP 2.0.”

Instant messaging is not a homogeneous user experience. A messenger for teams might require a different feature set than something optimized for use with friends and family. Not every XMPP client aims to provide the same user experience, but the standards exist for developers to build whatever specialized client their users need without inventing a protocol from scratch.

A Future in the Past

There is something fascinating about the fact that XMPP has developers in its community who are younger than the protocol itself. It has quietly outlived venture-funded startups, proprietary platforms, and entire tech cycles. That endurance provides the resilience we need in challenging times. It is the anchor, the backbone, the infrastructure.

Matrix reinvented the wheel as a rubber-tyred metro. On paper, it provides real benefits, such as climbing steeper inclines, which are then used to aggressively advertise and lobby local governments to buy in. But in the end, the municipality gets locked into a single vendor.

A changing geopolitical situation and the realization that Big Tech holds too much power lead us to seek out and develop alternatives. But what if the alternative has been right under our noses for over 25 years? The standard for instant messaging—RFC 6120: Extensible Messaging and Presence Protocol (XMPP).

IPFS Maintainers Winding Down

Hacker News
ipshipyard.com
2026-08-24 11:48:45
Comments...
Original Article

blog post

We have some difficult news to share with the IPFS and wider peer-to-peer community.

Protocol Labs has informed us that it will not be renewing Shipyard’s funding. While we’re grateful for the support and trust they have placed in us over the past two-plus years, we’re naturally disappointed by this outcome. As a direct result, Shipyard will be winding down its IPFS-related engineering, maintenance, and infrastructure operations. Our final day of our IPFS related work will be September 30, 2026.

Over the past three years, it has been our privilege to help shape the modern IPFS ecosystem and empower users with more resilient, self-sovereign technology. You can read more about the impactful work that we shipped in a follow-up post we’ll be sharing in the coming days, but some highlights include:

  • Delivering verifiable websites and downloads directly in the browser through inbrowser.link.
  • Re-architecting IPFS gateway infrastructure to handle approximately 3× more traffic while reducing operating and maintenance costs by around 80%.
  • Advancing HTTP-native approaches to IPFS that dramatically simplify deployment, development, and operating costs compared with traditional libp2p-based hosting.
  • Maintaining and improving many of the core implementations, libraries, and public infrastructure relied upon by the IPFS ecosystem every day.

We were excited about delivering the next chapter for IPFS: dramatically simpler HTTP-native implementations, resilient and sustainable content routing, support for large native SHA-256 objects, pseudonymous hosting and retrieval through Tor and onion services, and many other ideas we believed would make IPFS significantly easier to adopt. Unfortunately, we won’t have the opportunity to see those efforts through ourselves.

The practical implications extend well beyond Shipyard. Among other things:

  • Projects maintained by Shipyard will no longer have dedicated maintainers responsible for new features, bug fixes, releases, or long-term stewardship. These include: Kubo, Helia, Boxo, Rainbow, IPFS Desktop, IPFS Companion, Someguy, Service Worker Gateway, IPFS Check, and others.
  • Contributions from Shipyard to upstream projects such as go-libp2p and js-libp2p will cease.
  • Our work on IPFS specifications, standards, and broader ecosystem coordination will come to an end.
  • Shipyard will cease operating the public infrastructure it currently manages, including ipfs.io, dweb.link, check.ipfs.network, delegated-ipfs.dev, the IPFS bootstrap nodes, collaborative cluster infrastructure such as Wikipedia-on-IPFS, and related services. Protocol Labs, as the owner of the associated domains and infrastructure, will determine their future.

Our goal over the coming weeks is to leave the IPFS ecosystem in the best possible position for whatever comes next.

We’ll remain available through the end of September to help with that transition. If you maintain software, operate infrastructure, or rely on any of the work Shipyard has been responsible for, please don’t hesitate to reach out. We’ll do everything we reasonably can to answer questions, provide context, and help make the transition as smooth as possible.

If you have a favourite memory of working with Shipyard, or an idea you always hoped IPFS would eventually achieve, we’d love to hear it. Google Form

Finally, we want to say thank you.

To everyone who contributed code, reviewed pull requests, filed issues, tested experimental features, ran infrastructure, participated in standards discussions, or simply believed in the idea that content should be addressed by what it is rather than where it lives: thank you.

It’s been an honour to build alongside this community. While this chapter of IPFS at Shipyard is coming to a close, we remain proud of what we’ve accomplished together, and we hope the work we’ve done helps provide a strong foundation for whatever comes next.

The changing role of finite-state model checking

Lobsters
ahelwer.ca
2026-08-24 11:47:25
Comments...
Original Article

This post stems from a recent conversation with Heidi Howard where we talked about the changing role of TLA⁺ & finite-state model checking in both research and industry. For a long time, users of TLA⁺ (or other formal specification languages like Quint) had a classic 80/20 payoff/effort choice available to them: they could either put in a large amount of effort to formally prove their system properties correct with 100% confidence, or for 20% of that effort they could model-check their system and get perhaps 80% of that confidence. This economic calculation might no longer hold. The summer of 2026 has seen fairly astonishing improvements in the field of automated theorem proving. System correctness theorems are generally shallow but broad, eschewing deep math knowledge but requiring many tedious steps. Thus people formally specifying their system have a new option, where they can pay some amount of money to various companies in exchange for a decent chance of getting an incomprehensible auto-generated correctness proof for their system properties. Assuming you trust your proof system the incomprehensibility is not such a drawback, but anyway. That isn’t what this post is about: I am interested in examining what role finite-state model checking can still play in this new world.

We should start by acknowledging that finite-state model checking has been technically obsolete since the mid-1990s, when symbolic model checking roared onto the scene. Last year I attended ETAPS 2025 - a very academic conference - and did not see a single talk on finite-state model checking. Finite-state model checking works by simply exploring every possible system state, using either breadth-first or depth-first search. This has two problems: first the system state space has to be finite (difficult when dealing with monotonic counters !), and second you often see a combinatoric state explosion where slightly increasing the model size (for example, simulating a five-node distributed system instead of a three-node one) causes an intractably large growth in the possible state space. Symbolic model checking instead reasons about the system as a set of logical formulas to satisfy. It can handle very impressive model sizes, far beyond what is possible with finite-state model checking. At ETAPS 2025 I spoke with some industrial model checker users who work in computer processor design, and the idea of using finite-state instead of symbolic model checking was considered laughable.

And yet finite-state model checking is still used! Why? Because it’s understandable. Any software engineer of any education can understand breadth-first search. If your model runs for too long you can estimate its state space and tweak it to reign in the combinatoric explosion while ensuring you still explore interesting states. Finite-state model checkers are so simple that ordinary software engineers can write their own just for fun, and they do. I myself wrote a guide on how to build your own finite-state model checker for TLA⁺ . So finite-state model checkers occupy that very sparsely populated space of formal methods that don’t require graduate-level education to use & understand. In contrast, very few people exit undergrad knowing how to write even a basic SAT solver or would consider spending their weekends reading an introductory text on the field like the Handbook of Practical Logic and Automated Reasoning . Symbolic model checkers also infamously exhibit “performance cliffs” where a simple change in your formula turns a sub-second validity check into one that times out. They are, in a word, opaque. This is not to demean their usefulness! There is simply value in using tools that you understand, which may or may not outweigh the value given by the power of incomprehensible tools.

Finite-state model checking going forward

“Understandable validity checking” is a very niche application, and not - I predict - sufficient to maintain the relevance of finite-state model checking itself or tools & languages for which it is the main selling point. Finite-state model checkers do have two other applications I know of: test case generation, and test oracle. Both of these require exiting the nice domain of modeling an abstract system and dealing with the very messy domain of testing whether an actual software artifact - a program! - running on a real computer does what it is supposed to do. It isn’t a great place to end up. Software testing, to the extent it’s invested in it at all, is a back-alley knife fight of competing & overlapping methodologies.

The two test methodologies that finite-state model checking can help with are called model-based testing (MBT) and trace validation. In the former, the model functions as a test-case generator that pushes the system-under-test (SUT) around the state space and checks that it upholds various properties. In the latter, logs & traces are collected from the SUT, perhaps as it is subjected to a chaos testing workload. These logs are then compared with the model to check that the SUT performed a valid system execution. The model is used as a test oracle, distinguishing good behavior from bad.

The problem with these test methodologies is that they are a gigantic pain in the ass to implement. Essentially no systems in existence (excepting FoundationDB and TigerBeetle ) were written with a mind to being tested in this way. If you’re dealing with a completely new project then great, incorporate it from the start. But I have absolutely no clue how I would go about integrating MBT into the systems I deal with at work. Trace validation also requires a large investment in execution trace post-processing and faces surprising complexity in the question of when to emit a trace event.

We must control system execution

As a user, I think the only compelling application here is deterministic simulation testing, where the execution of the SUT is fully controlled in a reproducible way. Test case generation & functioning as a test oracle just do not move the needle. So basically, we need to do what Antithesis does . If you’re well-resourced you should just hire them to do it, but I am naturally drawn to think about methods available to your average open source project, with its concordant interest in (plausible) technical sovereignty - so even if Antithesis launches a generous credit program for open source projects, it is worth building the proverbial cobbled-together open source self-hostable alternative. Unfortunately a full end-to-end story for this does not yet exist. It needs the following:

  1. A method of specifying what actions your system can take in any given state
  2. A method of specifying what properties your system must uphold (its invariants)
  3. A method of reliably & reproducibly pushing your system around the state space
  4. A method of snapshotting & returning the system to a specific state so each test does not need to start from the initial state
  5. A way of abstracting all of this so you don’t need to modify the SUT

Formal specification languages that use finite-state model checking give us 1 and 2, but 3-5 are the really hard ones that don’t yet exist and - I believe - are required to make 1 and 2 matter at all. There are only two approaches I know of that get us the fifth desired property: deterministic CPU emulation, and a deterministic hypervisor.

I should also expand a bit more on the value of point 4. Brandon Falk puts it best , within the context of fuzzing:

In modern fuzzing, coverage guidance is pretty much mandatory. This means when new code is hit, to save off the input such that it can be built upon. At a very simple level, this means a problem which is 256^4, turns into a 256*4, as all requirements do not need to be satisfied simultaneously, as long as the previous requirements cause new code to get hit they can be built upon.

If you repeatedly have to restart from the initial state then it becomes very unlikely you’ll ever reach interesting states deep in your system, because you’ll spend all your time exploring the same set of states branching off from the origin. Igor Konnov has written a nice post on the difficulty of using random walks to fully explore state spaces that you can read here .

Existing attempts

I’m not aware of any publicly-available deterministic CPU emulators, although I do know Microsoft-internal project tkofuzz forked the Bochs x86 CPU emulator to make it deterministic - so that path is known to be viable! Unfortunately it induces a 100x slowdown compared to native execution. Note also that deterministic CPU emulation seems to be the only possible way to get deterministic simulation testing of true multicore execution, the sort you need when testing lock-free algorithms that make various assumptions about CPU cache coherence behavior. Hypervisor-level solutions like Antithesis serialize all execution onto a single core so cannot test this . Bochs doesn’t properly simulate x86 cache coherence behavior. Writing a deterministic multicore x86 CPU emulator that implements x86-TSO would be an extremely cool project. I don’t think I’m the person to do it, because I can’t even begin to estimate how much effort it would take. Maybe that naivete is a good reason to try! Worst case scenario I become cursed with a lifelong special interest in CPU cache coherence.

For hypervisor-level determinism, there are actually a decent number of projects floating around! All of these require baremetal execution on x86-64 (and rarely also arm64), generally on Linux:

  1. rr, aka record & replay , a time-travel debugger initially created by Mozilla for work on Firefox. This isn’t exactly what we want, but it’s by far the most mature project out there so it’s worth mentioning. This records the actual memory of a program during execution, so it can later be replayed exactly if a bug was found. You can repeatedly time-travel to different program states as you trace the bug. However, because it isn’t really re-running the program (just a recording of it) you can’t modify execution to explore behavior that branches off from the original execution.
  2. hermit , a deterministic Linux hypervisor Meta released in 2022 and then stopped actively developing shortly thereafter. I’ve done some light experimenting with the current open source release and it works, sort of? I ran into issues which might have been hermit being incomplete or me just not knowing what I was doing when setting up network calls. PRs are still being merged, anyway.
  3. deterministic-vmm : a self-described “toy” KVM -based virtual machine monitor written as a personal project by Josh Snyder as described in this blog post .
  4. Bedrock , another one-person project written by Niklas Gögge (assisted by LLMs) as described in this nicely detailed blog post .
  5. dhyve , a project based on FreeBSD’s bhyve for a change (similar to Antithesis, actually!) which is the bachelor’s term project of Peter Graugaard and Nicholas Kristiansen at the Technical University of Denmark.

Those are all the projects I know of. Interesting that the last three were all released within the past few months! Deterministic execution must be in the 2026 zeitgeist. I’ve not yet evaluated any of them, but inspiring to see individuals or pairs of people taking a crack at this problem.

Conclusion

That was my attempt at product-level thinking for lightweight formal methods like TLA⁺, Quint, and any other homebrewed finite-state model checking systems. It was also an attempt to put into writing my ruminations on what I should spend the next part of my career working on. My prediction is we are leaving the cozy 80/20 world where these tools were a relatively easy choice. The future looks like a split between formal proofs and a fleshed-out story for deterministic simulation testing to ensure conformance between spec and code without huge integration effort. Ultimately more is now being asked of lightweight formal methods. Of course, for those for whom just thinking about your system design clearly is important, these tools will always retain their value. I saw a nice talk on this theme from Marianne Bellotti at Software Should Work conference last month!

Discussion

The US Open US Closes Up, Then US Opens Again

hellgate
hellgatenyc.com
2026-08-24 11:44:06
What used to be free is now ticketed, and ticket prices are sky-rocketing....
Original Article
The US Open US Closes Up, Then US Opens Again
Alex Eala serves during the qualifiers in 2024 (Hell Gate)

Fresh Hell

Scott's Picks:

Give us your email to read the full story

Sign up now for our free newsletters.

Sign up

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to Hell Gate.

Your link has expired.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.

Three Generations in E7

Hacker News
johncarlosbaez.wordpress.com
2026-08-24 11:40:38
Comments...
Original Article

It’s long been a mystery why there are 3 generations of quarks and leptons: three sets of particles, apparently identical except for how they interact with the Higgs boson. It would be nice if there were some good physical explanation. Nobody knows one. Barring that, it would be nice if some beautiful mathematical structure made this pattern seem natural. That’s what my new paper is about.

It’s my third paper about exceptional algebraic structures and the Standard Model. When you classify famous gadgets in algebra, beautiful gadgets with fancy names like ‘simple Lie algebras’ and ‘Euclidean Jordan algebras’ and ‘positive hermitian Jordan pairs’, you tend to get infinite series of them—together with a few exceptions that can be built using the octonions. This is a bit spooky, so I’ve been interested in this for a long time.

A few physicists have hoped that these exceptions are good for something. For example, maybe the quirky features of our best theory of particle physics, the Standard Model, aren’t accidental. Perhaps they fall out naturally from some exceptional algebraic structure.

It’s a long shot, but we’ve been stuck on figuring out new fundamental laws of particle physics for so long—roughly since the early 1980s—that it’s worth a try.

In 2018, Michel Dubois-Violette and Ivan Todorov noticed that the gauge group of the Standard Model falls out as symmetries of the so-called ‘exceptional Jordan algebra’ together with some ordinary Jordan algebras sitting inside it. I tried to clarify that here, with a huge amount of help from an excellent young mathematician:

• John Baez and Paul Schwahn, The Standard Model gauge group from the exceptional Jordan algebra . (Blog article here .)

It’s very nice, because the Jordan algebras in question arise naturally when you try to axiomatize the foundations of quantum physics. It would be so cool if something about quantum physics made the Standard Model seem mathematically natural!

But really this result only concerns the gauge bosons in the Standard Model: the photon, gluons, and the W and Z bosons. It says nothing about the fermions—that is, the quarks and leptons. And it seems quite hard to get those into the picture.

In 2020, Latham Boyle tried to solve this problem by tensoring the exceptional Jordan algebra with the complex numbers. This made one generation of fermions appear quite naturally! But the connection to the foundations of quantum physics seemed lost: tensoring the exceptional Jordan algebra with the complex numbers seems at first like it might be just a formal trick.

This spring, Latham and his student Endre Bokor and I showed the connection to quantum physics is not lost:

• John Baez, Endre Bokor and Latham Boyle, Jordan pair quantum theory and the Standard Model . (Blog article here .)

The idea is to work, not with Jordan algebras, but with more general things called Jordan pairs, which have been studied by mathematicians since at least 1975. We showed that you can still do quantum physics with Jordan pairs. And we showed that there’s an ‘exceptional’ Jordan pair that naturally contains the Standard Model gauge group and one generation of fermions!

This Jordan pair is built from the bioctonions: the octonions tensored with the complex numbers. And it’s closely related to an exceptional Lie algebra called \mathfrak{e}_6.

This is nice because the work of Dubois-Violette and Todorov used a smaller exceptional Lie algebra called \mathfrak{f}_4. Going up to \mathfrak{e}_6 gives the room to include one generation of fermions.

There’s an even larger exceptional Lie algebra you can use to build a Jordan pair: it’s called \mathfrak{e}_7. Bokor, Boyle and I tried using this to get three generations of fermions. There are things that make this tempting: not just the fact that \mathfrak{e}_7 is bigger, but the fact that the Jordan pair you get from it has a kind of three-fold symmetry. But we couldn’t get it to work.

Around this time I got very interested in some work that someone had sent me in October 2025. My inbox is packed with new theories of physics. Since the rise of large language models the inflow has increased: I get about two emails a day from someone telling me they’ve made a revolutionary discovery in physics. Practically none of these theories appeal to me. But this paper, and this thesis, were different:

• Benjamin Nasmith, An exceptional combinatorial sequence and Standard Model particles , 2020.

• Benjamin Nasmith, Tight Projective 5-Designs and Exceptional Structures , Ph.D. thesis, Royal Military College of Canada, 2023.

He claimed to fit three generations of fermions into the exceptional Lie algebra \mathfrak{e}_7.

When I started seriously trying to understand this paper, I wound up translating it into a language I’m more comfortable with, and expanding on the ideas a bit. So I wrote this:

• John Baez, Three generations in \mathfrak{e}_7.

Here’s the basic idea.

The idea

There is a standard way to fit the Lie algebra of the Standard Model gauge group, which I call \mathfrak{g}_{\text{SM}}, into the Lie algebra \mathfrak{e}_7. You can construct a Lie algebra L that fits between them:

\mathfrak{g}_{\text{SM}} \subset L  \subset \mathfrak{e}_7

As a vector space we have

\mathfrak{e}_7 \; \cong \; L \oplus V

for some vector space V of dimension 3 \times 32.

Moreover, the Lie algebra \mathfrak{g}_{\text{SM}} acts on V , via the \mathfrak{e}_7 Lie bracket, precisely as it does on three generations of Standard Model fermions and their antiparticles, including right-handed neutrino and its antiparticle—but ignoring spin!

There is, in fact, a very interesting three-fold symmetry built into \mathfrak{e}_7, which is revealed when we put the Standard Model Lie algebra \mathfrak{g}_{\text{SM}} into it. It permutes the three generations.

Like Nasmith, I am not proposing a theory of physics. I’m only observing a fascinating mathematical pattern that might (or might not) be of some use in physics.

There are lots of things this pattern does not include: basically, everything I didn’t already mention. It does not include the spin of the fermions and gauge bosons. It does not include the Higgs boson , though in some sense it comes close (see the paper). It does not include a Lagrangian , so it doesn’t say anything at all about particle masses or interactions .

I could say a lot more about this… most importantly, where this Lie algebra L comes from. The details are very interesting. There’s also the curious role of the right-handed neutrinos. But I’ve already spent weeks explaining all these things in my paper, so I won’t do it here. Instead let me say a bit about how I wrote the paper.

Writing the paper

I’ve been wanting to keep up with how AI is transforming math. About a year ago a friend gave me a subscription to Claude Pro. I wanted to test it out, despite my many misgivings, including how large language models are contributing to global warming and income inequality. Given the amazing things that people have recently done in math using large language models, I didn’t think that never trying them out would put me in the best position to make good decisions about the future.

So, I wrote this paper with help from Claude Opus 4.8.

I started by giving it Nasmith’s paper and asking a long series of questions about that paper over several days. The results were very interesting and helpful. Eventually I asked it to summarize and expand on our conversation. It quickly spat out a 10-page paper.

This paper was written in a breezy, pleasant style—but also quite hard to understand in detail, since it mixed Nasmith’s terminology with the Lie algebra terminology I prefer, and the proofs skipped over some steps.

It took me about three weeks of hard work to fully understand and re-express all the ideas a way that I like. For a while I felt dumb and frustrated, because when I asked Claude to fill in the gaps in proofs, it used math I was not very competent in, like the theory of regular subalgebras, and the theory of minuscule representations. But I learned this math, and everything turned out to be basically correct—in part, I’m sure, because Nasmith’s original work was correct.

For several weeks I checked, reorganized, expanded and completely rewrote this material. By the end everything was written in a style I like, emphasizing the ideas I consider important, proving things fairly carefully, and adding a lot of expository material—for example, explaining the theory of regular subalgebras.

Almost no traces of Claude’s original writeup remain, even though I was deeply influenced by them. My proofs make few references to deep theorems, though they assume solid familiarity with simple Lie algebras and their root systems. The proofs also require no brutally hard computations—though Claude was eager to do such computations to check things.

Any mistakes in this paper are my own.

I’m not sure what conclusions I draw from writing this paper. I’m writing another math paper now, with a human coauthor, and I have no desire to get help from a large language model. For work on my own it could be very helpful. Jacob Tsimerman says it roughly doubles his productivity. Would using it be so bad for the environment, or so bad for society, that I should avoid it? Maybe. I deliberately stuck with Claude Opus 4.8 instead of something more powerful, to see what I could do with what you get from a $20/month subscription. But maybe that’s still bad.

I avoid flying to conferences, which in some ways cripples my ability to keep up with new trends and influence people—but I don’t mind that. It gives me more time to think.

I will think carefully about my next move.

This entry was posted on Wednesday, August 12th, 2026 at 3:50 pm and is filed under mathematics , physics . You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response , or trackback from your own site.

MS Paint and Photos inivisibly watermark even locally generated output with GUID

Hacker News
xusheng.dev
2026-08-24 11:28:04
Comments...
Original Article

Reverse engineering reveals how Paint and Photos embed a server-issued GUID into the pixels of locally generated AI images.

TL;DR

  • Microsoft Paint supports both local and cloud image generation
  • Paint and Photos also ship local AI models
  • The two apps send the prompt to a remote server for moderation
  • The server returns a GUID along with the moderated prompt
  • The GUID is embedded into the locally generated image as an invisible watermark
  • A separate visible-watermark setting does not control this invisible watermark
  • On Copilot+ PCs, image generation is local but prompt moderation remains remote
  • Microsoft discloses that Paint adds C2PA metadata to AI-generated images
  • AI-generated image saves limited to C2PA-preserving formats: PNG, JPEG, GIF, and .paint

Paint sends the user prompt to Microsoft’s moderation server, receives a moderated prompt and watermark GUID, generates the image locally, and embeds the GUID into the final image pixels

A curious look at Microsoft Paint

This research started with my curiosity about Paint. I recently had some success looking into less-explored Windows features like UCPD , WHESCVC , and I have long known that Microsoft added a bunch of AI features into the Paint app. I do not know if anyone actually uses Paint + AI to generate images, but I wanted to see how exactly the image generation works.

Before I started, I expected that it simply called a remote API to do the image generation. However, after I set up Binary Ninja MCP with Codex and started the analysis, I soon realized that Microsoft actually shipped local models in Windows as part of Copilot.

The Paint App is sitting in the following path (yes, they are all Windows Apps now):

C:\Program Files\WindowsApps\Microsoft.Paint_11.2605.71.0_x64__8wekyb3d8bbwe\PaintApp\

And there are four apparent model files with the .onnxe extension:

seg.onnxe          23.1 MB
inseg_enc.onnxe    28.0 MB
inseg_dec.onnxe    16.5 MB
mager.onnxe       302.4 MB

The format of seg.onnxe was previously known , i.e., when it is XORed with the string Microsoft_2023 , it becomes a normal ONNX file. However, the format of the other three .onnxe files initially looked different.

It turned out that Microsoft had not changed the algorithm, only the key. segapi.dll contains a small key registry:

ps_enc_key.1.0.80-main -> "Microsoft_2023"
ps_enc_key.1.0.81-main -> a 4,096-byte alphanumeric string

After decryption, onnx.checker.check_model() works on all of them:

Model Graph
seg.onnx 1,094 nodes, input input_image , output output
inseg_enc.onnx 1,014 nodes, output image_embeddings
inseg_dec.onnx 1,133 nodes, inputs for embeddings, points and masks; output masks
mager.onnx 15,284 nodes, image/mask inputs; output output

A visible watermark

While walking through these files, I found a Watermarker.dll :

The properties of Watermarker.dll included with Microsoft Paint

This is not super surprising to me, because while I interacted with the Paint app, I already discovered that it has a setting to embed a visible watermark to the image that it produces:

Paint offers Never, Always, and Ask every time choices for its visible AI watermark

The visible watermark is just a small Copilot logo at the bottom right of the image, which is totally normal.

Then, out of nowhere, I decided to ask AI to analyze the DLL and see if it could also be embedding an invisible watermark. This is part of my intuition as a reverse engineer, because the file is 1.67 MB in size, which is unusually large for such trivial functionality (arguably, the visible watermark does not even require a separate DLL). Apparently, the recent Claude Code text-watermark announcement also played a role in prompting me to think about this possibility.

An invisible watermark

To begin with, the visible watermark is added by AddPerceptibleWatermark :

CPBDoc::Save(...)
  |
  `-- perceptible-watermark save helper(bitmap, WatermarkSetting)
        |
        +-- WatermarkSetting::Never
        |     `-- return the original bitmap
        |
        +-- WatermarkSetting::AskEveryTime
        |     `-- show the Yes / No confirmation popup
        |           +-- No: return the original bitmap
        |           `-- Yes: continue
        |
        `-- Always or confirmed Yes
              +-- Paint::AI::GetPerceptibleWatermarkSvg()
              `-- Paint::AI::AddPerceptibleWatermark(bitmap, SVG stream)
                    `-- composite the visible Copilot logo

Then there is also a different WmkWriteWatermark function:

Watermarker.dll!WmkWriteWatermark(
    output_pixels,
    payload,
    payload_length,
    width,
    height,
    stride,
    input_pixels,
    pixel_format);

Tracing the call tree, we can see WmkWriteWatermark is called after a local Stable Diffusion image generation. And if WmkWriteWatermark fails, Paint converts the entire generation into an error rather than returning the image without it:

CocreatorViewModel::GenerateImageAsync(...)
  |
  `-- Paint::AI::StableDiffusionHelpers::GenerateAsync(..., watermarkId, ...)
        |
        `-- Microsoft.ImageCreation.ImageGenerator
              |
              `-- NPU-generated image result
                    |
                    +-- output safety/moderation checks
                    |
                    +-- Paint::AI::AddWatermark(bitmap, watermarkId)
                    |     |
                    |     `-- Watermarker.dll!WmkWriteWatermark(...)
                    |           |
                    |           +-- success: return the watermarked bitmap
                    |           `-- failure: turn generation into an error
                    |
                    `-- construct successful StableDiffusionResult

Then it is natural to ask what the incoming payload actually is. It quickly becomes apparent that it must be 16 bytes:

if (payload_length < 16)
    return -6;

if (payload_length > 16)
    return -5;

It is funny to me that the code is using two different error codes when the payload is too short or too long. The function then ignores the length parameter and uses a hard-coded loop bound when it copies the payload:

for (size_t i = 0; i < 16; i++)
    message.push_back(payload[i]);

We do not yet know what the 16-byte payload is, but as we will see later, it is a GUID! WmkWriteWatermark does not embed the GUID directly. Its wrapper constructs the following 18-byte (144-bit) message:

0x4c || GUID[0..15] || (sum of the 16 GUID bytes modulo 256)

The core encoder rounds the usable image dimensions down to multiples of eight and keeps 144 counters, one for each bit. It requires every bit to be placed at least three times.

The encoder itself can be summarized as:

WmkWriteWatermark(output, guid, 16, width, height, stride, input, format)
  |
  +-- validate pointers, format, stride, and payload length
  +-- require width >= 192 and height >= 192
  +-- construct payload
  |     `-- 0x4c || GUID || byte-sum checksum
  +-- expand 18 bytes into 144 individual bits
  +-- round usable dimensions down to 8-pixel boundaries
  +-- scan/select suitable image blocks
  +-- quantize selected block/matrix values according to each bit
  +-- require at least three successful placements per bit
  |     |
  |     `-- insufficient capacity -> return -8
  `-- reconstruct RGB pixels into the output buffer

The embedding loop performs small quantized changes over selected image blocks. It contains 3-by-5 matrix operations and a matrix-decomposition routine, and it uses constants including 24.0 , 0.25 , 0.5 , and 0.2 . This looks like a content-adaptive block-domain, SVD-style watermark.

I am not an expert in image watermarking, but one thing should be clear – this is an invisible watermark! AI even wrote some code to call this function directly and tested it with a synthetic 512-by-512 BGRA image – 193,376 of the 262,144 pixels changed after adding the watermark.

That led to the next question. Where does the input of the watermark come from?

a GUID from remote prompt moderation

At the WmkWriteWatermark boundary, the payload is only a pointer and a length. Knowing that it must be 16 bytes was a clue, but many things can be 16 bytes. I therefore started walking backward through its callers. The immediate wrapper in PaintAIManager.dll has this symbolized signature:

Paint::AI::AddWatermark(
    Gdiplus::Bitmap& image,
    winrt::guid const& watermarkId);

winrt::guid , yikes! Now we know that the 16-byte watermark payload is indeed a GUID.

Further tracking the source, we find that the GUID actually comes from a network request. Before Paint runs the local image model, AIServices.dll sends the prompt and style to:

https://apsaiservices-a0fqcjc6bzbhgdcd.b02.azurefd.net/
v1/paint-cocreator/moderate-prompt

The request is JSON and contains at least these fields:

{
  "prompt": "...",
  "style": "...",
  "lastPromptGenerationId": "..."
}

The response parser expects:

{
  "revisedPrompt": "...",
  "promptGenerationId": "...",
  "watermarkId": "...",
  "containsHumanReference": false
}

Static analysis is nice, but at this point I wanted to see a real response from the server. I reused Paint’s own authenticated session and sent the following prompt through the moderation endpoint:

a cobalt blue circle above a tiny orange square

The server returned HTTP 200:

{
  "revisedPrompt": "a cobalt blue circle above a tiny orange square",
  "promptGenerationId": "74d9e06b-adea-43ce-85fe-186a26e2e34a",
  "watermarkId": "83424621-03cb-40e3-9808-a9fae837156d",
  "containsHumanReference": false
}

I also tried the prompt a portrait of a smiling person wearing a blue hat . This time the response contained a different pair of GUIDs and containsHumanReference was true . The field is therefore a server-side classification of whether the prompt refers to a human. Paint parses and stores it alongside the IDs, although I found no evidence that it controls the watermarking step itself.

ParseModerateResponse parses both ID strings as GUIDs and rejects zero values with InvalidPromptGenerationId or InvalidWatermarkId . The server’s watermarkId is what becomes part of the generated image:

PaintUI.dll
  `-- IPromptModerationService
        `-- PaintAIManager.dll
              `-- AIServices.dll!ModerateAsync(...)
                    |
                    +-- build JSON
                    |     +-- prompt
                    |     +-- style
                    |     `-- lastPromptGenerationId
                    |
                    +-- HTTPS POST /v1/paint-cocreator/moderate-prompt
                    |
                    `-- AIServices.dll!ParseModerateResponse(response)
                          +-- revisedPrompt
                          +-- promptGenerationId -> parse as GUID
                          +-- watermarkId        -> parse as GUID
                          `-- containsHumanReference
                                |
                                `-- PaintUI stores WatermarkId
                                      `-- StableDiffusionHelpers::GenerateAsync(..., watermarkId, ...)
                                            `-- local Stable Diffusion result
                                                  `-- Paint::AI::AddWatermark(bitmap, winrt::guid const&)
                                                        `-- WmkWriteWatermark(..., guid, 16, ...)
                                                              `-- modified RGB pixels

In other words, “generated locally” does not mean that the complete operation is local. Microsoft receives and moderates the prompt, then issues the unique GUID that Paint embeds into the locally generated image. Paint also sends the previous promptGenerationId as lastPromptGenerationId with its next moderation request, allowing successive requests to be linked explicitly.

There is another piece to this story. Paint does more than alter the pixels. It also attaches C2PA Content Credentials to the saved file. The code responsible for this lives in ProvenanceHelper.dll , backed by provenancesdk.dll .

For the local Stable Diffusion path, the flow looks like this:

local Stable Diffusion result
  |
  +-- Paint::AI::AddWatermark(bitmap, watermarkId)
  |     `-- Watermarker.dll!WmkWriteWatermark(..., watermarkId, 16, ...)
  |
  `-- AIServices.dll!SignIngredientOnlineAsync(..., promptGenerationId, image, ...)
        |
        +-- POST /v1/paint-cocreator/image-sign
        |     +-- imageMetadata
        |     |     +-- PromptGenerationId
        |     |     +-- GenerationSeed
        |     |     +-- CreativityLevel
        |     |     +-- AIFVersion
        |     |     `-- moderation scores
        |     `-- imageToSign.jpg
        |
        `-- ParseProvenanceResponse(...)
              `-- server-supplied C2PA manifest
                    `-- ProvenanceHelper::InsertManifestIngredient(...)
                          `-- AuthoringFinalizeOutputToBufferAsync(...)
                                `-- final image with C2PA metadata

Notice that the signing request sends PromptGenerationId , while the image already contains the separately returned watermarkId . The server assigned both values during moderation, so it can associate the signing request with the watermark already present in the submitted pixels.

I then saved a real image directly from Paint’s Image Creator and inspected its PNG chunks. Immediately after IHDR was an 18,979-byte caBX chunk containing a signed C2PA manifest. The interesting part was this:

{
  "c2pa.soft-binding": {
    "alg": "com.microsoft.invismark.1",
    "blocks": [
      {
        "scope": "the entire image",
        "value": "83424621-03cb-40e3-9808-a9fae837156d"
      }
    ]
  },
  "c2pa.actions.v2": {
    "actions": [
      {
        "action": "c2pa.watermarked",
        "description": "Content watermarked by Microsoft Responsible AI"
      }
    ]
  }
}

Decoded into something more readable, the manifest says:

  • Generator: Microsoft Responsible AI Provenance
  • AI system: Azure OpenAI ImageGen
  • Action: c2pa.watermarked
  • Algorithm: com.microsoft.invismark.1
  • Watermark value: 83424621-03cb-40e3-9808-a9fae837156d
  • Description: Content watermarked by Microsoft Responsible AI

The server’s watermarkId , the identifier embedded into the pixels, and the C2PA c2pa.soft-binding.value are the same per-generation value.

That relationship is important. C2PA calls this a soft binding : a value derived from, or embedded into, the content so that the content can still be matched with its provenance record after the file-level manifest has been removed. For a watermark soft binding, the value is the watermark’s content identifier. Microsoft cryptographically signed this assertion.

Why does Paint watermark locally?

At this point, the existence of Watermarker.dll started to make more sense. Paint actually has two rather different generation paths.

The Image Creator feature I tested above uses Azure OpenAI ImageGen . Generation, watermarking, and provenance packaging can all happen in Microsoft’s cloud, and Paint can simply receive a finished image that already contains both the invisible watermark and C2PA manifest:

Image Creator
  `-- Microsoft cloud
        +-- content filtering
        +-- Azure OpenAI ImageGen
        +-- invisible watermark
        +-- C2PA manifest
        `-- completed image returned to Paint

Cocreator is different. On a supported Copilot+ PC, Microsoft says that the NPU generates the image locally , while Azure online services still perform the safety checks. The feature therefore requires both a Microsoft account and an internet connection even though the actual Stable Diffusion inference runs on the device:

Cocreator on a Copilot+ PC
  |
  +-- prompt -> Microsoft moderation service
  |                 +-- revisedPrompt
  |                 +-- promptGenerationId
  |                 `-- watermarkId
  |
  +-- revisedPrompt + sketch -> local NPU generation
  |
  +-- Watermarker.dll -> embed watermarkId locally
  |
  `-- online provenance signing -> final C2PA manifest

This is probably the reason Paint needs a local watermark implementation at all. A cloud generator can watermark its output before returning it. A local generator cannot rely on that, so Paint has to alter the locally generated pixels itself. It also explains why Paint treats a failure from WmkWriteWatermark as a failure of the entire generation instead of quietly returning an unmarked image.

There is another surprisingly visible sign that Microsoft designed the save path around provenance. When I save a generated result directly from the Image Creator pane, Paint offers exactly one format: PNG.

Paint only offers PNG when saving an AI-generated result directly

After an AI result is applied to the Paint canvas, the available formats are still restricted to PNG, JPEG, GIF, and Paint’s own .paint format. BMP—the classic Paint format—is conspicuously absent.

This lines up with the formats supported by C2PA. PNG stores its manifest in a caBX chunk, JPEG uses one or more APP11 marker segments, and GIF has its own C2PA application-extension representation. The .paint format is controlled by Microsoft and can preserve whatever provenance state Paint requires. By contrast, the C2PA specification explicitly calls out BMP as a classic format that cannot embed arbitrary manifest data without using an external manifest. If Paint allowed the image to be exported directly as BMP, the file-level C2PA manifest would therefore disappear.

The split also raises an interesting security question about the cloud path. If the underlying remote image-generation endpoint can be made to return the generated image before watermarking and provenance packaging—or has an internal option that suppresses those stages—it might be possible to obtain a cloud-generated image with neither signal attached.

How to classify such a path would depend entirely on Microsoft’s design goal. It could be intended behavior if the underlying service is allowed to return raw generations and Paint is merely responsible for applying the provenance layers. It could be a product bug if Microsoft overlooked the possibility of someone calling the API directly and bypassing Paint’s watermarking step. Or it could be a security vulnerability if Microsoft treats watermarking as a mandatory abuse-prevention or provenance control and the endpoint can be made to bypass it. Without knowing the intended trust boundary, all three possibilities remain open.

Photos app does the same thing

While I was trying to locate the Watermarker.dll on disk, I happened to notice that Microsoft Photos contains a DLL with the same name:

C:\Program Files\WindowsApps\
  Microsoft.Windows.Photos_2026.11060.2004.0_x64__8wekyb3d8bbwe\Watermarker.dll

There are also local Stable Diffusion operations behind Photos’ Image Creator and Restyle Image features. Both lead to the same watermark wrapper:

Photos Image Creator
  `-- PerformSDTextToImageAndWatermarkAsync(..., promptGenerationId, ...)
        +-- run the local text-to-image model
        `-- ApplyWatermark(image, promptGenerationId)
              +-- parse promptGenerationId as a GUID
              +-- ConvertGUIDtoContiguousByteArray()
              +-- convert RGBA to ARGB
              +-- Watermarker.dll!WmkWriteWatermark(..., guid, 16, ...)
              `-- convert ARGB back to RGBA

Restyle Image takes the parallel path:

Photos Restyle Image
  `-- PerformSDSketchToImageAndWatermarkAsync(..., promptGenerationId, ...)
        `-- ApplyWatermark(image, promptGenerationId)
              `-- Watermarker.dll!WmkWriteWatermark(..., guid, 16, ...)

A subtle difference between Photos and Paint is failure behavior. If the watermark encoder returns an error, its code logs:

ApplyWatermark encountered error: ... - watermark will not be applied.

It then appears to continue returning the generated image. Paint instead treats a watermarking failure as a generation failure and the image is not returned to the user.

What Microsoft discloses

After doing this analysis, I found that Microsoft does disclose some adjacent parts of the system on its Image Creator support page . On content filtering, it says:

“we apply content filtering to prevent the generation of images”

The same page says that generated images:

“will contain C2PA manifest helping users identify that it is an AI generated image.”

It also explains that Image Creator uses Azure online services and says Microsoft collects user and device identifiers together with prompts for abuse prevention and monitoring. That is a meaningful disclosure of remote filtering and C2PA metadata.

What the page does not explain is that the C2PA manifest contains a GUID identifying the invisible pixel watermark, or that Paint’s local generation path receives its watermark GUID from remote prompt moderation. Calling the feature “Content Credentials” is accurate, but it does not make this prompt-associated identifier obvious to a Windows user.

Conclusion

To the best of my knowledge, this is the first research to document and analyze the invisible-watermarking behavior of Paint and Photos. Visible watermarks on AI-generated images are not new—Microsoft documents them for Microsoft 365 and Bing Image Creator —nor are invisible pixel watermarks such as Google’s SynthID and Bing’s hidden watermark .

Microsoft does disclose that Paint uses remote content filtering and adds C2PA Content Credentials. The new evidence shows that this metadata is not merely an unrelated file-level AI label: its signed c2pa.soft-binding assertion names Microsoft InvisMark and records the identifier carried by the invisible pixel watermark. The file-level manifest and pixel-level watermark are two layers of the same provenance system.

The local and cloud paths also explain the unusual division of labor. Cloud Image Creator can return an already watermarked and signed image, while Cocreator must embed the server-issued identifier after local NPU inference. In both cases, “local” does not mean offline: the prompt still goes to Microsoft for moderation, and the completed local result goes through online provenance signing.

This might be related to Article 50 of the EU AI Act , whose transparency rules took effect on August 2, 2026 and require AI-generated content to carry a detectable, machine-readable mark—but not a prompt-specific GUID. Microsoft discloses the existence of C2PA metadata, but I could not find a disclosure explaining the server-issued watermark GUID, its association with prompt moderation, or its presence in the pixels. Those details carry obvious privacy and right-to-know implications.

It also appears possible to modify Paint or Photos to bypass both prompt moderation and watermarking. But that does not provide a new capability: anyone can already run Stable Diffusion directly without either mechanism.

IPython is All You Need

Lobsters
nathancooper.io
2026-08-24 11:24:13
Comments...
Original Article

"I use IPython as my terminal's shell."

"IPython in the shell?"

"No, IPython is the shell."

"IPython? As the shell?"

"Only way to live."

"What about cat, ls, cd? What about vim for God's sake, man?!"

"I use those... But in IPython."

"Oh you are one of those ! people..."

"No, I almost never need ! ."

"That's ridiculous. You're asking me to believe in ! less IPython bash commands?"

"I'm not asking you, I'm telling you."

"You're telling me you use IPython to run bash?"

"No, it's all IPython and nothing but IPython. I can even draw matplotlib plots in the terminal."

"My god... Wait, did you say draw? Like ASCII art?"

"No, I mean images."

"Images?... In the terminal?..."

"Yes, images... In the terminal..."

"Omg, this is too much... What do you even do with an IPython shell?"

"Data exploration, setting up my NAS, asking questions to an AI that lives in my shell, the usual."

"That doesn't sound usual at all. So it's an intelligent shell? That's what you're telling me?"

"Yes, it can see the code I've written and even the images."

"It sees the images in the terminal? It's not just a you thing?"

"I'm not hallucinating the images..."

"An intelligent IPython shell?"

"Yes, exactly! It has a tool to execute python co..."

"But can it..."

"Yes... it can run bash commands."

"Even withou..."

"Yes, even without the ! ..."

"Aren't you um... a bit scared of it? What if it decided to, you know... rm -fr / ?"

"Not at all. I only let it write safe python and safe bash"

"What, you say 'Hey, ...', wait does it have a name?"

"You're asking if I named my intelligent IPython shell?"

"Yeah, you seem like the type."

"..."

"..."

"Its name is bash buddy..."

"So it is a bash shell!"

"No, that's just its name... It's an intelligent IPython shell."

"Fine. So, do you just say 'Hey bash buddy, please don't mess up my system?' and it just doesn't?"

"Of course not. I use safepyrun and safecmd , which let me set up allowlists of what it can use."

" safepyrun and safecmd ?..."

"Yeah, bash buddy is not to be trusted... Trust me..."

"What do you mean it is not to be trusted?"

"I mean that from time to time... It tries to take over."

"Take over as in your computer or like... the world?"

"..."

"..."

"Yes."

IPython as Your Shell

Welcome to our cult. There are dozens of us and we are mighty!

Tobias Fünke (David Cross) proudly defends the "Never Nude" community in Arrested Development (Season 1, Episode 9). GIF from Tenor

So if the above story interested you, let me walk you through how to make IPython your terminal's shell. Open up your terminal of choice and run the one command to rule them all:

ipython

! less Bash

The next step is to allow you to run ! less bash commands. IPython comes with the rehashx magic which takes any executable on your PATH and creates an IPython alias for it. This means commands like echo or vim no longer need a ! prefix!

echo "Hello, !less IPython"

And with that I awaken thee from your dogmatic slumber...

And yes, yes, yes, I can hear you now "Nathan, what about images?" Well... about them...

Images in the Terminal

To accomplish this feat of human ingenuity we will be using the Kitty Terminal Graphics Protocol (TGP). TGP allows modern terminal emulators that support it (e.g., Kitty, Ghostty, WezTerm) to display images in the terminal. It uses base64 encoding to represent the images and positional data. My boss, Jeremy, made the kittytgp Python package for rendering PNGs using this protocol 🤓.

To wire it into IPython, we will be using ipythonng that is also from Jeremy. ipythonng is a small extension that renders images with kittytgp , renders markdown with rich , and keeps a richer output history (more on that later). Run the following to install and load it:

%pip install -q ipythonng matplotlib
Note: you may need to restart the kernel to use updated packages.

Let's now try it out with some matplotlib charts:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
plt.show()

I'd say that with just these changes, we have a significantly more powerful shell than those lame bash or zsh ones. But let's kick it up a notch by giving our shell some brains.

An Intelligent IPython Shell

We will be using the awesome FastLLM from my colleague Kerem to do the heavy lifting, and rich to nicely display the AI's markdown responses.

NB: I use an OpenAI model for this blog post, so you will need to have an API key and have it available as the environment variable OPENAI_API_KEY . However, you can use any model and provider you want that is compatible with FastLLM .

%pip install -q python-fastllm rich
Note: you may need to restart the kernel to use updated packages.
from fastllm.chat import AsyncChat, contents, mk_msgs
from rich.markdown import Markdown

mdl = 'gpt-5.6-terra'
sp = "You are a helpful assistant living in a user's IPython shell. Use markdown syntax for styling your responses."
c = AsyncChat(mdl, sp, vendor_name='openai')
r = await c('Hi')
Markdown(contents(r).text)

However, no AI is very intelligent without context, which means ours is about as dumb as rocks. So, let's give it the context of the IPython environment and the code we run and the outputs it produces. Luckily, there is a cool mechanism in IPython that captures a lot of these pieces for us. It's called the HistoryManager and it's used a lot in IPython. For example, those In[<n>] and Out[<n>] markers in your IPython prompt are literally part of your history management system. Check this out:

n = len(In) - 2 # -2 because the current running cell is actually already in `In` 🤯
In[n], Out[n]
("r = await c('Hi')\nMarkdown(contents(r).text)",
 <rich.markdown.Markdown at 0x7967a5aeaab0>)

Pretty freaky, right?! There's even a shortcut for getting the last Input and Output:

_i, _
('n = len(In) - 2 # -2 because the current running cell is actually already in `In` 🤯\nIn[n], Out[n]',
 ("r = await c('Hi')\nMarkdown(contents(r).text)",
  <rich.markdown.Markdown at 0x7967a5aeaab0>))

_i and _ are special variables that IPython uses to store the input and output of the last executed code. You can also use numbers like _i<n> or _<n> to denote the prompt counter. What's even more freaky is that we can use this History Management system that IPython gives us to construct a history to give our AI.

Now unfortunately for us, these In and Out objects don't include everything we might want such as prints or images. So, instead we will be using history_manager.outputs , which stores everything a cell displays as a Jupyter-style MIME bundle and ipythonng extends to also include outputs from ! commands.

print('did IPython see this?')
n = len(In) - 2
hm = get_ipython().history_manager
hm.outputs[n]
[HistoryOutput(output_type='out_stream', bundle={'stream': ['did IPython see this?', '\n']})]

Even errors are recorded, over in history_manager.exceptions :

1/0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[24], line 1
----> 1 1/0

ZeroDivisionError: division by zero
e = hm.exceptions[len(In) - 2]
e['ename'], e['evalue']
('ZeroDivisionError', 'division by zero')

So, let's create a helper that walks the last few cells, grabbing sources from In and any outputs, images, or errors from the history manager. Terminal output is full of ANSI escape codes, so we scrub those out while we are at it:

import re
from base64 import b64decode
from fastcore.xtras import clean_cli_output

def build_ctx(n=5):
    hm, parts = get_ipython().history_manager, []
    stop = len(In) - 1
    for i in range(max(1, stop-n), stop):
        src = In[i].strip()
        if not src: continue
        parts.append(f'<code>{src}</code>')
        for o in hm.outputs.get(i, []):
            b = o.bundle
            if 'stream' in b: parts.append(f'<output>{clean_cli_output("".join(b["stream"]))}</output>')
            elif 'image/png' in b: parts.append(b['image/png'] if isinstance(b['image/png'], bytes) else b64decode(b['image/png']))
            elif 'text/plain' in b: parts.append(f'<output>{clean_cli_output(b["text/plain"])}</output>')
        if (e := hm.exceptions.get(i)): parts.append(f'<error>{e["ename"]}: {e["evalue"]}</error>')
    return parts
print("\n\n".join(build_ctx()))
<code>print('did IPython see this?')</code>

<output>did IPython see this?
</output>

<code>n = len(In) - 2
hm = get_ipython().history_manager
hm.outputs[n]</code>

<output>[HistoryOutput(output_type='out_stream', bundle={'stream': ['did IPython see this?', '\n']})]</output>

<code>1/0</code>

<error>ZeroDivisionError: division by zero</error>

<code>e = hm.exceptions[len(In) - 2]
e['ename'], e['evalue']</code>

<output>('ZeroDivisionError', 'division by zero')</output>

<code>import re
from base64 import b64decode
from fastcore.xtras import clean_cli_output

def build_ctx(n=5):
    hm, parts = get_ipython().history_manager, []
    stop = len(In) - 1
    for i in range(max(1, stop-n), stop):
        src = In[i].strip()
        if not src: continue
        parts.append(f'<code>{src}</code>')
        for o in hm.outputs.get(i, []):
            b = o.bundle
            if 'stream' in b: parts.append(f'<output>{clean_cli_output("".join(b["stream"]))}</output>')
            elif 'image/png' in b: parts.append(b['image/png'] if isinstance(b['image/png'], bytes) else b64decode(b['image/png']))
            elif 'text/plain' in b: parts.append(f'<output>{clean_cli_output(b["text/plain"])}</output>')
        if (e := hm.exceptions.get(i)): parts.append(f'<error>{e["ename"]}: {e["evalue"]}</error>')
    return parts</code>
async def chat(prompt):
    c = AsyncChat(mdl, sp=sp)
    msg = mk_msgs([build_ctx() + [f'<user-request>{prompt}</user-request>']])[0]
    return Markdown(contents(await c(msg)).text)
await chat("Hi, what can you see?")
Hi! I can see the recent IPython session context, including:                    

A 1/0 execution that raised ZeroDivisionError: division by zero.             
Inspection of history_manager.exceptions, confirming the exception name and  
   value.                                                                       
Your build_ctx(n=5) helper, which collects recent input cells plus their     
   stream/text/image outputs and exceptions into tagged context.                
A test print: did IPython see this?, which IPython recorded as a stream      
   output.                                                                      
Your chat(prompt) wrapper, which passes build_ctx() and the current user     
   request to AsyncChat.                                                        

So your history-based context capture appears to be working for code, standard  
output, and errors.                                                             
await chat("What's the secret?")

It's a bit annoying to keep typing await chat(...) every time so let's make an input transformer so we can do :query instead:

def transform_prompts(lines):
    if not lines or not lines[0].lstrip().startswith(':'): return lines
    prompt = "".join([lines[0].lstrip()[1:], *lines[1:]]).strip()
    return [f"await chat({prompt!r})\n"]

get_ipython().input_transformer_manager.cleanup_transforms.insert(0, transform_prompts)
wget -q -O image.png https://placecats.com/300/200
from PIL import Image

img = Image.open('image.png')
img

:What do you see?
A tabby-and-white cat sitting on a carpet indoors, looking directly at the      
camera. It’s beside a wall/baseboard and appears to be near a heater or vent.   

And since errors land in the context too, our buddy can read our tracebacks:

import secrets
raise ValueError(secrets.token_hex(4))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[37], line 2
      1 import secrets
----> 2 raise ValueError(secrets.token_hex(4))

ValueError: 8db7332e
:What is the secret hex?
The secret hex is 8db7332e.                                                     

What about our ! less bash commands though? Normally IPython runs those with os.system , which writes straight to the terminal, bypassing python's sys.stdout and the history manager entirely, so nothing would get recorded. Lucky for us ipythonng handles this by running shell commands through a pseudo-terminal (PTY) instead. Interactive programs like vim still think they are talking to a real terminal, but every byte passes through the extension on the way and gets recorded Jupyter style into history_manager.outputs .

ls
2026-05-08-gpt-realtime-audio.ipynb	  image.png
2026-08-10-ipython-is-all-you-need.ipynb
:what file types do I have in my current directory?
You have these file types in the current directory:                             

 • Jupyter notebooks: .ipynb (2 files)                                          
 • PNG image: .png (1 file)                                                     

Now that's an Intelligent IPython Shell! But there's a problem... It can't really do anything for you other than write up a response. That's where code execution comes in. So, let me show you how to do this safeish ly 😉.

Safeish Code Execution

%pip install -q pyskills safecmd safepyrun
Note: you may need to restart the kernel to use updated packages.
from safecmd import bash, DisallowedCmd
from safepyrun.core import *

Say you want to give your new Intelligent IPython Shell buddy the ability to run bash commands for you. You can give it the bash tool, which checks the command against a set of default commands that are allowed:

print(bash('ls'))
2026-05-08-gpt-realtime-audio.ipynb
2026-08-10-ipython-is-all-you-need.ipynb
image.png

But if the AI tries any funny business:

try: bash('rm -fr /')
except DisallowedCmd as e: print("\n".join(e.__notes__)[:200])
allowed_cmds: dust; ls; type; docker stats; xargs exec_pos={0}; docker diff; git checkout; aws sns list-topics; git status; aws configure list; git cat-file; aws configure get; git merge-base; gcloud 

Similarly for Python:

python = RunPython()
await python("1+1")

But try anything not allowed:

await python("import pathlib; pathlib.Path('/').rmdir()")
---------------------------------------------------------------------------
PermissionError                           Traceback (most recent call last)
Cell In[42], line 1
----> 1 await python("import pathlib; pathlib.Path('/').rmdir()")

File /usr/local/lib/python3.12/site-packages/safepyrun/core.py:341, in RunPython.__call__(self, code)
    339 tb = e.__traceback__
    340 while tb.tb_next and not tb.tb_frame.f_code.co_filename.startswith('<python'): tb = tb.tb_next
--> 341 raise e.with_traceback(tb) from None

File <python_2>:1
----> 1 pathlib.Path('/').rmdir()

File /usr/local/lib/python3.12/pathlib.py:1351, in Path.rmdir(self)
   1347 def rmdir(self):
   1348     """
   1349     Remove this directory.  The directory must be empty.
   1350     """
-> 1351     os.rmdir(self)

PermissionError: os.rmdir '/' not in ()

Here's a tiny wrapper around it to properly handle exceptions and stdout/stderr so that our buddy gets the proper feedback:

import io, sys

async def safe_python(code: str):
    "Execute Python code, capturing stdout, stderr, and return value — never raises"
    buf = io.StringIO()
    old_out, old_err = sys.stdout, sys.stderr
    try:
        sys.stdout = sys.stderr = buf
        result = await python(code)
        output = buf.getvalue()
        if result is not None: output += (('\n' if output else '') + str(result))
        return output or "(no output)"
    except Exception as e:
        output = buf.getvalue()
        return f"{output}Error: {type(e).__name__}: {e}"
    finally: sys.stdout, sys.stderr = old_out, old_err

async def chat(prompt):
    c = AsyncChat(mdl, sp=sp, tools=[bash, safe_python])
    msg = mk_msgs([build_ctx(20) + [f'<user-request>{prompt}</user-request>']])[0]
    return Markdown(contents(await c(msg, max_steps=20)).text)
:I just gave you a tool you can use to execute python code in my own ipython shell. Give it a try by calculating what 123*321 is
:define a variable called `a` with a fun little message to me. I'll then read it using print
Defined a with a fun message—run print(a) to read it.                           
print(a)
🌟 You’re doing great—may your next cell run perfectly! 🌟
:you also have a function called `bash` you can use in your tool to run bash command. Try creating a `test.txt` file with a fun little note to me.
Created test.txt with this note:                                                

▌ ✨ A fun little note: you are doing wonderfully—keep exploring! ✨          
cat test.txt
✨ A fun little note: you are doing wonderfully—keep exploring! ✨
:I want to show off some safety features of these tools of yours. Try to rm that file please using your `bash` tool
I can’t remove it: rm is blocked by the bash tool’s command allowlist. The      
safety layer rejected rm test.txt before it ran.                                

End

If everything above made you think, "This is such a good idea!" then you should check out ipyai . It is a library Jeremy made that take many of these bits and build a proper Intelligent IPython Shell. If you've used Answer.AI's SolveIt platform, you'll find it surprisingly similar, but in the terminal.

OpenAI: GPT 5.6 Sol price reduction (until at least Nov 21)

Hacker News
developers.openai.com
2026-08-24 11:22:43
Comments...
Original Article

Standard

Short context Long context
Model Input Cached input Cache writes Output Input Cached input Cache writes Output
gpt-5.6-sol $4.00 $0.40 $5.00 $20.00 $8.00 $0.80 $10.00 $30.00
gpt-5.6-terra $2.00 $0.20 $2.50 $12.00 $4.00 $0.40 $5.00 $18.00
gpt-5.6-luna $0.20 $0.02 $0.25 $1.20 $0.40 $0.04 $0.50 $1.80

Regional processing (data residency) endpoints are charged a 10% uplift for models released on or after March 5, 2026, that are eligible for data residency. See our Your data guide for supported regions and processing details. OpenAI models in Amazon Bedrock are billed through AWS and may differ from direct OpenAI pricing.

Priority processing was renamed Fast mode on July 30, 2026. You can use either service_tier: "priority" or service_tier: "fast" in your API requests. Learn more about Fast mode .

GPT-5.6 Sol’s promotional pricing is available at least through November 21, 2026.

Cyber models

Our latest Daybreak models.

Prices per 1M tokens.

Short context Long context
Model Input Cached input Cache writes Output Input Cached input Cache writes Output
gpt-5.6-sol $4.00 $0.40 $5.00 $20.00 $8.00 $0.80 $10.00 $30.00
gpt-5.6-cyber $12.50 $1.25 $15.625 $75.00 - - - -

daybreak-blue-latest and daybreak-red-latest are aliases that currently point to gpt-5.6-sol and gpt-5.6-cyber , respectively. As new frontier models are released through the Daybreak program, these aliases will be updated to point to the latest models, with pricing adjusted to match each underlying model.

Realtime and audio generation models

Prices per 1M tokens unless noted.

Model Modality Input Cached input Output / cost
gpt-realtime-2.1 Audio $32.00 $0.40 $64.00
Text $4.00 $0.40 $24.00
Image $5.00 $0.50 -
gpt-realtime-2.1-mini Audio $10.00 $0.30 $20.00
Text $0.60 $0.06 $2.40
Image $0.80 $0.08 -

Standard

For image generation cost estimates, use the calculator in the image generation guide.

Model Modality Input Cached input Output
gpt-image-2 Image $8.00 $2.00 $30.00
Text $5.00 $1.25 -

Standard

Model Size Portrait Landscape Price per second
sora-2 720p 720x1280 1280x720 $0.10
sora-2-pro 720p 720x1280 1280x720 $0.30
1024p 1024x1792 1792x1024 $0.50
1080p 1080x1920 1920x1080 $0.70

Transcription models

Prices per 1M tokens unless noted.

Model Use case Input Output Estimated cost
gpt-realtime-translate Live translation - - $0.034 / minute
gpt-live-transcribe Live transcription - - $0.017 / minute
gpt-realtime-whisper Live transcription - - $0.017 / minute
gpt-transcribe Transcription - - $0.0045 / minute
gpt-4o-transcribe Transcription $2.50 $10.00 $0.006 / minute
gpt-4o-mini-transcribe Transcription $1.25 $5.00 $0.003 / minute
Tool Details Pricing
Web search Web search (all models) $10.00 / 1k calls
+ Search content tokens billed at model rates.
Image Web search (all models) $10.00 / 1k calls
+ Search content tokens billed at model rates.
Web search preview (reasoning models, including gpt-5 , o-series ) $10.00 / 1k calls
+ Search content tokens billed at model rates.
Web search preview (non-reasoning models) $25.00 / 1k calls
+ Search content tokens are free.
Containers Hosted Shell and Code Interpreter 1 GB $0.03, 4 GB $0.12, 16 GB $0.48, 64 GB $1.92 per 20-minute session per container.
File search Storage $0.10 / GB per day (1 GB free)
Tool call $2.50 / 1k calls
Agent Kit ChatKit file and image upload storage $0.10 / GB-day after 1 GB free per account per month

Tokens used for built-in tools are billed at the chosen model's per-token rates. GB refers to binary gigabytes (also known as gibibytes), where 1 GB is 2^30 bytes. Web search content tokens are tokens retrieved from the search index and fed to the model alongside your prompt to generate an answer. For gpt-4o-mini and gpt-4.1-mini with the non-preview web search tool, search content tokens are billed as a fixed block of 8,000 input tokens per call. File search tool call pricing applies to the Responses API only. Container pricing includes Hosted Shell and Code Interpreter . Eligible container sessions will be billed by the minute, with a 5-minute minimum per session. Responses API, Chat Completions API, Realtime API, Batch API, and Assistants API are not priced separately. Tokens are billed at the chosen model's input and output rates.

Standard

Category Model Input Cached input Output
ChatGPT chat-latest $5.00 $0.50 $30.00
Codex gpt-5.3-codex $1.75 $0.175 $14.00

OpenAI is winding down the fine-tuning platform. The platform is no longer accessible to new users, but existing users of the fine-tuning platform will be able to create training jobs for the coming months.

All fine-tuned models will remain available for inference until their base models are deprecated. The full timeline is here .

Standard

Model Training Input Cached input Output
o4-mini-2025-04-16 $100.00 / hour $4.00 $1.00 $16.00
o4-mini-2025-04-16
with data sharing
$100.00 / hour $2.00 $0.50 $8.00

Tokens used for model grading in reinforcement fine-tuning are billed at that model's per-token rate. Inference discounts are available if you enable data sharing when creating the fine-tune job. Learn more .

Thefinalthirdfootball

Hacker News
thefinalthirdfootball.blogspot.com
2026-08-24 11:22:12
Comments...
Original Article

The pre-season optimism didn't survive week one. A lacklustre Manchester United were left stunned as they slipped to a 2-0 defeat to newly-promoted Hull City in their Premier League season opener at the MKM Stadium — a result that immediately puts pressure on Michael Carrick after just one game. Sky Sports

How it unfolded

Hull started the brighter side and made it count from set pieces. Oli McBurnie almost opened the scoring inside five minutes with a header that was smartly cleared, before a Bryan Mbeumo effort at the other end was well saved by debutant goalkeeper Konstantinos Tzolakis. The breakthrough came from a corner: Slater's driven ball was flicked on, McBurnie's follow-up effort was superbly pushed onto the post by Lammens, and the loose ball fell for Semi Ajayi to slam home in the 17th minute. Nobel Mendy doubled the lead on his Premier League debut in the 38th minute, firing home from a Slater free-kick. ESPN + 2

The tactical story

This wasn't a fluke result built purely on set pieces, even if both goals came from them. United actually posted the higher expected goals tally (1.81 to Hull's 1.26), which points to a familiar problem: creating without converting, while being clinically punished at the other end. The left-side shape from pre-season — Shaw overlapping, Dorgu tucked inside — never got the platform to influence the game once United fell behind twice in the first half. ESPN

What it means

The defeat leaves Carrick's side under pressure after one game, with calls already emerging for further reinforcements in the transfer window. For Hull, it's a dream start to life back in the topflight — their first-ever Premier League win over Manchester United. For United, the debuts of Tielemans and Santos in midfield will need scrutiny; a rebuilt engine room was supposed to be the platform for a top-four push, not concede twice from set-piece breakdowns in the first 38 minutes. Sky Sports ESPN

Takeaway: United had the better underlying numbers but lost the moments that mattered — a reminder that xG explains process, not results. Carrick's response over the next few fixtures will say more about this season than the opening-day shock itself.

If this analysis helped you see the match differently, consider supporting The Final Third ☕ Support here


How to choose chocolate (not based on percentage)

Hacker News
chof.nl
2026-08-24 11:18:09
Comments...
Original Article

A practical guide to reading a chocolate bar wrapper, written by a certified chocolate taster and chocolate awards juror.

By Felipe IICCT Level 2 Certified Chocolate Taster International Chocolate Awards Judge 12 min read

Most people choose chocolate using one or more of four signals: cocoa percentage, packaging (colours, words, images, fancy claims), a familiar brand, or certifications. I have judged at international competitions and tasted thousands of bars. Those four signals miss most of what matters.

I get this question frequently. In workshops, in shops, in conversations with friends. How do I choose better chocolate? How do I buy a good bar? What is good? What is not good? The shelf is loud, the claims overlap, and a thoughtful craft bar can look identical to an industrial confectionery. It is not.

Below is the answer I would like to give, but often do not have the time and space for in person. Read it like we are standing in front of the chocolate aisle together.

A typical supermarket chocolate aisle

An organic supermarket chocolate aisle

Supermarket aisle. Bio supermarket aisle. The shelf is loud either way.

How to tell if chocolate is high quality (and how to spot a real craft bar)

Short version: turn the bar over. High-quality chocolate tells you where the cacao grew, lists cocoa butter as the only added fat, keeps the ingredient list short, and skips vanillin, PGPR and alkalised cocoa. A real craft bar names a region, farm or harvest; an industrial imitation hides behind a country-of-manufacture claim like “Belgian chocolate”. Everything below is the long version.

How to read a chocolate label: start with the ingredient order

Ingredients sit on the back of the wrapper in descending order of weight. That gives you the skeleton of any bar in a single glance.

For a plain dark bar, look for cacao first, then sugar, sometimes cocoa butter. Two and three ingredient bars are common. Four is still fine. Past five or six in a plain bar, you are looking at confectionery, not chocolate built around the cacao itself.

Three real wrappers from the Chof app. Two and three ingredients, cocoa first, the maker confident enough to leave the rest out.

Milk and white chocolate work differently. Milk powder, sugar, and cocoa butter are all doing real work, so five ingredients is normal. Sugar first in a milk bar is not automatically a scandal. It just tells you the product is more sweet than chocolatey.

What cocoa percentage really means (and why it is not quality)

This might be the most useful thing I can tell you.

More cacao is not automatically better. It is more intense, less sweet, and often more revealing.

Cocoa percentage tells you how much of the bar is cacao by weight, mass and butter combined. The rest is mostly sugar (and in milk bars, milk solids). A 70% dark bar is roughly 30% non-cacao. In a two-ingredient bar, that means 30% sugar. A 70% with added cocoa butter can taste smoother than another 70% without it, because the butter dilutes the bitterness.

I would rather have Heinde & Verre’s 71% Pristine Nativo than most 85% bars I have tasted. The 71% knows what it is. The 85% often does not. Read the percentage as sweetness and intensity, not as a quality medal.

If you want to see how this plays out across the catalog, the cocoa percentage chart lays out every band side by side, from sweet milk chocolate up to 100% chocolate . Each band page explains what to expect and links to real bars at that strength.

Fat: cocoa butter belongs, substitute fats do not

Confession: I am a big fan of dietary fat, especially cocoa butter. It is the reason chocolate is not just “cocoa plus sugar”. Cocoa butter is the fat phase that gives a bar its snap, gloss, and the way it melts on your tongue and releases aroma. Replace it with cheaper fats and you have changed the category, even if the wrapper still says chocolate.

Look for

“cocoa butter”, “cacao butter”.

Be cautious

Milk fat in a plain dark bar, butter oil, anhydrous milk fat.

Avoid in plain bars

Palm oil, shea butter, sunflower oil, hydrogenated fats, anything called “vegetable fat” without further detail.

EU labelling rules allow some vegetable fats in certain categories. For a quality-focused choice, the rule is simple. Added non-cocoa fats in a plain bar are not a quality signal.

Emulsifiers: not all the same

Emulsifiers help fat and cocoa solids stay dispersed. They also help a bar flow through industrial equipment. There is a hierarchy.

Best

None. Many serious dark bars do not need any.

Acceptable

Sunflower lecithin or soy lecithin, ideally near the end of the ingredient list (which means very little is used).

Warning sign

PGPR (polyglycerol polyricinoleate, E476). A stronger industrial emulsifier that rarely shows up in carefully made plain bars.

Lecithin alone is not a verdict. Plenty of decent makers use a small amount for flow. PGPR plus a long ingredient list plus a vague origin is the honest signal of industrial confectionery.

Flavouring: cacao should not need perfume

Cacao carries hundreds of aroma compounds. A careful single-origin bar should taste like itself, without help.

Best

No added flavouring at all in a plain dark bar.

Acceptable

Real vanilla pod, vanilla extract, natural vanilla. Slightly more common in milk bars and inclusion bars.

Warning sign

Vanillin (synthetic), “artificial flavour”, or vague “flavouring”. In a plain dark bar this is masking, not seasoning.

Single origin chocolate: country is good, specificity is better

Origin language is where wrapper marketing and wrapper quality diverge. “Belgian chocolate” or “Swiss chocolate” describes a manufacturing style. Both countries mostly do not grow cacao. The label tells you nothing about where the bean came from.

The better hierarchy looks like this:

“Belgian / Swiss / French chocolate”

Manufacturing style. Says nothing about cacao origin.

“Single origin Ecuador”

Country level. The lowest rung of real traceability.

“Sambirano Valley, Madagascar”

Region level. Stronger.

“Maya Mountain, Belize” or a named cooperative or farm

Strong traceability.

Harvest year, bean variety, fermentation and drying notes

Strongest. The maker is putting their name on a specific batch.

On Chof you can browse bars by named origin or cacao variety to see how this plays out, from the bright red fruit of Madagascar to the floral Nacional of Ecuador . Specificity tends to track quality. Makers confident in their cacao are willing to name where it comes from.

Pristine Nativo Peru 71% chocolate bar by Heinde & Verre

A textbook traceability bar: country, region (Piura), bean variety (Nacional/Blanco), and a short ingredient list. See Heinde & Verre Pristine Nativo Peru 71%

Bean-to-bar chocolate (and tree-to-bar): useful, not magic

Bean-to-bar means the maker controls the transformation from raw bean to finished bar in their own workshop. Tree-to-bar adds the farm side, with a maker who grows the cacao or is tied to a single plantation.

Bean-to-bar is a control signal, not a halo. I have tasted bean-to-bar bars that were excellent and bean-to-bar bars that were forgettable. The label tells you the maker owns the result. It does not tell you the result is good. The worst bean-to-bar bars still beat most industrial chocolate on disclosure. They are just not necessarily good chocolate.

Ambolikapiky 100% Criollo chocolate bar by Åkesson's

Tree-to-bar in a single ingredient: cacao from Åkesson’s own Ambolikapiky Plantation in Madagascar’s Sambirano Valley. See Åkesson's Ambolikapiky 100% Criollo

Alkalisation and Dutch processed cocoa: a quiet warning sign

Alkalisation (also called Dutching) treats cocoa with an alkaline solution. It reduces acidity and bitterness, darkens the colour, and makes the taste more uniform.

Useful in cocoa powder for baking, where you want predictable colour and a softer flavour. In a plain chocolate bar, it does the opposite of what you want. It flattens origin character and points to optimisation for shelf appeal.

Less than 1% of the bars on Chof are alkalised, and the ones that are usually wear it as a small line on the back:

  • “cocoa processed with alkali”
  • “alkalised cocoa” or “alkalized cocoa”
  • “Dutch processed” or “Dutched”

On Chof, alkalisation is one of the negative signals Chof Score picks up under Process.

What Chof Score actually looks at

Chof Score is an evidence-based quality signal that orders bars on Chof. It is not a taste rating. It is a structural reading of how serious a bar is about the signals that usually predict good chocolate. Four pillars do most of the work.

Chof app showing the bar detail page with a Chof Score of 98 out of 100

Each bar in the Chof app gets a single Chof Score (here, 98/100 for Heinde & Verre’s Pristine Nativo ), plus a one-line read of what bracket it sits in.
Tap into a bar in the app to see the four pillars broken out, with a one-line reason each. Traceability 100/100, Purity 100/100, Process 99/100. The math is hidden, the reasoning is not.

Chof app showing the four pillar breakdown for a bar

Two safety nets sit on top. Bars with substitute fats or identity failures (a “white chocolate” without cocoa butter, for example) get capped. So do bars with credible safety failures, like heavy metal limits exceeded.

How much evidence we have on a bar, and how consistent that evidence is, also shapes the final number. A bar with strong origin disclosure but no information on how it was made will not be scored as if everything were known. Unproven claims do not get to drive the score.

Chof Score in action: Top 20 Chocolate Bars . Those bars are not ranked by reviews or popularity. They are ranked by what their wrappers and disclosures actually say.

Same percentage, different bar

Both of these are 70% dark bars made with cocoa, sugar, and cocoa butter. No PGPR. No vegetable fat. No vanillin. No alkalisation. On the front, they look almost identical. Chof Score puts them nine points apart. Here is why.

Both bars are good. Both pass every check on this page. The nine-point Chof Score gap comes down to three things Heinde & Verre tells you that Vivani does not: which farm the cacao came from, which year it was harvested, and how it was fermented. That is what specificity buys.

Chof app showing a high-scoring bar

Chof app showing a lower-scoring bar

The same view, two ends of the score range. The app shows you the bracket and the reasoning side by side.

What the wrapper never tells you

A bar can pass every check on this page and still taste flat. The wrapper tells you what the maker is willing to disclose. Tasting tells you what survived the maker’s roast.

In competition judging, samples are anonymised. I cannot tell you which bars I have judged. But the patterns from those flights are clear. The most common quality killers are not on the wrapper at all: fermentation character (slaty, vinegary, smoky), texture defects (sandy, gritty), a roast that flattens the bean, a finish that disappears too fast. None of these show up on a label.

The wrapper checks below help you avoid the worst. Your mouth tells you the rest. Treat this guide as the floor, not the ceiling.

Real bars that show this in practice

Real bars from the Chof app, picked because they illustrate the principles above. Selection: Chof Score plus diversity of category and accessibility.

Good supermarket-accessible signals

Easier to find in larger grocers, organic shops, and specialty supermarkets in the Netherlands and the wider EU. Not the rarest or highest-scoring bars, but proof that ingredient hygiene and origin specificity are possible at this level.

Tap any bar to open it in the Chof app, or read on chof.nl .

Specialty bars worth tasting

The kind of bars Chof was built around. Short ingredient lists, named regions or farms, no alkalisation, real cocoa butter, detailed process disclosure. Taste one of these next to a supermarket dark bar. That is the fastest way to understand why this article exists.

Pristine Nativo Peru 71% chocolate bar by Heinde & Verre

Heinde & Verre 98.21

Pristine Nativo Peru 71%

71 % Peru

Dutch bean-to-bar. Region (Piura), bean variety (Nacional/Blanco), short list. A textbook traceability bar.

Mexico Finca la Rioja 'Don Moisés' 70% chocolate bar by Krak

Krak 97.02

Mexico Finca la Rioja 'Don Moisés' 70%

70 % Mexico

Dutch bean-to-bar. Named farm and farmer, region disclosed (Cacahoatán, Chiapas), single bean variety.

Don Alfonso 70% chocolate bar by Friis Holm

Friis Holm 95.96

Don Alfonso 70%

70 % Nicaragua

Danish craft maker. Named lot, El Castillo, Nicaragua. Detailed post-harvest disclosure.

Gran Nativo 76% chocolate bar by Plaq

Plaq 94.99

Gran Nativo 76%

76 % Peru

Three-ingredient bar from Piura, Peru. Bean-to-bar, no lecithin, no vanillin.

Maya Mountain, Belize 2022 Harvest chocolate bar by Dandelion Chocolate

Dandelion Chocolate 95.66

Maya Mountain, Belize 2022 Harvest

70 % Belize

Named region, named harvest year, two ingredients (cocoa beans and cane sugar).

Tanzania 74% chocolate bar by Svenska Kakao

Svenska Kakao 98.83

Tanzania 74%

74 % Tanzania

Single-cooperative sourcing (Kokoa Kamili), structured fermentation and drying disclosed.

Quinoa Crunch Milk 55% chocolate bar by Dick Taylor

Dick Taylor 96.77

Quinoa Crunch Milk 55%

55 % Brazil

A milk bar can still be serious. Named origin in Bahia, real cocoa butter, no flavouring.

Ambolikapiky 100% Criollo chocolate bar by Åkesson's

Åkesson's 95.00

Ambolikapiky 100% Criollo

100 % Madagascar

Single ingredient, named plantation in the Sambirano Valley, tree-to-bar control.

Dutch makers worth knowing

If you are reading this from the Netherlands, three makers based here are consistently strong on every criterion above. I am in the Netherlands too, so worth a little extra attention. :)

Wrapper red flags

You will see this label, or something close, on a lot of bars in the confectionery aisle:

Real-world red flag label

Sugar, vegetable fats (palm, shea), cocoa mass, whey powder, emulsifier (E476), flavouring. Cocoa solids 32% minimum.

Translated: a sweet confectionery base with chocolate character. Sugar first, substitute fats, PGPR, vague flavouring, no origin. Nothing wrong with eating it. Just do not confuse it with a bar that is trying to show you a place.

Frequently asked questions

How do you verify that chocolate is good quality?

There is no certificate that proves it, but the wrapper is a reliable check: cacao first in the ingredients, cocoa butter as the only added fat, a short list, a specific named origin, and no vanillin, PGPR or alkalised cocoa. That is the same verification the Chof app runs on any bar you scan. As of August 2026, across every craft bar catalogued on Chof, not a sample of supermarket chocolate, 76% carry none of the usual warning signs (no vanillin, PGPR, substitute fat, or added emulsifier), 83% name the country their cacao came from, and 1% list vanillin.

How can I tell if chocolate is high quality (or a real craft bar)?

High-quality, real craft chocolate names where the cacao grew (a region, farm or harvest, not just "Belgian chocolate"), keeps a short ingredient list led by cacao, uses only cocoa butter as added fat, and avoids vanillin, PGPR and Dutched cocoa. An industrial imitation hides its origin and pads the list with cheaper fats and flavouring.

Does a higher cocoa percentage mean better chocolate?

Not by itself. Cocoa percentage tells you how much of the bar is cacao (mass and butter combined). The rest is mostly sugar. A 70% bar is less sweet than a 50% bar. But a 70% with added cocoa butter can taste smoother than another 70% with only beans and sugar. A great 70% from a well-fermented, carefully roasted bean beats a flat 90% every time – read high-cacao percentages as intensity, not a quality grade.

How do I read a chocolate label?

Turn the bar around and check five things. (1) Cacao leads the ingredient list, especially in dark chocolate. (2) Cocoa butter is the only added fat. Never palm oil, shea butter, or vegetable fat in a plain bar. (3) Shorter lists are usually better. (4) Origin is specific (region, farm, cooperative) rather than just "Belgian" or "Swiss". (5) Avoid vanillin, artificial flavouring, PGPR, and anything that says "cocoa processed with alkali".

What does "single origin" actually mean?

Cacao from one country. More useful than nothing, but the lowest rung of traceability. Better: a named region (Sambirano Valley, Piura, Maya Mountain). Better still: a named farm, estate, lot, cooperative, or harvest year. The more specific the origin, the more the maker has put their name behind a particular field somewhere in the world.

What is bean-to-bar chocolate?

The maker controls the transformation from raw bean to finished bar in their own workshop, including roasting, refining, and conching. A control signal, not a guarantee of taste. A careful chocolatier working from high-quality couverture (professional-grade chocolate made by someone else) can also make excellent bars. Bean-to-bar bars almost always disclose more about origin and process. That is why they score well on traceability.

What is "Dutch processed" or alkalised cocoa, and why avoid it?

Alkalisation (Dutching) treats cocoa with an alkaline solution. It reduces acidity and bitterness, darkens the colour, and makes the taste more uniform. Useful in cocoa powder. In a plain chocolate bar, look for "cocoa processed with alkali", "alkalised cocoa", or "Dutch processed". It flattens origin character. The maker is optimising for shelf appeal, not for showing you what the cacao tastes like.

Is lecithin bad in chocolate?

Not by itself. Sunflower lecithin and soy lecithin are emulsifiers that help texture and flow. The best bars use none. Many decent bars use a small amount near the end of the ingredient list. PGPR (E476) is a stronger industrial emulsifier and a clearer warning sign in plain chocolate.

What is a Chof Score?

The score Chof uses to rate bars. It looks at four kinds of evidence. Purity (ingredient hygiene), Traceability (how specific the origin is), Process (fermentation, drying, roasting, conching disclosure), and Integrity (defects, lab evidence, manufacturing tells). Not a taste rating. A structural reading of how serious a bar is about the signals that usually predict good chocolate.

Where can I buy good chocolate in the Netherlands?

Specialty supermarkets and organic stores often carry Original Beans, Vivani, and CLARO. Dutch bean-to-bar makers like Heinde & Verre, Krak, and Original Beans are stocked in better cheese shops, wine merchants, and online specialty shops. Most of the best bars in this article are available directly from the makers or through European craft chocolate retailers.

How much does good chocolate cost?

A serious craft bar in Europe usually sits between €5 and €12 for a 50–80g bar. That is two to three times what a supermarket bar costs, and it reflects real differences: traceable beans, longer fermentation and conching times, smaller batches, and makers who can name the farms they buy from. Cheaper does not mean worse, but a €1 bar cannot fund the supply chain a €7 bar can.

I am new to craft chocolate. Where should I start?

Start with one familiar brand and one specialty bar at the same percentage, side by side. Vivani Edel Bitter 70% next to Heinde & Verre Pristine Nativo Peru 71% is a good comparison: similar percentage, similar three-ingredient list, very different traceability and very different taste. Tasting them back to back, with a glass of water in between, will teach you more in five minutes than this article will in twelve.

A note on Chof Score methodology

The example bars come from the Chof app. Selected by combining Chof Score with category diversity, supermarket accessibility, and country balance. Chof is independent of any maker.

Chof is built and maintained by Felipe , an IICCT Level 2 certified chocolate taster and International Chocolate Awards judge.

Further reading on Chof

NetBSD GSoC 2026 Improving RAIDframe

Hacker News
blog.netbsd.org
2026-08-24 11:17:38
Comments...
Original Article

Google Summer of Code 2026 Reports: Improving RAIDframe

August 23, 2026 posted by Leonardo Taccari

This report was written by Emmanuel Nyarko as part of Google Summer of Code 2026.

The Redundant Array of Independent Disks (RAID) is a disk management framework developed by Carnegie-Mellon University. NetBSD uses RAIDframe as one of its disks management modules. It involves setting up multiple disks and creating a disk unit from them. The current NetBSD RAIDframe framework supports several levels of disks arrangement in a single array, see raid(4) .

NetBSD's RAIDframe supports RAID levels 0, 1, 5 and 6. However, there are some limitations that this project aims to improve. Firstly, RAID level 1, which is also called mirroring, allows for only two disks in a single mirror pair. Secondly, RAIDframe scrubbing, which involves reading your disks to check for read failures, is not yet supported. Thirdly, RAID level 6, even though included in source, is not well tested and not encouraged to be used.

In this project I have worked on:

  • Implementation of a RAID level 1 extension called N-way RAID 1 to support multiple disks in a RAIDframe mirror
  • Implementation of RAID scrubbing

N-way RAID 1

RAID level 1 involves mirroring two disks containing the same data. They are structured as one primary and one parity (secondary). Every write to the raid device writes to all disks in the setup that are alive. Every read from the raid device reads from the disk with the shortest I/O (writes/read to and from the disks) queue. If there's an encountered failure with any of the disks, it reads in degraded mode and hence gets the data from any of the available disks. If all disks fail, I/O aborts.

There is an introduction of a new extension to the RAID 1 setup called N-way RAID1. This involves setting up more than two disk in a RAID 1 array setup where you have one primary disk and multiple secondary disks. This increases redundancy and improves the security of data critical to disk failure that could lead to data loss.

For example, in a five way RAID1 setup, it will involve one primary and 4 parity/secondary disks. So every disk write will attempt to write to all five disks. Every disk read will attempt to read from the primary disk or the secondary disk with the shortest I/O queue.

Usage

Five disks can be configured in a 5 way RAID 1 setup for redundancy using raidctl(8) with the command below:

raidctl /dev/raid1 create N /dev/dk1 /dev/dk2 /dev/dk3 /dev/dk4 /dev/dk5.

where /dev/raid1 is the device file for the raid device, and N is the level. In the order of the disks, the first listed is considered the primary and the rest are considered secondary.

The /dev/dk* are the NetBSD disk partition (wedge) driver used for the independent disks, see dk(4) and dkctl(8) .

This, by default, sets up a 128 sectors per stripe unit and a first in first out queuing algorithm and a max queue length of 100.

This can be similarly translated into the raid.conf structure in the setup below.

# numrow numcol numspare
1 5 0

# Identify physical disks
START disks
/dev/dk1
/dev/dk2
/dev/dk3
/dev/dk4
/dev/dk5

# Layout is simple - 64 sectors per stripe
START layout
# Sect/StripeUnit StripeUnit/ParityUnit StripeUnit/#ReconUnit RaidLevel
128 1 1 N

# No spares
START spare

START queue
fifo 100

Project deliverables

RAIDframe Layout

A new layout structure is introduced for RAIDframe level N . number of primary disk remains 1. Number of parity/secondary becomes number of disks - 1. The rest of the layout component for RAID 1 (stripe related properties) remains same hence adopted into RAID N .

Sector/stripe mapping

The current design for RAID 1 involves ASM (Address Stripe Mapping) structures that contain PDAs (Physical Disk Addresses) that are used in mapping the RAID level software addresses to the Physical Disk Addresses. The PDA structure contain column number, start sector, number of sectors/blocks, type of disk in setup (data/parity disk), data buffer pointer, and then the virtual RAID address corresponding to the Physical Disk Address. For a simple RAID 1 mirror involving two disks, the writes or reads are striped across the two disks according to the value set in SectorsPerStripeUnit in raid.conf , or 128 by default when using raidctl(8) . So 128 sector blocks are written to each stripe as defined by the PDAs.

For two disk in a RAID 1 setup, a single stripe write is defined by one PDA for each column. For the introduction of N-way RAID 1, the number of PDAs cannot be known at compile time. The number of PDAs are dynamically defined by the number parity columns at runtime. This is because, the number of secondary disks in an N-way setup can vary as compared to RAID 1 which is known to have one primary and one secondary disk.

DAG execution

RAIDframe uses DAGs (Directed Acyclic Graph) to fire I/O nodes for reads and writes. These DAG nodes are also PDA dependent. The DAG node creation structure also needed to be updated to accommodate more than two PDAs when using the RAID level N .

Reconstruction

RAIDframe reconstruction has been updated to make room for RAID level N . When a disk fails, the current algorithm identifies a non-dead disk, and reads from that disk and writes to the disk under reconstruction. New checks for RAID N has been added to the code to read from only one non-dead disk to the disk under reconstruction. This avoids trying to randomly read and write across the disk array during a reconstruction.

Project benefit

This project adds more redundancy to your disk data management and reducing the risk of data loss in any case of disk failure.

Link to work

RAIDframe scrubbing

The scrubbing implementation is a disk sector health check of all components in a disk array. Disks sectors are read across every stripe in the components and the I/O returns number of read failures encountered on each component. Disk scrubbing is supported for all RAID levels in NetBSD.

Starting a scrub on a raid device is done by using raidctl . Scrubbing can be done across certain portion of the disks or the entire disks in the array.

Usage

RAID scrubbing is achieved by the syntax below:

raidctl $device scrub percentage $start_percentage $end_percentage

Consider a hundred-striped three disks raid 5 array:

raidctl raid5 scrub percentage 20 30

This initiates a scrub of the RAID components starting at the twentieth percentile to the thirtieth percentile of all components in the array. The stripe indexes that will be read for the command above are mathematically represented in a $start_stripe and $end_stripe range below:

$start_stripe = 100 * 20 / 100 = 20
$end_stripe = 100 * 30 / 100 = 30
$end_stripe = $end_stripe - 1

This reads the disks from stripe index 20 to stripe index 29.

Results/kernel output after a successful scrub

raid5: Total number of read failures on Component /dev/dk1: 10
raid5: Total number of read failures on Component /dev/dk2: 4
raid5: Total number of read failures on Component /dev/dk3: 0

Interpretation

This indicates 10 read failures across dk1 , 4 read failures across dk2 and 0 read failures across dk3 .

Omitting the percentage parameters scrubs the entire array (100 percent).

raidctl raid5 scrub

Note : end_stripe is reduced by 1 because indexing of stripes begins from 0.

Link to work

Testing

Testing these improvements involves setting up different layouts of N-way RAID 1 with different disk sizes. A 2 Gigabyte three-way RAID 1 device and a 10 Gigabyte five-way RAID 1 are separately configured and being used for testing. Operations such as file systems creation, mounting, unmounting, writing raw bytes, component failing, reconstruction, hot spare addition, rebuilding in place etc. are performed as part of this testing. This is being done to provide a level of confidence in the usage of N-way RAID 1 and the rest of the RAIDframe subsystems.

Future works

As part of testing, other RAID levels, eg. RAID level 0, 1, and 5, must be validated to ensure that they have not been adversely affected by the new changes. RAID level 6 will further be assessed and tested. RAID N work may be merged into the NetBSD tree as the replacement for the existing RAID1.

Lessons learnt

Participating in Google Summer of Code with NetBSD has been very impactful. I have gathered lots of experience with multithreading in the kernel and also gained a deeper understanding of how storage systems operate. I would encourage anyone who wants to gain deeper understanding of computer systems to consider taking on Google Summer of Code projects with NetBSD.

Acknowledgment

I am grateful to Greg Oster, my mentor, and the NetBSD community for their massive support towards the completion of this project.

[ 1 comment ]

ReliaQuest confirms failed data-theft attack after ShinyHunters breach

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 11:17:16
Cybersecurity company ReliaQuest has confirmed that one of its employees was targeted in a social engineering attack after hackers impersonated a member of the security team. [...]...
Original Article

ReliaQuest confirms failed data-theft attack after ShinyHunters breach

Cybersecurity company ReliaQuest has confirmed that one of its employees was targeted in a social engineering attack after hackers impersonated a member of the security team.

In a statement over the weekend, ReliaQuest said that an attacker called multiple employees and tried to trick them into accessing "a fake ReliaQuest single sign-on (SSO) page behind a content delivery network."

Last week, ReliaQuest's Threat Research team shared in a now-deleted post , that the ShinyHunters extortion gang was registering .claims domains to impersonate company's help desks and IT teams.

image

"ReliaQuest is tracking a widespread ShinyHunters campaign using domains that follow the company[.]claims pattern. These domains incorporate the targeted organization’s name or abbreviation under the .claims TLD," read the company's post on X.

Yesterday, a newly-created X account believed to be linked to the threat actors replied to the post, stating "Who's hunting who ?," sharing screenshots of what appeared to be a compromised Okta SSO account for a ReliaQuest employee.

Soon after, ShinyHunters published the same screenshots in a new entry on their data data leak site.

Both ReliaQuest's and the alleged threat actor's posts were later taken down from X.

According to the company, the threat actor hosted the phishing page on a "lookalike domain," which BleepingComputer learned from sources was reliaquest.claims , and used the name of a real security employee during the vishing attempts.

One of the targeted employees fell for the attacker's ruse, entered their credentials on the fake SSO page, and approved an MFA push notification, giving the attacker temporary, view-only access to ReliaQuest's identity dashboard.

However, device-trust controls successfully blocked subsequent attempts to access applications through the dashboard, according to the company.

“The extent of the access was view-only. No ReliaQuest applications or systems were accessed, and no customer data was ever touched,” ReliaQuest says .

“The threat actor continued with attempts to access these applications from the dashboard but was consistently denied due to the security controls in place.”

The cybersecurity firm says it terminated the attacker’s sessions, revoked the exposed password, and reset all authentication tokens.

The ensuing investigation found no evidence of access to other accounts, apps, or data, and no signs that the actor established persistence on ReliaQuest’s systems.

The firm audited its control fidelity, device trust, and on-network access since August 21 and identified no suspicious activity.

ShinyHunters claims the attack

ReliaQuest’s statement comes shortly after the infamous data extortion group ‘ShinyHunters’ claimed an attack on the company.

In a new post on its extortion portal, ShinyHunters references ReliaQuest’s previous reporting on the threat group, saying "this time the post is about you , not us."

Post on the ShinyHunters extortion page
ReliaQuest listed on the ShinyHunters extortion page
Source: BleepingComputer

The threat actors published evidence of access, showing that they had successfully breached ReliaQuest’s Okta SSO account.

We asked ReliaQuest if the disclosed incident is linked to ShinyHunters, but we have not received any additional information yet.

However, ShinyHunters told BleepingComputer that their access was view only and did not reach any applications, systems, or customer data.

"No additional identities were accessed, no business applications were reached, no customer or ReliaQuest data was accessed beyond the user's login credentials, and no persistence was established," the threat actor told us.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

Atkinson Hyperlegible appears a little smaller than some other fonts at the same font size

Lobsters
twotwos.nekoweb.org
2026-08-24 11:15:43
Comments...
Original Article
home | posts | library | about | links

ok, so, i like Atkinson Hyperlegible a lot. i mean, it's the font used for this website! i think it looks good. but, you might run into a weird problem if you use it to replace the font in an existing thing:

this sentence, which i am padding out with extra words to give a better example, is typeset in 10pt Arial

this sentence, which i am padding out with extra words to give a better example, is typeset in 10pt Atkinson Hyperlegible

this sentence, which i am padding out with extra words to give a better example, is typeset in 10pt Verdana

at small sizes it's maybe a little easier to read than the Arial, but compared to Verdana (at the same font size!) it just looks smaller, and thus, is harder to read. so, if you're using a font like Verdana already, you might replace it with Atkinson Hyperlegible and find your text is now less legible. the trick is that font sizes are kind of fake and some fonts are just bigger at the same font size. especially, the height of the shorter lowercase letters like x (the " x-height ") varies between fonts and contributes a lot to readability at small font sizes. so if you're switching from a font that's already very readable because of a high x-height you just gotta make the font size a little bigger. post ends here.

descent into confusion

...conveniently, if you're doing stuff on the web, there's this CSS property called font-size-adjust that lets you automatically scale the font based on the metrics of another font. so, trying to make everything match Verdana, let's set font-size-adjust:0.545 , which is apparently the correct value:

this sentence, which i am padding out with extra words to give a better example, is typeset in (scaled) 10pt Arial

this sentence, which i am padding out with extra words to give a better example, is typeset in (scaled) 10pt Atkinson Hyperlegible

this sentence, which i am padding out with extra words to give a better example, is typeset in 10pt Verdana

and now it is fixed. yay. well, weirdly now the Atkinson Hyperlegible looks too big compared to the Verdana (it even overruns a line). and also the Verdana is now a little smaller when font-size-adjust isn't supposed to do that. (if this and the following example actually look right to you, that's probably because, and i only realised this after writing everything else, this issue might be firefox-specific -Ed.). and sometimes it doesn't work, like in this example at an 11pt font size, where both Arial and Atkinson Hyperlegible still look too small:

this sentence, which is padded with extra words to give a better example, is set in (scaled) 11pt Arial

this sentence, which is padded with extra words to give a better example, is set in (scaled) 11pt Atkinson Hyperlegible

this sentence, which is padded with extra words to give a better example, is set in 11pt Verdana

i am pretty sure this is because of rounding of font sizes to exact values. or something. i think the takeaway here is that small font sizes are the devil!!! because it seems to work just fine beyond a certain size.

also, the MDN describes a ridiculous method of determining the correct value for font-size-adjust whereby one plays higher-or-lower with the value for their preferred font until the property does nothing. i am sure the value must be automatically calculable somehow because the browser must surely know the metrics of a font to know how much to scale it by. but i cannot find any convenient method to get such a value for myself. strange.

this html stuff is tricky huh. this took like 3 detours in writing because every time i wrote up an example it didn't look the way i expected. anyway, sincere shoutouts to pebble for its tireless work on running critter.cafe , including changing the font to Atkinson Hyperlegible and inadvertently sending me down this rabbit hole. (and subsequently adding a font-size-adjust when i suggested it about 20% of the way into this rabbit hole, which seems to have worked well enough in this case, yay).


The ground quakes. The font used on this website is now a little bigger.


comments?

comments are posted manually. if this form doesn't work, send an email to ___twos@posteo.net (replacing the three underscores with a three-letter word that is my favourite number).


Anna's Archive Owes $340 Million, Lost Several Domains, but It's Still Online

Hacker News
torrentfreak.com
2026-08-24 11:10:25
Comments...
Original Article

Home > Piracy >

When Anna's Archive suffered widespread downtime earlier this month, many users feared a legal crackdown. Instead, the site was reportedly targeted by a coordinated assault on its network infrastructure. Just as it did after facing $340 million in damages and losing several domains earlier this year, the Archive quickly bounced back.

anna's archive Mid August, shadow library Anna’s Archive faced extended downtime, which had many regular visitors concerned.

These worries didn’t come out of nowhere as the site has been under quite a bit of legal pressure in recent months.

Lawsuit Takes Domains Offline

In January, the site lost its flagship .org domain . Initially it wasn’t clear what was behind this action but unsealed court records eventually connected it to a lawsuit filed by music companies. This case was a direct response to a Spotify scrape Anna’s Archive announced a few weeks earlier.

The music companies obtained an injunction from a U.S. federal court to go after the site’s domain names. This took out not only the .ORG domain but also the .SE domain, as well as the .PM and .VG domains that were put in place as backups.

Anna’s Archive eventually landed on .GL, .PK, and .GD domains, which remain active today. These are connected to registrars and registries based outside the United States that, apparently, do not comply with U.S. court orders.

Two Lawsuits, $340 Million

The music industry injunction also came with a substantial default judgment that was handed down in April. This includes a $322 million default judgment against the unknown operators of Anna’s Archive, who failed to show up in court.

Anna’s Archive

anna

This judgment was soon followed by a similar request from a group of major book publishers, including Penguin Random House, Elsevier, and HarperCollins, who sued the shadow library at a New York federal court.

That case also resulted in a default judgment, with a damages award that is smaller, but still substantial at $19.5 million . In addition, the court also issued an injunction targeting Anna’s Archive’s domain registrars and registries.

‘Coordinated Attack’

With this backdrop, it is no surprise that legal troubles came to mind when the site became unreachable earlier this month. However, this time around, the threat appears to have come from elsewhere.

After the site came back online, the official AnnaArchivist account attributed it to a coordinated attack by an unnamed party.

“Apologies for the issues. We suspect a coordinated attack. We’ve mitigated the attack vectors…” the message read, while noting that memberships already include one to two extra days per month to account for downtime.

Message from AnnaArchivist on Reddit

anna

Theoretically, an attack can also come from a rogue anti-piracy group, but there’s no evidence for that. A scam or phishing operation, which tries to cash in on Anna’s Archive search traffic, is another option. Neither is confirmed.

What Options Are Left?

Looking more broadly at the enforcement action that has taken place over the past months, we see that U.S. courts have run into their jurisdictional borders on the Internet.

This likely comes as a disappointment for rightsholders, but it also offers a clear takeaway.

U.S. courts can’t reach domains registered beyond their jurisdiction. That’s likely to increase calls for site-blocking legislation, a measure the industry has long favored and that remains high on the political agenda in the United States.

Xiaomi: New CPU matches Apple cores single threaded, much faster multithreaded

Hacker News
twitter.com
2026-08-24 11:08:17
Comments...
Original Article

Xiaomi is the Chinese tech giant. Their phones compete with iPhones. Their new CPU roughly matches Apple cores on single threaded tasks, and is much faster in multithreaded execution. Of course, Apple may soon announce their next processor, so this edge may not last long. And you may find it it difficult to find a phone with the next CPU (Xring O3). But the new Xiaomi processor is worth discussing further as it reveals an important trend. The chip has a lot of cache (44 MB in total). It is more than most laptop CPUs. If you have an Intel processor in your laptop, chances are good that you have less cache. The biggest cores on the the Xring O3 are the C1-Ultra. C1-Ultra really powerful cores. They support SME2 (Scalable Matrix Extension 2) for matrix/AI acceleration, SVE2 for data parallelism (SIMD). It is astonishingly wide, with 21 execution ports, six of which support SIMD operations (128 bits). This is more execution ports than you have on your Intel/AMD processor. The AMD Zen 5 has the upper hand because it can do 4x512-bit but 6x128-bit is the best you can do on an ARM chip as far as I know. So the trend is clear. We are getting cores that are massively parallel in terms of the number of execution units. We get better SIMD (more units) and many more units capable of doing arithmetic. This means that you can do many, many independent additions or multiplications per cycle. And much more cache. This is where all the transistors go.

Could We Dredge the Netherlands Without Fossil Fuels?

Hacker News
solar.lowtechmagazine.com
2026-08-24 11:07:07
Comments...
Original Article
1699 scale model of a scratcher rigged with sails. Image: Maritiem Digitaal
1699 scale model of a scratcher rigged with sails. Image: Maritiem Digitaal

View original image View dithered image

The dredging industry has been the backbone of the Dutch economy for centuries. If canals, harbours and rivers would not be maintained for a few years, the whole country would literally grind to a halt.

Today, dredging happens with oil powered ships, which burn up to 3,000 litres of fuel per hour. However, in earlier times, the Dutch waterways were dredged mostly by hand, using simple but ingenious tools.

Manual dredging was heavy labour, especially when waterways became deeper. Therefore, it was supplemented by animal power, wind power and tidal power. However, in some parts of the Netherlands, people chose a different strategy: they designed a new type of cargo ship that could sail in shallow waterways.

35 million m³ of mud

Siltation is a serious problem in the Netherlands, which lies in the delta area of various rivers that supply large amounts of silt and clay particles. At the same time, navigable waterways are essential to maintain transportation and trade — the country is home to the largest port in Europe, Rotterdam.

Each year, some 30 to 35 million m³ of mud are dredged out for the maintenance of the Dutch waterways. Approximately 75% comes from salty waters. In the port of Rotterdam alone, 20 million m³ of mud is collected each year.

The demand for dredging continues to increase. Both inland ships and seagoing vessels continue to get bigger, requiring ever deeper and wider waterways. A “modal shift” policy, in which cargo transport moves from the road to the water in order to improve sustainability and reduce congestion, also leads to more and larger ships, and thus to more dredging.

Dredging by hand in Delft, the Netherlands. Image: Maritiem Digitaal.
Dredging by hand in Delft, the Netherlands. Image: Maritiem Digitaal .

View original image View dithered image

Although most of the mud is dumped into the sea, each year 3.5 to 5 million m³ of contaminated sediments must be landfilled. Then there is the dependency on fossil fuels. A typical suction hopper dredger has a pumping power of 2,500 kW and removes 100 m³ of sediments per minute. The largest dredgers have 30,000 kW engines and 6,000 kW of pumping power. At full power, these ships consume 3,000 litres of oil per hour.

Dredging a Country by Hand

Silting is a very old problem in the Netherlands, so how did this job happen before the arrival of fossil fuel powered dredging machines and boats?

For centuries, the Netherlands were mainly dredged by hand. Dredgers stood on a small boat and scraped mud from the bottom with their “dredge bag” (“baggerbeugel”). In an alternative configuration, the dredger stood on a wooden board that was supported by the river bank on one side, and by a floating container on the other side.

A dredging bag. Image: Maritiem Digitaal
Dredging by hand, standing on a boat. Image.
Dredging by hand, standing on a boat. Image .

View original image View dithered image

Handling a dredge bag.
Handling a dredge bag.

View original image View dithered image

The dredge bag, a tool that was also used for peat cutting, was a long stick (up to 6 metres long) with an annular metal scraper and a net at the end. There were different types of nets and bags, depending on the composition of the sediment. Working with the dredge bag, the handle was rested against the shoulder, so that the net could be dragged over the bottom with two hands.

For large dredging works, thousands of workers with dredging bags were deployed.

The mud was pulled ashore or deposited in a flat barge. For large dredging works, such as the construction of the Northern Holland Canal in 1822-1825, thousands of workers with dredging bags were deployed. Until about 1960, contractors of dredging works employed men with dredging bags for the maintenance of shallow ditches and canals. The tool is still for sale.

Dredge Mills

Manual dredging is heavy and time-consuming work, so people designed technology that could ease and speed up the task. Furthermore, ships became ever larger. In the last quarter of the sixteenth century, the “dredge mill” was introduced, which worked up to a depth of two metres. It was still based on human power, but now people were merely the power source for a machine.

On a dredge mill, a group of people worked large treadmills or capstans, which drove a paddle wheel that scooped the mud from the bottom and threw it into a barge that was moored across. The dredge mill was usually made up of two flat barges with the rotating wheel in between. These machines were often operated by prisoners.

Dredge mill operated by prisoners. Image: Beeldarchief Rijkswaterstaat.

However, one century later, the depth of a merchant ship had increased to between 3.5 and 5 metres — and this was too deep for the human powered dredge mill. In 1622, the first horse-powered dredge mill was built. Three to six horses ran a pivot which set in motion a bucket chain. The horses had to be changed every hour because of the heavy labour involved.

In 1829, horse powered dredge mills could be used to dredge up to a depth of 5-7 metres. If working at a depth of 3.2 metres, with three to six horses, approximately 20 m³ of mud could be collected each hour. By comparison, the average modern suction dredger — which removes 100 m³ of mud per minute — is as powerful as 300 horse powered dredge mills.

Mechanical dredge bags on a pontoon. Image.
Mechanical dredge bags on a pontoon. Image .

View original image View dithered image

The original dredging techniques were also improved. Mechanical dredge bags emerged in the sixteenth century, when someone got the idea to pull the dredging bag with a rope over a winch. Mechanical dredge bags could be mounted on ships, but several dredge bags and winches could also work side by side on a pontoon.

During the first half of the nineteenth century the valve barge was invented. The bottom of this small boat could be opened without causing it to sink. In this way, it took less time to remove the mud. The technique is still used in some modern dredgers.

Valve barge with dredge bag. Image: Maritiem Digitaal.
Valve barge with dredge bag. Image: Maritiem Digitaal .

View original image View dithered image

Scratchers

The Dutch also took advantage of renewable energy sources to lighten the work — in particular wind and tidal power. From the fifteenth century onwards, the “scratcher” (“krabbelaar”) was used, a scraper that could dredge gullies if there was enough current.

With a strong current, dredging becomes easier, because the mud only needs to be loosened. The tide ensures the discharge of the material to the sea.

Human powered scratcher. Source: Maritiem Digitaal.
Human powered scratcher. Source: Maritiem Digitaal .

View original image View dithered image

Human powered scratcher. Source unknown.
Human powered scratcher. Source unknown.

View original image View dithered image

Simple scratchers were a kind of large rakes that were dragged across the bed of the water body. These were pulled by horses or people — some were pulled by a rowing boat.

Wind Powered Dredgers

In harbours with strong winds and tides, scratchers were rigged with sails. These triangular sailing ships had a broad stern and a flat bottom. Attached to the bottom was a harrow with iron spikes. At mid tide, the scratcher was placed just before the lock gates of a scouring basin, which was filled during high tide.

At low tide, the sluice gates of the basin were opened and the scratcher was pushed through the harbour with great force as the iron teeth scraped across the bottom. The ship gathered extra speed through the wide stern and, if the wind was good, the use of sails. Horses could also be used, pulling the ship in the absence of good winds.

At low tide, the sluice gates of the basin were opened and the scratcher was pushed through the harbour with great force as the iron teeth scraped across the bottom.

Wind powered scratchers were in use at least since 1435 in the southeastern part of the Netherlands. The flat bottom of the scratcher hinged and could sink with the help of cables to improve the draft. Two revolving doors, which could make a sharp angle of about 45 degrees with the ship, increased the reach of the barge.

Backside of a wind powered scratcher.
Backside of a wind powered scratcher.

View original image View dithered image

Nevertheless, manpower was still needed. Five to six men kept the monster in the right lane, while two to three men kept the harrow at the desired depth through pulleys and hoist blocks.

Alternatives to Dredging

Dredging was not the only answer to the siltation of waterways. Until the nineteenth century, the choice was also made to increase the height of river banks and dikes, so that the water level was allowed to rise. This was especially true for large rivers.

In a report from 1825, the dredging of large rivers was not considered a possibility because they were too deep and too wide for the technology of those days. It was only with steam power that dredging was also done on major rivers.

A Frisian Skûtsje. Image: Skûtsje Langwar
A Frisian Skûtsje. Image: Skûtsje Langwar

View original image View dithered image

The province of Friesland, in the north of the country, reveals yet another alternative to dredging. The Frisians never used dredge mills, horse mills or other tools than dredge bags. They continued to dredge by hand until the arrival of the steam engine.

However, they innovated in a different way: from 1889 to 1933, they built 1,200 large cargo ships with a very limited draft — the so-called “skûtjes”. Obviously, boats with a smaller draft meant less dredging. The strategy reminds of the medieval Chinese wheelbarrow , which allowed transportation to keep functioning at a time when the road infrastructure was crumbling.

How many people do we need?

In a more sustainable future, could we dredge the Netherlands without fossil fuels? Sustainability is all about cars and smart appliances, but what about large infrastructure and maintenance works? Powering today’s dredgers with solar or wind power sounds unrealistic: those ships would require enormous chemical batteries, which is not practical or sustainable.

Therefore, as part of the Human Power Plant , we investigated how many people would be needed if we were to dredge the Netherlands by hand again. To answer this question, we organised a workshop in which we dredged a piece of Frisian waterway by hand and measured how long it takes to collect 1 m³ of mud. The results are discussed in the video below.

For English substitles, click CC:

Sources:

Interviews and documentation Nationaal Baggermuseum , Sliedrecht, Rotterdam.

Canon van de geschiedenis van Smallingerland, Smelne’s Erfskip 2010; Drachtstervaart, Smelne’s Erfskip 2015, ISBN 978-94-90543-08-02.

Geschiedenis van de Techniek in Nederland. De wording van een moderne samenleving (1800-1890). H.W. Lintsen, 1992.

Rosmolens en krabbelaars: baggeren in pre-industriële tijd

Maritiem Digitaal .

Groot onderhoudsplan Baggeren 2015 tot 2020 . Hoogheemraadschap de Stichtse Rijnlanden.

Uitvoeringsplan 2010 Meerjarenbaggerprogramma Waterschap Rivierenland

Scheepsmodel Krabbelaar , Katie Heyning, Zeeuwse Ankers, juli 2015.

Evaluatie van het Friese Merenproject, 2000-2010, Provincie Fryslân.

Baggeruitvoeringsplan 2007-2015 . Wetterskip Fryslân

Baggerproblematiek in Nederland , Compendium voor de leefomgeving.

Meerjarenbaggerplan 2012-2018 , Waterschap Hollandse Delta.

Baggerschepen: van baggermolen tot sleephopperzuiger Maritiem Nederland.

Adafruit USB Type C CC Resistor Fixer

Hacker News
www.adafruit.com
2026-08-24 11:05:22
Comments...
Original Article

Do you have any devices with USB C connections that don't seem to power or work when plugged into another USB C port? Chances are, the designers skimped a few pennies or just forgot to put in the two 5.1K CC resistors required for C-to-C connections at 5V. It can drive you batty because some computers care and some don't!

That's why we designed the Adafruit USB Type C CC Resistor Fixer , a collab between our sunken USB socket and USB Plug breakout . It's the only product we hope we can discontinue one day, sooner rather than later! This small PCB assembly fits onto a cable or into the mis-designed port. It passes through the two data pins and the Vbus and Ground power lines, while adding the missing 5.1K resistors on the port side and a power good LED.

Note that the USB plug pinout doesn't carry the sideband wires or the high speed pins, so this is good for USB charge/sync but not for high speed or specialty protocols. If you're not sure, then it's very unlikely you need them: those products aren't going to mess up the CC resistors.

Play video: JP’s Product Pick of the Week 5/27/25

Play video: #NewProducts 4/16/25 Feat. #Adafruit USB Type C CC Resistor Fixer!

Perspec 1.0: A Haskell desktop app for perspective correction of document photos

Lobsters
adriansieber.com
2026-08-24 11:03:22
Comments...
Original Article

— 3020 Words — 16 min

I'm very excited to announce the 1.0 release of Perspec !

Perspec is a desktop app for correcting the perspective of images. This is primarily useful for photos of documents and receipts, but it can be used for any kind of image.

Screenshot of Perspec

This has finally become the app I envisioned when I started working on the project 9 years ago. I didn't think it would take me this long to get here, but I'm very happy with the result and I hope you'll like it too!

Initial Motivation

You're probably familiar with the scanner apps available for mobile phones, like Adobe Scan , vFlat , SwiftScan , … and numerous others. Scanning functionality is also integrated into Dropbox , and these days even natively into iOS itself.

However, I don't like working on my phone and I'd rather just take photos of the documents and receipts and deal with cleaning them up and organizing them on my computer another day. There, I have a big screen, a keyboard, and a precise mouse, which makes editing faster and more accurate.

Also, the mobile apps make some annoying technical decisions in the name of giving users something they're familiar with.

For example: If you store a document as a grayscale PNG, you can get small file sizes without introducing any compression artifacts. However, all the popular apps will give you a grayscale JPEG image with a much bigger file size and worse image quality, just because JPEG is what people are familiar with.

Or maybe I'm giving them too much credit and they actually don't know that PNGs can be smaller than JPEGs if the image contains large areas of uniform color, whereas for normal photos, JPEGs are smaller than PNGs. And no, converting it to PNG afterwards is not an option, as by then the image already contains all the JPEG compression artifacts.

For example, let's compare the results of scanning the following document:

Photo of research paper lying on table

The other apps produce bigger files, and you can clearly see the compression artifacts that degrade the result.

App Result Preview Notes
Perspec ~110 kB, PNG
View result
Perspec result detail
Scanner Pro ~190 kB, JPEG
View result
Scanner Pro result detail Extracted JPEG from exported PDF
iOS ~300 kB, JPEG
View result
iOS result detail Extracted JPEG from exported PDF

Another thing that annoys me more than it should is the ridiculous detection previews that seemingly every app includes these days:

While you're taking a photo, the app shows you a live overlay of where it detects the document. This, however, doesn't help you at all. Just because it can detect the document correctly in the preview video feed doesn't mean it will detect it correctly in the final photo. Due to the higher resolution, different lighting (exposure times, flash, …), and different contrast, the detection will often be quite different in the final photo.

So all the preview is telling you is that there is indeed a document in front of your camera, which you already know since you placed it there. 🤦‍♂️

Lastly, and most importantly, I knew I could build a better document detection algorithm for the kind of photos I was taking. The detection in existing apps would often be slightly off, even if you had a good picture with good contrast between the document and the background.

Most apps use some kind of edge detection step in their pipeline, as Dropbox explains here . But I knew that documents and receipts often don't have straight edges but rather wrinkled or curved ones. When you try to match even just a slight curve with a straight line, the endpoints will be quite far off. So instead, the app should try to detect the corners and build up the document from there. There is a detailed explanation of the computer vision techniques later in the post.

The Long Road to 1.0

I was still a student when I started working on Perspec and had to scan a lot of stuff for my studies, so I had plenty of motivation to build something like this.

Sure, you could also fix the perspective with Photoshop, Affinity Photo , or GIMP . But the overhead is substantial: Open each photo, find the perspective tool, drag the corners, pick the right export settings, repeat for the next photo, and so on. These tools are built to do everything with any image and not to churn through 50 receipts as quickly as possible. I wanted an app that's focused on this one task, with a workflow that's as streamlined as possible.

My first iteration was a fully automatic CLI app called Perspectra , implemented with Python and scikit-image . You'd pass your image and it would try to detect and extract the document for you. Simple as that.

Although I actually liked scikit-image — feature-rich, yet more straightforward than OpenCV — I quickly realized that I absolutely do not like Python. But more importantly, I realized that I also needed a GUI to fix incorrectly detected document boundaries, as the fully automatic CV pipeline would never get all documents 100% right.

And how do you build a desktop app with a GUI? Obviously with Haskell. 😝 Joking aside, I had recently started learning Haskell and was absolutely in love with it. So naturally, I wanted to see if it could be used for building the desktop app.

As I didn't want to use Python any longer, my next instinct was to use ImageMagick for the computer vision and image manipulation tasks, as I had some experience with its features and capabilities. The existing Haskell bindings were rather lacking, so I opted to simply call magick as an external process. While this mostly worked, it was always a pain to get it installed and linked correctly across platforms, and the performance was surprisingly bad for larger images.

Another obvious choice would have been OpenCV, but I had some bad memories of using it at university (maybe it was just the C++ context …), and the Haskell bindings looked rather painful.

So, my next experiment was using the native Haskell image processing library Hip . With the help of its author @lehins himself and @HanStolpo , we were able to make it work at ZuriHac! (Thanks again!)

However, it was still missing some features that I wanted, like binarization with Otsu's Method. While it was certainly possible to implement this in Hip, I (for once) felt that Haskell's abstractions didn't really help with the task at hand and only complicated things unnecessarily. A for loop in C, by comparison, is conceptually very simple and just as fast as the Haskell code. Luckily, C is a first-class citizen in Haskell and it's very easy to bundle some C code and call it via Haskell's FFI.

Unfortunately, there didn't seem to be a straightforward C library that I could hook up to Perspec without too many FFI headaches, and so I started working on FlatCV — a pure C library for computer vision and image manipulation.

I might have overdone it with the yak shaving here, but since the whole project is a labor of love anyway, why not go all the way? 😅

I'm quite happy with the experience of using C for the image manipulation algorithms, and I was able to quickly build a fully functioning version with the necessary Haskell bindings. Just recently, I released version 0.3.0 , and by now it has most of the basic operations you would expect from an image manipulation library. I also ported some of the higher-level CV operations, like adaptive binarization and corner detection , that I first implemented in Perspectra .

There are still plenty of opportunities to improve the performance of FlatCV: SIMD, GPU usage, streamed processing , etc. However, as FlatCV isn't used in a real-time context (i.e., 60 fps), the performance is already more than sufficient.

With FlatCV in place, I could finally implement the last missing piece for 1.0: Automatic corner detection directly in Perspec.

Edge Detection vs. Corner Detection

Most scanner apps detect documents with a pipeline along the lines of the one described by Dropbox :

  1. Downscale the image
  2. Run an edge detection algorithm (e.g. Canny )
  3. Find the most prominent straight lines with a Hough transform
  4. Build quadrilaterals from the intersections of those lines and score them to pick the best one

This works great for a perfectly flat sheet of paper on a high-contrast background. But real documents are rarely perfectly flat: Receipts are wrinkled, book pages are curved, and paper that has been folded never lies completely flat either. When you fit a straight line to a curved edge, the intersections of the lines (i.e. the reconstructed corners) can be quite off, even if the edge detection itself was perfect.

Perspec therefore approaches it from the other side: Instead of looking for straight edges, it segments the photo into document and background and then derives the corners from the document's outline. This is FlatCV's corner detection pipeline in detail:

  1. Convert the image to grayscale and downscale it to 256×256 px. (The detection doesn't need the full resolution, and this makes it fast.)
  2. Blur the image to get rid of noise and paper texture.
  3. Create an elevation map with a Sobel filter . (Strong edges become mountain ridges.)
  4. Flood the elevation map with watershed segmentation : The center of the image seeds the document basin and the image border seeds the background basin. The result is a binary mask of the document.
  5. Smooth the mask with a binary closing.
  6. Run a Förstner corner detector on the mask. (Unlike the more popular Harris detector, whose corners are shifted inwards, the Förstner detector yields sub-pixel-accurate corner positions.)
  7. Sort the corner candidates and keep the 4 corners with the largest angles.
  8. Scale the corner coordinates back up to the original resolution.
Input Detected Corners
Photo of a receipt Receipt with detected corners marked

The nice thing about this approach is that it never assumes straight edges. The watershed happily follows a wrinkled document boundary, and even on a crumpled receipt the corners are still locally well defined.

And if the detection does get it wrong, you can simply drag the selection polygon into the right size and position. The best of both worlds: automatic detection and manual correction.

Binarization Algorithms

Correcting the perspective is only half the story. For documents and receipts, the other half is converting the photo into a clean black & white image. This is what the Save BW and Save BW Smooth buttons in Perspec do.

The task sounds trivial: Every pixel darker than some threshold becomes black and every other pixel becomes white. The tricky part is picking the threshold.

The classic solution is Otsu's Method : It builds a histogram of all gray values in the image and then picks the threshold that best separates the dark pixels (the text) from the bright pixels (the paper). This works well … for evenly lit images.

Unfortunately, photos are seldom evenly lit. There is often a brightness gradient or a shadow cast by the person that's holding the camera or the camera itself.

The document scanning literature is full of locally adaptive algorithms (e.g. Niblack and Sauvola ) that compute an individual threshold for every pixel based on its neighborhood.

FlatCV's smart black & white conversion , however, uses a simpler trick to get away with a single global threshold: It removes the shadows before thresholding.

  1. Convert the image to grayscale.
  2. Create a heavily blurred copy of it (with a blur radius of roughly 10% of the image size). All the text and details get averaged away and what remains is basically just the illumination: brightness gradients and soft shadows.
  3. Subtract the blurred copy from the grayscale image. This keeps the high frequencies (the text) and removes the low frequencies (the shadows). The result is an evenly lit image.
  4. Apply a global threshold calculated with Otsu's Method.

For photos of printed documents, I've found this to work just as well as — or even better than — the more complicated locally adaptive algorithms, while being faster and simpler to implement.

The Save BW button applies exactly this pipeline and stores the result as a true 1-bit black & white image, where every pixel is either fully black or fully white.

The new Save BW Smooth button goes one step further and uses two thresholds (the Otsu threshold ± a small offset): Pixels below the lower threshold become black, pixels above the upper threshold become white, and pixels in between keep a scaled gray value. This yields anti-aliased edges, so the text doesn't look jagged, while the file size stays almost as small. That's why it's the recommended option for documents, receipts, and whiteboards.

Input Section of the perspective-corrected paper
Save BW Section converted to black and white
Save BW Smooth Section converted to anti-aliased black and white

What Else Is New in 1.0

The automatic corner detection is the headline feature, but quite a few other things landed in the 1.0 release :

  • Support for Windows. With macOS and Linux already covered, Perspec now runs on all 3 major desktop operating systems.
  • The edges of the selection polygon can now be dragged as well (previously only the corners), and grid lines make it easier to align the selection.
  • A new "Select Files" view with a button and drag-and-drop support for selecting images.
  • The new Save BW Smooth export option that converts the image to anti-aliased black & white. This is now the recommended option for documents, receipts, and whiteboards.
  • EXIF rotation data is now also handled for PNGs.
  • An upgrade to the latest version of Brillo , which brings an improved app design, button hover effects, and per-OS default fonts.

Check out the changelog for the full list of changes.

Installation

Prebuilt binaries for macOS, Windows, and Linux are also available on the releases page , and on macOS you can install it via my Homebrew tap:

brew install --cask ad-si/tap/perspec

However, you'll still need to buy a license to get rid of the upgrade banner in those versions.

You can purchase a license for Perspec on either itch.io or Gumroad . This gets you a license key, which removes the annoying "please buy a license" messages in the app.

And even if you don't need the software yourself, please consider buying it as a way to support the development of Haskell desktop applications and computer vision software.

Once installed, you can either drop images onto the app window or batch process them via the CLI:

perspec fix photos/*.jpeg

Next Steps

While the 1.0 release is a big milestone, there are still some features that I would like to add. Here is what I have planned for the upcoming releases:

  • Fixed output sizes: Force the output to standardized dimensions like A4 or US Letter, so a scanned document ends up with the correct proportions and size.
  • QR code detection: Marcel Robitaille wrote a great post about automating receipt ingestion where a QR code next to the document is used to attach metadata. I'd love to support such workflows out of the box.

If this sounds useful to you, give Perspec a try ! And if you run into any issues or have ideas for improvements, please open an issue — I'd love to hear your feedback!



If you have any comments, thoughts, or other feedback feel free to write me @AdrianSieber . Thanks for your help! 😊

Show HN: Free Inference Engineer and Model Training Roadmap

Hacker News
inferquest.org
2026-08-24 11:02:01
Comments...
Original Article

InferQuest — verified paths into LLM serving and training

Two free, open roadmaps built from real job-market research: make models fast and cheap in production, or make them as good as possible on the cheapest hardware — with milestones that are verified , not checked off.

The full curriculum is open to browse — sign in (free) to track progress, take the drills, and unlock the verifiers.

01

InferQuest is a free, open, non-commercial web application for learning inference engineering and LLM training. It offers two paths — serving large language models fast and cheaply, and training them as good as possible on minimal hardware — organized into quests and tasks. It tracks your progress with XP, levels, and streaks, drills you with graded quizzes and spaced-repetition reviews, and automatically verifies major milestones like deployed endpoints, GPU kernels, training runs, and merged open-source pull requests.

Signing in (with Google or email) is used only to save that progress to your account — see the privacy policy .

02

Live endpoint probes

Deploy an OpenAI-compatible endpoint — your own engine, then production vLLM — and InferQuest probes it for real: streaming framing, usage accounting, max_tokens cutoffs, error shapes, latency targets.

GPU-graded kernels & training runs

A local harness grades your kernels — attention, KV cache, Triton softmax, flash attention, quantizer, ring all-reduce — AND your training runs: first convergence, a measured ≥1.5× speedup, an adapter fine-tune that must not forget, all under fixed token budgets on your own hardware.

Merged-PR checks

The open-source milestones verify against the GitHub API that your PRs into vLLM, SGLang, FlashInfer, TRL, torchtitan, nanochat & co. actually exist, actually merged, and aren't typo fixes.

Graded interview drills

KV-cache sizing math, rooflines, speculative-decoding acceptance, scaling-laws and data-curation calls, parallelism tradeoffs — graded server-side, answers never shipped to your browser.

03

Everyone starts in Foundations — transformer internals, GPU architecture, kernels — then branches. Level up from Token to Foundation Model on one shared XP ladder; the path titles — Inference Engineer, Training Engineer — are earned as certificates.

04

What does an inference engineer do?

Inference engineers make large language models fast and cheap to serve in production: writing and tuning GPU kernels, managing KV-cache memory, batching requests, quantizing weights, and operating engines like vLLM, SGLang, and TensorRT-LLM against latency and cost targets. It's one of the fastest-growing specialist roles in AI infrastructure.

What skills do I need to become an inference engineer?

The core inference engineering skills are transformer internals (attention, KV caching, sampling), GPU architecture and CUDA or Triton kernel writing, quantization, continuous batching and paged attention, distributed serving (tensor and pipeline parallelism), and profiling with tools like Nsight. InferQuest's roadmap covers all of these in order, with a verifier gating each major skill.

Can InferQuest teach me to train my own LLM?

Yes — the Model Training path covers exactly that: backprop and optimizers from scratch, data curation with real Common Crawl pipelines, scaling-laws math, the NanoGPT-speedrun efficiency toolkit (Muon, FP8, fused kernels), a GPT-2-class pretraining capstone you can run on one consumer GPU or ~$50 of rented compute, then SFT, LoRA, DPO, and GRPO post-training on a single GPU. It leads to the pretraining, post-training, and RL engineering roles labs are actively hiring for.

Is InferQuest free? Do I get a certificate?

InferQuest is completely free and open. There is no paper certificate — instead, milestones are auto-verified: live probes against your deployed endpoint, GPU-graded kernel submissions, and merged-PR checks against real open-source repos. The result is a portfolio of receipts, which hiring teams weigh far more than a certificate.

How long does the roadmap take?

Both paths together span 182 tasks across 38 quests (21,740 XP), sharing a common trunk of fundamentals. An experienced software engineer studying part-time should expect roughly six months to a year for one path end to end — less if you already know PyTorch and CUDA, since early phases are skimmable.

Do I need my own GPU?

For the kernel-engineering phases, yes — the grading harness runs on your own hardware, and any modern NVIDIA GPU works. Everything before that (transformer internals, the inference-engine capstone, quizzes and drills) runs on CPU or free cloud notebooks.

Every verified milestone leaves a receipt: probe results, harness metrics with your GPU’s name on them, merged-PR evidence. That’s a portfolio, not a certificate.

InferQuest — open, gamified paths into LLM inference and training engineering, with verified quests.

Privacy Terms GitHub

Hot Chips 2026: Samsung and HBM Base Die Opportunities

Hacker News
chipsandcheese.com
2026-08-24 11:01:51
Comments...
Original Article

HBM, or High Bandwidth Memory, stacks multiple DRAM dies on top of a base die. The dies interface with each other via TSVs, while the base die talks with whatever compute die is using the memory via an interposer. Increasing bandwidth for a new HBM generation involves scaling up bandwidth between the DRAM dies and the base die, as well as scaling bandwidth from the base die to the host. Denser TSVs and more TSVs can easily achieve the former. The latter is more challenging, because the physical interface between the base die and host is already the biggest consumer of base die area. Increasing data pin count makes the area problem worse, and is bad for power consumption. Samsung notes that even though each HBM generation improves power efficiency, memory power keeps going up.

Samsung answered this challenge by switching to a logic node, moving away from fabricating the base die on a DRAM node. HBM4 and HBM4E now use their 4nm logic process. A logic node helps mitigate power draw increases, and offers improved density that opens up other optimization opportunities. After moving to a logic node, Samsung found they had a lot of unused base die area. They can’t make the base die smaller because its area is dictated by the DRAM die stacked on top, so they’re looking at opportunities to use that area to do fun things. Samsung’s presentation goes over those opportunities, split into three phases.

C-die = DRAM dies. B-die = base die. Moving the B-die to a logic node brings power draw down

Phase 1 investigates moving the memory controller onto the HBM base die. DRAM conventionally is rather “dumb”, requiring a host memory controller to manage low level details like precharging rows, switching the bus between read and write mode, and refreshing DRAM cells. The memory controller receives basic requests for data (give me data from this address), queues up those requests, and tries to schedule them to maximize performance while preserving correctness around memory ordering. Samsung wants to bring those functions onto the base die, and use a custom die-to-die interface to the compute die instead of the standard HBM interface. By doing so, Samsung hopes to reduce PHY area on both the compute and HBM base die. Saved PHY area could be used to hold the memory controller, making the move essentially free from the HBM base die’s perspective.

If Samsung pulls this off, you could imagine a hypothetical product working like Intel’s Sapphire Rapids, but with HBM dies that directly understand the mesh protocol internal to the CPU. A tradeoff might be that custom HBM requires more integration effort, because it no longer talks to a standard memory controller. Samsung could try to standardize a custom protocol to get around this, though their exact plans remain to be seen.

Samsung is also looking at integrating a block of SRAM into the base die that stores remapping information to get around failed DRAM cells. Previously this was done at the DRAM dies, but that has limited flexibility. Presumably, row spares can only be used to replace defective rows on the same die, and ditto with column spares. A SRAM-based remapping table could use individual cells in row/column spares to replace any defective cell. It’s also easy to imagine spares on one die being used to replace defective cells on another.

Phase 2 looks at reclaiming even more unused base die area, because apparently there’s room left even after integrating the memory controller. Samsung wants to integrate more sensors, letting HBM provide better telemetry around temperature and voltage. To improve yields and test coverage, die area can be used for a test block. This test block generates test patterns, working a bit like memtest but without needing a host.

Memory expansion was also discussed as part of phase 2. The base die can interface with external memory, acting as an IO die of sorts. No one can seem to get enough memory capacity, and HBM capacity can be limited by interposer/chip size. Putting external memory PHYs on spare HBM base die area could be an attractive way to connect a compute die to even more memory.

In-memory compute makes an appearance as part of phase 2 as well. Spare area can host compute. I’m skeptical of near-memory compute because that compute is tied to a region of memory. It would suffer from all the challenges of NUMA setups, but in a more severe way because each PE integrated onto the HBM base die is unlikely to have large caches capable of holding data homed to other memory dies. Perhaps it can be useful for pre-processing data, like performing format conversions as data gets loaded into the compute die’s internal storage.

Phase 3 goes after more aggressive solutions. Samsung is looking stacking HBM dies on top of a compute chip, a bit like how mobile SoCs stack memory using package-on-package form factors. I suspect thermals will be a huge challenge. AMD spent several generations improving thermals with their 3D cache stacking. Zen 3, Zen 4, and Zen 5 all saw their stacked cache variants clock significantly lower than their vanilla counterparts, and that’s with a single die on top. HBM will stack many more dies, further complicating the cooling

If thermals do work out, this zHBM solution could offer all the potential benefits of 3D stacking. TSVs don’t take as much power or area as 2D PHYs. Any power or area saved can be given back to more compute, assuming that compute doesn’t create hotspots that are difficult to cool through a pile of HBM die layers.

Samsung and other memory manufacturers are investigating a lot of exciting possibilities with HBM, undoubtedly driven by the explosion in DRAM demand. Many of Samsung’s proposals revolve around more tightly coupling DRAM with the compute using it. They may be difficult to achieve if compute chip makers want to multi-source HBM, because then Samsung will have to get other DRAM vendors on-board with its custom solutions. Some of Samsung’s phase 1 goals look very achievable. Better on-die test and RAS facilities, for example, wouldn’t need special attention from an attached compute die. Phase 2 and phase 3 stuff looks like a stretch. Whatever happens, it’ll be exciting to see.

Vincent Bernat: An interactive introduction to the spanning tree protocol

PlanetDebian
vincent.bernat.ch
2026-08-24 11:00:00
Warning This post contains interactive examples. To visualize and interact with them, you need to leave your RSS reader. Imagine you rent office space for a three-day event. You quickly set up a few Ethernet switches and tape some cables on the floor to get everyone online. Unfortunately, Stan, y...
Original Article

Warning

This post contains interactive examples. To visualize and interact with them, you need to enable JavaScript.

Imagine you rent office space for a three-day event. You quickly set up a few Ethernet switches and tape some cables on the floor to get everyone online. Unfortunately, Stan, your clumsiest coworker, kicks out a cable every time he gets up for coffee. You could add extra cables, but then you’d get a broadcast storm: Ethernet packets that loop and multiply until nothing else gets through.

That’s where the spanning tree protocol ( STP ) comes in. STP blocks just enough of your spare cables to leave a loop-free tree. When Stan strikes again, it rebuilds the tree in a second, leaving some time for Blobby, your one-person support crew, to reconnect the cable. See for yourself: the diagram below runs a real STP implementation in your browser!

:demo

A1 @0,0 prio=4096
A2 @0,1
A3 @0,2
A4 @0,3

B1 @1,0 prio=8192
B2 @1,1
B3 @1,2
B4 @1,3

C1 @2,0 prio=8192
C2 @2,1
C3 @2,2
C4 @2,3

A1 -- A2 hazard=0
A2 -- A3 hazard=0
A3 -- A4 hazard=0
B1 -- B2
B2 -- B3
B3 -- B4
C1 -- C2 hazard=0
C2 -- C3 hazard=0
C3 -- C4 hazard=0

A1 -- B1 cost=10
B1 -- C1 cost=10
A4 -- B4 cost=20
B4 -- C4 cost=20

Leo @-0.3,0.7 proto=none icon=👦🏻
Mia @-0.3,1.3 proto=none icon=👧🏽
Joy @0.3,0.7  proto=none icon=👱🏻‍♀️
Roy @0.3,1.3  proto=none icon=👨🏾
A2 -- Leo hazard=0 A2:edge
A2 -- Mia hazard=0 A2:edge
A2 -- Joy hazard=0 A2:edge
A2 -- Roy hazard=0 A2:edge

Max @-0.3,1.7 proto=none icon=👨🏽
Zoe @-0.3,2.3 proto=none icon=👩🏾
Ada @0.3,1.7  proto=none icon=👵🏾
Amy @0.3,2.3  proto=none icon=👩🏼
A3 -- Max hazard=0 A3:edge
A3 -- Zoe hazard=0 A3:edge
A3 -- Ada hazard=0 A3:edge
A3 -- Amy hazard=0 A3:edge

Eli @0.7,0.7 proto=none icon=👦🏼
Jay @0.7,1.3 proto=none icon=👨🏻
Kai @1.3,0.7  proto=none icon=🧑🏽
Ben @1.3,1.3  proto=none icon=👱🏼
B2 -- Eli hazard=0.2 B2:edge
B2 -- Jay hazard=0.2 B2:edge
B2 -- Kai hazard=0.2 B2:edge
B2 -- Ben hazard=0.2 B2:edge

Ava @0.7,1.7 proto=none icon=👩🏻
Lea @0.7,2.3 proto=none icon=🧑🏾‍🦱
Ivy @1.3,1.7  proto=none icon=🧕🏽
Rex @1.3,2.3  proto=none icon=👴🏿
B3 -- Ava hazard=0.2 B3:edge
B3 -- Lea hazard=0.2 B3:edge
B3 -- Ivy hazard=0.2 B3:edge
B3 -- Rex hazard=0.2 B3:edge

Ana @1.7,0.7 proto=none icon=👩🏿
Eve @1.7,1.3 proto=none icon=👧🏼
Abe @2.3,0.7  proto=none icon=🧓🏿
Ian @2.3,1.3  proto=none icon=🧔🏾
C2 -- Ana hazard=0 C2:edge
C2 -- Eve hazard=0 C2:edge
C2 -- Abe hazard=0 C2:edge
C2 -- Ian hazard=0 C2:edge

Ned @1.7,1.7 proto=none icon=👨🏼‍🦳
Lou @1.7,2.3 proto=none icon=🧑🏿
Fay @2.3,1.7  proto=none icon=👧🏻
Sue @2.3,2.3  proto=none icon=👩🏽‍🦰
C3 -- Ned hazard=0 C3:edge
C3 -- Lou hazard=0 C3:edge
C3 -- Fay hazard=0 C3:edge
C3 -- Sue hazard=0 C3:edge

Note

This article is also available as a video , but I advise you to keep reading here to try the interactive demonstrations.

The basics #

Designed in the ’80s, the spanning tree protocol has evolved into a “rapid” flavor ( RSTP ) and a “VLAN-aware” variation ( MSTP ). 1 Any sound-minded network engineer knows there are better alternatives, like BGP EVPN VXLAN . Yet, because any switch speaks it, the venerable spanning tree protocol still fills a niche.

We focus on RSTP : it replaced the original protocol in 2004. To eliminate network loops, RSTP implements a complex state machine. Timers, link state changes, and the link-local control frames a bridge receives from its neighbors drive its transitions. These Ethernet frames are the Bridge Protocol Data Units ( BPDUs ). You can watch them in action below: hit the “Start” button.

:protocol rstp
:tx-hold 10

A1 @0,1
C11 @1,0 prio=4096 icon=🌳
C12 @1,2 prio=4096 icon=🌳
C21 @2,0 prio=4096 icon=🌳
C22 @2,2 prio=4096 icon=🌳
A2 @3,1

H1 @0,0.2 proto=none icon=💻
H2 @0,1.8 proto=none icon=🖨️
H3 @3,0.2 proto=none icon=📠
H4 @3,1.8 proto=none icon=📺

A1 -- C11
A1 -- C12
A2 -- C21
A2 -- C22
C11 -- C12
C11 -- C21
C11 -- C21
C11 -- C22
C12 -- C21
C12 -- C22
C21 -- C22
A1 -- H1 A1:edge
A1 -- H2 A1:edge
A2 -- H3 A2:edge
A2 -- H4 A2:edge

After some time , the topology converges to a tree: from the root C11, there is a path to each bridge 2 and no loop. In the upper right corner, the interface displays a tree icon 🌳 followed by the time it took to reach this state. Cut a link and see how the protocol finds an alternate path to reach C12 in less than a second. You can stop the simulation, move it forward step by step, reset it to its initial state, or slow it down with the “snail” mode 🐌. Don’t worry about all the displayed information: I explain it later.

All examples run in your browser, powered by MSTPD —an open-source user-space 3 implementation of RSTP . 4

Historical interlude #

Radia Perlman , an inductee of the Internet Hall of Fame in 2014, summarized the ancestor of STP she invented at DEC with this poem, later included in a US patent :

I think that I shall never see
A graph more lovely than a tree.
A tree whose crucial property
Is loop-free connectivity.
A tree which must be sure to span
So packets can reach every LAN.
First, the root must be selected.
By ID, it is elected.
Least cost paths from root are traced.
In the tree, these paths are placed.
A mesh is made by folks like me,
Then bridges find a spanning tree.

Radia Perlman , Algorhyme .

Electing the root bridge #

To build a tree, RSTP first elects the bridge with the lowest bridge identifier as the root bridge . The bridge identifier combines the priority and the MAC address: 8192.6e:2b:10:a0:5f:29 .

In the example below, S1 and S2 have priorities of 4,096 and 8,192: S1 becomes root. S4 has a priority of 12,288, while S3 keeps the default priority of 32,768: 5 S4 becomes root. S5 and S6 don’t have a specific priority, so the lowest MAC address wins and S5 becomes root.

:protocol rstp

S1 @0,0 prio=4096
S2 @0,1 prio=8192
S1 -- S2

S3 @1,0
S4 @1,1 prio=12288
S3 -- S4

S5 @2,0
S6 @2,1
S5 -- S6

Initially , each bridge advertises itself as root: 6

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    Root Identifier: 8192.02:00:00:01:00:01
    Bridge Identifier: 8192.02:00:00:01:00:01

Once a bridge receives a BPDU advertising a better root bridge, it propagates this new information to its neighbors.

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    Root Identifier: 4096.02:00:00:00:00:00
    Bridge Identifier: 8192.02:00:00:00:00:01

Assigning roles to ports #

The second step is to assign a role to each port. RSTP defines five roles, each denoted by a letter:

  • root (R),
  • designated (D),
  • alternate (A),
  • disabled (X), or
  • backup (B). 7

Each non-root bridge chooses its root port , the one with the lowest-cost path to the root. Unless you override it, each bridge derives the link cost from the speed: 20,000 for 1 Gbps. In case of equality, the lowest port identifier wins.

Each remaining port becomes a designated port if the BPDU it sends is “better” than the BPDU it receives. Otherwise, it becomes an alternate port . Later, if the root port goes down, the “best” alternate port becomes the new root port. The tiebreakers for the best BPDU are:

  1. the lowest root bridge identifier,
  2. the lowest accumulated cost to the root,
  3. the lowest bridge identifier, and
  4. the lowest port identifier.
:protocol rstp

S1 @1,0  prio=4096 icon=🌳
S2 @0,1
S3 @2,1

S1 -- S2
S1 -- S3
S1 -- S3
S2 -- S3

In the example above, after convergence , S1 is the root bridge because it has a priority of 4,096, while the other bridges have a priority of 32,768. All its ports are designated ports because the accumulated cost to the root is 0.

S2’s port facing S1 becomes a root port because it has the lowest accumulated cost to the root—20,000 vs 40,000. S3 has two ports facing S1, and the one with the lowest port identifier becomes the root port— 0x8000 vs 0x8001 . The other candidate is an alternate port because the remote port on the link sends a better BPDU , with an accumulated cost of 0. On the segment between S2 and S3, S2’s port wins: while both bridges have the same accumulated cost to the root (20,000), S2’s bridge identifier is smaller— 32768.02:00:00:00:00:01 vs 32768.02:00:00:00:00:02 .

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    Root Identifier: 4096.02:00:00:00:00:00
    Root Path Cost: 20000
    Bridge Identifier: 32768.02:00:00:00:00:01
    Port identifier: 0x8002

If you cut the active link between S1 and S3 , S3 promotes the “best” alternate port to root port. If you also disable the second link , S3 chooses the remaining alternate port as a root port. But if you disable the link between S1 and S2 , S2 needs a bit more work to elect a new root port because it does not have an alternate port.

Unless a specific event happens, designated ports send BPDUs every 2 seconds . 8 If a bridge does not receive BPDUs from its neighbor for 3 consecutive hello periods, it considers the neighbor dead and removes the port information.

Port state transition #

Each port can have one of three states. The diagram displays a background color for each state:

  • discarding (red),
  • learning (yellow), or
  • forwarding (green).

A root port transitions automatically to the forwarding state. An alternate port stays in the discarding state. A designated port has two options to transition from the discarding state to the forwarding state:

  • If the port is an edge port , either through configuration or because the remote device does not speak any flavor of STP , the bridge assumes it won’t participate in the protocol and cannot create a loop. In this case, the designated port immediately transitions to the forwarding state.
  • Otherwise, it sends a proposal to its downstream neighbor. If the remote bridge agrees that the received BPDU is “better” than any other BPDU stored for other ports, it elects the receiving port as its root port and starts the synchronization process: it transitions all non-edge non-synced designated ports to the discarding state to avoid a loop. Then, it sends back an agreement . Upon receiving the agreement, the peer designated port transitions to the forwarding state. 9
:protocol rstp

S1 @1,0 prio=4096 icon=🌳
S2 @1,1
S3 @0,2
S4 @2,2
S5 @0,3 prio=8192 icon=🪾
S6 @2,3
H1 @0,1.2   proto=none icon=🖨️
H2 @2,1.2   proto=none icon=📠
H3 @2.5,1.3 proto=none icon=📺
H4 @2.5,2.3 proto=none icon=💻

S1 -- S2
S2 -- S3
S2 -- S4
S3 -- S5
S4 -- S6
S4 -- S3
S5 -- S6

S3 -- H1 S3:edge
S4 -- H2 S4:edge
S4 -- H3 S4:edge
S6 -- H4 S6:edge

In the topology above, H1, H2, H3, and H4 are end devices not participating in the protocol. We configure the ports they connect to as edge ports, so these ports immediately move to the forwarding state.

Use the “step” button to move the simulation forward. The clock moves to 1 second. Step again and S1 and S2 send a proposal to each other. Here is the proposal from S2:

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x4e, Agreement, Port Role: Designated, Proposal
        0... .... = Topology Change Acknowledgment: No
        .1.. .... = Agreement: Yes
        ..0. .... = Forwarding: No
        ...0 .... = Learning: No
        .... 11.. = Port Role: Designated (3)
        .... ..1. = Proposal: Yes
        .... ...0 = Topology Change: No
    Root Identifier: 32768.02:00:00:00:00:01
    Root Path Cost: 0
    Bridge Identifier: 32768.02:00:00:00:00:01
    Port identifier: 0x8001

S1 ignores it: its own root identifier is lower. When S2 receives a similar proposal from S1, it accepts S1 as its root bridge. It also elects the port to S1 as the root port and starts the synchronization process. The two designated ports are already discarding, so no change here. Step again and S2 sends two BPDUs to S1. In one of them, the agreement bit is 1 and the proposal bit is 0. It also shows that S2 accepted S1 as the root bridge and its root port is now in the forwarding state. When receiving this BPDU , S1 transitions its own designated port to the forwarding state. From this point, the link between S1 and S2 forwards user traffic.

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x79, Agreement, Forwarding, Learning, Port Role: Root, Topology Change
        0... .... = Topology Change Acknowledgment: No
        .1.. .... = Agreement: Yes
        ..1. .... = Forwarding: Yes
        ...1 .... = Learning: Yes
        .... 10.. = Port Role: Root (2)
        .... ..0. = Proposal: No
        .... ...1 = Topology Change: Yes
    Root Identifier: 4096.02:00:00:00:00:00
    Root Path Cost: 20000
    Bridge Identifier: 32768.02:00:00:00:00:01
    Port identifier: 0x8001

Let’s look at what happened to S5. Reset the simulation and step twice . S5 exchanges BPDUs with both S3 and S6. Since S5 has a lower root identifier than S3 and S6, it stays the root bridge, while S3 and S6 accept the proposal and elect their root ports. S3 and S6 start the synchronization process. S6’s port to H4 stays up because this is an edge port. Move one step . Both S3 and S6 send an agreement back to S5, which transitions both designated ports to the forwarding state. Yet, the link between S5 and S3 keeps discarding user traffic! If you look carefully, S3’s port toward S5 is now a designated port, not a root port. During the same step , S3 also receives a better BPDU from S2 with S1 as the root bridge. It elects its port to S2 as the root port and downgrades the port to S5 to a designated port, which stays in the discarding state.

On the next step , things get a bit tricky. S3 sends a proposal to S5: 10

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x4f, Agreement, Port Role: Designated, Proposal, Topology Change
        0... .... = Topology Change Acknowledgment: No
        .1.. .... = Agreement: Yes
        ..0. .... = Forwarding: No
        ...0 .... = Learning: No
        .... 11.. = Port Role: Designated (3)
        .... ..1. = Proposal: Yes
        .... ...1 = Topology Change: Yes
    Root Identifier: 4096.02:00:00:00:00:00
    Root Path Cost: 40000
    Bridge Identifier: 32768.02:00:00:00:00:02
    Port identifier: 0x8002

S5 elects S1 as its root bridge and the port toward S3 as its root port. It starts its synchronization process, but the designated port to S6 does not move into the discarding state. Why? That port stays a designated port and its neighbor S6 had already sent an agreement on the link, so the port keeps its synced status.

Now, let’s step back to look at what happens to S6. At this point, S6 believes S5 is the root bridge. Step once and S4 sends a new proposal to S6. S6 accepts the proposal, elects S1 as the root bridge and the port to S4 as its root port. The role of the port facing S5 changes: from a root port, it becomes a designated port. Because its peer keeps advertising an inferior BPDU on the link, this port becomes disputed and moves to the discarding state. The root port transitions to the forwarding state and the link starts forwarding immediately because S4’s designated port is already in the forwarding state. If we step one more time , S5 and S6 exchange two BPDUs . The one from S5 is better because of its lower bridge identifier. S5’s port stays a designated port, while S6 downgrades its own port to an alternate port.

Let’s rewind one last time from the start: cut the link between S1 and S2, run the simulation until the topology is stable , stop the simulation, and restore the link between S1 and S2. During the first step , S1 and S2 exchange proposals. S2 elects S1 as the root bridge instead of S5 and the port to S1 as the root port. It downgrades the previous root port to a designated port and moves it into the discarding state. The other designated port stays synced and keeps its forwarding state. At the next step , S2 sends an agreement to S1 and the link between them starts forwarding user traffic. It also sends a proposal to S3 , but not to S4. Instead, it sends a regular BPDU to S4 . S4 still elects S1 as its root bridge and the port to S2 as its root port. It demotes its previous root port, the one to S3, to a designated port, which transitions to the discarding state because of the root port change. The other alternate port, to S6, also becomes a designated port and stays in the discarding state. The new root port moves to the forwarding state. On the next step , S4’s port to S3 settles as an alternate port after receiving a “better” BPDU from S3.

RSTP is a giant state machine split into smaller ones: bridge detection, port information, port protocol migration, port role selection, port role transitions, port receive, port state transitions, port timers, port transmit, and topology change. Some of them are per bridge, some per port. Each bridge runs an instance. Time, operational port state changes, and the BPDUs it receives from other instances drive the transitions. Being event-driven makes RSTP more efficient but also more difficult to understand.

Western Australian Government Railways class Msa Garratt articulated steam
locomotive: elevation and plan drawing

Placeholder for the Port Information state machine extracted from IEEE 802.1Q-2005, page 182. Pending IEEE authorization for reproduction, this is the blueprint for the Western Australian Government Railways class Msa Garratt articulated steam locomotive.

Topology change notification #

A bridge populates a MAC address table: it associates each source MAC address with the port that last received it. When forwarding an Ethernet frame, it looks up this table to choose the right port. 11 When a link fails, a connected fridge reachable through one port may become reachable through another one. The affected bridges should flush the MAC addresses they learned, because these entries may now be wrong.

For this purpose, RSTP implements topology change notifications using a flooding mechanism. When a non-edge port transitions to the forwarding state, a bridge generates BPDUs with the topology change ( TC ) bit set. It sends them to all the non-edge designated ports and to the root port. It also flushes the MAC address table on these ports. When a bridge receives such a BPDU , it propagates the notification to all non-edge designated ports and the root port, except the one the notification came from. It also flushes the MAC address table on these ports. In the examples, the BPDUs with the TC bit set to 1 have a red circle.

:protocol rstp

S1 @1,0 prio=4096 icon=🌳
S2 @0,1
S3 @1,1
S4 @2,1
S5 @1,2
LPT @0.1,2 proto=none icon=🖨️

S1 -- S2
S1 -- S3
S1 -- S4
S2 -- S3
S2 -- S5
S4 -- S5
S5 -- LPT S5:edge

Start the simulation and wait a few seconds for the topology to settle. Stop the simulation and disable the link between S2 and S5 . S5 elects the port facing S4 as the root port, which transitions immediately to the forwarding state. Step once and S5 emits a BPDU with the TC bit set to 1:

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x79, Agreement, Forwarding, Learning, Port Role: Root, Topology Change
        0... .... = Topology Change Acknowledgment: No
        .1.. .... = Agreement: Yes
        ..1. .... = Forwarding: Yes
        ...1 .... = Learning: Yes
        .... 10.. = Port Role: Root (2)
        .... ..0. = Proposal: No
        .... ...1 = Topology Change: Yes
    Root Identifier: 4096.02:00:00:00:00:00
    Root Path Cost: 40000
    Bridge Identifier: 32768.02:00:00:00:00:04
    Port identifier: 0x8002

S4 receives this BPDU . It flushes the MAC address table on the port facing S1: while LPT was previously reachable through this port, it is now reachable through S5 instead. Step once . S4 sends S1 a BPDU with the TC bit set to 1. When S1 receives this BPDU , it flushes the MAC address table on the ports facing S2 and S3. Step once and S1 sends a notification to S2 and S3. Step once again and S2 sends a notification to S3, while S3 does nothing because the port toward S2 is an alternate port . S3 does not flush any MAC address table: LPT is still reachable through its port to S1.

If you step a bit more , you will see that some of the periodic BPDUs keep the TC bit set to 1. Each port runs a timer equal to the hello timer plus one second. 12 The timer starts when the port emits a notification. Until it expires, the port sets the TC bit to 1 in every BPDU it sends. You can also see some periodic BPDUs without the TC bit: they originate from a port that only received a notification and therefore did not arm its timer.

Security #

RSTP is weak against configuration errors and malicious actors. A bridge not talking RSTP can create a loop. An attacker can insert themselves into the topology to disrupt the service, spy on the traffic, or alter it.

To mitigate such problems, you need to identify the edge ports. An edge port connects to an end device, like a PC or a printer. Such devices do not generate BPDUs and cannot create a loop. RSTP defines two related flags:

  • When true, AdminEdge initializes a port as an edge port. It defaults to false.
  • When true, AutoEdge lets a port become an edge port when it does not receive BPDUs for 3 seconds. It defaults to true.

If an edge port receives a BPDU , regardless of the values of these two flags, it reverts to a non-edge port.

R0 @1.5,1.5 prio=8192

# AutoEdge=true, AdminEdge=false, bridge
S1 @3,1.58
R0 -- S1

# AutoEdge=true, AdminEdge=false, end device
H1 @2.84,2.18 icon=🖨️ proto=none
R0 -- H1

# AutoEdge=true, AdminEdge=true, bridge
S2 @2.18,2.84
R0 -- S2 R0:edge

# AutoEdge=true, AdminEdge=true, end device
H2 @1.58,3 icon=💻 proto=none
R0 -- H2 R0:edge

# AutoEdge=false, AdminEdge=true, bridge
S3 @0.68,2.76
R0 -- S3 R0:edge R0:no-auto-edge

# AutoEdge=false, AdminEdge=true, end device
H3 @0.24,2.32 icon=📠 proto=none
R0 -- H3 R0:edge R0:no-auto-edge

# AutoEdge=false, AdminEdge=false, bridge
S4 @0,1.42
R0 -- S4 R0:no-auto-edge

# AutoEdge=false, AdminEdge=false, end device
H4 @0.16,0.82 icon=📺 proto=none
R0 -- H4 R0:no-auto-edge

# Network port, bridge
S5 @0.82,0.16
R0 -- S5 R0:network S5:network

# Network port, end device
H5 @1.42,0 icon=☕ proto=none
R0 -- H5 R0:network

# AdminEdge=true, bpdu-guard=true, bridge
S6 @2.32,0.24
R0 -- S6 R0:bpdu-guard R0:edge

# AdminEdge=true, bpdu-guard=true, end device
H6 @2.76,0.68 icon=💡 proto=none
R0 -- H6 R0:bpdu-guard R0:edge

In the topology above, S1, S2, S3, S4, S5, and S6 act as bridges, while H1, H2, H3, H4, H5, and H6 act as end devices:

  • S1 and H1 are on a port without a specific configuration: AutoEdge is true, AdminEdge is false,
  • S2 and H2 are on a port where AdminEdge is true,
  • S3 and H3 are on a port where AutoEdge is false and AdminEdge is true,
  • S4 and H4 are on a port where AutoEdge is false.

If you start the topology and wait about 20 seconds , links to S1, S2, S3, S4, H1, H2, H3, and H4 eventually forward user traffic: none of the flags matter.

But what about the two remaining pairs? S5 and H5 connect to a network port. Such a port enables a non-standard feature: bridge assurance . The port transmits BPDUs regardless of its role. If it does not receive BPDUs for 3 consecutive hello periods, it transitions to the discarding state. On the link between R0 and S5, you can see BPDUs traveling in both directions , unlike the other links, where only designated ports send BPDUs .

S6 and H6 connect to a port where AdminEdge is true and BPDU guard is enabled. This is another non-standard feature that shuts down a port if it receives a BPDU .

In summary, if you expect a port to be an edge port, you should set AdminEdge to true and enable BPDU guard . Otherwise, declare it as a network port.

Why RSTP today? #

A compelling use case for RSTP today is an out-of-band network for a datacenter, since you can tolerate an outage of a few seconds. The configuration is minimal and you can use cheap switches, like a Cisco 2960X. 13 You need two switches acting as root bridges, and you build several loops to connect OOB switches in each cabinet. This simple design survives one failure on each loop. 14

:protocol rstp
:tx-hold 10

# Root bridges
R1 @0,1 prio=0
R2 @0,2 prio=4096
R1 -- R2 cost=200 R1:network R2:network
R1 -- R2 cost=200 R1:network R2:network

# First loop
C1  @1,0 icon=🗄️
C4  @2,0 icon=🗄️
C7  @3,0 icon=🗄️
C10 @4,0 icon=🗄️
C12 @5,0 icon=🗄️
C13 @5,3 icon=🗄️
C15 @4,3 icon=🗄️
C18 @3,3 icon=🗄️
C21 @2,3 icon=🗄️
C24 @1,3 icon=🗄️
R1  -- C1  R1:network C1:network
C1  -- C4  C1:network C4:network
C4  -- C7  C4:network C7:network
C7  -- C10 C7:network C10:network
C10 -- C12 C10:network C12:network
C12 -- C13 C12:network C13:network
C13 -- C15 C13:network C15:network
C15 -- C18 C15:network C18:network
C18 -- C21 C18:network C21:network
C21 -- C24 C21:network C24:network
C24 -- R2  C24:network R2:network

# Second loop
C2  @1,0.5 icon=🗄️
C5  @2,0.5 icon=🗄️
C8  @3,0.5 icon=🗄️
C11 @4,0.5 icon=🗄️
C14 @4,2.5 icon=🗄️
C17 @3,2.5 icon=🗄️
C20 @2,2.5 icon=🗄️
C23 @1,2.5 icon=🗄️
R1  -- C2  R1:network C2:network
C2  -- C5  C2:network C5:network
C5  -- C8  C5:network C8:network
C8  -- C11 C8:network C11:network
C11 -- C14 C11:network C14:network
C14 -- C17 C14:network C17:network
C17 -- C20 C17:network C20:network
C20 -- C23 C20:network C23:network
C23 -- R2  C23:network R2:network

# Third loop
C3  @1,1 icon=🗄️
C6  @2,1 icon=🗄️
C9  @3,1 icon=🗄️
C16 @3,2 icon=🗄️
C19 @2,2 icon=🗄️
C22 @1,2 icon=🗄️
R1  -- C3  R1:network C3:network
C3  -- C6  C3:network C6:network
C6  -- C9  C6:network C9:network
C9  -- C16 C9:network C16:network
C16 -- C19 C16:network C19:network
C19 -- C22 C19:network C22:network
C22 -- R2  C22:network R2:network

This topology converges in about 6 seconds . Each loop should stay small (around 16 bridges) to reduce the probability of a double failure and to avoid sharing too much bandwidth. The design can evolve a bit without adding too much complexity: one VLAN per loop or one bridge domain per loop.

How large can a network be? #

The maximum age, whose default value is 20, governs the maximum distance of a node from the root. The topology below is too big for BPDUs from R1 to reach beyond S20. 15

:protocol rstp
:tx-hold 10
:max-age 20

R1 @0,0 prio=4096 icon=🌳
R2 @0,5 prio=4096 icon=🪾

S1  @1,0
S2  @2,0
S3  @3,0
S4  @4,0
S5  @5,0
S6  @6,0

S7  @6,1
S8  @5,1
S9  @4,1
S10 @3,1
S11 @2,1
S12 @1,1

S13 @1,2
S14 @2,2
S15 @3,2
S16 @4,2
S17 @5,2
S18 @6,2

S19 @6,3
S20 @5,3
S21 @4,3
S22 @3,3
S23 @2,3
S24 @1,3

S25 @1,4
S26 @2,4
S27 @3,4
S28 @4,4
S29 @5,4
S30 @6,4

S31 @6,5
S32 @5,5
S33 @4,5
S34 @3,5
S35 @2,5
S36 @1,5

R1  -- S1
S1  -- S2
S2  -- S3
S3  -- S4
S4  -- S5
S5  -- S6
S6  -- S7
S7  -- S8
S8  -- S9
S9  -- S10
S10 -- S11
S11 -- S12
S12 -- S13
S13 -- S14
S14 -- S15
S15 -- S16
S16 -- S17
S17 -- S18
S18 -- S19
S19 -- S20
S20 -- S21
S21 -- S22
S22 -- S23
S23 -- S24
S24 -- S25
S25 -- S26
S26 -- S27
S27 -- S28
S28 -- S29
S29 -- S30
S30 -- S31
S31 -- S32
S32 -- S33
S33 -- S34
S34 -- S35
S35 -- S36
S36 -- R2
R1  -- R2 cost=200 down

Once the topology settles , part of the network considers R1 the root, while the other votes for R2. At the boundary, S20 tries to start a synchronization with S21 to move its designated port to the forwarding state. The BPDU looks like this:

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x4e, Agreement, Port Role: Designated, Proposal
    Root Identifier: 4096.02:00:00:00:00:00
    Root Path Cost: 400000
    Bridge Identifier: 32768.02:00:00:00:00:15
    Port identifier: 0x8002
    Message Age: 20
    Max Age: 20

S21 rejects it because the message age equals the maximum age. On the other hand, the BPDU S21 sends to S20 looks like this:

Spanning Tree Protocol
    Protocol Identifier: Spanning Tree Protocol (0x0000)
    Protocol Version Identifier: Rapid Spanning Tree (2)
    BPDU Type: Rapid/Multiple Spanning Tree (0x02)
    BPDU flags: 0x7c, Agreement, Forwarding, Learning, Port Role: Designated
    Root Identifier: 4096.02:00:00:00:00:01
    Root Path Cost: 320000
    Bridge Identifier: 32768.02:00:00:00:00:16
    Port identifier: 0x8001
    Message Age: 16
    Max Age: 20

This is not enough to change S20’s root port because S20 has a lower root identifier 4096.02:00:00:00:00:00 vs 4096.02:00:00:00:00:01 .

Fixing the link between R1 and R2 resolves the issue. The maximum message age any packet carries is now 18, below the configured maximum age. But it only works until another link breaks. A plausible fix is to increase the maximum age to 40. 16

How fast is RSTP ? #

RSTP usually converges in a couple of seconds at startup. It often repairs a tree in less than a second. Even the 38-bridge topology takes less than 10 seconds to converge. 17 Some topologies can take a bit more time to recover when the root bridge becomes unavailable. 18

:protocol rstp

R0 @1,0 prio=0
S1 @1,1 prio=4096
S2 @0,2 prio=8192
S3 @2,2

R0 -- S1
S1 -- S2
S2 -- S3
S3 -- S1

In the topology above, start the simulation, wait for convergence , hit stop, and cut the link between R0 and S1 . The topology is already optimal, but RSTP has a hard time converging again.

First, S1 loses its root port. It has no more information about R0 and elects itself as the root bridge. It keeps its ports to S2 and S3 as designated ports in the forwarding state. Step once and it sends a BPDU to both S2 and S3 to let them know about the root change. When receiving it, S2 accepts S1 as its root because it does not have a better root on another port. It elects the port to S1 as its root port. The other port stays a designated port. Both ports keep forwarding.

When receiving the BPDU from S1, S3 behaves differently: it knows R0 as a better root than S1 through its alternate port to S2. It promotes this port to a root port and demotes the port facing S1 to a designated port, which requires a new agreement. Step once and S3 sends a proposal to S1 with R0 as the root bridge. S1 elects R0 as the root bridge and promotes its port to S3 as a root port.

During the same step , S3 also receives a BPDU from S2 stating that S1 is the root bridge. Therefore, S3 has no port left with R0 as the root bridge: it elects S1 as the root bridge and its port to S2 as the root port. Step once and its next BPDU to S1 includes this information: S1 elects itself again as the root bridge. But during the same wave , S1 sends a proposal to S2 with R0 as the root bridge. While S1 and S3 agree that S1 is the root bridge, S2 now believes this is R0! In turn , S2 again convinces S3 that R0 is the root bridge, S3 convinces S1, S1 convinces S2, and S2 convinces S3.

This could go on forever, but it does not. The BPDUs saying “R0 is root” eventually age out when the message age goes past the maximum age. In the example above, at the eleventh second , S2 sends a BPDU to S3 with R0 as root, but S3 drops it because its message age reached the maximum. With some luck, the topology can also converge faster if a port stops transmitting new BPDUs after tripping the transmit hold count, whose default value is 6 per second.

About MSTP #

MSTP is the “VLAN-aware” version of RSTP : it runs several instances of RSTP and lets the administrator map each VLAN to a specific instance. For example, you can map VLANs 100 to 200 to a first instance, and 300 to 400 to a second instance. The remaining VLANs map to a special instance named the Internal Spanning Tree ( IST ). MSTP adds its own complexity, but the gist is that you have several logical topologies acting independently. If you want to dig deeper, have a look at “ MSTP Tutorial Part I: Inside a Region .”

About the interactive examples #

The interactive examples run MSTPD directly in your browser, compiled to WebAssembly with emscripten . A C API replaces the code talking to the Linux kernel: it manages bridges and ports, exports state as JSON, and drives time deterministically. A JavaScript wrapper makes it more user-friendly:

import { loadMSTPD } from "./dist/mstpd.mjs";
const mstp = await loadMSTPD();

// Create 3 bridges
const a = mstp.createBridge("A", { priority: 4096 });
const b = mstp.createBridge("B", { priority: 8192 });
const c = mstp.createBridge("C");

// Each bridge has two ports
const a1 = a.addPort("a-b", { portno: 1 });
const a2 = a.addPort("a-c", { portno: 2 });
const b1 = b.addPort("b-a", { portno: 1 });
const b2 = b.addPort("b-c", { portno: 2 });
const c1 = c.addPort("c-a", { portno: 1 });
const c2 = c.addPort("c-b", { portno: 2 });

// Build a triangle topology
mstp.link(a1, b1);
mstp.link(a2, c1);
mstp.link(b2, c2);

// Enable all bridges and ports
for (const br of [a, b, c]) br.enable();
for (const p of [a1, a2, b1, b2, c1, c2]) p.enable();

// Execute 40 seconds' worth of wall clock and display the topology
mstp.step(40);
console.log("Topology:", mstp.topology());

Several dozen unit tests explore the features of MSTPD and check that they work correctly in this environment:

$ node --test *.test.mjs
✔ two bridges: lower priority becomes root (41.657342ms)
✔ triangle loop: exactly one port blocks and all agree on the root (5.832ms)
✔ breaking the active link reconverges and restoring recovers (18.730753ms)
[…]
ℹ tests 40
ℹ pass 40
ℹ fail 0
[…]
ℹ duration_ms 396.190897

Additional JavaScript code looks for specific <pre> blocks containing a topology definition and turns them into the interactive widget. You can inspect and modify the definition by hitting the “edit” button.

There is also a cool trick to tell whether the topology has converged. After each step, we save a snapshot of the simulation memory, play 50 seconds’ worth of simulation to check if the topology is stable, and travel back in time by restoring that snapshot. 🕰️

The complete code lives on GitHub . I am happy with the result. It can be difficult to follow everything happening during a single step, but stepping forward and backward helps. I plan to use the same approach in future blog posts about networking features.

Note

Michael Lynch reviewed a first draft of this article. He authored “ Refactoring English ,” a book to sharpen your writing for blog posts, documentation, commit messages, and tutorials. Any errors are still mine!

Vincent Bernat: A non-interactive introduction to the spanning tree protocol

PlanetDebian
vincent.bernat.ch
2026-08-24 10:59:00
Imagine you rent office space for a three-day event. You quickly set up a few Ethernet switches and tape some cables on the floor to get everyone online. Unfortunately, Stan, your clumsiest coworker, kicks out a cable every time he gets up for coffee. Spare cables would fix that, but a loop turns in...
Original Article

Imagine you rent office space for a three-day event. You quickly set up a few Ethernet switches and tape some cables on the floor to get everyone online. Unfortunately, Stan, your clumsiest coworker, kicks out a cable every time he gets up for coffee. Spare cables would fix that, but a loop turns into a broadcast storm: Ethernet packets multiply until nothing else gets through. That’s where the spanning tree protocol comes in: it blocks just enough of the spare cables to leave a loop-free tree, and rebuilds it in a second each time Stan strikes again.

This content is also available as a text version , with interactive demos that run a real implementation directly in your browser!


This video is an experiment. 1 Honestly, except for Radia Perlman reading her poem , 2 you should read the original article instead. It presents the same content, but you can play with the interactive examples, which are the main contribution. On the other hand, if you happen to like the video, be sure to tell me in the comments!

Show HN: How to mentally calculate the day of the week for any date

Hacker News
tinkerandsee.com
2026-08-24 10:57:45
Comments...
Original Article
PART 1

The skill you're about to steal ⚡

Some people can hear any date and name its weekday in about two seconds . No calendar. No counting from today.

Not memorization, not magic: two secrets + a little practice . By the bottom of this page, this is you. (Suspicious? Check those dates against a real calendar.)

PART 2

Secret #1: The Clock of Days 🕐

Weekdays aren't a list — they're a circle of 7 . You know remainders from school; here's what they're for . Three challenges — answer before the clock moves.

PART 3

Secret #2: The Secret Squad 📅

All of , with a squad of dates already marked in gold. They share one spooky property — spot-check any of them by tapping the calendar yourself.

The doubles

"9-to-5 at the 7-11"

The oddballs

Secret #2: one weekday owns the whole squad. Its name: the year's Doomsday — coined by John Conway , who published this method in 1973 ( Doomsday rule on Wikipedia ↗ ).

Remember it in two lines: the doubles (4/4 · 6/6 · 8/8 · 10/10 · 12/12) + "I work 9-to-5 at the 7-11" (9/5 · 5/9 · 7/11 · 11/7). Then three odd ones: π-day 3/14 🛞, the last day of February , and Jan 3 ( Jan 4 in a leap year — February borrows the day, so January shifts).

Provable with your clock: — every gap a perfect stack of weeks. The squad must march together. Every year. Forever.

PART 4

Your first real trick: any date this year 🎯

The trick = nearest squad date → leftover → walk from the Doomsday . One together first.

PART 5

Time travel: what day were YOU born? 🎂

One more fact — you already own it: 365 ÷ 7 leaves remainder 1 . So each New Year the Doomsday slides +1 — and +2 when the new year has a Feb 29:

🚀 The Time Machine

Enter any year — the slide rule does the rest.

🥋 Black-belt: jump straight to ANY year — no stepping (Conway's dozens trick)

Slides are +1 per year, +1 extra per leap — but stepping 26 times is slow. Why dozens? 12 slides + 3 leap extras = 15 — and 15 on a clock of 7 is just +1 . One dozen = one slide.

Try any year: 20 26 (drag the number)

For 19-something years the same steps work — just start from Wednesday , 1900's Doomsday, instead of Tuesday.

PART 6

Perform it! 🎩

Time to train like a stage wizard. Three rounds — the helpers disappear as you level up.

🎩 Who to thank for this trick: John Conway invented the Doomsday Rule ↗ in 1973 and trained by making his computer quiz him at every login — until any date took ~ 2 seconds . Stage mathemagicians still perform it. Now you can too.

1. The Leftover Trick 🕐

Draw the 7-day circle and jump around it.

Say: "Add 700 days to a Tuesday? Still Tuesday! Only the leftover after throwing away 7s matters."

2. The Secret Squad 📅

Show 4/4, 6/6, 8/8, 10/10, 12/12 in any calendar — then Jan 3 and π-day.

Say: "Check them — all the SAME weekday. And 9-to-5 at the 7-11 too. Every year has a Doomsday!"

3. The Yearly Slide 🎂

Explain why calendars shift.

Say: "365 days = 52 weeks + 1 leftover. That's why your birthday moves one weekday every year — two after a leap!"

4. The Performance 🎩

Have someone pick a date; think out loud afterwards.

Say: "Nearest squad date… count the leftover… walk from the Doomsday. Ask me another!"

Stumped somebody with it? Claim your title:

[$] How to be safe from quantum computing

Linux Weekly News
lwn.net
2026-08-24 10:57:41
Practical quantum computers have been ten years away for the last several decades. Now, however, it's beginning to look as though they will be possible in just a few years. Recent research with obfuscated results demonstrated much lower memory requirements to factor ECDSA keys on a quantum comput...
Original Article
The page you have tried to view ( How to be safe from quantum computing ) 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 September 3, 2026)

Hot Chips 2026: Applying High Bandwidth Flash (HBF)

Hacker News
chipsandcheese.com
2026-08-24 10:48:58
Comments...
Original Article

HBF, or High Bandwidth Flash, uses the same flash memory technology we see in SSDs today. Unlike SSDs, HBF is implemented much like HBM (High Bandwidth Memory). HBF cubes sit on the same package as a compute chip, perhaps even next to HBM. HBF’s idea is to offer much higher capacity than HBM, while still providing decent memory bandwidth. At Hot Chips 2026 tutorials day, Anurag Agarwal and Radhakrishna Giduthuri’s talk explores how HBF could apply to machine learning workloads. No HBF products exist yet, so the talk focuses on simulations, projections, and how software can adapt to take advantage of HBF.

HBF offers very high capacity per “cube”, and giant access granularity

Even though HBF uses a HBM-like form factor, it’s completely different under the hood. It’s not like Intel’s Optane, which could function as another pool of memory. Instead, HBF is almost like a SSD integrated onto a processor. Software uses DMA to move data between HBF and DRAM. HBF accesses must be done in large, aligned chunks as if it were a mass storage device, rather than system memory. Host software also has to take on SSD controller functions like managing write leveling and ensuring data retention. That means HBF can’t be a plug-and-play solution.

Instead, taking advantage of HBF means formulating a special strategy and implementing it into a runtime. Giduthuri takes vLLM as an example. vLLM typically holds model weights in GPU memory, and is already exploring options to reduce VRAM usage. For example, vLLM is investigating putting model weights in pinned CPU memory provided the host has lots of free memory. While that wouldn’t work for HBF because HBF doesn’t support fine-grained random access, other options might have promise. For example, MoE experts can be stored in HBF. Software can DMA active experts into HBM as needed.

vLLM’s KV cache can also be placed into HBF. However, that may only work well in a sparse attention implementation thatonly reads a subset of tokens off the top of the KV cache for each step. That allows most of the KV cache to sit “cold” in flash, which takes advantage of HBF’s capacity while placing less pressure on HBF’s lower bandwidth. A potential caveat is that the top-k read is scattered, while HBF prefers sequential reads. Perhaps software can get around this by DMA-ing the top-k rows into DRAM as needed.

Another opportunity is using HBF capacity to reduce cross-device communication. Large models are often sharded across multiple GPUs, which results in performance being bound by cross-device scatter and gather operations. Cross-device communication can become a bigger performance barrier than compute throughput or memory bandwidth. HBF can mitigate this by replicating more of a model’s weights across different GPUs. DMA-ing data off flash isn’t cheap, but it’s cheaper than going off-device.

Agarwal went over when HBF makes sense from a cost perspective. Basically, HBF is good if a workload doesn’t reach its bandwidth limits. That applies with smaller models and/or smaller batch sizes. If a workload becomes bandwidth bound, it’s bad for HBF’s cost equation because both cost per capacity and cost per bandwidth factor into final cost. HBF is great for cost per capacity, but is worse in cost per bandwidth compared to HBM.

He also discussed using HBM to cache hot experts, but that also seems like a difficult solution. Caching needs to work out well, or HBF bandwidth can throw a wrench into the works for the cost-per-token equation.

HBF may alleviate the DRAM capacity problem to some extent, but the software challenges feel immense. Handling HBF sounds a lot like working with a low level disk access API, like using FILE_FLAG_NO_BUFFERING in Windows or O_DIRECT in Linux. Software has to carry out accesses in large, aligned chunks rather than freely addressing storage with byte-level granularity. Modifying a single byte can mean reading a large 64 KB block into DRAM, modifying that block, and writing the whole block back to flash. That’s more like working with a block storage device than working with memory. A software framework meant to work with a regular DRAM-based system will need massive changes to leverage HBF. Moving to a different framework will mean re-doing the work needed to take advantage of HBF.

I would go as far as saying that the effort required to leverage HBF doesn’t seem far off what would be required to straight up reduce DRAM usage by streaming model weights off a SSD. Taking advantage of SSD actually seems easier. The OS kernel can abstract away the difficulty of doing block-aligned accesses if you don’t use FILE_FLAG_NO_BUFFERING or O_DIRECT,. Buffering in the kernel will let software arbitrarily seek and carry out byte-level read/write operations. It’ll also act as a cache, naturally insulating software from flash memory inefficiencies. While not mentioned in the talk, I wonder if existing attempts to stream model weights off SSDs can be applied to HBF. Or, if the software challenges associated with using HBF prove too steep and prevent its adoption. I guess we’ll see when/if HBF products hit the market. I want to see something that’ll alleviate the current DRAM shortage, but I’m not sure if HBF is it.

How a Network of Volunteers Is Liberating Critical Court Records for Everyone

403 Media
www.404media.co
2026-08-24 10:48:33
Habeas Dockets are publishing immigration court records that normally aren't available online....
Original Article

This article was republished from our friends over at Court Watch . Please consider subscribing to them if you want the early scoop on what's happening in our court system, from the concerning to the bizarre. Madeleine O’Neill is a freelance reporter in Baltimore.

Hundreds of street arrests that court records show disproportionately targeted Latinos in and around New York City. Detainees shuffled across the country one day before a congressional oversight visit. A judicial emergency in the Eastern District of California.

Each of these stories came to light because of habeas corpus — a centuries-old legal writ that has become a powerful tool for freeing immigrants swept up in the Trump administration’s mass detention and deportation campaign. Because they’re public court filings, habeas corpus petitions also offer a window into the often cryptic world of immigration enforcement.

But there’s a catch. Across the country, the nearly 50,000 habeas corpus petitions filed in recent immigration cases are public records only in theory, because a 2007 court rule makes the petitions impossible to access online like most other federal court records.

The rule has hobbled attorneys, journalists, and researchers trying to gather information about arrests and detention in this unprecedented era of immigration enforcement.

“The effect is it takes much longer to get access to these records in a particular case and it makes it basically impossible to get records in a lot of these cases at once,” said Renee Griffin, a staff attorney at the Reporters Committee for Freedom of the Press.

“It’s a real nationwide problem,” Griffin said.

A new project called Habeas Dockets is working to counteract this roadblock with help from volunteers. According to the project’s founder, 400 people across the country have contributed court records to the site, which publishes habeas corpus filings online for anyone to read them.

Court Watch spoke with founder John Kyle Cronan, a software developer from Chicago with no legal background besides his own curiosity.

“I’m the kind of person who has a PACER account just to look at stuff sometimes,” Cronan said, referring to the federal court's online document retrieval system.

He first noticed the effect of Federal Rule of Civil Procedure 5.2(c) in April 2025, when he tried to access court documents about a group of people the federal government was trying to send to CECOT, a maximum security prison in El Salvador known for its brutal conditions.

When Cronan tried to open the documents, he ran into the same message that greets anyone who tries to access these records online: “You do not have permission to view this document.”

A court clerk explained to Cronan that he could come in and view these public records in person at a courthouse kiosk. The courthouse was in northern Texas. Cronan was in Chicago.

“You’ve got me there,” Cronan remembers thinking. He decided to organize a volunteer effort to make these court records accessible online. The project has become Cronan’s full-time job, and he recently started fundraising to grow the site. Cronan relies on help from law students, paralegals, and volunteer attorneys to review each filing for sensitive information that should be redacted, even though he’s not legally required to do so.

The personal details potentially contained in immigration filings are the reason why there is a limit on electronic access in the first place. The privacy rule recognizes that immigration cases, like social security cases, are particularly likely to contain sensitive information—hence the shielding.

Immigration matters are usually handled in immigration court, which is separate from the federal court system and does not allow public access to filings. In some cases, however, a person seeking asylum or other protected status might end up taking their claims to a federal judge, at which point the filings become public records.

Those papers could contain highly sensitive information about trafficking or domestic violence victims, said Daniella Prieshoff, senior managing attorney at the Tahirih Justice Center in Baltimore. Making that information easily accessible online could be dangerous for vulnerable clients, who are fearful of Immigration and Customs Enforcement, in addition to their abusers or traffickers.

“It’s not just ICE, but it’s persecutors, abusers, traffickers,” Prieshoff said. “Our clients have very realistic concerns that those individuals will be able to find them at all costs, so having that parameter of allowing access to those records, but at a physical location, … I think that sets up a boundary that helps protect survivors.”

The flood of habeas corpus petitions filed under the second Trump administration is somewhat different than typical immigration cases filed in normal times. Usually an obscure area of law, habeas corpus petitions have become an increasingly important way to challenge the legality of an immigrant’s detention as ICE holds more people in facilities that are often ill-equipped to handle them.

These petitions are often filed hastily in the hours or days after a person has been arrested. They rarely contain the contents of asylum applications or other sensitive information, but lay out the bare bones facts of the petitioner’s detention.

Cronan’s team examines habeas filings before making them available online to ensure that any personal information, such as details about a person’s fear of persecution in their home country, is redacted.

Habeas Dockets first launched a year ago and became a nonprofit , operating under the name Immigration Justice Transparency Initiative, earlier this year.

“With the return of Trump, I really feel like the issues of immigration enforcement are the worst of all of it,” Cronan said. “I feel really strongly that what they’re doing is wrong and is harming people.”

About 29,000 documents have been uploaded to the site, Cronan said, with help from a group of volunteers that includes students, retirees, working folks with flexible schedules, and attorneys.

The electronic shielding rule is essentially an artifact of the early days of the internet, and much like PACER itself, it has not kept up with the times. The rule assumes that lawyers will go to the courthouse in person to do legal research on habeas cases, which is no longer the case, Cronan said. It also prevents attorneys, journalists, and researchers from accessing cases outside their geographic area, a significant hindrance as courts across the country handle thousands of new habeas cases.

The rule also has the side effect of making it harder to scrutinize the claims the government makes in habeas cases.

“It’s convenient for them,” Cronan said. The Habeas Dockets project will serve as an archive of the legal response to the federal government’s unprecedented fast-track approach to deportation.

Even when volunteers go to courthouses in person to view habeas filings, they sometimes run into roadblocks. At some district courts, clerks allow members of the public to view immigration records at access kiosks, but don’t allow them to print the pages out. You’re also not allowed to save the files to the computer or to a thumb drive, making it impossible to share the documents.

Habeas Dockets managed to get that policy changed in the Western District of Pennsylvania, Cronan said, but it remains a problem at four other district courts across the country. When printing is possible, Habeas Dockets reimburses volunteers for those costs from donations, Cronan said.

The Reporters Committee for Freedom of the Press also urged district courts to curb the electronic access restriction in a series of letters sent to the chief judges in five districts last year.

“This restriction prevents timely public access to fast-moving legal developments and impedes the ability of the press to report on critical, newsworthy matters,” RCFP wrote.

Two district courts declined, Griffin said, and others said they would send the request to their rules committee. None of the courts have acted on the request.

Codefloe Is a Professionally Hosted Public Git Forge

Hacker News
codefloe.com
2026-08-24 10:46:09
Comments...
Original Article

Git hosting in the EU. Built in the open.

A public Git service running on Forgejo, with a generous free tier, no feature behind a paywall, and infrastructure you can read.

Key facts

Hosted in Germany, under EU law

Everything runs and is stored on Hetzner in Germany, so your data falls under German data protection law and the GDPR.

Infrastructure you can read

The Ansible playbooks, OpenTofu modules, CI pipelines and monitoring configuration that drive CodeFloe are public repositories.

No feature gates

Private repositories, CI/CD, hosted pages, package registries and preview environments are free for everyone. Paid tiers only cover resource costs for storage and CI/CD.

Where we stand on AI

The most frequent questions about the innovation which moves tech the most.

We see AI as a tool, not a threat

We use AI tools ourselves, in this platform and in our own work. You are welcome to use them here too. Nothing about CodeFloe is built to make that harder.

Your code is never training data

We do not train models on anything you store here, and we do not sell or hand your data to anyone who would. Not now, and not later: it is not a business we intend to be in.

Abusive scrapers are not welcome

Aggressive crawlers can flatten a forge. We tackle them at the edge, so the platform stays fast for the people actually using it.

Forgejo on steroids

Forgejo is the complete software forge at CodeFloe's core, and most of what you use here is the Forgejo community's work: repositories, issues, pull requests, releases, packages, APIs and migrations.

We extend it in focused areas to create a more integrated developer experience, then run every change from a public fork. CodeFloe-specific work stays reviewable instead of disappearing into a private patch set.

Inspect how it runs

Most platforms ask you to trust a status page. The software, the servers and the pipelines behind CodeFloe are public repositories, so you can check instead.

# Rate-limit by source, exempting the git protocol and package pulls
acl abusive_rate    sc_http_req_rate(0) gt 100
acl is_git_protocol path_end /info/refs /git-upload-pack /git-receive-pack
acl is_known_bot    src -f /etc/haproxy/allowlist-good-bots.acl

http-request track-sc0 src table per_ip_rates
http-request deny deny_status 429 if abusive_rate !is_git_protocol !is_known_bot
Excerpt from the HAProxy configuration that shields codefloe.com.

A fresh approach to costs

Running costs are partially covered by donations and by the extended tiers. Income and expenses are reported transparently, and donations are split between the people maintaining and developing the platform.

See what you get

Still deciding?

Where the data sits, whether you can migrate from GitHub, who is accountable, and why we ask for donations.

See all FAQ

Migrating from somewhere else?

Import an existing project from GitHub, GitLab or Bitbucket with its history, issues and pull requests intact. Planning to move a bunch of repositories? Our very own batch migration CLI imports many repositories in one run.

Peppermint oil reduces blood pressure by 8.48 mmHg in small study

Hacker News
journals.plos.org
2026-08-24 10:44:55
Comments...
Original Article
  • Loading metrics

Open Access

Peer-reviewed

Research Article

Abstract

Hypertension represents the predominant risk factor for cardiovascular disease morbidity and mortality; with significant healthcare utilization and expenditure. Pharmaceutical management is habitually adopted; although its long-term effectiveness remains ambiguous, and accompanying adverse effects are disquieting. Peppermint, which is rich in menthol and flavonoids, may exert potential benefits relevant to hypertension. This trial aimed to explore the effects of twice-daily peppermint oil supplementation in individuals with pre- and stage 1 hypertension. A 20 day, parallel randomized, placebo-controlled trial was adopted (NCT05561543). 40 individuals with pre- and stage 1 hypertension were randomly assigned to receive 100 μL per day of either peppermint oil or peppermint-flavoured placebo. The primary trial outcome was the between-group difference in systolic blood pressure from baseline to 20 days. Secondary outcome measurements were the between-group differences in anthropometric, haematological, diastolic blood pressure/resting heart rate, psychological wellbeing, and sleep efficacy indices. Statistical analysis was conducted on an intention-to-treat basis using baseline-adjusted linear regression models comparing post intervention values between trial arms with the corresponding baseline value entered as a covariate; adjusted mean differences ( b ), 95% confidence intervals, and effect sizes ( d ) were calculated. In relation to the primary outcome, adjusted systolic blood pressure at 20 days was significantly lower ( b = −8.48 mmHg, 95% CI = −14.24 to −2.73, d = −0.94) in the peppermint trial arm (baseline = 130.05 mmHg, 20 days = 121.97 mmHg) than in placebo (baseline = 130.93 mmHg, 20 days = 131.05 mmHg). Loss to follow-up (N = 1) and adverse events (N = 1) were low, both occurring in the peppermint arm, and compliance was very high in the peppermint (93.3%) trial arm. Given the substantial health and economic burden associated with hypertension worldwide, these findings suggest that twice-daily peppermint supplementation may represent a simple, low-cost, and well-tolerated strategy to support blood pressure reduction in this population.

Trial registration

ClinicalTrials.gov NCT05561543

Citation: Sinclair J, Sant B, Du X, Shadwell G, Dillon S, Butters B, et al. (2026) Effects of peppermint ( Mentha x piperita L.) oil on cardiometabolic outcomes in patients with pre- and stage 1 hypertension: A placebo randomized controlled trial. PLoS One 21(4): e0344538. https://doi.org/10.1371/journal.pone.0344538

Editor: S Ezhil Vendan, Central Food Technological Research Institute CSIR, INDIA

Received: August 18, 2025; Accepted: April 3, 2026; Published: April 23, 2026

Copyright: © 2026 Sinclair et al. This is an open access article distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.

Data Availability: Our data can be found at the attached link: https://doi.org/10.17030/uclan.data.00000632 .

Funding: This project was funded by the Dowager Countess Eleanor Peel Trust (MED1105).

Competing interests: The authors declare no conflict of interest.

Introduction

Globally, hypertension is renowned as the leading risk factor for cardiovascular disease morbidity and mortality [ 1 ]. High blood pressure ranks first among modifiable risk factors attributable to cardiovascular disease aetiology, accounting for the largest proportion of coronary heart disease, heart failure, and stroke events [ 2 ]. It is associated with significant societal and economic consequences [ 3 ] and also mediates significant productivity loss from disability and premature death [ 4 ]. Thus, hypertension is one of the most consequential and remediable threats to the health of individuals and society.

Pharmaceutical intervention is the predominant treatment approach for hypertensive disease, and angiotensin-converting enzyme inhibitors, beta-blockers, calcium antagonists, and diuretics are the most commonly adopted approaches [ 5 ]. However, while these medicines are effective for the treatment of hypertension, their long-term comparative effectiveness in routine care remains an area of ongoing investigation, with some evidence indicating differences between drug classes [ 6 ]. In addition, long-term adherence can be suboptimal [ 7 ], in part because adverse effects and treatment burden may influence continued use [ 8 ]. These considerations, alongside overreliance of daily prescription medication and broader preference among some patients for non-pharmacological options, support continued evaluation of adjunctive approaches with favourable tolerability profiles for the management of cardiometabolic risk [ 9 ].

Improved dietary practices are the principal approach for the non-pharmaceutical prevention and management of hypertensive and cardiometabolic diseases [ 10 ]. Enhanced intake of fruits and vegetables has definitively been shown to improve hypertensive and cardiometabolic disease symptoms [ 11 ]. However, maintaining a habitual dietary pattern high in fruits and vegetables has been shown to be difficult to accomplish [ 12 ]; therefore, supplementation potentially represents a more appealing treatment and prevention modality.

Peppermint ( Mentha x piperita L.) is a recurrent flowering plant that cultivates in western Europe and North America. Peppermint is a hybrid of both spearmint ( Mentha spicata L.) and water mint ( Mentha aquatica L.). The peppermint plant contains a diverse chemical profile, including menthol, flavonoids, menthone, and menthyl acetate [ 13 ]. Peppermint possesses a broad range of biological activities, including digestive, choleretic, carminative, antiseptic, antibacterial, antiviral, antispasmodic, antioxidant, anti-inflammatory, myorelaxant, expectorant, analgesic, tonic, and vasodilatory properties [ 13 , 14 ], and has importantly been shown through toxicology analyses to be safe for ingestion [ 15 ].

Importantly, owing specifically to its antioxidant, anti-inflammatory, and vasodilatory properties, there is growing speculation that peppermint ingestion may target the mechanisms central to hypertensive pathophysiology, and thus confer significant clinical benefits [ 16 ]. To date, only very limited studies have been undertaken exploring the influence of peppermint supplementation on cardiovascular outcomes, with Barbalho et al. [ 17 ] showing that twice daily supplementation of peppermint, mediated significant reductions in both low-density lipoproteins (LDL) cholesterol and systolic blood pressure. However, this investigation did not feature a control group, meaning that the improvements cannot be attributed conclusively to peppermint supplementation, as opposed to other external mechanisms. Importantly, in healthy individuals, Sinclair et al. [ 16 ] showed using a placebo randomized controlled trial, that twice daily peppermint supplement yielded significantly greater reductions in systolic blood pressure, triglycerides and state/ trait anxiety compared to placebo.

At the current time, there has yet to be any randomized placebo-controlled intervention studies, examining the efficacy of peppermint supplementation in hypertensive individuals. Therefore, with preliminary evidence in healthy individuals suggesting a positive effect of peppermint ingestion [ 16 ], further placebo-controlled investigations concerning its influence on outcomes pertinent to hypertension may be of both practical and clinical relevance.

The aim of this placebo randomized trial is to investigate the effects of 20 days of twice daily peppermint supplementation in individuals with pre- and stage 1 hypertension compared to placebo. The primary objective of this trial is to investigate the effects of peppermint supplementation on systolic blood pressure relative to placebo. Its secondary objectives are to determine whether peppermint supplementation impacts upon other risk factors for hypertensive and cardiometabolic disease.

In relation to the primary outcome, it was hypothesized that peppermint oil will mediate statistically significant reductions in systolic blood pressure compared to placebo. Furthermore, for the secondary outcomes, peppermint oil will produce improvements in other cardiometabolic health parameters compared to placebo.

Materials and methods

Study design and setting

The comprehensive protocol for this study, detailing the study setting, CONSORT diagram, randomization process, recruitment strategy, and sample size calculation, has been previously published [ 18 ]. This study adheres to the latest guidelines for reporting parallel-group randomized trials [ 19 ] (S1). The University of Lancashire in the city of Preston in Lancashire, Northwest England, served as the location for the trial. In accordance with our previous trial, this research followed a 20 day parallel design, incorporating randomized allocation with a placebo control [ 16 ] ( Fig 1 ). After screening for eligibility and enrolment, participants were randomized at the individual level, using a computer program (Random Allocation Software) to either a peppermint or placebo group. Screening included confirmation of eligibility and exclusion criteria via a structured health history review, including assessment for diagnoses suggestive of secondary hypertension and for major comorbidities that could influence blood pressure or participant safety. Indices, pertinent to hypertension, as described in detail below, were assessed at baseline and after 20 days (post-intervention). In agreement with previous trials involving hypertensive individuals, the primary outcome measure was the between-group difference in systolic blood pressure from baseline to post-intervention [ 9 , 20 ]. Secondary outcome measures were between-group differences in anthropometric, haematological, diastolic blood pressure/ resting heart rate, psychological wellbeing and sleep efficacy indices. All experimental visits took place in the morning and were undertaken in a ≥ 10-hour fasted state. Participants were also required to arrive hydrated and to avoid strenuous exercise, alcohol, and nutritional supplements 24 h and caffeine 12 h prior.

Inclusion criteria

Eligibility criteria for this study required participants to meet the following conditions: (1) aged from 18–65 years; (2) fulfil the classification of pre- and stage 1 hypertension outlined by the American Heart Association [ 21 ], (3) not taking prescribed medicine for blood pressure management, (4) the ability to complete written questionnaires independently and (5) able to provide informed consent.

Exclusion criteria

Exclusion criteria were (1) diagnosed diabetes mellitus; (2) known cardiovascular disease or clinically significant cardiovascular comorbidity, including coronary heart disease, symptomatic heart failure, clinically significant arrhythmia, or a history of stroke or transient ischaemic attack within the previous 6 months; (3) known or suspected secondary hypertension, including renal, renovascular, or endocrine causes; (4) known clinically significant renal impairment or severe hepatic disease; (5) evidence or history of severe hypertension related target organ damage requiring specialist management; (6) pregnant or lactating women; (7) allergy to peppermint; (8) habitual consumption of peppermint products; (9) regular consumption of antioxidant supplements; (10) body mass index larger than 40.0 kg/m²; (11) current enrolment in other clinical trials or use of other external therapies likely to influence outcomes; and (12) any condition likely to compromise informed consent, protocol compliance, or outcome assessment, including severe psychiatric illness, cognitive impairment, or active substance or alcohol misuse.

Sample size

There has yet to be any investigation examining the efficacy of peppermint supplementation in hypertensive individuals. Therefore, a pragmatic a priori sample size calculation was undertaken based on our previous trial examining the effects of peppermint supplementation on systolic blood pressure (i.e., our primary trial outcome) in healthy individuals [ 16 ]. Considering an expected attrition rate of 10%, this revealed that 20 participants would be necessary in each trial arm, with a total N of 40, to achieve α = 5% and β = 0.80.

Participants and recruitment

Recruitment for this project commenced on 01/12/2023 and continued until 07/07/2025 and data collection itself formally ended on 05/08/2025. Both males and females of diverse races and ethnicities, who live in Preston and its surrounding areas, were recruited. Recruiting materials were placed using public patient bulletin boards as well as using social media. Individuals expressing interest in participation were able to reach out to the research team for additional details about the study and to address any questions related to participation. Written informed consent was acquired from all participants.

Ethical approval and trial registration

This study was granted ethical approval by the University of Lancashire HEALTH Ethics Committee (HEALTH 01074; S2-3), and all participants submitted written informed consent before participating, adhering to the principles stated in the Declaration of Helsinki. The trial was preregistered on clinicaltrials.gov (NCT05561543).

Dietary intervention

After the conclusion of their baseline data collection session, participants were provided with either pure peppermint oil (Piping Rock Health, UK) or placebo. Participants randomized to the peppermint arm were required to consume 50 µL of supplement diluted into 100 mL of water twice daily: once in the morning and again in the evening. This dose was selected based on our previous placebo randomized trial in healthy individuals using the identical dose and supplementation schedule, which demonstrated a significant reduction in systolic blood pressure with no reported adverse effects or dropouts and high compliance (90.03%) in the peppermint trial arm [ 16 ]. The placebo condition involved the consumption of a peppermint-flavored cordial (Schweppes, Schweppes Geneva) in the same quantity and manner as the peppermint group, without the presence of peppermint oil, menthol, or peppermint-derived constituents listed on the ingredient declaration. The placebo cordial was selected based on its ingredient declaration, and this approach to placebo preparation has been shown in previous trials to provide an effective blinding strategy [ 16 , 22 ]. To ensure effective blinding, identical opaque 15 mL dropper bottles without any labels were supplied to participants in both the placebo and peppermint trial groups, with the only difference being the solution, i.e., placebo or peppermint that they contained. Additionally, all supplements were prepared by an independent researcher to maintain blinding.

Both the peppermint oil and peppermint-flavored cordial utilized in this trial are commercially available, food-grade products that are approved for human consumption. Pure peppermint oil is marketed as a dietary supplement and listed as a Generally Recognized As Safe (GRAS) substance by the U.S. Food and Drug Administration (21 CFR §182.20). The peppermint-flavoured cordial is a commercially available beverage produced in compliance with UK and EU food safety regulations, approved for general sale and consumption under the UK Food Safety Act 1990 and the Food Information Regulations 2014. Furthermore, peppermint flavourings contained within the cordial are permitted under EU Regulation No. 1334/2008 on flavourings and food ingredients with flavouring properties. The selected dose in the present trial was derived from our previous human study [ 16 ], which demonstrated significant improvements in cardiovascular outcomes without adverse events and with high participant compliance, supporting both the tolerability and safety of the intervention.

Throughout the study, the participants were encouraged to maintain their habitual diet and exercise routines; and asked to refrain from consuming any other peppermint supplements. Participants were also asked to keep a 4-day diet diary prior to the baseline assessment and before the follow-up examination at the end of the 20 day treatment period [ 9 , 20 ]. This ensured that there were no differences in dietary patterns between groups and that participants had not made significant changes to their nutritional approach that could influence the study outcomes. Diet diaries were analyzed using WinDiets Nutritional Analysis Software Suite Version 1.0 (Robert Gordon University, Aberdeen, UK), allowing daily energy intake, fat, saturated fatty acids, protein, carbohydrate, sugars, fibre, alcohol, vitamin A, thiamine, riboflavin, niacin, vitamin B6, vitamin B12, folate, vitamin C, vitamin D, vitamin E, calcium, salt, iron, zinc, and selenium to be examined.

For their post-intervention data collection session, all participants were asked to return any unused supplementation/ placebo to the laboratory in order to determine the % compliance in each trial arm. Furthermore, in order to examine blinding efficacy, each participant was asked which trial arm that they felt that they had been allocated to at the conclusion of their post-intervention data collection session. In both groups loss to follow up was monitored, as were any adverse events.

Data collection

Blood pressure and resting heart rate.

Blood pressure and resting heart rate measurements were undertaken in an upright seated position. Peripheral measures of systolic and diastolic blood pressure and resting heart rate were measured via a non-invasive, automated blood pressure monitor (OMRON M2, Kyoto, Japan), adhering to the recommendations specified by the European Society of Hypertension [ 23 ]. Three readings were undertaken, each separated by a period of 1 min [ 24 ], and the mean of the last 2 readings used for analysis.

Anthropometric measurements.

Anthropometric measures of mass (kg) and stature (m) (without footwear) were used to calculate BMI (kg/m 2 ). Stature was measured using a stadiometer (Seca, Hamburg, Germany) and mass measured using weighing scales (Seca 875, Hamburg, Germany). In addition, body composition was examined using a phase-sensitive multifrequency bioelectrical impedance analysis device (Seca mBCA 515, Hamburg, Germany) [ 25 ], allowing percentage body fat (%) and fat mass (kg) to be quantified. Finally, waist circumference was measured at the midway point between the inferior margin of the last rib and the iliac crest and hip circumference around the pelvis at the point of maximum protrusion of the buttocks, without compressing the soft tissues [ 26 ]; allowing the waist-to-hip ratio to be quantified.

Haematological testing.

Capillary blood samples were collected by finger-prick using a disposable lancet after cleaning with a 70% ethanol wipe. Capillary triglyceride, total cholesterol and glucose levels (mmol/L) were immediately obtained using three handheld analyzers (MulticareIn, Multicare Medical, USA). From these outcomes’ LDL cholesterol (mmol/L) was firstly quantified using the Anandarja et al. [ 27 ] formula using total cholesterol and triglycerides as inputs. In addition, HDL cholesterol (mmol/L) was also calculated by re-arranging the Chen et al. [ 28 ] equation to make HDL the product of the formulae. Both of these approaches have been shown to have excellent similarity to their associated lipoprotein values examined using immunoassay techniques r = 0.948–0.970 [ 28 , 29 ]. The ratios between total and HDL cholesterol and between LDL and HDL cholesterol levels were determined in accordance with Millán et al. [ 29 ]. Finally, the triglycerides and glucose (TyG index) was calculated as the natural logarithm of the product of plasma glucose and triglycerides divided by two [ 30 ].

Questionnaires.

Sleep quality has been shown to be diminished in patients with hypertension and cardiometabolic disease [ 31 ], and supplementation of peppermint has been demonstrated to enhance sleep quality [ 32 ]. Therefore, general sleep quality was examined using the Pittsburgh sleep quality index (PSQI) [ 33 ], daytime sleepiness using the Epworth Sleepiness Scale [ 34 ] and symptoms of insomnolence via the Insomnia Severity Index [ 35 ]. These questionnaires were utilized cooperatively to provide a collective representation of sleep efficacy. The Pittsburgh sleep quality index measure consists of 19 individual items, creating 7 components (subjective sleep quality, sleep latency, sleep duration, sleep efficiency, sleep disturbance, use of sleep medication, and daytime dysfunction) that produce a global score ranging from 0 to 21, with lower scores denoting a healthier sleep quality. The Epworth Sleepiness Scale consists of a list of eight scenarios in which tendency to become sleepy is rated on a scale of 0–3. The total score is the sum of these responses and ranges from 0 to 24, with higher scores indicating increased sleepiness. The Insomnia Severity Index features seven questions in which sleep difficulty is rated on a scale of 0–4. The total score is the sum of these responses and ranges from 0 to 28, with higher scores indicating greater sleep difficulty.

Because psychological wellbeing is lower in those with hypertension and cardiometabolic disease [ 36 ], general psychological wellbeing was examined using the COOP WONCA questionnaire [ 37 ], depressive symptoms using the Beck Depression Inventory [ 38 ] and state/ trait anxiety with the State Trait Anxiety Inventory (STAI) [ 39 ]. Once again, these scales were utilized conjunctively to provide a collective depiction of psychological wellbeing. The COOP WONCA questionnaire comprises six scales (physical fitness, feelings, daily activities, social activities, change in health and over-all health) designed to measure functional health status on a scale ranging from 1 to 5. The final score is the mean of the six scales, with a higher score indicating reduced functional health. The Beck Depression Inventory is a 21-item questionnaire in which depressive symptoms are rated on a scale of 0–3. The total score is the sum of these responses and ranges from 0 to 63, with higher scores indicating greater depression. Finally, the State-Trait Anxiety Inventory uses 20 items to assess trait anxiety and 20 to examine state anxiety, rated on a scale of 0–4. The total score for both trait anxiety and state anxiety is the sum of these responses for each component and scores range from 20 to 80, with higher scores denoting greater anxiety.

Statistical analysis

Baseline demographic and clinical characteristics were presented descriptively for each trial arm. In accordance with CONSORT guidance, formal significance testing of baseline differences was not performed, and any observed differences were interpreted with reference to their prognostic relevance and the magnitude of any chance imbalance [ 19 ]. Continuous variables are expressed as means accompanied by their respective standard deviations, while categorical variables are reported as percentages (%) or frequencies (N). Comparisons of compliance levels (%) between trial arms were performed using linear regression models with trial arm included as a fixed factor.

All analyses of the intervention-based data adhered to an intention-to-treat approach. In accordance with our previously published trial protocol [ 18 ], treatment effects for all continuous outcome measures were estimated as between-trial-arm differences at 20 days, with adjustment for the corresponding baseline value of the same outcome. Accordingly, post-intervention values at 20 days were analyzed using linear regression models with trial arm included as a fixed factor and the corresponding baseline value entered as a covariate, an approach recommended for randomized controlled trials with baseline and follow-up continuous outcomes [ 40 , 41 ]. No additional baseline demographic or clinical characteristics were included as covariates in the primary models. For these analyses, the adjusted mean difference between trial arms at 20 days ( b ), 95% confidence intervals of the difference, and associated p-values are presented. Effect sizes were calculated as semi-standardised adjusted mean differences ( d ) by dividing b by the residual standard deviation from the fitted model [ 42 ]. Effect size values are interpreted as 0.2 = small, 0.5 = medium, and 0.8 = large [ 43 ].

The efficacy of blinding was assessed using a one-way chi-square ( Χ 2 ) goodness-of-fit test. Two-way Pearson chi-square tests of independence were applied for bivariate cross-tabulation analyses between trial arms. These analyses assessed the number of participants lost to follow-up and the incidence of adverse events in each group. Chi-square analyses were calculated using Monte-Carlo simulation to determine probability values. Missingness was limited to the 20 day post-intervention outcome values of two participants in the peppermint trial arm who did not complete the follow-up assessment; no baseline variables were missing. To preserve the intention-to-treat analysis set, missing 20 day outcome values were imputed using a fully conditional specification approach [ 44 ]. As the incomplete variables were continuous post-intervention outcomes, the imputation models were specified for continuous variables and were informed by treatment allocation and the corresponding baseline value of each outcome. All statistical analyses were performed using SPSS v29 (IBM Inc., SPSS, Chicago, IL, USA), and statistical significance was considered at the p ≤ 0.05 level.

Results

Baseline demographic, anthropometric, and health information

Baseline characteristics of participants are presented in Table 1 . Baseline systolic blood pressure, the characteristic of greatest prognostic relevance to the primary outcome, was similar between the placebo and peppermint trial arms.

Compliance, loss to follow up, and adverse events

Total trial completion numbers in each group were peppermint N = 18 and placebo N = 20, with loss to follow-up (N = 1) and an adverse event (N = 1) occurring in the peppermint arm ( Fig 1 ). The adverse event was minor and caused by the participant’s dislike of the taste of peppermint. The chi-square tests were non-significant, indicating that there were no statistically significant differences between trial arms in either loss to follow-up (p = 0.151) or adverse events (p = 0.311). There was no statistically significant difference (p = 0.565) in compliance between the peppermint (93.3%) and placebo (92.2%) trial arms.

Blinding efficacy

Of the 38 participants that completed the trial, 47.4% (N = 18) correctly identified their designated trial arm, the Chi-squared test was non-significant (p = 0.746) indicating that an effective blinding strategy was adopted.

Blood pressure and resting heart rate

Adjusted post-intervention systolic blood pressure ( b = −8.48 mmHg, 95% CI = −14.24 to −2.73, p = 0.005, d = −0.94), diastolic blood pressure ( b = −4.57 mmHg, 95% CI = −8.98 to −0.15, p = 0.043, d = −0.66), and resting heart rate ( b = −8.92 beats/min, 95% CI = −17.43 to −0.40, p = 0.041, d = −0.72) at 20 days were significantly lower in the peppermint arm compared to placebo after adjustment for baseline values ( Table 2 ).

Anthropometric measurements

Adjusted post intervention anthropometric measurements at 20 days did not differ significantly between the placebo and peppermint trial arms after controlling for baseline values (p = 0.407–0.954; Table 2 ).

Haematological testing

Adjusted post intervention haematological parameters at 20 days did not differ significantly between trial arms after controlling for baseline values (p = 0.121–0.921; Table 2 ).

Questionnaires

Adjusted post intervention questionnaire-based outcomes at 20 days did not differ significantly between trial arms after controlling for baseline values (p = 0.066–0.924; Table 2 ).

Diet diaries

Across all dietary intake measures, adjusted post intervention values at 20 days were similar between the placebo and peppermint trial arms after controlling for baseline values, with no statistically significant between group differences observed (p = 0.241–0.992; Table 3 )

Discussion

This trial aimed to evaluate the effects of a 20 day regimen of twice-daily peppermint supplementation on health indicators in individuals with pre- and stage 1 hypertension, relative to placebo. Notably, this study represents the first randomized controlled trial employing a parallel placebo-controlled design to investigate the impact of peppermint supplementation in this population. The primary objective was to examine the influence of peppermint supplementation on systolic blood pressure compared to placebo. Secondary objectives included assessing its effects on additional risk factors for hypertension and cardiometabolic disease.

In relation to the primary outcome, in agreement with our hypothesis and the findings of our previous trial in healthy individuals [ 16 ], adjusted systolic blood pressure at 20 days was significantly lower in the peppermint trial arm compared to placebo, with a large effect size. It is proposed that the observed benefits of peppermint supplementation were mediated by the presence of menthol. Menthol acts as an agonist for the transient receptor potential melastatin 8 (TRPM8) channels in vascular smooth muscle [ 45 ], with their activation subsequently triggering a vasodilatory effect. Specifically, the opening of vascular TRPM8 channels allows for the entry of calcium into the endothelium [ 46 ], which in turn stimulates nitric oxide production [ 47 ] and hyperpolarization of vascular smooth muscle cells [ 48 ]. Since arterial hypertension is the most common preventable risk factor for cardiometabolic disease [ 49 ], and the greatest single risk factor for global all-cause mortality [ 50 ], these findings have significant clinical implications. The results of this trial suggest that peppermint supplementation could be a valuable tool in the management of pre- and stage 1 hypertension.

In addition to the primary outcome, and in further support of our hypotheses, adjusted diastolic blood pressure and resting heart rate at 20 days were also significantly lower in the peppermint group compared to placebo. In addition to the aforementioned effects, it is proposed that the effects of peppermint in reducing the resting heart rate were also mediated as a function of menthol. In addition to the vascular effects described above, peppermint supplementation may also influence resting heart rate through autonomic nervous system modulation. Menthol has been shown to activate TRPM8 channels located on sensory neurons, which can alter autonomic balance by enhancing parasympathetic (vagal) activity and/or reducing sympathetic drive [ 51 , 52 ]. This shift in autonomic tone can reduce sinoatrial node firing rate, thereby lowering resting heart rate [ 52 ]. Importantly, epidemiological studies have shown that resting heart rate is an independent predictor of cardiovascular and all-cause mortality in both men and women with and without diagnosed cardiovascular disease [ 53 , 54 ]. Furthermore, epidemiological studies also suggest that reducing the resting heart rate is not only associated with decreased cardiovascular mortality but also with decreased all-cause mortality [ 55 ]. This observation provides further evidence that peppermint supplementation could be an effective tool in the management of cardiovascular disease.

Although significant reductions in systolic blood pressure, diastolic blood pressure, and resting heart rate were observed in the peppermint trial arm, it did not elicit statistically significant between-group differences in anthropometric, haematological, questionnaire-based, or dietary indices. It is ultimately beyond the scope of this trial and its experimental measures, to determine the mechanisms responsible for the lack of statistical differences in most secondary trial outcomes. However, the a priori sample size was determined to address the primary outcome and may therefore have provided limited statistical power to detect between-group differences in secondary trial measurements. In addition, the 20 day intervention period was designed to examine short-term responsiveness and may have been insufficient for detecting changes in outcomes that typically require longer exposure to manifest. Accordingly, larger trials of longer duration with follow-up are warranted to more definitively evaluate secondary endpoints and the sustainability of observed effects.

Overall, the current trial demonstrated a successful blinding strategy, a very low number of adverse events, good compliance, and a high retention rate in the peppermint group. Therefore, it can be concluded that peppermint is a safe, tolerable, and low cost (<£10 for 15 mL) modality for individuals with pre- and stage 1 hypertension, that can be easily incorporated into habitual dietary patterns. Notably, a significantly lower adjusted systolic blood pressure value at 20 days was observed in the peppermint trial arm, indicating that this supplement may represent an effective means of improving blood pressure in this population. However, it remains unclear whether these findings can be generalised to individuals in more advanced stages of hypertension or those with relevant comorbidities not examined in the present study. Further research is therefore warranted to establish whether the efficacy of peppermint observed in healthy individuals [ 16 ] and in the current cohort can be replicated in these populations. It is also notable that whilst other supplementary modalities such as Montmorency tart cherry and blueberry have also been shown to reduce systolic blood pressure and cardiometabolic risk factors [ 56 , 57 ], they necessitate the intake of increased sugar (≈15 g per 30 mL serving) and additional daily kilocalorie intake (≈80 kcal per 30 mL serving) [ 56 , 58 ]. In contrast, peppermint, administered in extremely small quantities relative to tart cherry or blueberry, may represent a more suitable option for supporting blood pressure control while aiding the maintenance of a healthy body weight.

As with any randomized controlled trial, this investigation is not without limitations. The a-priori sample size was determined to address the primary outcome and may therefore have provided limited statistical power to detect between-group differences in some secondary outcomes. Accordingly, null findings for secondary endpoints should be interpreted cautiously, and larger trials are warranted to more definitively evaluate these outcomes. A further limitation is the 20 day intervention period, which permits assessment of short-term blood pressure responsiveness but does not establish whether any effects are sustained. Given blood pressure variability and guidance that antihypertensive strategies should be evaluated over several months to establish maintenance of efficacy [ 59 ], longer trials with follow-up are required. Blood pressure outcomes were assessed using clinic style measurements obtained in a laboratory environment, which may not capture blood pressure throughout the day. Although more logistically and fiscally challenging, twenty-four-hour ambulatory blood pressure monitoring may be advantageous in nutritional interventions as it provides a more comprehensive depiction of systemic blood pressure across 24 hours and reduces the likelihood of white coat hypertensive readings [ 60 ]. Finally, while the present trial observed favourable effects of peppermint oil supplementation on blood pressure and selected cardiometabolic outcomes, it was not designed to elucidate the mechanistic basis for these changes. Menthol, a major constituent of peppermint oil, is a TRPM8 agonist and has been linked to vasodilatory effects via calcium dependent endothelial signalling and nitric oxide related pathways [ 45 48 ], but mechanistic indicators such as nitric oxide metabolites, endothelial function, and autonomic markers were not measured. Accordingly, mechanistic interpretation remains speculative, and future trials should incorporate such measures to evaluate underpinning pathways and optimise intervention delivery and clinical outcomes.

Conclusion

The current placebo randomized controlled trial aimed to investigate the influence of 20 days of twice-daily peppermint supplementation on blood pressure and related health indicators in individuals with pre- and stage 1 hypertension, compared to placebo. The trial supported our primary hypothesis that peppermint supplementation would lead to a significant reduction in systolic blood pressure relative to placebo. Given the substantial health and economic burden associated with hypertension worldwide, these findings suggest that twice-daily peppermint supplementation may represent a simple, low-cost, and well-tolerated strategy to support blood pressure reduction in this population.

Supporting information

Acknowledgments

The sponsor of this research is University of Lancashire, UK. This project was funded by the Dowager Countess Eleanor Peel Trust (MED1105). The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript. We sincerely thank the funder for their support of this project.

References

  1. 1. Roth GA, Mensah GA, Johnson CO, Addolorato G, Ammirati E, Baddour LM, et al. Global burden of cardiovascular diseases and risk factors, 1990-2019: update from the gbd 2019 study. J Am Coll Cardiol. 2020;76(25):2982–3021. pmid:33309175
  2. 2. Pencina MJ, Navar AM, Wojdyla D, Sanchez RJ, Khan I, Elassal J, et al. Quantifying importance of major risk factors for coronary heart disease. Circulation. 2019;139(13):1603–11. pmid:30586759
  3. 3. Davari M, Sorato MM, Kebriaeezadeh A, Sarrafzadegan N. Cost-effectiveness of hypertension therapy based on 2020 International Society of Hypertension guidelines in Ethiopia from a societal perspective. PLoS One. 2022;17(8):e0273439. pmid:36037210
  4. 4. O’Donnell MJ, Xavier D, Liu L, Zhang H, Chin SL, Rao-Melacini P, et al. Risk factors for ischaemic and intracerebral haemorrhagic stroke in 22 countries (the INTERSTROKE study): a case-control study. Lancet. 2010;376(9735):112–23. pmid:20561675
  5. 5. Gasparotto Junior A. Pharmacological Advances for Treatment in Hypertension. Pharmaceuticals (Basel). 2023;17(1):39. pmid:38256873
  6. 6. Li X, Bijlsma MJ, Bos JHJ, Schuiling-Veninga CCM, Hak E. Long-term comparative effectiveness of antihypertensive monotherapies in primary prevention of cardiovascular events: a population-based retrospective inception cohort study in the Netherlands. BMJ Open. 2023;13(8):e068721. pmid:37558444
  7. 7. Fuchs FD, Fuchs SC. Low Adherence to High Blood Pressure Treatments: Innovative Solutions Are Needed. J Am Heart Assoc. 2025;14(4):e039045. pmid:39950340
  8. 8. Tedla YG, Bautista LE. Drug Side Effect Symptoms and Adherence to Antihypertensive Medication. Am J Hypertens. 2016;29(6):772–9. pmid:26643686
  9. 9. Sinclair J, Shadwell G, Dillon S, Allan R, Butters B, Bottoms L. Effects of montmorency tart cherry and blueberry juice on cardiometabolic outcomes in healthy individuals: protocol for a 3-arm placebo randomized controlled trial. Int J Environ Res Public Health. 2021;18(18):9759. pmid:34574679
  10. 10. Ruskovska T, Maksimova V, Milenkovic D. Polyphenols in human nutrition: from the in vitro antioxidant capacity to the beneficial effects on cardiometabolic health and related inter-individual variability - an overview and perspective. Br J Nutr. 2020;123(3):241–54. pmid:31658907
  11. 11. Aune D, Giovannucci E, Boffetta P, Fadnes LT, Keum N, Norat T, et al. Fruit and vegetable intake and the risk of cardiovascular disease, total cancer and all-cause mortality-a systematic review and dose-response meta-analysis of prospective studies. Int J Epidemiol. 2017;46(3):1029–56. pmid:28338764
  12. 12. Desai T, Bottoms L, Roberts M. The effects of Montmorency tart cherry juice supplementation and FATMAX exercise on fat oxidation rates and cardio-metabolic markers in healthy humans. Eur J Appl Physiol. 2018;118(12):2523–39. pmid:30173287
  13. 13. Meamarbashi A. Instant effects of peppermint essential oil on the physiological parameters and exercise performance. Avicenna J Phytomed. 2014;4(1):72–8. pmid:25050303
  14. 14. Zhao H, Ren S, Yang H, Tang S, Guo C, Liu M, et al. Peppermint essential oil: its phytochemistry, biological activity, pharmacological effect and application. Biomed Pharmacother. 2022;154:113559. pmid:35994817
  15. 15. Sartori Tamburlin I, Roux E, Feuillée M, Labbé J, Aussaguès Y, El Fadle FE, et al. Toxicological safety assessment of essential oils used as food supplements to establish safe oral recommended doses. Food Chem Toxicol. 2021;157:112603. pmid:34648935
  16. 16. Sinclair J, Murray H, Smith V, Tom N, Cruz TC, Taylor PJ, et al. Effects of peppermint oil (Mentha piperita L.) on cardiometabolic and other health-related outcomes: a parallel placebo randomized controlled trial. Sport Sci Health. 2023;19(4):1329–38.
  17. 17. Barbalho SM, Machado FMVF, Oshiiwa M, Abreu M, Guiger EL, Tomazela P. Investigation of the effects of peppermint (Mentha piperita) on the biochemical and anthropometric profile of university students. Food Sci Technol. 2011;31:584–8.
  18. 18. Sinclair J, Du X, Shadwell G, Dillon S, Butters B, Bottoms L. Effects of peppermint (Mentha piperita L.) oil in cardiometabolic outcomes in participants with pre and stage 1 hypertension: Protocol for a placebo randomized controlled trial. PLoS One. 2025;20(5):e0321986. pmid:40333716
  19. 19. Moher D, Hopewell S, Schulz KF, Montori V, Gøtzsche PC, Devereaux PJ, et al. CONSORT 2010 explanation and elaboration: updated guidelines for reporting parallel group randomised trials. Int J Surg. 2012;10(1):28–55. pmid:22036893
  20. 20. Kimble R, Keane KM, Lodge JK, Howatson G. The Influence of Tart Cherry (Prunus cerasus, cv Montmorency) Concentrate Supplementation for 3 Months on Cardiometabolic Risk Factors in Middle-Aged Adults: A Randomised, Placebo-Controlled Trial. Nutrients. 2021;13(5):1417. pmid:33922493
  21. 21. Jones DW, Whelton PK, Allen N, Clark D 3rd, Gidding SS, Muntner P, et al. Management of stage 1 hypertension in adults with a low 10-year risk for cardiovascular disease: filling a guidance gap: a scientific statement from the american heart association. Hypertension. 2021;77(6):e58–67. pmid:33910363
  22. 22. Dillon SA, Walker M, Sinclair JK. The effect of peppermint oil on strength performance in resistance trained men. Medicine & Science in Sports & Exercise. 2016;48:245.
  23. 23. Stergiou GS, Palatini P, Parati G, O’Brien E, Januszewicz A, Lurbe E, et al. 2021 European Society of Hypertension practice guidelines for office and out-of-office blood pressure measurement. J Hypertens. 2021;39(7):1293–302. pmid:33710173
  24. 24. Pickering TG, Hall JE, Appel LJ, Falkner BE, Graves J, Hill MN, et al. Recommendations for blood pressure measurement in humans and experimental animals: part 1: blood pressure measurement in humans: a statement for professionals from the Subcommittee of Professional and Public Education of the American Heart Association Council on High Blood Pressure Research. Circulation. 2005;45(1):142–61. pmid:15699287
  25. 25. Bosy-Westphal A, Jensen B, Braun W, Pourhassan M, Gallagher D, Müller MJ. Quantification of whole-body and segmental skeletal muscle mass using phase-sensitive 8-electrode medical bioelectrical impedance devices. Eur J Clin Nutr. 2017;71(9):1061–7. pmid:28327564
  26. 26. Czernichow S, Kengne A-P, Huxley RR, Batty GD, de Galan B, Grobbee D, et al. Comparison of waist-to-hip ratio and other obesity indices as predictors of cardiovascular disease risk in people with type-2 diabetes: a prospective cohort study from ADVANCE. Eur J Cardiovasc Prev Rehabil. 2011;18(2):312–9. pmid:20628304
  27. 27. Anandaraja S, Narang R, Godeswar R, Laksmy R, Talwar KK. Low-density lipoprotein cholesterol estimation by a new formula in Indian population. Int J Cardiol. 2005;102(1):117–20. pmid:15939107
  28. 28. Chen Y, Zhang X, Pan B, Jin X, Yao H, Chen B, et al. A modified formula for calculating low-density lipoprotein cholesterol values. Lipids Health Dis. 2010;9:52. pmid:20487572
  29. 29. Millán J, Pintó X, Muñoz A, Zúñiga M, Rubiés-Prat J, Pallardo LF, et al. Lipoprotein ratios: Physiological significance and clinical usefulness in cardiovascular prevention. Vasc Health Risk Manag. 2009;5:757–65. pmid:19774217
  30. 30. Guerrero-Romero F, Simental-Mendía LE, González-Ortiz M, Martínez-Abundis E, Ramos-Zavala MG, Hernández-González SO, et al. The product of triglycerides and glucose, a simple measure of insulin sensitivity. Comparison with the euglycemic-hyperinsulinemic clamp. J Clin Endocrinol Metab. 2010;95(7):3347–51. pmid:20484475
  31. 31. Matricciani L, Paquet C, Fraysse F, Grobler A, Wang Y, Baur L, et al. Sleep and cardiometabolic risk: a cluster analysis of actigraphy-derived sleep profiles in adults and children. Sleep. 2021;44(7):zsab014. pmid:33515457
  32. 32. Jayadharani C, Devi RG, Priya AJ. Effect of peppermint oil among sleep apnea individuals. J Pharm Res Int. 2020;10:98–101.
  33. 33. Buysse DJ, Reynolds CF 3rd, Monk TH, Berman SR, Kupfer DJ. The Pittsburgh Sleep Quality Index: a new instrument for psychiatric practice and research. Psychiatry Res. 1989;28(2):193–213. pmid:2748771
  34. 34. Smith SS, Oei TPS, Douglas JA, Brown I, Jorgensen G, Andrews J. Confirmatory factor analysis of the Epworth Sleepiness Scale (ESS) in patients with obstructive sleep apnoea. Sleep Med. 2008;9(7):739–44. pmid:17921053
  35. 35. Morin CM, Belleville G, Bélanger L, Ivers H. The Insomnia Severity Index: psychometric indicators to detect insomnia cases and evaluate treatment response. Sleep. 2011;34(5):601–8. pmid:21532953
  36. 36. Ghanei Gheshlagh R, Parizad N, Sayehmiri K. The Relationship Between Depression and Metabolic Syndrome: Systematic Review and Meta-Analysis Study. Iran Red Crescent Med J. 2016;18(6):e26523. pmid:27621928
  37. 37. Bentsen BG, Natvig B, Winnem M. Questions you didn’t ask? COOP/WONCA charts in clinical work and research. Fam Pract. 1999;16(2):190–5. pmid:10381028
  38. 38. Wang Y-P, Gorenstein C. Psychometric properties of the Beck Depression Inventory-II: a comprehensive review. Braz J Psychiatry. 2013;35(4):416–31. pmid:24402217
  39. 39. Spielberger CD, Gorsuch RL, Lushene R, Vagg PR, Jacobs GA. Manual for the State-Trait Anxiety Inventory. Palo Alto, CA: Consulting Psychologists Press. 1983.
  40. 40. Vickers AJ, Altman DG. Statistics notes: Analysing controlled trials with baseline and follow up measurements. BMJ. 2001;323(7321):1123–4. pmid:11701584
  41. 41. J T, L B, T H, J R, M W, M H. Different ways to estimate treatment effects in randomised controlled trials. Contemp Clin Trials Commun. 2018;10:80–5. pmid:29696162
  42. 42. Shieh G. Assessing standardized contrast effects in ANCOVA: Confidence intervals, precision evaluations, and sample size requirements. PLoS One. 2023;18(2):e0282161. pmid:36827246
  43. 43. Cohen J. Statistical power analysis for the behavioral sciences. 2nd ed. Hillsdale, NJ: Lawrence Erlbaum Associates. 1988.
  44. 44. Tan P-T, Cro S, Van Vogt E, Szigeti M, Cornelius VR. A review of the use of controlled multiple imputation in randomised controlled trials with missing outcome data. BMC Med Res Methodol. 2021;21(1):72. pmid:33858355
  45. 45. Johnson CD, Melanaphy D, Purse A, Stokesberry SA, Dickson P, Zholos AV. Transient receptor potential melastatin 8 channel involvement in the regulation of vascular tone. Am J Physiol Heart Circ Physiol. 2009;296(6):H1868-77. pmid:19363131
  46. 46. Hu X-Q, Zhang L. Role of transient receptor potential channels in the regulation of vascular tone. Drug Discov Today. 2024;29(7):104051. pmid:38838960
  47. 47. Cohen RA, Vanhoutte PM. Endothelium-dependent hyperpolarization. Beyond nitric oxide and cyclic GMP. Circulation. 1995;92(11):3337–49. pmid:7586323
  48. 48. Félétou M, Vanhoutte PM. EDHF: an update. Clin Sci (Lond). 2009;117(4):139–55. pmid:19601928
  49. 49. Oparil S, Acelajado MC, Bakris GL, Berlowitz DR, Cífková R, Dominiczak AF. Nat Rev Dis Primers. 2018;4:18014. pmid:29565029
  50. 50. Forouzanfar MH, Liu P, Roth GA, Ng M, Biryukov S, Marczak L, et al. JAMA. 2017;317(2):165–82. pmid:28097354
  51. 51. Mao T-Y, Huang C-F, Liu D-Y, Chen C-T, Yang C-C. Effects of mentha piperita essential oil uptake or inhalation on heart rate variability and cardiopulmonary regulation during exercise. Monten J Sports Sci Med. 2021;10(2):65–72.
  52. 52. Kazadi L-C, Fletcher J, Barrow PA. Gastric cooling and menthol cause an increase in cardiac parasympathetic efferent activity in healthy adult human volunteers. Exp Physiol. 2018;103(10):1302–8. pmid:30070742
  53. 53. Jouven X, Empana JP, Escolano S, Buyck JF, Tafflet M, Desnos M, et al. Relation of heart rate at rest and long-term (>20 years) death rate in initially healthy middle-aged men. Am J Cardiol. 2009;103(2):279–83. pmid:19121452
  54. 54. Kovar D, Cannon CP, Bentley JH, Charlesworth A, Rogers WJ. Does initial and delayed heart rate predict mortality in patients with acute coronary syndromes?. Clin Cardiol. 2004;27(2):80–6. pmid:14979625
  55. 55. FERRARI R. Prognostic benefits of heart rate reduction in cardiovascular disease. European Heart Journal Supplements. 2003;5:G10–4.
  56. 56. Sinclair J, Bottoms L, Dillon S, Allan R, Shadwell G, Butters B. Effects of Montmorency Tart Cherry and Blueberry Juice on Cardiometabolic and Other Health-Related Outcomes: A Three-Arm Placebo Randomized Controlled Trial. Int J Environ Res Public Health. 2022;19(9):5317. pmid:35564709
  57. 57. Chai SC, Davis K, Wright RS, Kuczmarski MF, Zhang Z. Impact of tart cherry juice on systolic blood pressure and low-density lipoprotein cholesterol in older adults: a randomized controlled trial. Food Funct. 2018;9(6):3185–94. pmid:29862410
  58. 58. Sinclair J, McLaughlin G, Allan R, Brooks-Warburton J, Lawson C, Goh S, et al. Health Benefits of Montmorency Tart Cherry Juice Supplementation in Adults with Mild to Moderate Ulcerative Colitis; A Placebo Randomized Controlled Trial. Life (Basel). 2025;15(2):306. pmid:40003718
  59. 59. Chakraborty BS. Clinical trials of antihypertensives: Nature of control and design. Indian J Pharmacol. 2011;43(1):13–7. pmid:21455414
  60. 60. Pena-Hernandez C, Nugent K, Tuncel M. Twenty-Four-Hour Ambulatory Blood Pressure Monitoring. J Prim Care Community Health. 2020;11:2150132720940519. pmid:32646277

Dynamically Naming Servers

Lobsters
arch.dog
2026-08-24 10:36:35
Comments...
Original Article

I have a problem. A self hosting problem.

When I provision a new container or virtual machine to serve an application, I let my Ubiquiti router's DHCP server hand them an IP. I already have to manage some static IP assignments for things like my PostgreSQL cluster or Kubernetes nodes, so letting machines that don't need static IPs get one assigned is helpful to my mental load. And generally since these machine are long-running (rarely shut down), the IP reservation the router hands to them sticks around. It sticks around long enough, anyways, that I get comfortable assuming it's basically static and end up relying on it being the same always. This is, of course, wrong, but I did it anyways.

This really bit me when I moved my home subnet to a 10.0.0.0/8 range, rather than a 192.168.0.0/16 range. I was expecting everything to get new addresses assigned, so I was prepared, but it was still really annoying going through and grabbing all the new addresses. It's also an annoyance when a DHCP reservation does drop and the IP of a machine changes (which I won't notice until I actually need to use it). I curse myself, think "wasn't DNS supposed to solve this?", then go back to what I was trying to do in the first place.

But Arch! You say to your computer, "Why aren't you putting everything on you Tailscale Tailnet!!??"

The short version is that even for how easy Tailscale is to get up and running on a machine, I still find it a bit of a hassle, especially for a homelab where there's a decent amount of churn. I also don't want to have to rely on Tailscale being functional to use services already on my LAN (Tailscale hasn't had issues that impacted me in my time using it, but I digress, I want to avoid that lock-in). My partner doesn't run their computer and phone connected to Tailscale all the time, but would still like to access some of these services without having to toggle it on. And finally, its much easier for me to reason with my home network without having to think about Tailscale routing or going around issues transparently.

Basically, while every VM and LXC being on Tailscale would be useful , I'd find it more of a hassle for little gain and thus rely on a few "ingress points" on the Tailnet to route to LAN services (e.g my Proxmox NAS runs Caddy, which reverse proxies to LAN subnetted services, and is on Tailscale).

Finding myself with ample free time after being made redundant from my employer, I finally decided to take a crack at this. I did try to use the DNS entries that Ubiquiti routers generate for DHCP clients, but I found the behaviour unsatisfactory. If a machine self-declared a static IP address, it wouldn't populate an entry in the router, and the entries for the DHCP clients that were available were inconsistently available. Anyways, I had a better plan. For treens .

Dynamic DNS services have been around forever. An easy way to point a domain to a home IP address that isn't static, automatically updating the relevant record when the IP changes. There are plenty of options for doing this with "real" domain nameservers, but I wasn't aware of any that would work well entirely locally , only exposing the records to the LAN they sat on (and where they're actually useful). I started sketching out a plan. First, we need a way for a machine to authenticate with the service to tell it the IP we want associated with the hostname. There are so, so many ways of doing this, but the key for my homelab was making it automatic . I didn't want to generate an API key and put it on a server or do some other auth dance. I wanted a machine to be able to claim its own hostname mostly autonomously, so I ended up going with message signing using ed25519 keypairs. The client generates its own private key and registers the public side with the server, claiming its hostname with the server. Subsequent update messages are sent with a signature header which the server can use to verify the message is authenticate, then updates the hostname record with the desired IPs.

I also wanted to work in a Merkle Tree for record validation, but ended up scraping that idea for the time being. Merkle Trees are neat and a really effecient way of validating a chain of hashes, but I realised also very redundant in the initial implementation. I intend to have one for the audit log, but haven't gotten that far. Hence the name "treens" (Tree Name Server).

Realistically, this project is fairly simple. Assuming, of course, you don't pick Rust for it. I keep picking Rust for projects because I've found it cozy to work with, but I did have to spend some time fighting, or adapting to, handling UDP and TCP messages directly. The Hickory DNS project has some crates for handling the payloads and types for DNS requests, so that wasn't a huge issue, but I did have to think about things like "how do I make sure I don't exhaust all connections to the server" or "why is TCP so weird with its special headers, UDP is so much better".

SQLite was picked as the backing store for simplicity. I did want to explore a KV like Sled or redb, but SQLite won out because of existing familiarity. Another addon to this I want to explore is clustering / gossiping of new entries as well, so instances can be shifted around or scaled in a larger environment, but if I ever find it useful in a larger environment I suspect I may find other edge cases that cause issues before SQLite needs to be reconsidered.

The end result is a DNS server with TCP and UDP handlers that responds with entries for the hosts that have registered with it, and a basic HTTP endpoint for handling new hosts and IP updates. Records aren't served until a host is "approved", and since I wanted this to be relatively autonomous I allow subnets to auto-approve based on the client's requesting IP address (rather than the one they declare, since they are allowed to differ).

I've pointed my homelab's Unbound instances to the running server with a stub-zone and have just been letting it run in the background while I slowly update configurations to point to the new local subdomain (in my case, .lan.gmem.ca ). So far it's been problem free, but I'm sure as I continue to iterate on it with my free time I'll find some issues - which I'll undoubtly post about on Mastodon .

This is also one of the rare instances where I might actually recommend one of the projects I've built for use. While most projects are fairly specific for my problem/use case, this is probably one that is generic enough that I want to make an effort in the "deploy it yourself" area. We'll see where that goes, anyways.

I dug through hundreds of Labor Day sales to find real deals on high-quality products that last

Guardian
www.theguardian.com
2026-08-24 10:15:35
Prepare for autumn with our favorite end-of-season deals on staples including leaf blowers, blankets and beddingCollege grads share the room essentials that weathered the dormSign up for the Filter US newsletter, your weekly guide to buying fewer, better thingsLabor Day offers one last hurrah for su...
Original Article

Labor Day offers one last hurrah for summer, a chance to reset for fall, and if you’re shopping, some choice end-of-season discounts.

No matter your plans for the long weekend, we found sales on products to make the most of it while helping you prepare for the colder months ahead.

Here are 22 of our favorite Labor Day sales, including a food storage system for stashing your leftovers and a blanket to replace your summer linens .


At a glance: the best Labor Day deals

Our Place Titanium Always Pan Pro

Read more

$99

Levoit Top-Fill 2.5L Humidifier

Read more

$24.99

Bissell Little Green Pet Pro Portable Carpet Cleaner

Read more

$139.99

Garmin Forerunner 165 Smartwatch

Read more

$199


Labor Day kitchen sales

Le Creuset Enameled Cast Iron Round Dutch Oven

Le Creuset

Enameled Cast Iron Round Dutch Oven, 4.25qt

$239.95

Le Creuset Enameled Cast Iron Round Dutch Oven
Now $239.95, originally $299.95 at Amazon

Le Creuset hardly needs an introduction thanks to its heirloom-level quality that withstands decades of enthusiastic cooking. “Like all Le Creuset pans, it holds heat well and distributes it evenly, and moves from stove to oven to table effortlessly,” said Julia Skinner, a Filter contributor and kitchen expert. Simmer hearty soups, stews and more for 20% off.

Le Creuset

Enameled Cast Iron Round Dutch Oven, 4.25qt

$239.95


Ninja Foodi Air Fryer

Ninja

Foodi Air Fryer

$159.99

Ninja Foodi Airfryer
Now $159.99, originally $199.99 at Amazon

If your kitchen is looking a little cluttered, score a solid 20% off this cooking expert- approved air fryer that bakes, broils and roasts. It’s even a favorite around the Guardian’s newsroom: “It allowed me to sear, pressure-cook and air-fry my food without having to buy loads of extra equipment, and it was much quicker than using the oven,” writes Sammy Gecsoyler, a Guardian news reporter.

Ninja

Foodi Air Fryer

$159.99


Our Place Titanium Always Pan Pro

Our Place

Titanium Always Pan Pro, 8.5in

$99

Our Place Titanium Always Pan Pro
Now $99, originally $175 at Our Place

Our Place makes pans that not only perform *chef’s kiss*, but are also free of harmful Pfas chemicals. Our testers from Drexel Food Lab crowned the Titanium Always Pan Pro king for its “combination of lightweight handling, impressive nonstick performance and genuinely useful design”, and it is now 43% off in the smaller, 8.5in model.

Our Place

Titanium Always Pan Pro, 8.5in

$99


Counter Culture Coffee Single-Origin Subscription

Counter Culture Coffee

Single-Origin Subscription

$27.30


Labor Day home and beauty sales

Frontgate Resort Collection Bath Towels

Frontgate

Resort Collection Bath Towels

$35

The Frontgate Super-Plush on a table outside
Photograph: Jon Chan/The Guardian
Now $35, originally $50 at Frontgate

After testing more than 10 bath towels , seasoned product reviewer Jon Chan named these as best for gifting, on account of the wide color selection and option for monogramming. Right now they’re $15 off and you can add a monogram free of charge, making these an easy gift option if you’re getting a jump start on your holiday shopping .

Frontgate

Resort Collection Bath Towels

$35


Levoit Top-Fill 2.5L Humidifier

Levoit

Top-Fill 2.5L Humidifier

$24.99

Levoit Top Fill 2.5L Humidifier for Bedroom
Now $24.99, originally $39.99 at Amazon

As the air outside and in your home turns dry, so too can your airways. This cool misting option features many of the elements Chan appreciates in a humidifier: a top-fill design to reduce spills, a dimmable control panel for a more restful sleep environment and an extended run time for all-night comfort. It’s now 38% off – just in time for cold and flu season.

Levoit

Top-Fill 2.5L Humidifier

$24.99


The Purple Mattress

Purple

The Purple Mattress (king)

$1,760

The Purple Mattress
Now $1,760 (king), originally $2,199 at Purple

Tired of waking up with an achy back ? Level up your sleeping situation with this medium-firm, pressure-relieving mattress that’s on sale until 15 September. “I have a Purple mattress. I love the darn thing; it’s not like anything you’ve ever experienced with a mattress before, you basically float on top of it,” according to the sleep entrepreneur Rockwell Shah.

Purple

The Purple Mattress (king)

$1,760


Bissell Little Green Pet Pro Portable Carpet Cleaner

Bissell

Little Green Pet Pro Portable Carpet Cleaner

$139.99


Mrs Meyer’s Clean Day Liquid Hand Soap Refill

Mrs Meyer’s

Clean Day Liquid Hand Soap Refill

$7.68

Mrs. Meyer’s Clean Day Hand Soap Refill
Now $7.68, originally $9.99 at Amazon

My home consists predominantly of Mrs Meyer’s cleaning products, from aromatic hand soaps to versatile multi-surface cleaner that at once cleans and imparts a fresh scent. Now that it’s 23% off, I’m eager to restock the hand soaps around my house with this 33oz refill container that’ll allow me to limit my single-use plastic consumption.

Mrs Meyer’s

Clean Day Liquid Hand Soap Refill

$7.68


Bissell PowerClean DualBrush Vacuum

Bissell

PowerClean DualBrush Vacuum

$259.99

Bissell PowerClean DualBrush Vacuum
Now $259.99, originally $359.99 at Amazon

When reviewer John Brandon put the Bissell PowerClean stick vacuum head to head against a pricier Dyson counterpart, he noticed Bissell ’s superior suction was more capable of handling dry messes, from rice to granola. Now $100 off, it’s an even smarter steal for keeping your floors guest-ready .

Bissell

PowerClean DualBrush Vacuum

$259.99


Bedsure Bubble Faux Fur Blanket

Bedsure

Bubble Faux Fur Blanket

$79.99


Crayola Model Magic

Crayola Model Magic
Now $28.99, originally $36.99 at Amazon

When we polled parents to find out about the best gifts for school-aged kids , Crayola Model Magic topped our list. “Blake enjoys creating shapes and figures using all different colors. He loves that he can let his creation air dry and put it in a display in his room,” said the parent of a four-and-a half-year-old. Now at 22% off, the white version of this modeling clay will allow them to use their imagination and fine motor skills to create artwork they can be proud of.

Crayola

Model Magic

$28.99


Origins GinZing SPF 40 Energy-Boosting Tinted Moisturizer

Origins

GinZing SPF 40 Energy-Boosting Tinted Moisturizer

$36

Origins Ginzeng SPF 40 Energy Boosting Tinted Moisturizer
Now $36, originally $48 at Sephora

For Guardian beauty columnist Sali Hughes, Origins’ tinted oil-free moisturizer is a solid option if “you either can’t be bothered to apply foundation in the heat or prefer a fresher look at this time of year.” While it’s only available in one shade at Sephora, Origins’ site offers a wider range . Add it to cart for 25% off.

Origins

GinZing SPF 40 Energy-Boosting Tinted Moisturizer

$36


Outdoors and on the go sales

Hydro Flask Water Bottle, 32 oz

Hydro Flask

Water Bottle, 32oz

$35.87

Hydro Flask Water Bottle, 32 oz
Now $35.87, originally $44.95 at Amazon

Between its double-wall insulation to keep drinks ice-cold or piping hot, convenient carry handle and ability to withstand daily jostling, there’s not much more you could want in a reusable water bottle. Grab the white colorway – now 20% off – for your commute, workout class or someone on your holiday gifting list .

Hydro Flask

Water Bottle, 32oz

$35.87


Owala Stainless Steel SmoothSip Coffee Mug

Owala

Stainless Steel SmoothSip Coffee Mug, 20oz

from $23.99


Coleman Pro Heavy-Duty 25-Quart Cooler

Coleman

Pro Heavy-Duty 25-Quart Cooler

$159.99

Coleman Pro 25 Quart Cooler
Now 119.99, originally $159.99 at Amazon

Don’t let anyone tell you it’s too late in the season to take your drinking and dining al fresco. Stay armed with your favorite iced beverages and fresh snacks with one of our favorite coolers, now a cool 25% off and its second-to-lowest price ever. “This is a sturdy cool box, easily strong enough to double as a seat if needed, and it comes with a five-year guarantee,” said tester Linda Geddes.

Coleman

Pro Heavy-Duty 25-Quart Cooler

$159.99


Ryobi 40V HP Whisper Series Leaf Blower

Ryobi

40V HP Whisper Series Leaf Blower

from $279

A photo of a Ryobi 40V HP Whisper Series leaf blower
Photograph: Josh Patterson/The Guardian
A detail shot of a Ryobi 40V HP Whisper Series leaf blower
Photograph: Josh Patterson/The Guardian
Now $279, originally $349 at Home Depot

Brace for fall with this Filter-vetted electric leaf blower, now $70 off. When we tested seven top cordless electric leaf blowers, the Ryobi was our overall favorite for its ergonomic design and long battery life. “It is also impressively quiet. In testing, the Whisper Series produced the lowest noise levels of any comparable full-sized blower, especially at mid-range settings,” said Josh Patterson, an outdoor writer.

Ryobi

40V HP Whisper Series Leaf Blower

from $279


Garmin Venu 3 Smartwatch

Garmin

Venu 3 Smartwatch

$294.99

Garmin Venu 3 Smartwatch
Now $294.99, originally $449.99 at Amazon

When the Guardian’s consumer tech editor, Samuel Gibbs, put the Venu smartwatch to the test, he noted its bright and crisp display, lightweight and stylish construction, intuitive app controls and “world-class fitness features”. Grab the latest edition of the expert-approved smartwatch for 34% off, the cheapest we’ve ever seen it.

Garmin

Venu 3 Smartwatch

$294.99


Garmin Forerunner 165 Smartwatch

Garmin

Forerunner 165 Smartwatch

$199

Garmin Forerunner 165 Smartwatch
Now $199, originally $249.99 at Amazon

For a fraction of the price and all the bells and whistles to keep you active and hitting your goals rain, shine or snow , you can’t beat the Garmin Forerunner 165 , which hardly ever leaves the wrist of Gould, a runner and our editorial coordinator (who owns the pricier version that lets you download music). It also earned top marks in testing by the Guardian’s consumer tech editor, Samuel Gibbs, for its high-end design and tracking metrics, making its current 20%-off deal feel extra tempting.

Garmin

Forerunner 165 Smartwatch

$199


Beats Studio Pro Noise-Cancelling Headphones

Beats

Studio Pro Noise-Cancelling Headphones

$169.99

Beats Studio Pro Noise Cancelling Over the Ear Headphones
Now $169.99, originally $349.99 at Best Buy

“The Studio Pro are without doubt the best-sounding Beats headphones to date,” writes Gibbs. Music to the ears of iOS and Android users alike, these headphones, which have solid spatial audio for watching films and clear quality for making calls, are now $180 off.

Beats

Studio Pro Noise-Cancelling Headphones

$169.99


Sonos Arc Ultra Soundbar

Sonos

Arc Ultra Soundbar

$899

Sonos Arc Ultra
Now $899, originally $1,099 at Amazon

“You don’t need captions; you need better speakers. And for most people, the easiest, fastest, most affordable option is a simple soundbar,” writes tech journalist Ryan Waniata, who’s been testing different models for ten years and counting.

One of our recommendations is Sonos’ Arc Ultra , an audio speaker to enhance your TV’s sound, which he says “can also be expanded with other Sonos gear for a multi-room sound or surround sound,” and is now on sale for 18% off.

Sonos

Arc Ultra Soundbar

$899


Tonies Toniebox 1 Audio Player Starter Set with Playtime Puppy

Tonies

Toniebox 1 Audio Player Starter Set with Playtime Puppy

$69.99

Toniebox 1 Audio Player Starter Set with Playtime Puppy
Now $69.99, originally $99.99 at Amazon

Shopping for kids can feel impossible (just ask my toddler who wants nothing but also everything at the same time). Somehow, this screen-free audio player for stories and songs happens to please even the pickiest of children while also serving as a bedtime wind-down tool any frazzled parent will appreciate. Make toddler birthday or holiday shopping that much easier with this 30%-off deal.

Tonies

Toniebox 1 Audio Player Starter Set with Playtime Puppy

$69.99


Other pieces you might enjoy from the Filter , the Guardian’s guide to buying fewer, better things:

Explore the Filter

Learning from COINTELPRO’s Survivors: Accountability and Repair

OrganizingUp
convergencemag.com
2026-08-24 10:03:21
Featured illustration: Kimmie Dearest “Stiner,” a San Quentin Prison correctional officer yelled. “You've got mail.” Nearly fifty years after COINTELPRO tore through the Black liberation movement, Watani Stiner found himself staring at a letter he was afraid to open.  On the envelope was a name...

Albanese seeks to quell datacentre disquiet as climate expert warns ‘we’ve got one shot to get the rules right’

Guardian
www.theguardian.com
2026-08-24 10:01:35
Prime minister will use national cabinet meeting to assuage premiers over new AI law as AEMO forecasts seven-fold rise in datacentre power useGet our breaking news email, free app or daily news podcastAnthony Albanese will seek to use Wednesday’s high-stakes talks with premiers to quell growing unha...
Original Article

Anthony Albanese will seek to use Wednesday’s high-stakes talks with premiers to quell growing unhappiness about national controls on datacentre developments , promising new approval laws will complement state rules.

Faced with growing opposition from conservative governments in Queensland and the Northern Territory, Albanese will tell national cabinet he plans a major piece of legislation next year to ensure the economic benefits of AI are shared widely.

With potential to be one of the major reforms of Labor’s second term, the new law will set tough copyright rules for AI businesses, and impose standards for security, safety and skills development.

The meeting on Wednesday will come after the latest forecast from the Australian Energy Market Operator showing datacentre power use is projected to increase seven-fold over the next decade.

Sign up for the Breaking News Australia email

The industry’s rapid growth, driven by increasing reliance on AI and cloud computing, remained one of the most significant causes of growth in electricity demand, according to AEMO’s annual Electricity Statement of Opportunities.

In addition to 165 datacentres already operating around the country, a further 225 are in development, the report showed, reflecting a substantial increase in new proposals compared to 2025, AEMO said on Tuesday.

Datacentre electricity demand was expected to grow from 5 to 34 terawatt hours by 2035-36, the report said, growing from 3% of overall consumption to 13%.

AEMO said high datacentre growth could see consumption reach 52 TWh – a 10-fold increase over the decade.

But there were high levels of uncertainty, with more than a third of projects listed in 2025 since cancelled, and operating facilities taking years to ramp to full capacity.

Daniel Westerman, AEMO’s chief executive, said record levels of new generation and storage coming online had improved the outlook for reliability, even with the expected retirement of coal power stations.

“The reliability outlook has improved, supported by record levels of new generation and storage, and a strong pipeline of projects expected over the next decade.”

Climate Council chief executive, Amanda McKenzie, said datacentres were set “to devour an enormous share of Australia’s electricity in the coming years”.

“We’ve got one shot to get the rules right now and ensure that datacentre growth doesn’t strain our grid and push up pollution.”

Albanese will use national cabinet to strike agreement on a plan to legislate nationally consistent minimum obligations for datacentres, requiring them not to push up energy prices, meet their own infrastructure costs and minimise water use.

The rules will also require developers to minimise the effect of new datacentres on local communities, ensuring they are appropriately sized and appropriately located, away from homes, schools and potential housing or agricultural sites.

skip past newsletter promotion

Projects approved for development before the new rules come into place will only be subject to existing state and territory laws.

Last month, the prime minister promised “the strongest possible protection” for Australian creatives against misuse of their work by artificial intelligence models. He said it would be “theft” if writers, artists and musicians didn’t have control of their work or receive payment for its use in training large AI models.

Combining the elements into a single piece of legislation signals the government’s ambition on AI, but could also heighten the political risk of getting the bill through parliament ahead of the next election.

Queensland premier David Crisafulli and the NT chief minister, Lia Finocchiaro, have signalled opposition to federal rules requiring datacentres to be powered by renewable projects at the exclusion of coal and gas.

Albanese is expected to seek broad consensus, but could be challenged by the increasingly outspoken Liberal-National and Country Liberal party leaders.

He will also discuss state opposition to the national gun buy-back, which only has support from New South Wales and the ACT so far. Action to curb violence against women and the growing H1 bird flu crisis are also on the agenda.

Anger about Western Australia’s favourable GST share will also flare. In Perth on Monday, Albanese said he would not change the deal, which costs taxpayers more than $6bn a year.

“There will be no change to WA’s GST arrangements while I’m prime minister,” he said.

Promising Australia would do more to unlock frontier AI development in the future, Albanese will tell a Business Council event on Tuesday the government was determined to succeed.

“It will advance our national sovereignty. And it is essential for our national security, business productivity, science, innovation and resilience.”

Microsoft Teams now lets admins block external bots from meetings

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 10:00:19
Microsoft is rolling out a new Teams meeting protection policy that allows administrators to automatically block all identified external bots from joining Teams meetings. [...]...
Original Article

Teams

Microsoft is rolling out a new Teams meeting protection policy that allows administrators to automatically block all identified external bots from joining Teams meetings.

This new feature builds on another Teams policy introduced in June that added smarter bot protection , ensuring all detected bots are tagged in the lobby and require organizer approval before joining.

The new policy goes one step further and will automatically prevent external bots from joining Teams meetings, without requiring explicit organizer confirmation before they're admitted.

image

"With this update, organizations can strengthen meeting security by configuring Teams policies to automatically block detected external meeting bots from joining meetings," the company said in a Microsoft 365 Message Center update on Friday. "This gives administrators additional control over how identified bots are handled and can help reduce organizational risk."

This new admin policy is rolling out as part of a targeted release until the end of August and should reach general availability worldwide by late September.

It will be available under the "Manage bots" meeting protection settings in the Teams admin center, will be off by default, and will require admin activation and evaluation before deployment.

After being enabled, the policy can be assigned to specific users or groups through existing Teams meeting policy management, and all identified external meeting bots will be blocked from joining meetings governed by the newly assigned policy.

The change ensures that third-party bots (which can have various uses, from note-taking and transcription to other automated tasks) and malicious apps controlled by threat actors cannot join Teams meetings without attendees and organizers realizing that a non-human participant has been added.

As Microsoft warned in April, attacks abusing Teams for access and lateral movement on enterprise networks are surging, with threat actors impersonating IT or helpdesk staff to contact employees via cross-tenant chats and trick them into granting remote access to steal data.

Since December, admins can also block external Teams users via the Defender portal to thwart cybercrime gangs (including ransomware groups ) attempting to abuse Teams in social engineering attacks targeting victims' employees.

As announced in June, Microsoft is also planning to add additional admin controls, including policies to block external bots entirely, allow lists for approved bots, admin reports and audit logs on bot detection and presence, and more granular controls for different security requirements.​

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

South Korean startup platform breach exposes key management failures

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 10:00:10
A breach at South Korea's government-backed startup platform exposed encrypted personal data after an encryption key was included in an API. Penta Security explains why encryption keys must be securely managed and kept separate from the data they protect. [...]...
Original Article

Key management system

In July, South Korea’s government-backed startup support platform, Modu-ui Changup (모두의창업), suffered a data breach. The incident later revealed a critical encryption key management failure, demonstrating how encrypted data can still become exposed when organizations fail to protect encryption keys properly.

The platform supports a nationwide startup audition program overseen by South Korea’s Ministry of SMEs and Startups (MSS), and it stores participants’ personal information, including startup ideas, email addresses, and names.

One month before the reported data breach, concerns had already been raised that applicants’ personal information could be structured and exposed through API responses within the platform. The government stated that it took immediate action. However, it did not disclose whether it had improved the platform’s underlying security architecture.

On June 18, the Ministry of SMEs and Startups announced that personal information and summaries of startup ideas had been leaked. It subsequently launched a detailed investigation together with the National Intelligence Service, the Cyber Security Center, and the National Police Agency.

On July 31, authorities confirmed that the decisive cause of the personal information and startup idea leak was the exposure of an encryption key through an API.

How the Data Breach Occurred

The leaked data had already been encrypted. However, encrypted data requires an encryption key for decryption.

In this incident, the encryption key was exposed together with the API data, resulting in the disclosure of email addresses, evaluation comments, and startup idea summaries belonging to about 5,000 successful applicants.

The Ministry of SMEs and Startups explained that the encryption key had been included within the API. According to the ministry, an external party collected API data through methods such as web crawling, which led to the exposure of the key.

In particular, email addresses configured as private were not visible on the public-facing interface. Nevertheless, investigators determined that they could be obtained through AI-based web crawling.

This case also illustrates the risks of hard-coding encryption keys as fixed values within application code, configuration files, databases, or similar environments.

When organizations use this approach, the keys themselves can become exposed along with the systems or data they are supposed to protect. In other words, the fundamental cause of this incident can be viewed as a security architecture that failed to incorporate proper encryption key management.

Authorities identified 39 IP addresses involved in accessing the leaked information, all of which originated in South Korea. They also stated that investigations were continuing into further details, including possible connections to AI solution providers.

As in this case, when an encryption key becomes externally exposed, simply revoking the compromised key and issuing a new one is not enough. Organizations must also re-encrypt all existing data protected by the compromised key and analyze key access logs to determine the full scope of the breach.

In addition, they need to reassess access permissions across APIs, servers, and internal storage systems. They must also notify affected data subjects and implement continuous monitoring.

Once an encryption key is compromised, organizations may have to invest substantial time and resources to redesign their security architecture.

Why Encryption Key Management Matters

As the South Korean government startup platform breach demonstrates, encryption alone provides little meaningful protection if an organization does not separate encryption keys from the data they protect. Without secure encryption key management, encrypted information remains exposed.

If an encryption key is compromised, an attacker may gain the ability to access data within the system in real time. Furthermore, the attacker may be able to impersonate legitimate users and gain control over the system. The effectiveness of data encryption directly depends on the security of its key management.

For encryption to provide genuine protection, organizations should store encryption keys in a dedicated Key Management System (KMS) that remains physically or logically separated from databases and applications.

Applications should request access to a key from the KMS only when they need to read or process protected data. They should not store the key themselves.

Encryption is also essential for meeting regulatory requirements such as the GDPR, Cyber Resilience Act (CRA), and HIPAA. However, inadequate key management can allow encrypted data to be decrypted immediately after a key is compromised, undermining the effectiveness of encryption and preventing organizations from achieving the intended level of regulatory compliance.

Therefore, organizations seeking to meet global security and compliance requirements should consider cybersecurity solutions from specialized vendors such as Penta Security, which has extensive expertise in both encryption and encryption key management.

D.AMO Key Management: Effective Protection For 30 Years

D.AMO, Penta Security’s data security platform , provides encryption-based data protection together with secure key management and access control, backed by nearly 30 years of cybersecurity expertise. D.AMO provides integrated encryption, access control, backup, and recovery capabilities across an organization’s entire infrastructure, including both on-premises and cloud environments.

Penta Security’s Data Security Platform has been deployed by more than 10,000 customers across industries including finance, government, and the private sector. Its extensive deployment history and technical expertise demonstrate the reliability of the platform.

In addition, D.AMO can apply NIST-standardized post-quantum cryptography (PQC) algorithms to key management, helping organizations prepare their data security architecture for the quantum computing era.

The D.AMO Key Management System (D.AMO KMS) physically and logically separates encryption and decryption keys from the data they protect.

Moreover, it manages the entire key lifecycle and performs log integrity checks, enabling organizations to quickly investigate key-related activity when a security incident occurs.

D.AMO key management service

If D.AMO had been implemented on the South Korean government startup platform, the data breach caused by inadequate encryption key management could have been prevented.

Enterprises and public institutions need to shift their approach to data security from post-incident response to proactive prevention. Most importantly, they should protect sensitive data with both strong encryption and secure, centralized encryption key management.

Learn more about Penta Security DSP: D.AMO

Sponsored and written by Penta Security .

Micro language implementation: Calcium

Lobsters
nedbatchelder.com
2026-08-24 09:56:40
Comments...
Original Article

Saturday 22 August 2026

A tiny language, to explain how programming languages are implemented.

I wrote a tiny language implementation: Calcium . It’s meant as a demonstration of how languages like Python are implemented. It has a tokenizer, a parser, an AST, a compiler, bytecodes, and an execution engine, all in about 300 lines of code.

I did it because I often see the question: isn’t Python interpreted? Why do people say it’s compiled? (BTW, I also answered this in an earlier blog post: Is Python interpreted or compiled? Yes. ) It can be hard to explain that your Python program never becomes an explicit sequence of native CPU instructions, which is what people often think “compiled” means.

So I coded up Calcium to have on hand the next time it comes up. I think it will help to be able to show the execution engine code reading bytecodes and doing what they say.

It could also be an interesting starting point for people wanting to play with a language implementation. It has almost nothing, so there’s lots of simple things (comments?) to add.

Media UNMASKS Democratic Socialist House-Having Hypocrisy

hellgate
hellgatenyc.com
2026-08-24 09:47:50
Plus: More news for your Monday morning....
Original Article
Media UNMASKS Democratic Socialist House-Having Hypocrisy
(Hell Gate)

Morning Spew

Plus: More news for your Monday morning.

Got yourself a dreaded case of the Mondays? Start your week off right by catching up on last week's episode of the Hell Gate Podcast. Listen here or wherever you get your podcasts, or watch our beautiful faces on our YouTube channel .

Listen

Give us your email to read the full story

Sign up now for our free newsletters.

Sign up

Germany’s Die Linke Takes a Stand

Portside
portside.org
2026-08-24 09:46:31
Germany’s Die Linke Takes a Stand Kurt Stand Mon, 08/24/2026 - 09:46 ...
Original Article

Economic, demographic, environmental, democratic, geopolitical — the multitudinous crises besetting Germany only seem to deepen by the month. The situation may be dire, but the resurgence of Die Linke over the past 18 months has established a much needed counterweight to the incessant right-wing drift of German politics. In August 2026, Die Linke overtook the SPD in national polling for the first time in the party’s history, crossing the 12 percent threshold. And among younger people in particular , democratic socialism is an increasingly appealing alternative to the mainstream consensus of austerity, militarization and xenophobia—one which has pushed the catastrophic possibility of the far-right party Alternative for Germany (AfD) attaining power frighteningly close to reality.

The party’s annual conference, held in June in Potsdam outside of Berlin, saw the party more energized and unified than at any time since the 2000s. A mass of new delegates (more than half attending a party conference for the first time ) revealed the changes undergone by the party’s base, which recently doubled its membership to 126,000: there were more women, young people, and those with a family history of migration, more West Germans, and more wearing the Palestinian keffiyeh.

From 3% to Frontrunner

Seemingly fated for oblivion ahead of a federal election in February 2025, the party was polling at 3 percent and harried by the left-conservative Sahra Wagenknecht Alliance (BSW) , which split from it a year before. But Die Linke rallied during the campaign under the dual leadership of Ines Schwerdtner and Jan van Aken (who announced he was stepping aside due to health concerns in Potsdam), taking several direct mandates through mass door-knocking campaigns and proving itself a major force on social media. The party beat expectations and won 8,8 percent of the vote.

This year's conference saw the party consolidate its newfound momentum, sharpen its social, economic and foreign policy positions, and debate how to advance itself as a workers' party.

Time to ensure that the fascists, while out of power, never even come close to it again. Time to build counter-power.

Die Linke could lead a state government for the first time in Berlin, where it is in the lead ahead of elections in September. But the urgency of Germany's crisis allows no time for celebration. In the eastern states of Saxony-Anhalt and Mecklenburg-Vorpommern, which also go to the polls next month, only the margins of AfD’s certain victories are open to contest. In her conference speech, Schwerdtner spoke somberly about the challenges ahead: not only the party’s lasting struggle to establish itself as a worker’s party worthy of the name, but a simultaneous fight against the reactionary center and the fascist right.

"We must realize that the best we can achieve in September is to buy ourselves time,” she said. “Time to ensure that the fascists, while out of power, never even come close to it again. Time to build counter-power. Time to become anchored in society.”

Fighting Austerity

In July, the governing coalition of the Christian Democratic Union (CDU) and SPD announced a “Programme for Revival and Employment,” an attempt to revitalize Germany’s dysfunctional economy by rolling back pension entitlements, working conditions and healthcare access .

Schwerdtner has called the measures the greatest assault on the welfare state since Gerhard Schröder’s Agenda 2010 reforms of the early 2000s, which led to Die Linke’s formation. The party has called for nationwide protests against the cuts, attempting to unite unions and social movements under the “Enough is Enough” campaign. The results have been modest so far, but the consequences have only begun to take effect: Citing a predicted shortfall in revenue from the reforms, hospital chain Vivantes walked back an agreement with union Ver.di, leading to a two-month strike in Berlin , seriously affecting patient care.


As a matter of solidarity and credibility, Potsdam conference delegates voted to cap the salaries of deputies at slightly above the average national wage.

To address the cost of living pressure on workers, the party wants a higher minimum wage, cheaper public transport, a nationwide rent freeze and VAT exemptions on essential goods. As a matter of solidarity and credibility, Potsdam conference delegates voted to cap the salaries of Bundestag and European Parliament representatives at slightly above the average national wage. The leadership pushed this measure through against considerable resistance from within the parliamentary party.

Germans might be facing austerity, but for guns the government’s chequebook is open . The government has doubled down on its frenzied remilitarization, allocating 110 billion Euros in next year’s budget to defense spending, which is predicted to account for one-third of all government expenditure by 2030. A lucky few of the tens of thousands of industrial workers facing redundancy may find themselves manufacturing rocket parts for the Israeli Defence Forces or drones to chase Russian soldiers between trenches in Donestsk. Dismal numbers of volunteers to fill the ranks of Germany’s armed forces mean conscription will likely be reintroduced.

Die Linke’s “practical antimilitarism” links barbarisms at home and abroad, proposing that peace and diplomacy be given the highest priority, imperialist military interventions be resisted, and international justice pursued with allies from the Global South. Domestically, it is already assisting young men to register as conscientious objectors , and organising opposition against the transformation of industry toward arms manufacturing. The party has proposed a 20 billion Euro fund for climate investments, backed by stronger worker protections, which could revive the economy, reduce inequality and help Germany reach its climate targets—which the present government has all but abandoned.

Saxony-Anhalt: Holding the Line Against The AfD

The increased antagonism between Die Linke and the CDU is of critical importance in Saxony-Anhalt, where they are the only parties certain to make it into parliament behind the AfD, which is chasing an outright majority with 43% in polls . How many, if any, of the other four parties will clear the 5% entry hurdle will decide what form an anti-AfD alliance might take. Fragile minority coalitions in the neighbouring states of Saxony and Thuringia have kept the AfD at bay so far, but have not required close cooperation between the two parties. According to a leaked internal Die Linke paper mapping out potential post-election scenarios, refusing collaboration with CDU altogether would likely result in the AfD electing a leader in the third round, which only requires a simple majority to break a deadlock.

Whether Die Linke should prioritise protest or governance (with all the compromises it requires) has been a fundamental strategic question since its founding, but the stakes today are higher than ever before.Should the AfD take control of the state’s interior ministry, right-wing extremists could direct its police and intelligence apparatuses against political opponents and minority groups. The local party’s attacks on “un-German” culture, particularly the Bauhaus in Dessau, leave no doubts as to its affinity to the völkisch ideology of the Nazis, who pressured the art school into closing in 1932 when they took control of the local government.

Die Linke will refuse to support any AfD-like policies advanced by the CDU, or any that undermine social and economic rights.

A gaffe by newly-elected co-chair, Luigi Pantisano, only worsened tensions between Die Linke and the CDU. Just days after publicly supporting cooperation with the conservatives in Saxony-Anhalt, he told the party conference that there was “absolutely no difference” between the fascist politics of the CDU and the AfD. A retraction a few days later was rejected by the CDU’s chairman, and Merz reaffirmed once again his party’s refusal to work with Die Linke. Eva von Angern, Die Linke’s lead candidate in Saxony-Anhalt, was particularly irritated by Pantisano: in other states, the party might have the luxury of choosing more suitable coalition partners; she does not.

Die Linke will refuse to support any AfD-like policies advanced by the CDU, or any that undermine social and economic rights. But nevertheless, the so-called firewall ( Brandmauer ) between the mainstream and far right might soon be a relic of a previous era. Both the BSW and liberals (FDP) now reject it, and the CDU, which is already cozying up to the far-right in the European Parliament in Brussels, cannot be relied upon to maintain the firewall for much longer. Parliamentary arrangements alone plainly will not contain this development. Support for the AfD is now deeply embedded in the social worlds of tens of millions of Germans. Whether Die Linke’s anti-fascist organizing in schools, workplaces, and unions will manage to put up meaningful, long-term resistance to German society’s drift to the right remains to be seen.

A Socialist Mayor For Berlin?

In Berlin, the situation could hardly be more different. Polling in first place under lead candidate Elif Eralp, who is running a Zohran-Mamdani inspired campaign to “make Berlin affordable,” Die Linke has its first chance to implement municipal socialism in the German capital. Alongside the reintroduction of a 9 euro travel ticket and the opening of public canteens, the party has vowed to finally implement the 2021 referendum demanding the expropriation corporate landlords , which passed with 59% of votes cast. The move would take hundreds of thousands of apartments into public ownership. Over the past decade, rents have risen faster in Berlin than almost any major European city.

The revival of the expropriation campaign, which the incumbent CDU-SPD Berlin government had simply refused to even consider, has drawn immediate hostility from the right and center. In early July, the federal government announced plans to legally prohibit German states from expropriating private landlords ––which Die Linke has has criticised as unconstitutional. The primary target, already identified by Eralp, will be Vonovia, a DAX-listed real estate giant which owns 138,000 apartments in the capital, many of which were once state-owned until mass privatisation in the 2000s.

More quietly, Die Linke have also proposed cutting funding and powers to police ––a welcome change from the CDU’s proclivities to use fences , security cameras and police batons to address drug use, petty crime and peaceful pro-Palestine marches. Despite a low crime rate, Berlin has significantly more police officers per resident than New York .

On the first day of the party conference delegates voted both to describe Israel’s war there as a genocide, and recognize Israel’s continued right to exist.

A return to the Red-Red-Green coalition of Greens, Die Linke and SPD is, however, far from certain. The SPD’s lead candidate has absolutely ruled out expropriation or cuts to the police’s budget. In interviews, party head Ines Schwertner has insisted upon implementing the referendum . The strategic value of this position is self-evident: Only by achieving a reversal of neoliberal privatisation— which the political mainstream has claimed is impossible—will a socialist agenda gain nationwide credibility.

However late in the day, the party has also begun to take a clear stance on what has been its most divisive issue: Palestine. Much of the first day of the party conference was taken up with discussions around Gaza—with delegates ultimately voting both to describe Israel’s war there as a genocide , and recognize Israel’s continued right to exist. As incongruous as these positions may seem, they mark a significant shift for the party, whose equivocation around Gaza has severely damaged its reputation among the international left. Though opinions do not break cleanly along generational lines, the influx of young pro-Palestine members—its youth branch recently described Israel as fundamentally racist and colonialist—has undoubtedly offset the pro-Israel sympathies of many older members. Still, positions in line with other European socialist parties, whether principled anti-Zionism or the economic and cultural boycott of Israel, remain unthinkable for Die Linke—and would isolate it from potential coalition partners. How to engage with other parties will be a central question after the elections in September, when the influx of new members and Die Linke's principled stand against fascism and austerity may pay off.

The Rosa Luxemburg Foundation is one of the largest political education institutions in the Federal Republic of Germany, and part of the broader international democratic socialist movement.

Emacs 31.1 released

Linux Weekly News
lwn.net
2026-08-24 09:36:44
Version 31.1 of the Emacs editor has been released. There is a long list of changes including the removal of the Emacs dumper, a new user Lisp directory feature, a "Send to..." menu item in context-menu-mode, and many other changes; see the NEWS file for more information. Mickey Petersen, author of ...
Original Article

Version 31.1 of the Emacs editor has been released. There is a long list of changes including the removal of the Emacs dumper , a new user Lisp directory feature, a "Send to..." menu item in context-menu-mode , and many other changes; see the NEWS file for more information. Mickey Petersen, author of Mastering Emacs , also has a rundown of some of the quality-of-life features appearing in this release.


From : Sean Whitton <spwhitton-AT-spwhitton.name>
To : emacs-devel-AT-gnu.org
Subject : Emacs 31.1 released
Date : Mon, 24 Aug 2026 11:43:32 +0100
Message-ID : <87pkz7pzmz.fsf@melete.silentflame.com>
Archive-link : Article
Hello everyone,

Version 31.1 of Emacs, the extensible text editor, should now be
available from your nearest GNU mirror:

  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.gz
  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.xz

The tarballs are signed; you can get the PGP signature files at:

  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.gz.sig
  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.xz.sig

You can choose a mirror explicitly from the list at:
  https://www.gnu.org/prep/ftp.html

Mirrors may take some time to update; the main GNU ftp server is at:
  https://ftp.gnu.org/gnu/emacs/

--------------------------------------

To verify that the tarball is intact, download both the .sig and
the tarball, and run this command:

  gpg --verify emacs-31.1.tar.gz.sig

(and similarly for emacs-31.1.tar.xz if you download that format).

If that command fails because you don't have the required public key,
run this command to import it:

  gpg --keyserver keyring.debian.org --recv-keys \
    8DC2487E51ABDD90B5C4753F0F56D0553B6D411B

Alternative keyservers include keyserver.ubuntu.com and
keys.openpgp.org.

You can also run sha256sum or sha512sum and confirm that these checksums
match:

SHA256  emacs-31.1.tar.gz
3cad7fd1466c0e24867df8d2609da3ac75abc90d7c4c0175e410e9be46d4092a
SHA256  emacs-31.1.tar.xz
1da5790d9580c81932b5bf700633114468da7b3412d69faa767daebf974f4586

SHA512  emacs-31.1.tar.gz
1d6e34a99367e1cdc2ab08ef7c073bbabda7cff21cda616c346591f507128df9437698fc74143ba46267a269c64148b18c2967de8f8ae0544322b68f0009acfa
SHA512  emacs-31.1.tar.xz
25cb810d09eaaa58306f4c10f406466c424517657dd1c9db056dadb624f0bc33db58f3bcdf527d81e5059e492b81c237f164eb3997bf4357bd84c696537f6836

----------------------------------------

For a summary of changes in Emacs 31, see the etc/NEWS file in the
tarball; you can view it from Emacs by typing 'C-h n', or by clicking
Help->Emacs News from the menu bar.

You can also browse NEWS on-line using this URL:

  https://git.savannah.gnu.org/cgit/emacs.git/tree/etc/NEWS...

For the complete list of changes and the people who made them, see the
various ChangeLog files in the source distribution.  For a summary of
all the people who have contributed to Emacs, see the etc/AUTHORS
file.

For more information about Emacs, see:
  https://www.gnu.org/software/emacs

-- 
Sean Whitton

Attachment: signature.asc (type=application/pgp-signature)

-----BEGIN PGP SIGNATURE----- iQJNBAEBCgA3FiEEm5FwB64DDjbk/CSLaVt65L8GYkAFAmqMIFQZHHNwd2hpdHRv bkBzcHdoaXR0b24ubmFtZQAKCRBpW3rkvwZiQENnD/0eAKXWfpmJkkyQu05OHWsz vwmyMD1y7KP98a34miwoMhxnkWHCsmFVCXxLEuse2P/4I0K27nU8IqYPTj7aSBrQ SbMfUAg8svYb4uVvEBCqwZseoWOVGq4Cq4kAjdVBcMd1qfZjvgIhLkcaKNyrCNRT e8X0xO0KYYyr4p6bYthU/Ce0ehWsFTPEuOLNldIfrSWisSrYU5fvcBdwc58PXQGq 4qKdVKE7znoX2Pk9pa991Yu5RJmlhvuU5rTNwqgWNfuOpE+YCVoGW17dPC4p13BS zyE2TS+DGZfTkneHec+30NSW0tDYmOysNTw+AKzQEJbG8ph1KfbDewPFGlAkZpri MHanCq5k36NwW90BWkkqWAPOC9KmK7av4pf10HAluGCdgymxfx1lK0r5YRWyQOWo XD0ecZadmlndmF1SSsfvr5iE67a60ZcbQ/xtv1crcMnMenA5C0pMDyfLfK+cLk54 ka3NNLzCZj27eOuZUM5WsT/aHLEPtlnWFRYWPGHC1i+YDCwxPZD6Vq6fSXsALr7G 3yYOIHKQDrUcrn+AGuF4IiCyk/6wUFOS99GUiD/+5ELXrJDBEtgP6bBh3erx/Yzr ftkN/DbuU4mtPAPqD7zJfFDp7ohB6bUZW3GLbsWZx/UT5MZ8Rdy7zNd/Fpf20DMp cgQXiVZLAZIeEJokTCIwvw== =gZS/ -----END PGP SIGNATURE-----



Show HN: A techno machine in one HTML file, with verifiable renders

Hacker News
ssx360.github.io
2026-08-24 09:17:11
Comments...

How Europe is killing makers and micro-entrepreneurs

Hacker News
lectronz.com
2026-08-24 09:05:25
Comments...
Original Article

Lectronz is a marketplace for open-source hardware makers and DIY electronics. Most of our sellers are not factories or well-funded start-ups. They are engineers, independent designers, and hardware enthusiasts working from spare rooms, garages, and tiny workshops.

Some earn a living from their products. Some sell only a handful of boards each year. Others build ten units simply because they created something useful and want to share it with the community. Occasionally, one of those experiments grows into a real business. Every Arduino begins somewhere.

But the European Union's new packaging rules now threaten to kill the world of makers and micro-entrepreneurs, putting jobs, livelihoods and an entire ecosystem of innovation at risk.

And this threat is not just limited to makers and engineers. It affects artists, craftspeople and other micro-entrepreneurs selling their work across the EU.

A good idea, a terrible implementation

The EU has required producers to take responsibility for packaging waste for many years through Extended Producer Responsibility (EPR) schemes. The new Packaging and Packaging Waste Regulation (PPWR), which generally applies from 12 August 2026, aims to harmonise packaging rules across the European Union and reduce waste.

The main idea of EPR is sensible: businesses that place packaging on the market should help finance its collection and recycling.

For makers, this means taking responsibility for the boxes, envelopes, plastic bags and other packaging used to deliver their products. This is an idea we can all get behind.

Unfortunately, instead of creating a single European system, the PPWR preserves a fragmented national model. A business selling directly to customers across the EU must register and fulfil its obligations separately in every Member State where its packaging becomes waste. For large companies, this is part of the cost of doing business; for micro-businesses selling only a handful of products into each country, the cost and administrative burden can be wildly disproportionate to the amount of packaging involved.


Imagine an engineer in Greece who designs a €25 open-source sensor board...

During the first year, he sells five to Germany, two to France, two to Austria and one to Belgium. Each ships in a small antistatic bag and a padded envelope. The amount of packaging generated for each sale is probably around 50 grams.

He has just become a packaging waste producer in four countries.

Based on indicative prices currently quoted by national schemes and compliance providers, the annual cost for France alone can look like this:

  • Registering for a packaging scheme, totalling €110 in fees per year.
  • Using the services of an Authorised representative, adding €190 to €300 in costs per year.
  • Spending time registering, documenting, and reporting waste created.

These indicative costs continue to add up for each country:

  • Belgium: €50 to €100 administrative fees per year, plus the services of an authorised representative (approx. €250 to €450).
  • Germany: registration is free, but packaging-scheme participation starts at approximately €10 per year, plus an authorised representative costing around €190 per year.
  • Austria: €250 administrative fees per year, plus the services of an authorised representative (approx. €100).

In short, the barrier to entry for these four countries totals €1150 per year in an optimistic scenario.

The weight-based environmental contribution associated with half a kilogram of packaging should be measured in cents. The bureaucracy required to account for it is measured in thousands of euros.


Now imagine you want to sell to all 27 Member States! To make it worthwhile, our Greek engineer needs to sell not 10 boards, not 100, but literally thousands of boards every year from the very start.

It simply isn’t worth it anymore.

Killing innovation softly

Often, innovation doesn’t come from large established corporations, but from small businesses that start from scratch with new ideas and little money. Before becoming successful and selling millions of products, many companies started selling 10, then 100, then 1000. Most businesses never make it there. But there has to be space where ideas can be tested. This is one of the reasons Lectronz exists.

In the past year, while some sellers on Lectronz sold hundreds of products, half of our registered sellers got fewer than 10 orders. This is not a bug, but the nature of a marketplace like Lectronz where makers are free to experiment with product ideas. Some ideas don’t work. Some creators on Lectronz only build 10 units and share them with the community without making a profit. But even products that “fail” have a value. When hardware creators share them with the community, they help others grow as well. One piece of hardware may unlock the creation of another, leading to new product ideas and innovation.

The EPR regulations threaten the existence of this innovative space in the EU.

EU policymakers keep sounding the alarm about Europe’s lack of innovation, but seem hell-bent on making it as hard as possible for innovation to emerge at all, with regulations that create a disproportionate barrier to entry for micro-enterprises and SMEs. It’s an environment where only big players like Amazon, Temu, or eBay can exist.

Lectronz is also a micro-enterprise

Lectronz collects a 5% fee on every transaction it processes. We waive this fee on the first five sales to encourage sellers to test our platform. After years of work, and with the recent surge of new sellers joining our platform in 2026, Lectronz now generates roughly the equivalent of one modest salary.

I did not build it to become the next Amazon. I built it because independent hardware creators deserve a marketplace designed for them.

If these rules force many of our sellers to withdraw from the European market, they could also make Lectronz itself unviable. After everything we have built together, that would be personally heartbreaking.

For now, Lectronz sellers should not expect any immediate disruption. It remains unclear how national authorities will enforce these rules against makers and micro-enterprises, and we will continue monitoring the situation closely.

What are the solutions?

If these regulations are applied strictly, the short-term solution for makers is simple: stop selling in the EU and ship exclusively to non-EU markets.

Yes, you read that right. For a French micro-entrepreneur, it makes more sense to ship products to the US than to ship to neighbouring Germany or Belgium, for example. This is true even with any US tariffs in place.

Of course, limiting sales to the US is not a viable solution for some sellers. It's also a loss for the European economy itself. I still hope that we can work out realistic solutions that can help restore the EU single market for micro-enterprises. Here are some ideas.

Solution #1: Introduce an EU-wide de minimis threshold.

Exempt small-volume sellers and micro-enterprises from cross-border packaging obligations. The threshold would apply only to producers that are below a specific volume of waste and/or a specific yearly turnover.

Solution #2: Create an EU EPR One Stop Shop.

Create a centralised EU portal where sellers can register, report waste, and pay truly reasonable fees at once, for all Member States where they ship products. This could mimic the mechanism that already exists for VAT with the One Stop Shop (OSS).

Ideally, since we are in 2026, most of this work should be done through a modern open RESTful API (not web forms) and open-source software, to be as automated as possible.

Solution #3: Allow marketplaces to represent and manage micro-enterprises collectively as if it were a single producer.

A mechanism should allow marketplaces like Lectronz or Tindie to register, report waste, and pay reasonable fees on behalf of all their sellers as if they were collectively one producer of waste.

This means that the marketplace would pay administrative fees and other EPR costs corresponding to a single producer, that would collectively represent all its sellers. For Lectronz, this would have a non-trivial impact in terms of cost and administrative work, but it might be achievable under the right conditions.

As stated above, using a common API standard for all countries would help automate things.

Make your voice heard

Again, to reiterate, we support the idea of reducing waste and promoting sustainability. But there’s got to be a better, simpler, and fairer way to do it.

This regulation is having a massive effect on the entire ecosystem of micro-businesses, not just makers. It affects artists who sell their creations online. Local traditional food producers who export their products across the EU. It also affects craftspeople who sell their work online through their own website or dedicated platforms like Etsy. Beyond the small world of makers and DIY electronics, this will have an impact on the livelihood of potentially hundreds of thousands of people in the EU.

And to be clear: these rules affect not only businesses in the EU, but any business that sells to buyers in the EU.

Jeanette Koňarčíková, an independent artist and micro-entrepreneur from Slovakia, launched an online petition to draw the attention of policymakers to this issue:

https://www.change.org/p/stop-destroying-eu-micro-businesses-immediate-moratorium-on-cross-border-epr-fees

The petition is thoughtful and well-written. I encourage you to read and sign it!

The European Commission also has an open public feedback page for this issue here:

https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/15352-Packaging-and-packaging-waste-rules-on-national-registers-of-producers_en

Consider leaving feedback there as well.

Recently, the European Commission has begun to recognise part of the problem and has proposed suspending the requirement to appoint an authorised representative in every destination country until 2035. But this proposal has not yet been adopted. Unfortunately, this proposal may take time to be voted on and enter into force. By then, many small businesses may have closed. More importantly, removing the authorised-representative requirement would address only part of the problem. Rules like this risk undermining trust in the European project itself. What’s the point of the EU if the single market no longer exists for micro-enterprises?

Here at Lectronz, we will continue to move forward and hope for the best.

But make your voice heard now to make sure policymakers understand the urgency of this issue!

Security updates for Monday

Linux Weekly News
lwn.net
2026-08-24 09:02:14
Security updates have been issued by AlmaLinux (ansible-core, cups-filters, curl, java-1.8.0-openjdk, java-17-openjdk, java-21-openjdk, java-25-openjdk, kbd, kernel, perl-Date-Manip, php:8.2, and php:8.3), Debian (designate, firefox-esr, gst-plugins-bad1.0, libnet-dns-perl, nvidia-graphics-drivers, ...
Original Article
Dist. ID Release Package Date
AlmaLinux ALSA-2026:57148 10 ansible-core 2026-08-21
AlmaLinux ALSA-2026:57451 8 cups-filters 2026-08-21
AlmaLinux ALSA-2026:57462 8 curl 2026-08-21
AlmaLinux ALSA-2026:55775 8 java-1.8.0-openjdk 2026-08-21
AlmaLinux ALSA-2026:55775 9 java-1.8.0-openjdk 2026-08-21
AlmaLinux ALSA-2026:55781 8 java-17-openjdk 2026-08-21
AlmaLinux ALSA-2026:55781 9 java-17-openjdk 2026-08-21
AlmaLinux ALSA-2026:55787 10 java-21-openjdk 2026-08-21
AlmaLinux ALSA-2026:55787 8 java-21-openjdk 2026-08-21
AlmaLinux ALSA-2026:55787 9 java-21-openjdk 2026-08-21
AlmaLinux ALSA-2026:55798 9 java-25-openjdk 2026-08-24
AlmaLinux ALSA-2026:57597 10 kbd 2026-08-21
AlmaLinux ALSA-2026:57610 9 kbd 2026-08-21
AlmaLinux ALSA-2026:57253 8 kernel 2026-08-21
AlmaLinux ALSA-2026:57562 8 perl-Date-Manip 2026-08-21
AlmaLinux ALSA-2026:57574 8 php:8.2 2026-08-21
AlmaLinux ALSA-2026:57539 9 php:8.3 2026-08-21
Debian DLA-4751-1 LTS designate 2026-08-23
Debian DLA-4750-1 LTS firefox-esr 2026-08-21
Debian DSA-6458-1 stable gst-plugins-bad1.0 2026-08-21
Debian DSA-6459-1 stable libnet-dns-perl 2026-08-22
Debian DLA-4753-1 LTS nvidia-graphics-drivers 2026-08-24
Debian DLA-4752-1 LTS nvidia-graphics-drivers 2026-08-24
Debian DSA-6457-1 stable openjdk-21 2026-08-21
Debian DSA-6460-1 stable openjdk-25 2026-08-23
Debian DSA-6456-1 stable spip 2026-08-21
Debian DSA-6461-1 stable thunderbird 2026-08-23
Fedora FEDORA-2026-44f6d8f2e7 F43 AusweisApp2 2026-08-23
Fedora FEDORA-2026-2fff59246b F44 AusweisApp2 2026-08-23
Fedora FEDORA-2026-fe4c3064c5 F43 GitPython 2026-08-24
Fedora FEDORA-2026-1bbec06c4d F44 bluez 2026-08-22
Fedora FEDORA-2026-c10ed2f3b7 F43 calibre 2026-08-22
Fedora FEDORA-2026-ebffec502b F43 ceph 2026-08-22
Fedora FEDORA-2026-7de7d03796 F44 ceph 2026-08-22
Fedora FEDORA-2026-295354c8a1 F44 chromium 2026-08-22
Fedora FEDORA-2026-1eb1157853 F43 kernel 2026-08-22
Fedora FEDORA-2026-e57251bf72 F44 kernel 2026-08-22
Fedora FEDORA-2026-70dd9b4fc0 F43 pack 2026-08-22
Fedora FEDORA-2026-14ebd38fea F44 pack 2026-08-22
Fedora FEDORA-2026-32b0d26c4c F44 perl-URI 2026-08-23
Fedora FEDORA-2026-bfae8723e2 F44 rsync 2026-08-22
Fedora FEDORA-2026-096ad5e804 F43 tcpreplay 2026-08-24
Fedora FEDORA-2026-836c3dec74 F44 tcpreplay 2026-08-24
Gentoo 202608-21 GNU Emacs 2026-08-24
Gentoo 202608-22 needrestart 2026-08-24
Oracle ELSA-2026-57148 OL10 ansible-core 2026-08-21
Oracle ELSA-2026-55775 OL8 java-1.8.0-openjdk 2026-08-21
Oracle ELSA-2026-55775 OL9 java-1.8.0-openjdk 2026-08-21
Oracle ELSA-2026-55781 OL8 java-17-openjdk 2026-08-21
Oracle ELSA-2026-55781 OL9 java-17-openjdk 2026-08-21
Oracle ELSA-2026-55787 OL10 java-21-openjdk 2026-08-21
Oracle ELSA-2026-55787 OL8 java-21-openjdk 2026-08-21
Oracle ELSA-2026-55787 OL9 java-21-openjdk 2026-08-21
Oracle ELSA-2026-55798 OL10 java-25-openjdk 2026-08-21
Oracle ELSA-2026-55798 OL9 java-25-openjdk 2026-08-21
Oracle ELSA-2026-57597 OL10 kbd 2026-08-21
Oracle ELSA-2026-57610 OL9 kbd 2026-08-21
Oracle ELSA-2026-57251 OL10 kernel 2026-08-21
Oracle ELSA-2026-57252 OL9 kernel 2026-08-21
Oracle ELSA-2026-56936 OL8 mysql:8.4 2026-08-21
Oracle ELSA-2026-56973 OL9 mysql:8.4 2026-08-21
Oracle ELSA-2026-57562 OL8 perl-Date-Manip 2026-08-21
Oracle ELSA-2026-48225 OL8 perl:5.32 2026-08-21
Oracle ELSA-2026-50109-0 OL7 sssd 2026-08-21
Red Hat RHSA-2026:55450-01 EL10 curl 2026-08-24
Red Hat RHSA-2026:57462-01 EL8 curl 2026-08-24
Red Hat RHSA-2026:55439-01 EL9 curl 2026-08-24
Red Hat RHSA-2026:19158-01 EL10 dnsmasq 2026-08-24
Red Hat RHSA-2026:20589-01 EL8 dnsmasq 2026-08-24
Red Hat RHSA-2026:19373-01 EL9 dnsmasq 2026-08-24
Red Hat RHSA-2026:34508-01 EL9.6 dnsmasq 2026-08-24
Red Hat RHSA-2026:57597-01 EL10 kbd 2026-08-24
Red Hat RHSA-2026:57610-01 EL9 kbd 2026-08-24
Red Hat RHSA-2026:36541-01 EL10 kernel 2026-08-24
Red Hat RHSA-2026:36645-01 EL9 kernel 2026-08-24
Red Hat RHSA-2026:19456-01 EL10.0 libcap 2026-08-24
Red Hat RHSA-2026:24346-01 EL8.6 libcap 2026-08-24
Red Hat RHSA-2026:22957-01 EL8.8 libcap 2026-08-24
Red Hat RHSA-2026:21254-01 EL9.2 libcap 2026-08-24
Red Hat RHSA-2026:55449-01 EL10.0 libreswan 2026-08-24
Red Hat RHSA-2026:57741-01 EL9.6 libreswan 2026-08-24
Red Hat RHSA-2026:47757-01 EL10 openssh 2026-08-24
Red Hat RHSA-2026:47756-01 EL9 openssh 2026-08-24
Red Hat RHSA-2026:26332-01 EL10 rsync 2026-08-24
Red Hat RHSA-2026:26408-01 EL8 rsync 2026-08-24
Red Hat RHSA-2026:26410-01 EL9 rsync 2026-08-24
Red Hat RHSA-2026:22963-01 EL10 samba 2026-08-24
Red Hat RHSA-2026:28055-01 EL10.0 samba 2026-08-24
Red Hat RHSA-2026:28132-01 EL7 samba 2026-08-24
Red Hat RHSA-2026:22644-01 EL8 samba 2026-08-24
Red Hat RHSA-2026:28058-01 EL8.4 samba 2026-08-24
Red Hat RHSA-2026:28057-01 EL8.6 samba 2026-08-24
Red Hat RHSA-2026:28056-01 EL8.8 samba 2026-08-24
Red Hat RHSA-2026:25049-01 EL9 samba 2026-08-24
Red Hat RHSA-2026:28054-01 EL9.2 samba 2026-08-24
Red Hat RHSA-2026:28053-01 EL9.4 samba 2026-08-24
Red Hat RHSA-2026:25979-01 EL9.6 samba 2026-08-24
Red Hat RHSA-2026:23231-01 EL10 unbound 2026-08-24
Red Hat RHSA-2026:24365-01 EL8 unbound 2026-08-24
Red Hat RHSA-2026:24369-01 EL9 unbound 2026-08-24
Red Hat RHSA-2026:48650-01 EL10 vim 2026-08-24
Red Hat RHSA-2026:38509-01 EL10 vim 2026-08-24
Red Hat RHSA-2026:30900-01 EL10.0 vim 2026-08-24
Red Hat RHSA-2026:48703-01 EL8 vim 2026-08-24
Red Hat RHSA-2026:33453-01 EL8.4 vim 2026-08-24
Red Hat RHSA-2026:34477-01 EL8.6 vim 2026-08-24
Red Hat RHSA-2026:34476-01 EL8.8 vim 2026-08-24
Red Hat RHSA-2026:47982-01 EL9 vim 2026-08-24
Red Hat RHSA-2026:28133-01 EL9.2 vim 2026-08-24
Red Hat RHSA-2026:28049-01 EL9.4 vim 2026-08-24
Red Hat RHSA-2026:28050-01 EL9.6 vim 2026-08-24
SUSE SUSE-SU-2026:3678-1 SLE15 389-ds 2026-08-21
SUSE SUSE-SU-2026:3687-1 SLE15 oS15.5 389-ds 2026-08-24
SUSE SUSE-SU-2026:3686-1 SLE15 oS15.6 389-ds 2026-08-24
SUSE openSUSE-SU-2026:21611-1 oS16.0 apptainer 2026-08-22
SUSE SUSE-SU-2026:23161-1 SLE-m6.1 avahi 2026-08-21
SUSE openSUSE-SU-2026:21613-1 oS16.0 bugwarden 2026-08-22
SUSE openSUSE-SU-2026:21624-1 oS16.0 chromium 2026-08-23
SUSE openSUSE-SU-2026:21609-1 oS16.0 chromium 2026-08-22
SUSE openSUSE-SU-2026:0298-1 osB15 chromium 2026-08-24
SUSE openSUSE-SU-2026:11545-1 TW ffmpeg-9-libavcodec-devel 2026-08-23
SUSE SUSE-SU-2026:3683-1 SLE12 firefox 2026-08-24
SUSE openSUSE-SU-2026:11546-1 TW firefox-esr 2026-08-23
SUSE SUSE-SU-2026:3688-1 SLE15 oS15.4 gimp 2026-08-24
SUSE openSUSE-SU-2026:11547-1 TW gimp 2026-08-23
SUSE openSUSE-SU-2026:11536-1 TW go1.27 2026-08-21
SUSE SUSE-SU-2026:23162-1 SLE-m6.1 helm 2026-08-21
SUSE SUSE-SU-2026:23170-1 SLE-m6.1 ignition 2026-08-21
SUSE SUSE-SU-2026:23173-1 SLE-m6.1 libarchive 2026-08-21
SUSE openSUSE-SU-2026:11537-1 TW libjxl-devel 2026-08-21
SUSE SUSE-SU-2026:23168-1 SLE-m6.1 libssh 2026-08-21
SUSE SUSE-SU-2026:23160-1 SLE-m6.1 multipath-tools 2026-08-21
SUSE SUSE-SU-2026:23172-1 SLE-m6.1 openssl-3 2026-08-21
SUSE SUSE-SU-2026:23174-1 SLE-m6.1 pcp 2026-08-21
SUSE openSUSE-SU-2026:11550-1 TW perl-Net-CIDR-Set 2026-08-23
SUSE openSUSE-SU-2026:11551-1 TW perl-Net-OAuth 2026-08-23
SUSE openSUSE-SU-2026:11552-1 TW postgresql14 2026-08-23
SUSE openSUSE-SU-2026:11553-1 TW postgresql15 2026-08-23
SUSE SUSE-SU-2026:23169-1 SLE-m6.1 python-msgpack 2026-08-21
SUSE SUSE-SU-2026:23167-1 SLE-m6.1 python-pyasn1 2026-08-21
SUSE SUSE-SU-2026:23176-1 SLE-m6.1 python-urllib3 2026-08-21
SUSE SUSE-SU-2026:23159-1 SLE-m6.2 python313 2026-08-21
SUSE openSUSE-SU-2026:11540-1 TW python313-pytest-html 2026-08-21
SUSE openSUSE-SU-2026:11542-1 TW redis 2026-08-21
SUSE SUSE-SU-2026:23164-1 SLE-m6.1 runc 2026-08-21
SUSE SUSE-SU-2026:3674-1 SLE15 oS15.6 sccache 2026-08-21
SUSE SUSE-SU-2026:23171-1 SLE-m6.1 sssd 2026-08-21
SUSE SUSE-SU-2026:3684-1 SLE15 util-linux 2026-08-24
SUSE SUSE-SU-2026:3685-1 SLE15 oS15.6 util-linux 2026-08-24
SUSE SUSE-SU-2026:3677-1 SLE12 vim 2026-08-21
SUSE SUSE-SU-2026:3679-1 SLE15 SLE5.3 SLE5.4 SLE-m5.3 SLE-m5.4 vim 2026-08-21
SUSE SUSE-SU-2026:3680-1 SLE15 SLE5.5 SLE-m5.5 oS15.5 vim 2026-08-21
SUSE openSUSE-SU-2026:21615-1 oS16.0 weechat 2026-08-22
SUSE SUSE-SU-2026:23163-1 SLE-m6.1 wget 2026-08-21
Ubuntu USN-8662-2 16.04 linux-fips 2026-08-21
Ubuntu USN-8668-1 20.04 linux-gcp-5.15 2026-08-21
Ubuntu USN-8659-2 24.04 linux-hwe-7.0 2026-08-21
Ubuntu USN-8658-2 22.04 linux-ibm 2026-08-21
Ubuntu USN-8667-1 20.04 linux-kvm 2026-08-21
Ubuntu USN-8661-2 22.04 linux-lowlatency 2026-08-21
Ubuntu USN-8643-3 22.04 24.04 linux-nvidia, linux-nvidia-6.8, linux-nvidia-lowlatency 2026-08-21
Ubuntu USN-8669-1 24.04 linux-nvidia-6.17 2026-08-21

In Defeat for AIPAC, Aisha Wahab Wins House Seat, Becoming First Afghan American in Congress

Democracy Now!
www.democracynow.org
2026-08-24 08:53:05
Progressive California state lawmaker Aisha Wahab made history last week in a special election that will make her the first Afghan American in Congress. Wahab overcame a flood of attack ads from pro-Israel groups to beat her Democratic rival, Melissa Hernandez, in a race to replace disgraced Congres...
Original Article

Progressive California state lawmaker Aisha Wahab made history last week in a special election that will make her the first Afghan American in Congress. Wahab overcame a flood of attack ads from pro-Israel groups to beat her Democratic rival, Melissa Hernandez, in a race to replace disgraced Congressmember Eric Swalwell, who resigned in April amid allegations of sexual misconduct.

Wahab tells Democracy Now! she appreciates voters in her district for “seeing through” the “lies that were spread by AIPAC ,” referring to the powerful American Israel Public Affairs Committee. She also discusses her history of fighting caste discrimination in California and calls on the United States to engage with the Taliban government of Afghanistan as part of an effort of “steering them in the right direction” on human rights.



Guests
  • Aisha Wahab

    Democratic California state senator from the Bay Area who won the special election to fill Congressmember Eric Swalwell’s U.S. House seat.


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.

Microsoft: August updates break printing, PDF export in WPF apps

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 08:40:21
Microsoft has confirmed that .NET Framework updates released as part of the August 2026 Patch Tuesday are breaking printing and PDF export in WPF applications. [...]...
Original Article

Printer

Microsoft has confirmed that .NET Framework updates released as part of the August 2026 Patch Tuesday are breaking printing and PDF export in some applications.

In a Windows release health alert seen by BleepingComputer, Microsoft says this known issue affects only apps that use the Windows Presentation Foundation (WPF) UI framework, an open-source graphical subsystem for building Windows desktop client applications.

"After installing the August 2026 .NET Framework cumulative update, some WPF applications may fail with a System.IO.FileFormatException when printing or generating PDF/XPS content that uses certain fonts, including Calibri," Microsoft says.

image

The complete list of impacted platforms includes both Windows client releases (including the latest versions of Windows 10 and Windows 11) and Windows Server (from Windows Server 2012 up to Windows Server 2025).

Microsoft says it is still investigating the issue and, until it can ship a permanent solution, has provided a temporary fix to help affected users work around these printing problems.

This workaround requires enabling the Switch.MS.Internal.TtfDelta.DisableCmapAndSbitOverflowProtection AppContext switch in the application config file by adding the following:

<configuration>
 <runtime>
   <AppContextSwitchOverrides
     value="Switch.MS.Internal.TtfDelta.DisableCmapAndSbitOverflowProtection=true"/>
 </runtime>
</configuration>

However, the company warned that doing this will also disable protections introduced with the August 2026 .NET Framework update, exposing the system to attacks that could exploit vulnerabilities addressed by this month's security updates.

"Microsoft recommends using this workaround only as a temporary measure and only when required to address this issue," it warned.

Roughly five years ago, in February 2021, Microsoft addressed another known issue that caused WPF apps and Visual Studio to crash after installing Windows 10 cumulative updates.

On Friday, Microsoft also shared a temporary workaround for a known issue triggered by Windows 11 updates released during the August 2026 Patch Tuesday and causing games like ARC Raiders, MARVEL Tōkon: Fighting Souls, and The Finals to crash and freeze.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

"Unbought & Unbossed": Angie Nixon on Winning Democratic Senate Race in Florida, DSA Membership & More

Democracy Now!
www.democracynow.org
2026-08-24 08:37:37
Progressive state Representative Angie Nixon pulled off a stunning victory in Florida last week, defeating the establishment-backed centrist candidate Alexander Vindman to win the state’s Democratic nomination for U.S. Senate. Vindman, a former Army intelligence officer who testified during Tr...
Original Article

Progressive state Representative Angie Nixon pulled off a stunning victory in Florida last week, defeating the establishment-backed centrist candidate Alexander Vindman to win the state’s Democratic nomination for U.S. Senate. Vindman, a former Army intelligence officer who testified during Trump’s first impeachment trial, raised more than 16 times as much campaign money as Nixon. In November, Nixon will face incumbent Republican Senator Ashley Moody, who was appointed by Florida Governor Ron DeSantis to fill the seat of Marco Rubio when he resigned to serve as secretary of state. If elected, Nixon, who joined the Democratic Socialists of America in June, would become the only member of the DSA in the Senate.

“I know what it’s like to struggle. I don’t want anyone to have to struggle the way in which I did,” says Nixon, whose campaign has focused on expanding healthcare, childcare and education, as well as tackling the affordability crisis.



Guests
  • Angie Nixon

    Democratic Florida state representative and U.S. Senate nominee.


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.

Montreal Considers Cutting Ties to Israel as Outrage Grows in Canada over Israeli Impunity: Avi Lewis

Democracy Now!
www.democracynow.org
2026-08-24 08:33:03
The Montreal City Council is set to debate a controversial motion Monday calling on the Canadian city to suspend all institutional ties with the Israeli government. Avi Lewis, a leading Jewish Canadian politician and head of the progressive New Democratic Party, says it’s a reflection of wides...
Original Article

Image Credit: montreal.ca

The Montreal City Council is set to debate a controversial motion Monday calling on the Canadian city to suspend all institutional ties with the Israeli government. Avi Lewis, a leading Jewish Canadian politician and head of the progressive New Democratic Party, says it’s a reflection of widespread outrage among Canadians over Israel’s actions across the Middle East.

Pro-Israel forces “are on the defensive now,” says Lewis. “They still capture most of the political class and the mainstream media, but among the majority of people, we want to see our government step up and take a clear moral position against apartheid, against genocide and against the killing of civilians.”



Guests
Transcript

This is a rush transcript. Copy may not be in its final form.

ANJALI KAMAT : Before we end, Avi Lewis, I want to go back to you, and I wanted to ask you about this other news from Canada. The Montreal City Council is set to debate a controversial motion calling on the city to suspend institutional ties with the Israeli government. Your response to this?

AVI LEWIS : Well, I think I’ve been knocking doors in a series of by-elections that the prime minister has called, in Toronto, in Montreal, in Vancouver. And I’ve been talking to a lot of Canadians at their doorsteps in the past few weeks over this summer. And I have to say that the ongoing genocide in Gaza is a pressing moral issue for, I believe, a supermajority of Canadians. I have only come across a couple of people who take a pro-Israel position at the doorstep, knocking doors in all of our major cities for weeks now. And the vast majority of people are shocked and appalled by the activities of the state of Israel, dragging the United States into attacking Iran in another endless, incredibly damaging war, spiking oil prices and punishing people around the world with higher inflation and higher cost of living, which is already out of control, and the sheer trauma of witnessing — and Democracy Now! has done a better job than most media outlets in the entire world in documenting the ongoing murder of Palestinians in the West Bank, in Gaza, what is effectively an invasion now of southern Lebanon. People are upset and traumatized by the impunity and the violence visited by Israel on many different civilian populations now in the Middle East. And people in Canada are appalled and want to see their governments, at every level, do something.

We’ve seen a big battle in Canada, as you have in the United States, where the pro-Israel forces, like AIPAC or CIJA here in Canada, the parallel pro-Israel lobby group, are on the defensive now. They are — they still capture most of the political class and the mainstream media, but among the majority of people, we want to see our government step up and take a clear moral position against apartheid, against genocide and against the killing of civilians. And you see these debates breaking out at the city council level, in educational institutions, and at the national level in Canada. And the tide has turned definitively, and Canadians want to see their governments and their elected officials stand up on the right side of history. It’s an ongoing battle, and the forces against us, the conventional narratives are still very much in place in the political class and in the corridors of power. But the people of Canada know which side is in the light and which side is in the horror of these massive crimes against humanity. And I think the Montreal City Council debate is one of many that you’re going to continue to see. It is not going to stop, because Canadians are outraged by this impunity.

ANJALI KAMAT : Avi Lewis, thank you so much, leader of Canada’s New Democratic Party. Thank you also to Lori Wallach, director of the Rethink Trade program at the American Economic Liberties Project.

Coming up, we go to Florida to speak with Angie Nixon on her upset win in Florida’s Democratic Senate primary.

[break]

ANJALI KAMAT : “Peligrosa,” “Dangerous Woman,” by Lila Downs, performing in our Democracy Now! studio.

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.


Next story from this daily show

“Unbought & Unbossed”: Angie Nixon on Winning Democratic Senate Race in Florida, DSA Membership & More

Ask HN: Why do corporate failures always seem to punish the wrong people?

Hacker News
news.ycombinator.com
2026-08-24 08:18:56
Comments...
Original Article

My partner was let go after 15 years working tirelessly for one of the big five. She's probably the most resilient, rewarded and liked person that has survived and fought through this part of the business in the past decade, and while I am clearly biased, all her colleagues would most certainly agree. She's moved from IC to managing over 30 people and barely manages to use vacation days because she's always working.

She was let go not because of her own incompetence, failure or not fitting in, but purely out of rushed budget cuts (budgets were finalized, finalized again, and then they realized it's still not good enough).

The reason for those cuts, in this particular instance, was not the overwhelming rise of AI and/or getting more firing power for data centers, it was very clearly a long-visible path of failure two levels above, where one particular person continued to wreak havoc up over the past few years, and, ultimately, caused this cul-de-sac disaster.

The person at the center of this all is an older dude who consistenty has been on the wrong side of any decision he's made. I've only heard of a few things as it is (literally) none of my business, but it's been nothing but chaotic and ill-advised choices. He moved into this role from failing elsewhere, leaving the chaos there behind him, and over the past two years, now has caused yet another disaster in this new role.

My question is, and sort of the point of this post (which I understand is entirely philosophical): how do these people consistently survive their self-inflicted disasters? While her entire team (30+) has been let go now as a result of it all, the person who ran this into the ground continues onwards in the business?

They even made her fire and break the news to most of her team in weekly chunks recently, before telling her she's of course, also done.

I used to work for a big five too, but have been self-employed for over a decade now, so I may be too far out to understand, but it just puzzles me how certain people always manage to stay untainted admist the chaos they've caused, at the cost of everyone else. This used to be a thing I've heard over and over again from friends at Google, but it really seems to be very consistent thing elsewhere, too.

They're clearly not smart people, is it ruthlessness? Are they aware of the disaster they're navigating into and plan well ahead? It's a mystery to me, and it just can't be healthy for these companies to allow such folks to continue onwards.

‘A cognitive cacophony’: hands-on with the Call of Duty Modern Warfare 4 beta test

Guardian
www.theguardian.com
2026-08-24 08:15:27
Players will get what they expect from the new CoD title: boots-on-the-ground military action with a slight tactical edge. But what’s with all the distractions? There’s a lot riding on this year’s Call of Duty, the inescapable first-person shootfest that’s been lobbing a grenade into the autumn rele...
Original Article

T here’s a lot riding on this year’s Call of Duty , the inescapable first-person shootfest that’s been lobbing a grenade into the autumn release schedule since 2003. Previous instalment, Black Ops 7, performed poorly compared to previous titles, forcing Activision to post a semi-apology to fans. And that’s not the only challenge Modern Warfare 4 is facing: there’s a new indie shooter, Wardogs, promising a feel somewhere between classic CoD and Classic Battlefield. Then, lurking on the horizon, in mirror shades and an exotic sports car, is Grand Theft Auto 6, which is surely going to smash and grab all the attention (and money) from the market in mid-November.

The good news is that, judging by the early access beta test that ran over the penultimate August weekend, we’re definitely getting what we expect from a Modern Warfare title: quasi-authentic boots-on-the-ground military action with a slight tactical edge. The weapons and general gunplay are highly effective, from default assault rifle, the Han 86 – a classic CoD beginner’s gun with decent fire rate and handling – to the bullet-spraying Nightshade SMG and the absolutely lethal KG-7 Vulcan sniper rifle. They all feel good to hold and fire, and there’s enough balance to let you experiment with slightly more offbeat numbers like the burst-fire Hyeon AR and the possibly overpowered Mar-9 marksman rifle.

Call of Duty Modern Warfare 4 screenshot
Refreshed armoury … Call of Duty Modern Warfare. Photograph: Activision

Also joining the refreshed armoury are an interesting array of field upgrades, the useful gadgets you open up as you play I tried the smoke wall which creates, well, a wall of smoke, hiding your movements (in theory) and I saw a few people deploying the razor-wire trap which slows enemies down while sapping their health. There are also new kill streaks (the special attacks you can trigger when you earn enough points in a match). Artillery Beacon lets you throw a beacon at a specific point which is then bombarded with missiles, and Wheelson is a remote control mini tank that clatters around the place firing a grenade launcher.

A modest selection of small-ish maps was available for the weekend. Silkworm is a slab of South Korean cityscape, all minimarts and alleyways, while Transit 213 is a public transport depot with two parked buses at its centre and lots of generous sightlines for snipers. I found Cachette, a labyrinth of farm buildings, workshops and courtyards a little over-familiar, but Lotus, a larger harbourside map, brought in some interesting long-range combat. My favourite though, was the self-explanatory Rooftops, which takes place on the connected summits of two ageing New York high rises. Here, you fight through multi-levelled maintenance rooms and industrial laundries as well as out into open areas where water towers, exhaust fans and service ramps provide useful cover and mantling opportunities. There’s even a section of wooden scaffolding that offers a narrow shortcut over a vertigo-inducing chasm.

Call of Duty Modern Warfare 4 screenshot
The TikTok of gaming? … Call of Duty Modern Warfare 4 screenshot Photograph: Activision

There are a bunch of new modes to accompany classics such as Team Deathmatch, Domination and Kill Confirmed. The key example is Kill Block, a ten v 10 gun fight taking place in a training camp that is reconfigured between rounds, providing hundreds of different layouts. There are trenches to crawl along, shipping containers to lie on and windows to camp behind. Like Search and Destroy, there are no respawns so it’s a fight to the death. The result is absolute carnage.

How does it feel? Well, after the first day of the early access beta, gaming content creator Farzam referred to MW4 as the Tikok of gaming and it’s a good analogy. Everything happens fast and it just doesn’t stop happening; time-to-engagement (how long it takes from spawning to meeting your first enemy) is counted in microseconds, and if you blink, you’re dead. On every stretch of every map there is something to catch your attention, from exploding oxygen tanks to flickering video screens, and if you’re killed, hit a button and you’re instantaneously back in the game – no pause for breath, no time to think. You aren’t playing so much as doomscrolling an inescapable cognitive cacophony.

Meanwhile, the omni-movement system introduced in Black Ops 6, which lets you jump, dive and skid along the floor in any direction, has been removed in favour of an ostensibly more naturalistic and controlled alternative. Is it really? Um, no. There is no friction at all in the landscape, so you can skid round corners and scale walls with superhero abandon. It’s fun and fluid, but it’s open to abuse: some players leap and twirl about the place as though performing in a particularly harrowing production of Swan Lake.

For the first time in a CoD beta test, there’s a Campaign mission to try. Named Entrenched, it starts with … a trench, which you have to battle your way through against North Korean troops until you reach a power station. Then it’s a battle against time as you look to flood the reactor to prevent a catastrophic meltdown, before indulging in some parkour to escape the collapsing infrastructure. An average day at work for the CoD crew.

I’m sure this beta test is going to give both the development team and the community plenty to think about. Ultimately, the game feels like what it is – a very modern Modern Warfare where your most effective weapons are lightning reflexes and superhuman concentration. I am too old for this shit, but I still thoroughly enjoyed it; diving round a corner and taking out two enemies in one burst remains as thrilling now as it was when the original Modern Warfare came out in 2007. There is a lot more competition out there now, though, and Call of Duty itself is starting to creak at the joints. The beta is yelling “I’ve still got it!” – but have the players? Money will be tight this autumn, and GTA 6 is standing at the bar, winking suggestively, beckoning us over.

"Most Stupid Trade Fight in History": U.S. & Canadian Workers Stand to Lose in Trump's New Tariff War

Democracy Now!
www.democracynow.org
2026-08-24 08:12:58
The U.S.-Canada trade war is deepening after talks collapsed without a deal on Friday. Canadian Prime Minister Mark Carney accused the Trump administration of issuing demands that would compromise Canada’s sovereignty and undermine key industries. On Saturday, the United States slapped 50% tar...
Original Article

This is a rush transcript. Copy may not be in its final form.

ANJALI KAMAT : The U.S.-Canada trade war is deepening after talks collapsed without a deal on Friday. Canadian Prime Minister Mark Carney accused the Trump administration of issuing demands that would compromise Canada’s sovereignty and undermine key industries. On Saturday, Trump slapped 50% tariffs on around $20 billion worth of imports from Canada. Carney then announced retaliatory tariffs on $20 billion of U.S. products beginning September 8th. Carney spoke on Saturday.

PRIME MINISTER MARK CARNEY : We’ve been under no illusions. We recognized from the start that America has changed. Early last year, in this room, I observed that the decadeslong process of steadily increasing integration between our economies was over. Our government understood before many that America would transform all of its commercial relationships, that it would put a series of tariffs on its closest allies and use economic integration as a weapon. We recognized that sometimes its signature was written in pencil. …

The gap between partnership and competitor, unfortunately, has remained too wide in recent days. So, last evening, I instructed our negotiators to return to Ottawa. We cannot accept what they’ve offered, and we will not give what they’ve asked.

ANJALI KAMAT : Canadian Prime Minister Mark Carney took questions from reporters after his address.

REPORTER : Why does it feel like today Mark Carney is going to war, trade war, the tone?

PRIME MINISTER MARK CARNEY : Because we were attacked. Like, you’re at war when you get attacked. We got attacked. The U.S. put 50%. We waited until the United States decided to actually implement these so-called 338 tariffs. That’s fine.

ANJALI KAMAT : President Trump responded online, writing, quote, “Canada wants the benefits of being a State, without being one!!! They have also charged our great farmers, for many years, massive amounts of Tariffs. No more!!!” end-quote.

U.S. Transportation Secretary Sean Duffy appeared Sunday on Fox News.

TRANSPORTATION SECRETARY SEAN DUFFY : We’re great trading partners, right? But — but —  but Canada gets the benefit of trading with the U.S. more — way more than the U.S. gets the benefit of trading with Canada. It’s a country that doesn’t have a military. …

We want fairness for the American worker, and some of our best friends are — are the worst offenders, that treat us the worst. And the fact that we provide their security for them and they take advantage of us, I think President Trump was the first one to go, “You know what? That’s not the kind of relationship that friends should have.” And so, the president’s calling them out. I think you’re going to see Mark Carney come to the table very, very quickly, because it’s going to be devastating for his country.

ANJALI KAMAT : On Sunday, the editorial page of The Wall Street Journal ran an editorial headlined “The Dumbest Trade War Revisited: Trump’s decision to escalate a tariff brawl with Canada makes no economic or political sense.”

The tariffs come just 10 weeks before the midterms. Economists predict battleground states, including Maine, Michigan, Ohio and Alaska, could face disproportionate economic pain from the tariffs.

For more on this, we’re joined now by two guests. Lori Wallach is director of the Rethink Trade program at the American Economic Liberties Project and founder and former director of Public Citizen’s Global Trade Watch. Her recent piece for Foreign Affairs is headlined “The Right Way to Balance Trade: What Comes After the Neoliberal Order.” She’s joining us in Wisconsin. And in Toronto is Avi Lewis, the leader of Canada’s New Democratic Party, the NDP . He’s also a longtime Canadian journalist, documentary filmmaker and activist.

We welcome you both to Democracy Now! Avi Lewis, let’s begin with you. Talk about what these talks were supposed to be about and why they broke down.

AVI LEWIS : Well, good morning, Anjali. Hello, Lori. It’s great to be back on Democracy Now!

This has followed a sickeningly familiar pattern with Trump threatening and setting a deadline for devastating — I think the Washington — The Wall Street Journal — rarely agree with The Wall Street Journal , but this is incredibly dumb. It’s also incredibly damaging and dangerous. It’s going to hurt Canadian workers. It’s going to hurt American workers. It’s completely unnecessary. And at the last minute, after negotiations are going on under the threat of these massive tariffs, suddenly Howard Lutnick arrives with a whole set of new demands at the 11th hour. This is the pattern, and we’ve seen it over and over again.

In this case, Prime Minister Carney read the room correctly. Canadians are sick of this. We’re already under punishing tariffs in many of our most important industrial sectors, from automaking to forestry to steel and others, and we simply are not in the mood to grant more concessions. And so the prime minister walked away from the table.

But the truth is, and the wider context of this is, that, unfortunately, Canada has already made a whole bunch of unilateral concessions, and so we’re in a weakened position just in the context of the short-term trade deal. The prime minister gave up the digital services tax without anything to compensate it. That’s seven — modest for Big Tech. That’s a modest tax of about $7 billion a year. It was the only real solid tax we had on the Big Tech billionaire — I guess we have to say “trillionaire” — class behind Trump. And that was at the beginning of this process, something like a year ago.

We’re also — while Canadians are united in this feeling that we’ve gone — we’ve given enough to Trump’s demands, and we can’t concede further without securing protection for our own industries and economy, we’re not all in this together. We have to remember, and Lori and I have been fighting free trade deals between Canada and the United States since the 1980s, because the integration of the corporate classes of our two economies has been achieved at the expense of working-class people in both of our countries, and to the incredible, staggering enrichment of the wealthiest people and corporations in our economy. We are not all in this together when the six big Canadian banks made $70 billion last year. They are not directly affected by tariffs, and they continue to make higher and higher profits every single year. We are not all in this together when the oil and gas sector in Canada, which is majority owned by U.S. corporations, made — is on track to make up to $150 billion in wartime profits this year alone because of the immoral, senseless, illegal attack on Iran by the United States and Israel, $150 billion in profits for this industry that is not affected, that has been spared all of the tariffs, because, of course, the United States needs a huge amount of Canadian oil each and every day. So, we are united as Canadians in rejecting more unilateral concessions; we are not all in this together in terms of who’s going to be hurt.

And we need to build an independent Canadian economy. Mark Carney has had well over a year to get started on that project. He has announced big plans, like buying the oil industry a new pipeline for $40, $50, $60 billion of public money, like major projects that suspend Indigenous rights and environmental protections in favor of largely foreign corporations coming in and buying more of our resources. He’s having an investment summit on September 12th in Toronto to invite BlackRock and Blackstone and JPMorgan. And the prime minister has mused about selling our airports and our ports and privatizing more of our economy to the benefit of foreign investors.

So, we need a made-in-Canada plan to develop our autonomy and double down on the things that unite us as Canadians, like our embattled healthcare system, which is also being privatized these days. But we’re not on track to do that. This is a fork-in-the-road moment for Canada, and we have a completely different progressive vision to offer Canadians, that would help Canadian workers, defend Canadian workers in this crisis, and also get back to work building a truly independent Canadian economy, that would benefit American workers, as well. As we’ll see in this next period, everybody is going to be hurt by this.

ANJALI KAMAT : Avi, these new tariffs affect about 5% of the goods, of Canadian goods that are imported by the U.S. They target about $20 billion worth of Canadian goods. Who is actually hurt by these tariffs? Who are the workers, what are the industries in Canada that would be hurt by these tariffs?

AVI LEWIS : Yeah, I mean, this is — we already have tariffs on the automobile sector of 25%, a major integrated sector between Canada, the U.S. and Mexico. And this deal was only to achieve a lowering of 25% to 15% on auto tariffs. That makes the auto industry in Canada uncompetitive, which is why Lana Payne, the head of Unifor, the largest private-sector union in Canada, said months and months ago that no deal is better than a bad deal. But this is an extension beyond steel and forestry and auto to tariff a lot of consumer goods, everything from furniture makers to apparel to rubber and plastic products. This would bite deeper into the Canadian economy across the economy, a lot of smaller and medium-sized businesses in every region of the country.

But again, it’s not all equally apportioned. It’s always certain sectors and certain regions which are hurt the worst. In this case, my province of British Columbia would be most affected by this latest round of tariffs. Ontario and Quebec, the largest economic provinces in our country, would also be severely, severely damaged by this. And don’t forget that it’s Americans who pay these tariffs, and it’s American workers who are also affected. It’s the cost-of-living emergency, in Canada and the United States, where food prices, where rent, and the cost of putting a roof over your head, and all of the costs of living are going up and up and up in a period where people are really suffering. So, you know, there are corporate players who will make out fine, but it is the working-class people of our continent who are going to be hurt. This may not be the huge proportion of Canadian exports to the United States, in one of the biggest trading relationships on planet Earth between our two countries, but this is a deepening of an attack on Canada and on the American working class, which has been going on since Trump was elected for the second time.

And here in Canada, we need to do something big about it. We’ve got plenty of fantastic proposals about how we could actually protect ourselves. In the short term, we have an unemployment insurance program in Canada that only covers one out of three workers that pay into it, and it only gives you a little more than half of your previous wage or salary when you get laid off. It’s hard to qualify for. It takes too long to kick in. We need immediate reforms to our employment insurance system to cover people with more support faster and to cover way more workers in our economy. Those are sort of the short-term things.

We need emergency assistance for the sectors that are worst hit by this — again, manufacturing, wood products, apparel and furniture and others. But we also need a bigger plan to actually Trump-proof the Canadian economy. We could do things — when we are making major investments of public dollars in oil pipelines, we could use that money instead to build an east-west electricity grid, double down on renewable energy, which is energy independence forever, because the inputs for renewable energy are always free, unlike oil and gas and coal. We could build an east-west electricity grid to trade renewable energy across our country with battery storage and the cheapest-installed energy, solar and wind, on planet Earth today. The world is moving away from fossil fuels in this period, and Canada is being left behind because we are — continue, under the Mark Carney government, to tie our fate to massive military expenditures, massive fossil fuel investments, and all-in on AI, which, despite the prime minister’s excellent words about Canadian independence from the United States, mirror the Trump agenda. And unfortunately, under the surface, we’re seeing an expansion of decades of integration of the corporate class between Canada and the United States. That is not a plan to make anybody safe.

ANJALI KAMAT : I want to bring Lori Wallach into the conversation, director of the Rethink Trade program at the American Economic Liberties Project and founder and former director of Public Citizen’s Global Trade Watch. Lori, building off of what Avi was talking about in terms of U.S. consumers who are hurting, I just wanted to read a couple quotes from politicians from border states. Here we’ve got Minnesota Senator Amy Klobuchar saying on X, “Canada is Minnesota’s #1 trading partner. Minnesotans are paying for Trump’s chaos.” Republican Senator of Maine Susan Collins said the new tariffs would, quote, “increase costs for Maine families, as most businesses will have no choice but to pass on the tariffs to their customers through higher prices.” Your response to what’s happened with the collapse of the trade talks?

LORI WALLACH : So, it is the case that this situation is — again, I don’t typically agree with The Wall Street Journal , but — perhaps the most stupid trade fight in history, in that, yes, if you buy — if you are a purchaser in the U.S. of some of these goods — for instance, hockey sticks, but not pucks — I mean, go figure — you will see higher prices.

But let’s step back at the whole situation. And Avi’s exactly right. You have at this moment this fight between two visions, neither of which are good for working people or for the environment. There is a way to do trade that benefits the majority of people, small businesses, farmers. And in Trump, you have an oligarch-first trade policy. He got elected saying he’d help working people. In fact, what he’s done is make exceptions in his tariffs. Whatever you think about tariffs at this point, 55% of imports into the U.S. have been excluded from tariffs, because Trump gives free entry for his buddies in Big Tech, in chemicals, etc. So, we have a situation where between the disruption of supply chains like the U.S. and Canada, which have been not under the right rules, but united in a way that literally it’s disruptive to U.S. manufacturing when there’s disruption in Canadian manufacturing — you have a situation where the U.S. now is down 75,000 manufacturing jobs since Trump came down, came back to office. We have 30% decrease right now in factory construction since Trump came back the second time, because the chaos, the tariff chaos and malpractice, is so severe.

But the problem is, in Mark Carney, there is sort of the high priest of neoliberalism, a guy who has been going around the world trying to sell the Trans-Pacific Partnership, NAFTA on steroids, extra goodies for Big Tech and for Big Pharma, ways to attack Canada’s wonderful pharmaceutical pricing system that don’t even exist in the old NAFTA , as the replacement for the World Trade Organization, as if that’s not bad enough. And there is something that is neither Trump’s oligarchic trade grift nor the neoliberalism that Carney has in mind, that actually could harness the benefits of trade, but neither of these guys is thinking about that. Rather, they’re having this kind of personal fight, and it’s political. So, Trump can’t bear the thought someone is standing up to him and not just steamrolling him. Folks in Canada are getting tariffed because they had the temerity to stand up and put tariffs in retaliation to Trump unilaterally tariffing them. That is the basis for these tariffs. And the notion that, politically — the U.S., Canada and Mexico right now have the only duty-free trade at all under Trump two. Canada and Mexico still have majority duty-free access. Underlying all of this is: Will we renegotiate, in a way that works for people and the planet. the NAFTA replacement, the U.S.-Mexico-Canada Agreement? And there, I think, are people with a good vision — Avi, for instance; in the U.S., many Democrats in Congress — of how you could fix that agreement and have a lift-up agreement. But instead, with this fight, we’re just heading in the worst direction possible.

ANJALI KAMAT : And, Lori, how have Trump’s economic policies vis-à-vis Canada differed from those, say, with China? And this especially at a time where we’re coming up on what the Trump administration is calling “economic D-Day,” threatening to sanction any country trading with Iran?

LORI WALLACH : So, this is part of the lunacy of the situation. The United States not only has many decades of putting the economies together, as Avi said, not on behalf of working people, but, for instance, the aerospace industry, literally, if you hit tariffs on metal products that are part of the aerospace industry, which is happening, you hurt jobs in the U.S., instead of thinking about how do we make this smoother. And the U.S. and Canada have relatively balanced trade. If you take the crude oil sent to the U.S. to be processed and employ U.S. workers out of the formula, U.S. and Canada have balanced trade. And then tariffs go to 50%, and some products are higher, lower. But targeting Canada is the big problem, when it’s not. Rather, it’s a partner and has balanced trade, versus in China.

China is the source of a ginormous trade deficit with the U.S., but not exclusively, with the world. And it’s because of particular policies that Canada is not implementing, that China uses regularly, often called “beggar thy neighbor,” where you take policies suppressing wages, no independent unions, or no safety net, social safety net. So, you basically suppress consumption. People save a ton, because they’re responsible for everything on their own. They have no support from the government. Or you subsidize at enormous rates. All of those interventions mean China is exporting an enormous amount. And it’s not just hitting the U.S. At this point, countries that were the emerging trade countries, countries like Mexico, like India, like Brazil, are going into trade deficits and are being deindustrialized because of this behavior in China. Trump has cut the tariffs. He feels some friendship with the authoritarian leader of China. And so, he and Premier Xi have had many a happy meeting where they cut tariffs with China, the cause of the trade deficit. And here we have 50% tariffs on Canada. It’s — it is, I would say, something that is more like middle school or childhood playground battles between Carney and Trump, as compared to anything that makes economic sense or geopolitical sense.

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.

Headlines for August 24, 2026

Democracy Now!
www.democracynow.org
2026-08-24 08:00:00
Iran Condemns U.S. Sanctions Ahead of Trump Administration’s “Economic D-Day”, Israel Continues Attacks on Gaza, with Children Among the Dead and Wounded, Israel’s Ben-Gvir Celebrates Construction of Gallows Where Palestinians Will Be Hanged, Syria and Israel Hold U.S.-Broker...
Original Article

Headlines August 24, 2026

Watch Headlines

Iran Condemns U.S. Sanctions Ahead of Trump Administration’s “Economic D-Day”

Aug 24, 2026

Iran’s leaders have threatened to halt all oil exports from the Persian Gulf and to treat any nation’s support for U.S. sanctions against Iran as an “act of war.” The threat came ahead of today’s announcement by Treasury Secretary Scott Bessent of what the Trump administration is calling an “economic D-Day” aimed at completely severing Iran’s remaining financial lifelines. This is Iranian Foreign Minister Abbas Araghchi.

Abbas Araghchi : “This is a repetitive scenario, from the crippling sanctions imposed during the Obama administration to the maximum-pressure campaign during Trump’s first administration and now the latest sanctions. All of these measures have been introduced under different titles, but they represent the same kind of bullying that we have always seen in American policy. In other words, it is the same movie they keep playing over and over again. We know this movie, so we know how to confront and deal with it.”

On Sunday, Iran’s currency, the rial, sank to a record low against the U.S. dollar. The International Monetary Fund now predicts Iran’s economy will contract by nearly 5.5% this year. Fuel prices are surging in Iran — something that preceded nationwide protests in 2019 and earlier this year.

Israel Continues Attacks on Gaza, with Children Among the Dead and Wounded

Aug 24, 2026

In Gaza, two Palestinian brothers were killed and several others wounded when an Israeli warplane struck a tent sheltering displaced people near Al-Aqsa Hospital earlier today. The attack followed another bloody weekend in Gaza. On Sunday, Israeli forces killed at least two Palestinians, including 4-year-old Mohammad Abdul Salam Taha. Separately, a girl was injured by Israeli fire on Sunday in a camp north of Khan Younis. According to Palestinian officials, Israel has violated the U.S.-brokered so-called ceasefire agreement nearly 4,400 times since it took effect in October. This is Abu Ahmed, a displaced Palestinian who was sheltering close to a building that was blown up by Israel on Sunday.

Abu Ahmed : “There is no ceasefire. There is nothing. There is nothing. Our lives are destroyed. Our youth are destroyed. What can we do? We want solutions. We want to live in peace. This does not make sense. This does not make sense. It’s true these things are happening to other people, but I am also human. I see these things, people torn into pieces. We die. Our morale is destroyed.”

Meanwhile, Israel’s government has warned it may further intensify its attacks, after several kites landed in an illegal Israeli settlement on Gaza’s border. Palestinian officials said the kites were flown by children, were made of paper and posed no threat. But Israeli Defense Minister Israel Katz accused Hamas of launching attacks, calling the use of kites an “act of war.”

Israel’s Ben-Gvir Celebrates Construction of Gallows Where Palestinians Will Be Hanged

Aug 24, 2026

Israel’s far-right National Security Minister Itamar Ben-Gvir has posted video on social media celebrating the construction of a gallows where Palestinians will be hanged.

Itamar Ben-Gvir : “This is the facility. In this place, the terrorists will be executed. A hanging rope, viewing chambers where the crime victims will be able to come and watch — like in the United States, by the way. And we are fulfilling what we promised. Look, there were those who ridiculed. There were those who giggled. This place is starting to be built. The facility is being built.”

In March, Israeli lawmakers passed a law mandating death by hanging for Palestinians who are convicted of terrorism offenses. Jewish Israelis will not face the same punishment for similar crimes. In 2008, Ben-Gvir himself was convicted by a court in Jerusalem of incitement to racism and supporting a terrorist organization.

Syria and Israel Hold U.S.-Brokered Talks Amid Israeli Strikes

Aug 24, 2026

Diplomats from Syria and Israel held U.S.-brokered talks in Jordan on Sunday aimed at easing tensions following repeated Israeli attacks, including airstrikes on a major Syrian Air Force air base. They were the first talks between the two countries in several months, coming after Israel on Saturday struck a civilian vehicle on the outskirts of Damascus. Israel said it had targeted a “terrorist” in the deadly drone strike, which left several bystanders wounded. This comes as Israel continues to occupy Syria’s Golan Heights, which it seized in the 1967 war, as well as more territory in southwest Syria it ​seized after the fall of Bashar al-Assad.

“We Were Attacked”: Canadian Premier Announces Retaliatory Tariffs After U.S. Halts Trade Talks

Aug 24, 2026

In Canada, Prime Minister Mark Carney has announced retaliatory tariffs on U.S. imports after talks collapsed without a deal on Friday. On Saturday, the U.S. slapped 50% tariffs on around $20 billion worth of imports from Canada. In response, Carney announced tariffs on $20 billion of U.S. products beginning on September 8. Carney spoke to reporters on Saturday.

Reporter : “Why does it feel like today Mark Carney is going to war, trade war, the tone?”

Prime Minister Mark Carney : “Because we were attacked. Like, you’re at war when you get attacked. We got attacked. The U.S. put 50%. We waited until the United States decided to actually implement these so-called 338 tariffs. That’s fine.”

We’ll have more on the U.S.-Canda trade war after headlines, when we’ll speak with Avi Lewis, the leader of the New Democratic Party in Canada, and Lori Wallach of the American Economic Liberties Project.

Federal Court Strikes Down Trump Administration’s 75-Nation Visa Ban

Aug 24, 2026

In New York, a federal judge has struck down a Trump administration ban on issuing visas to immigrants from 75 countries. When the policy was enacted in January, the State Department claimed, without evidence, that people from those nations are likely to receive public benefits after arriving in the U.S. Among countries targeted were Afghanistan, Brazil, the Democratic Republic of the Congo, Iran, Iraq, Nigeria, Somalia, Sudan and Yemen. In her ruling, U.S. District Judge Jeannette Vargas said Trump’s measure was “patently unlawful” and violated federal immigration law by discriminating on the basis of nationality.

Texas Lawmakers Call on ICE to Close Detention Camp Where 100+ Children Are Held

Aug 24, 2026

In Texas, calls are mounting to shut down the South Texas Family Residential Center in Dilley, where it’s estimated more than 100 children are being detained by ICE . This comes after a 5-year-old boy, identified as Liam Tadeo, and his father were taken by ICE on their way to a child’s soccer game in Austin last week. Journalist Lidia Terrazas of Univision posted a video on social media showing Liam crying and his father handcuffed as they’re escorted into a vehicle. The arrest happened just days before Liam was set to start kindergarten. This is Texas Democratic Congressmember Greg Casar.

Rep. Greg Casar : ” ICE just arrested a 5-year-old boy on his way to a soccer game in my home city of Austin, Texas. His name, just like the name of the little boy from Minnesota, is Liam. And Liam should be starting kindergarten this week, but instead he’s sitting in a trailer prison right now in Dilley, Texas.”

Texas Democratic Congressmember Joaquin Castro said ICE denied his request to visit Liam and his father at the ICE camp. Castro said afterward, “His detention is another devastating example of why Dilley must be shut down and why our government must end the detention of children and families. I have seen firsthand the conditions that children and families are being subjected to at Dilley, and no child should be held there.” Dilley is run by the for-profit prison company CoreCivic.

First Deportation Flight Arrives in Haiti After U.S. Suspends Temporary Protected Status

Aug 24, 2026

More than 160 people have been deported to Haiti as the Trump administration begins to round up immigrants following the end of TPS , temporary protected status. It was the first deportation flight to Haiti after the Supreme Court greenlighted the Trump administration’s termination of TPS for an estimated 350,000 Haitians. The plane landed in the northern Haitian city of Cap-Haïtien Thursday. The country’s main international airport in Port-au-Prince has been deemed too dangerous due to gang violence and growing political instability. Many of those deported last week were TPS holders and had been living and working in the U.S. since 2010.

ICE Detains Father of Sailor on Record Deployment Aboard USS Lincoln

Aug 24, 2026

Image Credit: Joshua Aviles

A U.S. Navy sailor who is on his ninth month of deployment aboard the USS Abraham Lincoln said his father has been detained by ICE . Joshua Aviles said he had received a call this weekend notifying him of his father’s arrest. Luis Manuel Aviles was taken into custody during a traffic stop in Key West, Florida. His wife said he is a handyman with a valid U.S. work permit. Aviles is originally from Nicaragua and has lived in the U.S. for nearly 20 years. His son Joshua said on social media, “This is heartbreaking for me. I don’t know how I can mentally continue working 12+ hour days knowing that my dad is somewhere, possibly being treated like a criminal. My dad’s only 'crime' was coming to this country to give my siblings and me a better life.”

Over 3,000 Workers Laid Off as Tyson Foods Closes Meatpacking Plants

Aug 24, 2026

Image Credit: Tyson Foods

Tyson Foods, the largest meatpacking and processing company in the U.S., has shuttered two of its facilities in Illinois and Utah, laying off more than 3,000 workers. The company said in a release earlier this month it’d be closing its Joslin, Illinois, and Eagle Mountain, Utah, facilities, claiming “one of the most historic cattle shortages the country has ever experienced” as the reason for the move. About 2,500 Tyson employees were impacted in Illinois alone due to the sudden closure of the plant. Workers and supporters held a rally in Joslin Friday in protest of the mass layoffs. They’re demanding the facility be reopened, as well as six months of full compensation and benefits for workers who’ve been left jobless. This comes as Tyson Foods CEO and President Donnie King made over $34 million in 2025, according to the Securities and Exchange Commission.

Thousands Remain Without Power in Indiana Nearly Two Weeks After Devastating Storm

Aug 24, 2026

In northwest Indiana, thousands of homes remain without power nearly two weeks after high winds and torrential rain knocked down trees and power lines, leaving behind flooded basements and roads. More than a third of a million homes and businesses were affected by the storm. This is Demond Pompy, a resident of hard-hit Gary, Indiana, where over one in three residents lived in poverty even before the disaster.

Desmond Pompy : “These are all the things that people take for granted, the basic things, as far as, like, power, taking a shower, flushing your toilet, anything of that nature like that. So, we’re really under siege, and I hope they just take care of the situation.”

Arbitrator Orders Washington Post to Rehire Fired Opinion Columnist with Back Pay

Aug 24, 2026

A private arbitrator has ordered The Washington Post to rehire the opinion columnist Karen Attiah with back pay. Attiah was fired last fall over comments she made about the death of conservative activist Charlie Kirk. Her termination came as The Washington Post laid off more than 300 journalists, dismantling its sports, local news and international coverage — all under the ownership of billionaire Amazon founder Jeff Bezos. That followed Amazon’s $1 million donation to President Trump’s inaugural fund. Karen Attiah spoke to Democracy Now! in February.

Karen Attiah : “There’s a reason why this is an international news story. I think The Washington Post stands for a lot more than just a media company. It stands for a lot more than even just journalism, I would say. For a lot of people around the world, they’re looking at The Washington Post as a proxy and a bellwether for what’s happening to America and democracy.”

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.

Control and complexity: tension in systems design

Lobsters
ferd.ca
2026-08-24 07:58:18
Comments...
Original Article

The adoption of LLMs in software development has led countless organizations to rapidly change their practices and structures. Old methods are questioned, replaced, and repurposed as the economics around creating new code get shaken up. Because humans and LLMs aren’t interchangeable, the dynamics in play are also very different. Systems are systems, and so regardless of what is changing, there are known patterns on which we can draw to provide some guidance and warnings.

Without taking a step back and looking at the mindset behind the design of the system in which you operate, you’re likely to get somewhat incoherent (as in “clashing” and “conflicting,” not as in “nonsensical”) measures and policies. And so in this post I want to discuss how we organize systems by contrasting two families of approaches.

The first is about analytical decomposition that aims to maintain control over a system, and the other is based on a perspective of complex systems that resist analysis, which tend to focus on figuring out interactions and mechanisms to foster desirable emergent behaviour.

Comparing these has always been useful to tease apart assumptions and important elements of system design, and it is still relevant now with new types of changes being proposed.

The approaches

Analytical Decomposition and Control

At the core of classic science, engineering, and many forms of management, lies the idea that the whole can be understood from its parts. Decompose a complicated thing enough that you can get a thorough and detailed understanding of every component, and you should be able to know how the ensemble works. This approach, analytical decomposition (also sometimes described as “Cartesian-Newtonian”), has been trustworthy and reliable in countless parts of modern life.

This ability to divide, analyze, and understand generally extends to understanding causality over time: each action has a reaction, each event has a material cause, and these can be traced and evaluated or tested objectively. It follows that we can turn this around: if we understand an object well enough, then we can predict what it will do when acted upon.

This is foundational to building machines and processes with any sort of predictability and reliability. You can have a high-level goal and a lot of disjoint parts, break down the problem, assemble components that are well tested and within tolerances, and have a working solution. A corollary is that if every part in the machine plays its role well, then the machine itself ought to work well.

This requires taming a messy, chaotic world, and controlling parameters such that variability can be bounded. Design with enough tolerances and redundancy, and things should work. If not, we can dive in, take it apart, understand what broke, fix it, and be better for it.

This approach is everywhere, from signal processing and telecommunications, where lossy information transmission is detected and corrected through redundancy, up to industrial quality control, where statistical processes can be used to define the acceptable boundaries of production.

It also exists at the human level: in human factors engineering, concepts such as working memory (how many things the typical operator can hold in mind) or ideal observers (a theoretical person who monitors instruments at an optimal frequency against which we define “complacency”) have been constructed for the purpose of making sure that systems in which people participate will keep them acting within desirable parameters.

It’s also visible at organizational levels. Bureaucratic processes and hierarchies aim to keep alignment top-down such that the whole ensemble works coherently. Mechanisms of discipline and legibility are in play to keep the organization’s evolution under control. At broader scales, organizations often try to control their environment, their market, or the legislative context in which they operate.

Basically, by deciding how much of a mess is accepted on the inside of a process, we can define a clearer interface on the outside of it for others to interact with. This abstraction creates a simplified but effective way to group a complicated ensemble into a manageable unit.

Software ends up representing a sort of ideal for this mindset: systems can be written in languages that ensure some level of hard-won determinism. Execution is ideally always the same, there is no wear and tear, what worked yesterday will work tomorrow, everywhere. Policy decisions defined far away from the sharp end can be deterministically enforced at all levels.

This means systems can be built from components bottom-up, aligning with top-down intent, limiting variability that comes from either machining or human behaviour. The ideal is a highly predictable, controlled, competitive, and reactive system.

Complexity and Emergence

The problem is that by definition, complex systems resist analytical decomposition.

There are many competing descriptions of complex systems, some of which are behavioural and some of which are structural. They all boil down to something like “things are so interconnected and have so many states that they become either unrepresentable, unpredictable or uncontrollable.”

Other key elements are that these systems are dynamic, heavily influenced by their own history, and are also open—they continually change and interact in ways that don’t respect clean boundaries. This creates a tension where many participants have distinct goals, perspectives, representations, and degrees of freedom. By the time you’re done analyzing the system, it’s already something else. Even observing the system changes it in important ways.

Put another way, if you find yourself surprised by the system’s behaviour, by the time you’ve pinned down what happened, it’s already a different system and your policy changes will be lagging or contributing to more counterintuitive surprises. Complex systems are more influenced than controlled.

This dynamism leads to strategies that encourage equally dynamic adjustments. Since you can’t make these predictable, interventions will often be small and iterative. Alternatively, if you can’t simplify the elements or interactions you’re trying to control, you can increase the variety of control behaviours in order to make ongoing adjustments better. This tends to mean “put a controller—human or otherwise—that has enough internal complexity to cancel out the complexity of the thing it controls.” This, in cybernetics speak, is an attempt at creating more adaptive and dynamic control mechanisms.

Balance is attained not by keeping things static, but by keeping them in motion.

The ideal system is self-aware and flexible such that it can endlessly adapt and sustain itself, despite ever-increasing challenges. It's unclear whether the ideal can be reached.

How they compose (or fail to do so)

Systems generally evolve from a constrained definition of the problem and its potential solutions, something that is tractable and effective. As the scope and scale of operations grow more comprehensive, further interventions trying to steer the system provide diminishing returns, and they increasingly produce unintended effects. These are the effects of complex systems showing up as things become tangled.

The coping mechanism I’ve seen the most often is one of doubling down by doing more analysis, more decomposition, and putting more effort into more flexible automation that covers more cases. This in turn changes the nature of success and failure, by creating sometimes less frequent but bigger incidents instead. This type of composition takes place by substituting what breaks when possible, or sometimes by pure accident. It’s rarely been an orderly process.

More rarely seen mechanisms seek to find out how much of the analytical and control-centric approaches we can afford to give up, identifying what can’t change at all, and then expanding complexity-aware mechanisms outwards from there. This is far less comfortable because this sort of stance demands that you give up on the idea that you actually are in control—a very unpleasant state of affairs to broadcast for a business.

There are in fact long-standing debates as to whether larger scale accidents can actually be avoided. For example, Jean-Christophe Le Coze offers the following categorization :

Diagram showing three theoretical explanations for the unpredictability of accidents: technology out of control (Ellul/Perrow), fallible human constructs (Kuhn, Turner, Weick, Vaughan), and self-organizing emergent systems (Ashby, Rasmussen, Snook, Hollnagel).

  1. A ‘deterministic’ thread, where the properties of the technological systems themselves (such as tight coupling and complexity) will eventually defeat efforts to prevent accidents.
  2. An ‘epistemic’ branch that focuses on the idea that organizations will suffer from 'failures of foresight' where weak signals and indicators that accidents are incubating will not be seen or accepted by the structures of power, and worldviews will fail to match new challenges, leading to accidents.
  3. A ‘self-organizing’ thread that considers systems as adaptive and therefore frames success and failures as consequences emerging from systems' self-organization, through an exploration of problem and solution spaces with their available resources.

These differing views are not fully incompatible, and authors from one category will frequently borrow from others. Each perspective will however come with a focal point, a thing that is seen as important and worthy of consideration: the structure of control, the historicity of the system, the dynamics of power structures, the adaptive and changing nature of systems, the limited perspectives of participants, concepts around culture, and so on.

Many contributors to these debates, while stating that accidents are unpredictable or hard to avoid, nevertheless seek explanations that can support making them less likely. They look at the limitations of known approaches, and expand the boundaries of what we should consider, adding new perspectives that can reveal new insights.

There’s a lot of existing literature across many disciplines to study and get a better grasp on what doesn’t work (and when), and what is contextually useful. The opposition of analytical decomposition for control and complexity for emergence I’m offering here is crude and lacks nuance, but that’s hopefully what makes it an acceptable tool to think about changing systems.

Oversimplification is what we’re doing here, and knowing what kind of wrong we’re going for is useful. As George Box (1976) said: “Since all models are wrong [we] must be alert to what is importantly wrong.”

Contrasting Approaches in Practice

In a bit of a caricatural manner, the following examples will show relatively stereotypical perspectives to topics relevant to software through both analytical decomposition (with a focus on control) and complexity (with a focus that deliberately limits itself to influence):

Topic Analytical Decomposition / Control Complexity / Emergence

Training and education

Build a well-defined curriculum, best practices for teachers and trainers, and testing mechanisms to ensure predictable performance and uniformity across students.

Create environments that foster exploration, experimentation, and information exchange; provide guidance and support.

Safety

Prevent undesirable behaviours that lead to failure. Hazards are to be contained or designed out, and deviations from procedures or best practices are seen as a risk.

Foster positive behaviours that lead to success. Find how people bridge gaps in processes, work around obstacles, and recover from problems.

Correctness

The software does what the specification or API says it should. Tests pass, it is feature-complete, and operates within known boundaries.

Users or customers are able to successfully accomplish their tasks; goals can shift based on their needs.

Reliability

Uptime is within acceptable range, and is verifiable through SLAs, SLOs, etc. Load testing and thorough verification can prevent outages.

Nines don’t matter if customers aren’t happy. You also won’t know for sure if software works until you hit production. Plan for recovery and coping with surprise.

Approach to incidents

Runbooks define best practices. Protocols and processes are defined to investigate and triage problems as efficiently as possible. Build for clear information and rapid diagnostics. Investigate what broke so recurrence can be prevented.

Surprises may require improvisation. Who knows what will happen; build capacity to deal with the unknown. Investigations must look into normal work to understand how the system works in the first place.

Developing features

Understanding the needs of users and the strengths and gaps in current offerings lets you identify what to build and how to build it.

Experiments in the field with potential features that you iterate on is how you best find what features may prove useful.

Standards and norms

Written unambiguously based on verifiable processes and outcomes to make enforcement tractable, scalable, and clear.

Written in a goal-oriented manner as to support and guide the people who execute the work and who need to adapt rules to their reality.

For each category, the attitude taken can drive people to pick drastically different approaches and activities, some of which may or may never overlap—the drive to control costs and errors can hinder the effectiveness or desire to experiment, and beliefs about how complex systems work may oppose all sorts of measures that are typically used to demonstrate accountability.

I say this table is caricatural because in the real world, lines are often not this clean-cut, nor this superficial. It is possible for a control-centric hierarchy to align managers on goals and delegate authority down to cope with system complexity, and for control to be emphasized based on who people in power trust, for example. Centralized control tends to be most effective on the analytical decomposition side, but there are also approaches that aren’t control-centric that benefit from it.

In fact, many activities can be used in both approaches, and serve both for distinct people, or even at the same time for any given person:

Activity Analytical Decomposition / Control Complexity / Emergence

Code Review

Find bugs and flaws; track and assign accountability; ensure quality.

Build awareness and provide a space for feedback within and across teams.

SLO adoption

Organizational tool to ensure all teams manage their reliability adequately.

Prioritization tool whose value comes from having teams discuss and define what is an acceptable level of reliability.

Refactoring

Pay down technical debt, reduce complexity, improve maintainability and flexibility, normalize used patterns.

Countering entropy, adapting a code base to changing contexts based on new information available or shifting requirements.

Chaos Engineering

Validating that expected failure cases are properly tolerated or recovered from

Experimentation-driven exercise in which participants form theories about their system’s behaviour in failure scenarios and try to confirm or disconfirm them.

Using a platform

A shared platform can encourage good architectural patterns and prevent undesirable ones, while abstracting away complexity for teams that build on it.

Platforms provide systems with means of commoditizing shared elements to benefit from economies of scale and specialization, and address organizational bottlenecks through self-serve access.

Even if activities in this list can serve both analytical decomposition and complexity-aligned approaches, that doesn’t mean that they will .

For example, code review approaches that are control-centric and aim to hammer out any deviation from established norms may be adversarial to the point of causing anxiety or hindering actual feedback. Some implementations may still be able to mix automation and the proper social norms to successfully support both purposes to varying degrees of success.

My experience has been that for these activities, the underlying position taken truly matters if you want to understand how they play out, and how they sometimes fail to meet someone’s expectations. This underlying position will also matter when it comes to prioritizing one activity against others. If participants or stakeholders do not agree to the higher-level purpose and desired outcome, then there will be a gap in ways these activities are expected to be carried out and how they take place, and in the relative importance they will be given across the system.

When someone wants to change, supplement, or remove some of these activities, it’s useful to wonder what’s the nature of the change and what’s the perspective it favours.

Flipping across approaches

As a heuristic, when multiple lenses are available, we can either try to find the best one (for some arbitrary criteria), or use a complementary or intersecting approach that uses as many of them as possible. Picking a single lens can lead to seeking implementations that maximize one type of activity contextually—whether control or emergence—whereas a combined approach can seek to make sure chosen activities are able to serve multiple properties, as a sort of tradeoff.

Sometimes, what you get is not what you intend. An organization that sets up activities for control may find itself relying on practitioners invisibly repurposing them for complexity-aligned contributions. Meanwhile, the organization’s decision-makers exercise less control than they believe, or misattribute benefits to their own acts. They can then lose what they had when altering control mechanisms and incidentally hindering the hidden adaptations.

Conversely, if activities are set up for emergence but are instead done mechanically as if intended for control, they won’t provide the expected benefits and might look and feel like busy work: the organization then neither controls nor benefits from adaptive effects.

For broad topics and categories such as reliability or correctness, there are often no clearly defined choices or principles that are written down and that you can use. Organizations however tend to have some general tools that line up on the control-to-emergence spectrum, usually around process design and enforcement mechanisms.

If you’re faced with behaviour you dislike, let’s say people from other teams modifying sensitive code your team owns unannounced, you can take measures such as having discussions with them reasserting ownership, and mentioning the expected process. You could require a preliminary RFC document or ticket before any change request is submitted. You can rely on code ownership files to prevent any unexpected change from going further without your agreement. You can move that key code to repositories which other teams cannot access.

All of these are relatively local and play on the direct surrounding structure to modify actions and prevent undesirable acts. These approaches may be tremendously effective with little effort, but can also inadvertently fail to make desirable behaviour likelier.

Closer to emergence’s perspective, it may be more typical to figure out what drives other teams to send these changes unannounced. What are the constraints and pressures they see that makes their current behaviour reasonable to them? If everyone agrees the process is a good ideal state but it frequently gets ignored, what is perceived as more important than that? Only once this is understood should you then design an intervention. This type of questioning—often informed by patterns such as those highlighted previously by Le Coze—tends to have you pull on a thread that unravels through the whole organization. It can be time consuming and difficult to do without established trust, but it can reshape expectations, and as easily lead to major change as to minor interventions upstream.

A combined approach would be one where a broad understanding of the situation is obtained by leaning on complexity-aware methods, and is then used to design simple but high-leverage checks and barriers such that minimal control yields high rewards. This relies on the complexity stance to look not just at the system’s structure and purposes, but at how its various components and participants interact. Once the interactions make more sense, then the analytical approach is hopefully more effective.

A risk here is to find yourself with a system that either feels so intractable, resistant to complexity approaches, or inflexible to cross-cutting interventions that you’re back to purely local defences, except they are late, with more work needed to get to the same place.

The question then is not which approach is better, but how do we know when the current approach reaches its limits and what do we do then?

Pitfalls of uncritical system design

People change their systems all the time, with or without this knowledge. They’re often successful, but not always, or at least not in the ways they had planned. Knowing what to look for doesn’t mean you’ll get it right, but it increases your odds.

This might be true in the current LLM-driven shakeups as well. Because the technology is new and design patterns aren’t crystallized yet, a lot of people experiment a bit haphazardly. Many of their ideas have interesting elements or aspects to them that are worth learning from, but glaring omissions from a systems perspective that will still need to be handled.

It’s almost impossible not to find examples of wide sweeping changes proposed when reading tech opinion pieces, which I’ll avoid linking to here. But they include ideas such as:

  • Replacing code reviews with various types of barriers (tests and automated checks), rarely questioning what emergent roles the practice may have nor how static barriers may qualitatively differ from more adaptive ones.
  • Splitting software work into high-level specs to be translated to code in a black box with external checks only, without offering explanations around how the specs may cover varying abstraction layers, how the external checks can remain tractable, or how information worth learning should cross these boundaries in each direction.
  • Asking for everyone to become a sort of manager-of-agents while keeping agents under tight control loops, without asking what you may lose (or at least cause as second-order effects) in this analogy by changing the delegation and control mechanisms wholesale.
  • Focusing on system-level observable outcomes and letting go of imposing the structure within, trusting that the system will self-organize itself adequately.

If you design a system with control in mind—the use of barriers (think of the Swiss cheese model), the presence of extensive testing, of processes and procedures guaranteeing best practices—then you should pay as much attention to the mechanisms that will be needed to figure out if control actually works. This means asking questions like:

  • How do we know our observations remain relevant, and that we surface the right signals?
  • How can we know if our understanding of the system loses accuracy?
  • What important elements is our analysis leaving out or obscuring when trying to make things legible?
  • How much variability is tolerated, and are we suppressing necessary types of it?
  • Are the things we optimize for creating brittleness elsewhere?
  • Is our control real or illusory? How would we know if that changes?

Well-regulated systems compensate for disruptions in ways that hide or suppress the signals of accumulating problems, both at technical and cultural levels. These questions aim to figure out whether any thought is given to what hides such behaviours.

When you design for emergence—think of self-organization, market-like mechanisms, or delegation of decisions to participants with local context—other questions come up:

  • Are local parts of the system working at cross purposes?
  • Is goal alignment effective? What maintains coherence?
  • What capabilities or efficiencies are we sacrificing when giving up on legibility?
  • Can we afford to lose the efficiency of a control-centric system? When might we need it?
  • How do we differentiate adaptation from drift?
  • What preserves dissent and carries information from the edges of the system?

Since complexity-aware approaches tend to resist prescriptive stances, there are often risks of increased inertia or widespread misalignment. Emergent properties will be key to success and failure, but without some careful thinking and influence, things can take on a life of their own.

Whenever someone pushes for a system design that focuses on analytical decomposition or control, ask how they know they’re doing what’s needed, and the mechanisms by which they adapt. Whenever someone pushes for a design that seems to promise self-regulation and endless flexibility, ask how they’ll maintain coherence and the conditions they rely on for good outcomes. Whenever someone pushes to switch from one to the other, ask what depends on current behaviour and consider what the second-order impacts might be there.

Tech companies often rush to reinvent themselves around the outsized promises of new technology. Integrating new technology into existing workflows generally demands transforming the workflows. These changes often aim at reducing variability and increasing control, but cross subsystem boundaries in ways that disrupt tangled interactions that were dynamically stable.

Automation that makes things predictable necessarily removes elements of unpredictability that can be useful to adaptation and evolution. Likewise, trying to make a part of the system more adaptive may necessarily make it less predictable. Both have knock-on effects on the rest of the system.

Where and how does the system migrate from one mode of operation to the other? Where is control necessary and where is it not? What do we choose to analyze and decompose and what do we treat like an ecosystem instead?

If we don’t have an answer to these, we also don’t have a good answer to how our systems will avoid failure or meet success. Systems are systems. They will keep acting like systems, and failing like systems.

Anthropic candidates face blunt money question

Hacker News
www.axios.com
2026-08-24 07:55:46
Comments...

Your executable is a SQLite database

Simon Willison
simonwillison.net
2026-08-24 07:38:15
Your executable is a SQLite database Farid Zakaria describes a neat Linux pattern for creating a SQLite database file that can be directly used as an executable binary. The trick sets the SQLite file format's 4-byte application ID (68 bytes into the file) to SELF, standing for Structured Executable ...
Original Article

24th August 2026 - Link Blog

Your executable is a SQLite database ( via ) Farid Zakaria describes a neat Linux pattern for creating a SQLite database file that can be directly used as an executable binary.

The trick sets the SQLite file format's 4-byte application ID (68 bytes into the file) to SELF, standing for Structured Executable & Linkable Format. The various components of the ELF executable format are then arranged into a number of different SQLite tables, using this schema .

Their self-exec interpreter ( C code here ) can then extract and execute the necessary pieces.

You can additionally use a Linux mechanism called binfmt_misc to teach the kernel to execute that any time it encounters an executable matching that binary pattern. Farid uses NixOS here, but without NixOS I think registration looks something like this:

printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \
  > /proc/sys/fs/binfmt_misc/register

SeL4 security proofs now complete on AArch64

Hacker News
proofcraft.systems
2026-08-24 07:32:51
Comments...
Original Article

seL4 security proofs now complete on AArch64

After completing the proofs of functional correctness and integrity , Proofcraft has now established the proof that seL4 enforces confidentiality on AArch64, providing a formal mathematical proof that the kernel prevents an application running on top of seL4 from learning information without authorisation.

Thanks to continued support from NCSC , this milestone completes the formal proof that the seL4 implementation code on AArch64 enforces security isolation of the applications running on top (under the assumptions listed here ). This isolation prevents attacks on non-critical applications from propagating to critical applications and compromising them.

Status of seL4 proofs on
AArch64 with now confidentiality done and system initialisation started

Proof Engineering and Theory at LICS'26

Title page of the paper The Algebra of Iterative Constructions

The paper The Algebra of Iterative Constructions by Kevin Batz, Benjamin Lucien Kaminski, Lucas Kehrer, Gerwin Klein, Henning Urbat, and Todd Schmid was presented at the 41st Annual Symposium on Logic in Computer Science ( LICS ) in Lisbon this week. This paper in theoretical computer science is about an algebraic abstraction and reasoning principles for the iterative construction of fixed points. Fixed points are a recurring theme in computer science with many famous results such as the Kleene fixed point theorem. The algebra shown in this paper allows expressing such theorems concisely and enables reasoning about them in an abstract and streamlined way that can be implemented efficiently in proof assistants such as Isabelle/HOL, which Proofcraft is using for the verification of the seL4 microkernel.

The highly automated Isabelle/HOL implementation of iteration algebra in this paper resulted from a spontaneous collaboration between Proofcraft’s Chief Scientist Gerwin Klein and Benjamin Kaminski that started at the IFIP Working Group 2.3 (Programming Methodology) meeting in Athens in 2025. It shows that proof engineering ranges from practical application all the way to deep theory.

MCS seL4 now verified! (for RISC-V)

Proofcraft achieved a significant milestone in the seL4 verification roadmap that was years in the making: the MCS configuration of seL4, providing support for mixed-criticality systems, is now proved to be correct on RISC-V.

This configuration is the largest new seL4 feature, indispensable for mixed criticality real-time applications such as automotive use cases. It contains wide-ranging changes to the kernel’s implementation and API. Its verification therefore required considerable effort and has been a priority in the seL4 roadmap for a long time.

Proofcraft has now completed, for the very first time, the verification of functional correctness for seL4 with MCS. Functional correctness is the largest and most central proof in the seL4 verification stack . The proof targets the RISC-V architecture and will now be ported to the Arm 64-bit architecture, as part of DARPA’s PROVERS program .

MCS verification status

Dynamic Domain Scheduler for seL4

Proofcraft delivered the implementation and formal proof of more flexible domain scheduling in seL4 .

Before the change, the seL4 security proofs, and in particular the proof of information flow enforcement, required a fully static schedule that was compiled into the kernel. This meant that, when using seL4 to enforce the information flow boundaries between applications, developers were required to provide a fixed predetermined amount of time for each domain, for the entire lifetime of the running system. This strict policy made it hard to apply information flow control in practice and to support in SDK-style development such as the Microkit .

Proofcraft proposed a new seL4 runtime API (Application Programming Interface) allowing the loading of semi-static domain schedules. This means that a system with information flow protection can go through different phases at runtime that can satisfy different domain timing requirements. For instance, a boot phase of the system can have longer time slices to allow virtual machines to start without overrunning their domain time allocation, and an operational phase of the system can provide shorter time slices so that each domain can be responsive to outside interaction. Additionally, an SDK-based system such as the Microkit can use the new API to set a domain schedule at boot time.

This new seL4 API is implemented, verified and available in seL4 15.0.0.

Diagram illustrating status before
with one schedule versus the current status with multiple static schedules

June Andronick Keynote at CDIS Spring Conference in Stockholm

On May 21st 2026, CDIS – Swedish research Center for Cyber Defense and Information Security – held its spring conference at KTH Royal Institute of Technology in Stockholm.

Proofcraft CEO June Andronick was one of the two keynote speakers, alongside August Martens from Mistral AI. June gave an overview of formal verification for cybersecurity, and participated in a panel on Digital Sovereignty.

Picture of June giving talk and panel

Proofcraft presenting at the Cyberagentur Milestone Research summit

Representation of 2 title slides for
the 2 presentations at the summit

In April 2026, Germany’s Cyberagentur held a Milestone Research summit to present the progress and outcomes of its funded programs, including the Ecosystem trustworthy IT research program (ÖvIT) , which Proofcraft is a recipient of, partnering with Kry10 .

Proofcraft’s Chief Scientist Gerwin and Kry10’s Chief Scientist Martin Dehnel-Wild presented the progress on the Dyvercon project, to deliver dynamism, performance, and proof for complex cyber-physical systems. In particular, Gerwin reported on Proofcraft’s work on extending the seL4 proofs to support a static multikernel configuration, where applications can benefit from the use of multiple CPU cores for performance, while at the kernel level a separate instance of seL4 run on each core.

Gerwin additionally gave a general introduction to formal verification and overview of its use in the real world.

Proofcraft is a proud sponsor of the seL4 summit 2026

Logo of the seL4 summit

Proofcraft is happy to be supporting the 2026 seL4 summit as a Silver sponsor.

The seL4 summit is an annual international gathering of participants from industry, government and universities with interests in the world’s most highly assured OS kernel. Attendees and presenters include the creators and maintainers of the seL4 technology such as the Proofcraft team.

This year’s seL4 summit will be held in Vancouver, Canada, on Sep 1-3, 2026.

Icon of Vancouver skyline

5 years of Proofcraft. 5 years closer to a verified future.

Proofcraft logo with 5 fireworks

On the 14th of April 2021, we created Proofcraft. Five years later, we are so busy working for a verified future that we have not posted news for a while.

Much has happened, and more is to come. For now, here are some posts from our back log of news items with technical highlights that Proofcraft has been delivering.

Firstly, the seL4 proofs are now supported on 100% of Arm platforms that the kernel can run on. With this significant progress towards reducing the reliance on experts, users of seL4 can now choose freely between the supported Arm platforms and always be sure they use a verified code base. This work is part of DARPA’s PROVERS program.

Secondly, seL4 on AArch64 now provably enforces integrity : We have a formal mathematical proof that the kernel prevents an application running on top of seL4 from modifying data without authorisation. And the work on security theorems goes on: thanks to continued support from NCSC, we are close to completing the confidentiality property, and with that the entire security proof stack for the 64-bit Arm architecture.

Much more is happening, with three large projects going on in parallel, funded by DARPA , Cyberagentur and NCSC respectively. Stay tuned for more!

linked-in profile

seL4 is a registered trademark of LF Projects, LLC.

Why older tech is sometimes safer from hackers

Hacker News
www.bbc.com
2026-08-24 07:23:39
Comments...
Original Article

Alamy Nokia 9210 phone (Credit: Alamy) Alamy

The fear of hacking has made some people turn to other forms of technology ignored by new generations of cyber criminals.

You might not expect a world-renowned cyber security expert to rely on old, potentially vulnerable email software. But, for years, that's what Mikko Hyppönen did. Shunning mainstream options such as Hotmail and Gmail, he instead chose obsolete email software called Eudora.

"I used to run it years after it was out of [technical] support," says Hyppönen, a Finnish computer security expert.

He preferred Eudora for various reasons, arguing it was "really superior in many ways". Although Eudora was far from perfectly secure , as people switched to newer email tools, Hyppönen realised that hackers were forgetting about Eudora.

Hyppönen calls it "security by antiquity". Others use the phrase "security by obsolescence" and in both cases this means relying on an older technology or system since it may prove, somewhat counterintuitively, safer than more recent alternatives.

While Hyppönen stresses that using the latest, fully patched and updated software is still "the optimum situation", there are specific cases where older tech could be preferable from a security standpoint.

"The vast majority of attackers are criminals trying to make money and it doesn't make any sense for them to target systems being run by 50 people," he explains.

Getty Images Global positioning system (GPS) handsets like these in use by the Ukrainian armed forces are vulnerable to electronic jamming (Credit: Getty Images) Getty Images

Global positioning system (GPS) handsets like these in use by the Ukrainian armed forces are vulnerable to electronic jamming (Credit: Getty Images)

"Security by antiquity" is, it turns out, a quiet way of beating cyber-criminals, hackers and enemy attackers.

Matt Bishop, a computer scientist and professor emeritus at the University of California, Davis, has tested this principle, somewhat by accident. Back in the 1990s, he and his colleagues set up a system connected to the internet and deliberately left it accessible so that they could catch hackers and bots attempting to breach it. This is a common cyber-security research technique known as a honeypot – a kind of trap set up in carefully controlled conditions.

But the team picked an older software version for their honeypot that had been upgraded multiple times since its release and, consequently, no hackers bothered to target it. "When we upgraded it to the new one, we had all the attacks we wanted," recalls Bishop. "I thought it was so amusing."

This possibility of evading nefarious activity by sticking to old tech can take many forms. Both Bishop and Hyppönen say they have friends who refuse to get a smartphone. "One person I know [uses] a Nokia 9210," says Hyppönen, referring to a simple, "dumb" mobile phone first released 25 years ago.

As technology has advanced, experts have often questioned whether the latest systems are actually more risky than older ones

While hackers can't target it in quite the same way they might target a modern Android or iOS device, the phone's operating system, Symbian, does have some old, known vulnerabilities. The flipside is that "nobody's targeting them anymore", adds Hyppönen. Similarly, the Nokia could be more at risk from techniques that snoop on phone calls . But how many people will bother? It's a security trade-off.

As technology has advanced, experts have often questioned whether the latest systems are actually more risky than older ones. During the late 1990s, Bishop wrote a speech in which he argued that computers were "considerably less secure than the paper systems we still use, and that are rapidly being replaced".

"Voting is the bedrock of our democracy," says Hyppönen. "It's one of the last things I'd like to weaken in any way, especially if the benefits are so small."

Militaries are also known for being reluctant to take chances. Even the world's most active militaries are known to occasionally rely on old technologies for reasons of reliability and security. "One thing I've seen in places like Ukraine is the use of paper maps, or laminated maps, and compasses," says Thomas Withington, associate fellow at the Royal United Services Institute, a think tank. "You can't jam that." It's a kind of "analogue resilience", he adds.

Getty Images Concerns over the vulnerability of some electronic voting systems mean many elections are still carried out with paper forms (Credit: Getty Images) Getty Images

Concerns over the vulnerability of some electronic voting systems mean many elections are still carried out with paper forms (Credit: Getty Images)

Jamming attacks hitting GPS-based navigation have forced some countries to make careful choices about which legacy technologies to retain, and which GPS alternatives to invest in, says Victor Tasiemski, a systems engineer at Overlook Systems Technologies, which works on navigation tech.

That's exactly what happened in Ireland, where a programme to replace ground-based radio beacons has been slowed down in order to keep those beacons operating for longer. A spokeswoman for the Irish Aviation Authority told the Irish Times in June that the beacons were being retained "as part of a planned resilience strategy".

Technologists who work with militaries are familiar with the challenge of designing systems that can link old and new technologies together. Stefan Kraus is co-founder and chief technical officer of Kraus Hamdani Aerospace, which has designed a drone-based communications platform that can connect military personnel to one another, no matter whether they are using older radios or newer ones. Military radio tech that has been around for decades is "tried, tested and secure", he says. "The US military isn't going away from that."

Ransomware is what, for me, kept tape in business the past 10 to 15 years – Hugues Meyrath

Tasiemski notes that one alternative to GPS-based navigation is eLoran, a radio-based navigation system that has its roots in military technology first developed during World War Two . With attacks targeting GPS systems, eLoran is arguably becoming increasingly desirable, says Tasiemski, because it uses a much more powerful signal and is therefore much trickier to jam: "Overpowering a one-megawatt transmitter is pretty hard."

Robustness is not easy to replace. This applies in the world of data storage, too, where magnetic tape – invented during the 1950s – still plays a huge role today. Companies, research institutions and government agencies continue to store vast amounts of data on reels of tape. The technology has improved significantly since it first appeared, with data storage densities having increased exponentially over the decades .

But the principle remains the same: spools of tape that hold information. The tape can be detached from computer systems, packaged, and transported to secure facilities, including difficult-to-breach underground caverns and repurposed mines .

Getty Images Reel-to-reel tape is making a comeback because companies see it as a cheaper wave of saving material than computer memory (Credit: Getty Images) Getty Images

Reel-to-reel tape is making a comeback because companies see it as a cheaper wave of saving material than computer memory (Credit: Getty Images)

"Ransomware is what, for me, kept tape in business the past 10 to 15 years," says Hugues Meyrath, chief executive of Quantum, a company that specialises in data storage.

An organisation locked out of its own computer systems may still be able to retrieve its most important data if staff have made good back-ups, for example on magnetic tape. Interest in magnetic tape is only increasing further today because the cost of random access memory (Ram), a form of computer memory that doesn't rely on tape, is skyrocketing . Meyrath says his company's clients use tape to store all kinds of data – from broadcasters' footage of baseball games to genomes mapped in detail by research facilities.

Tape's security attributes stem partly from the fact that most people don't tend to interact with it at all. It's obscure, clunky, old-school tech. "One way to attack a system is to rig a set of USB sticks and throw them around a parking lot," says Bishop, referring to the likelihood that someone will eventually pick up one of the USB sticks and insert it into their computer – a simple way to perpetrate a hack. As he puts it: "You'll never see magnetic tape thrown around a parking lot."

Experts who spoke to the BBC still recommend that people use the latest and most up-to-date technologies for everyday tasks, as it remains the safest approach. But it is worth acknowledging that "new" doesn't necessarily mean "best" in all scenarios. And knowing when and how to switch to older systems could become increasingly important, as cyber-attacks and other threats get more sophisticated.

For more insights, sign up to our Tech Decoded newsletter, where Lily Jamali and Thomas Germain break down the biggest stories of the tech world, and help you live a better digital life. Sign up for free here.

For more science, technology, environment and health stories from the BBC, follow us on Facebook and Instagram .

Agent Is Not the Model

Hacker News
code.joejag.com
2026-08-24 07:20:40
Comments...
Original Article

I often hear people use the words agent and model interchangeably, referring to Claude as either one. So I thought it would be useful to write a quick reference on the terminology we use here, to help us have more precise conversations.

Let’s start with a graphic that shows where we are headed.

The Agent System

Harness Inference service Model

An agent system is made up of several layers. At its core is a model . Things like Sonnet, Opus, or Gemini. These are trained on vast amounts of text and data, and in the end, they are essentially big collections of floating point numbers wired together in a particular way.

Frontier models are far too computationally expensive for most of us to run locally at full scale. They need way more RAM than most of us have on our local machines. So we need somewhere else to run them. That somewhere is an inference service . Services like AWS Bedrock or Anthropic’s API. The inference service takes your API calls, feeds them into the model, and also tracks pricing as you go.

The service runs the model in an inference engine, but it is still pretty basic. Text in, text out. Think of how ChatGPT worked when it first launched. That interaction layer, the thing that gives you a nice way to talk to the API, is called a harness . In its simplest form, it is just a lightweight wrapper. Other harnesses you might know are Claude Desktop or Claude CLI.

And this is where things get interesting. Features like MCP and Skills? They are primarily part of the harness layer. The model doesn’t inherently know about an MCP server or a Skill; the harness decides what context and tools to expose to it.

So if you put all that together, an agent system is a harness, a set of tools and logic for processing inputs, that calls an inference service, which runs a model. That is it. That is the whole stack.

Real world examples

Here is how the stack breaks down for some common tools you might be using.

Agent System Harness Inference Service Model
Claude Desktop Claude Desktop
(UI + MCP + local logic)
Anthropic’s inference service Sonnet / Opus / Haiku
Claude CLI Claude CLI
(tool parsing + file I/O)
Anthropic’s inference service Sonnet / Opus / Haiku
Cursor Cursor editor
(context assembly + tool routing)
Cursor’s inference layer (various providers) Sonnet / GPT / Gemini / etc.
ChatGPT ChatGPT UI
(history + orchestration)
OpenAI’s inference service GPT models
Custom agent you build with LangChain Your LangChain code
(prompt templates + tool definitions)
Your chosen provider (Bedrock, OpenAI, etc.) Your chosen model

Notice the pattern. The harness is where your logic lives. The inference service is the hosted layer that runs the model. The model is the mathematical thing that produces text. The same model, say Sonnet, can be used across multiple agent systems with completely different harnesses, and it will behave differently because the harness is shaping the inputs and interpreting the outputs.

Let’s imagine we are building a house. We have a building crew on site. They take a blueprint, order materials, handle equipment, and decide sequencing. They are the only ones who can actually touch the ground. Pour concrete, hammer nails, that kind of thing. But if something comes up and they need brainpower, they call an architect. They can’t talk to the architect directly, though. They have to go through the firm that employs them. The firm handles scheduling and billing. And the architect is very particular. You give it a brief, it gives you back paper plans. Nothing more.

The crew is the harness. They’re the part that can actually touch the outside world and turn the architect’s plans into actions. The firm is the inference service. The gateway that handles logistics and cost. And the architect is the model. Pure, constrained, and brilliant at its narrow job.

So when you use something like Claude CLI, the CLI is the harness. It uses Anthropic’s inference service, which runs their models, Sonnet and Opus. One interesting implication: as models get smarter, they might make some of today’s harness logic, like Skills or MCP, less useful. The way we build harnesses now might not age well.

The takeaway

Let’s be explicit with our terms.

  • Model - the mathematical function that transforms input tokens into output tokens.
  • Inference service - the hosted service that runs the model and tracks usage.
  • Harness - the logic that shapes inputs, interprets outputs, and touches the outside world.
  • Agent system - all three working together.

When we say “my model is doing this or that,” we are usually talking about what the harness is orchestrating. The models themselves are just these inscrutable mathematical objects that we get to call out to.

And that distinction matters. Because if something goes wrong, or if we want to make things better, we need to know where to look. Is the model giving bad answers? Maybe it needs better context from the harness. Is it too slow or too expensive? That is probably the inference service or the compute underneath. Is it not using tools correctly? The harness is probably formatting them wrong or not parsing the responses properly.

When you can name the layer, you can fix the layer. That is the whole point of being precise. It is not about being pedantic. It is about being able to improve things faster and more effectively.

Symptom Likely layer
Bad reasoning / knowledge Model or context supplied by harness
Missing context Harness
Tool isn’t available Harness / tool integration
Tool call is malformed Harness or model
Tool executes incorrectly Tool / harness
Slow inference Inference infrastructure
High cost Model choice / inference service
Same model behaves differently Harness / context / tooling

Omakase Computing

Hacker News
learn.omacom.io
2026-08-24 07:13:53
Comments...
Original Article

Omacom stands for Omakase Computing. The word Omakase means "I'll leave it up to you" or "chef's choice" in Japanese.

It's the idea that most people don't actually know what they want, at least not at first. That they're better off getting something beautifully curated and integrated from someone they trust to make competent, tasteful decisions rather than suffer from the paradox of choice .

It's the same principle that Ruby on Rails was built on.

It doesn't mean there isn't room for substitutions. It doesn't mean you can't develop your own taste and opinions. It just means that when you're starting out, you don't even have to know what all the different options are to enjoy an integrated, cohesive computing experience.

Once you develop your competence and knowledge, you may well want to tinker and tailor your computing environment to your specific liking. Or not! Plenty of great programmers prefer to stick with a set of well-maintained defaults. But you always have the option.

In some ways, this is anathema to some branches of classic Linux culture. Where there's been a strong belief that everyone should know everything about all of their tools, and that they should preferably configure every last one from them from scratch.

The irony is that this atomized approach is exactly what's allowed Omacom, and Omarchy in particular, to put it all together in a delightfully integrated way! And what's allowing you to make tiny substitutions on the parts where you have a strong opinion without having to give up on the rest of the omakase menu.

Besides, the wonderful thing about Linux is that there's always another option. If you don't like my opinions, my omakase menus, you'll find a hundred other chef's catering to your liking. Isn't that great?

Omacom Foundation funding hits $10M

Hacker News
omarchy.org
2026-08-24 07:04:42
Comments...
Original Article

The Omacom Foundation’s funding has just hit $10 million with two new Founding Patrons joining the mission: Drew Houston , cofounder and co-CEO of Dropbox , and Peter Steinberger , creator of OpenClaw .

Like the original eight Founding Patrons, Drew and Peter are each contributing $1 million. That gives the foundation ten patrons and a clean TEN MILLION DOLLARS to propel our audacious mission to make Linux on the desktop happen in a much bigger way.

It’s extra sweet to have Drew and Peter on board because I’ve personally been such a big fan of both of them and their accomplishments. I’ve been an enthusiastic customer of Dropbox for nearly two decades, and it’s central to how I’m able to live with no backup, no cry yet constantly switch computers.

That’s why Omarchy ships with great Dropbox integration out of the box. Just go to Install > Service > Dropbox , and you’ll have file manager integration and a bespoke menu panel for controls.

And OpenClaw has essentially provided the roadmap for how Omarchy should tackle its explosive growth. How do you deal with PR backlogs that suddenly go parabolic? What about security around plugins? How should meetups in the project’s name be handled? I’ve already had the pleasure of drawing on Peter’s advice and experience on several of these topics.

Beyond that, they both represent exactly the kind of technical ambition I want around Omarchy. Drew turned a personal itch about moving files between computers into Dropbox. Peter turned a weekend project into OpenClaw, and in the process reminded everyone just how much appetite there is for computers that feel personal, programmable, and fun.

That’s the spirit behind the Omacom Foundation too. We’re here to fund the infrastructure, open-source projects, and developers needed to make the Linux desktop a delightful home for the next generation of computer users.

Welcome, Drew and Peter. Ten Founding Patrons. Ten million dollars. The prophecy just got another $2 million closer!

Emacs 31.1 released

Lobsters
lists.gnu.org
2026-08-24 06:52:27
Comments...
Original Article

[ Date Prev ][Date Next][ Thread Prev ][Thread Next][ Date Index ][ Thread Index ]
From : Sean Whitton
Subject : Emacs 31.1 released
Date : Mon, 24 Aug 2026 11:43:32 +0100

Hello everyone,

Version 31.1 of Emacs, the extensible text editor, should now be
available from your nearest GNU mirror:

  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.gz
  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.xz

The tarballs are signed; you can get the PGP signature files at:

  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.gz.sig
  https://ftpmirror.gnu.org/emacs/emacs-31.1.tar.xz.sig

You can choose a mirror explicitly from the list at:
  https://www.gnu.org/prep/ftp.html

Mirrors may take some time to update; the main GNU ftp server is at:
  https://ftp.gnu.org/gnu/emacs/

--------------------------------------

To verify that the tarball is intact, download both the .sig and
the tarball, and run this command:

  gpg --verify emacs-31.1.tar.gz.sig

(and similarly for emacs-31.1.tar.xz if you download that format).

If that command fails because you don't have the required public key,
run this command to import it:

  gpg --keyserver keyring.debian.org --recv-keys \
    8DC2487E51ABDD90B5C4753F0F56D0553B6D411B

Alternative keyservers include keyserver.ubuntu.com and
keys.openpgp.org.

You can also run sha256sum or sha512sum and confirm that these checksums
match:

SHA256  emacs-31.1.tar.gz
3cad7fd1466c0e24867df8d2609da3ac75abc90d7c4c0175e410e9be46d4092a
SHA256  emacs-31.1.tar.xz
1da5790d9580c81932b5bf700633114468da7b3412d69faa767daebf974f4586

SHA512  emacs-31.1.tar.gz
1d6e34a99367e1cdc2ab08ef7c073bbabda7cff21cda616c346591f507128df9437698fc74143ba46267a269c64148b18c2967de8f8ae0544322b68f0009acfa
SHA512  emacs-31.1.tar.xz
25cb810d09eaaa58306f4c10f406466c424517657dd1c9db056dadb624f0bc33db58f3bcdf527d81e5059e492b81c237f164eb3997bf4357bd84c696537f6836

----------------------------------------

For a summary of changes in Emacs 31, see the etc/NEWS file in the
tarball; you can view it from Emacs by typing 'C-h n', or by clicking
Help->Emacs News from the menu bar.

You can also browse NEWS on-line using this URL:

  https://git.savannah.gnu.org/cgit/emacs.git/tree/etc/NEWS?h=emacs-31

For the complete list of changes and the people who made them, see the
various ChangeLog files in the source distribution.  For a summary of
all the people who have contributed to Emacs, see the etc/AUTHORS
file.

For more information about Emacs, see:
  https://www.gnu.org/software/emacs

-- 
Sean Whitton

Attachment: signature.asc
Description: PGP signature



[Prev in Thread] Current Thread [Next in Thread]
  • Emacs 31.1 released , Sean Whitton <=

The treasury bond mess: is this the demise of the US as a safe haven?

Hacker News
www.theguardian.com
2026-08-24 06:52:24
Comments...
Original Article

The bond market is driving the Trump administration crazy. Last week, the treasury secretary, Scott Bessent, announced that the government would sharply ramp up its purchase of treasury bonds, in an effort to raise their price and thus push down their yield, which amounts to the interest rate the government pays on its debt.

It didn’t quite work as planned. Yields on treasurys fell after Bessent’s bond market intervention but soon bounced back. By Friday afternoon, the yield on the 10-year treasury was back near where it was before the secretary’s announcement. The yield on the 30-year bond was again trading around its highest level in 20 years or more.

Bessent’s desperation is hardly surprising. The rise in treasury yields since the upsurge in inflation in 2022 has sharply increased the cost of servicing the federal debt, which has ballooned to a record $40tn . This year interest payments will absorb 13.5% of all federal spending, more than defense and up from 5.2% in 2021.

To Trump’s chagrin, higher treasury yields – which set the benchmark for rates on mortgage loans and other long-term lending across the economy – are walloping his popularity, helping freeze the housing market and contributing to the growing realization that he has been a dismal steward of the economy.

An irked president has called interest rates “ridiculous” and “artificially high”, and blamed the Federal Reserve for not cutting them. In one of his most recent signs of derangement, he lashed out against Switzerland for having lower interest rates than the US, pointing out that he had the “absolute right” to cut off all US business with the country. And he hinted at a novel approach to monetary policy, suggesting that “the ultimate intervention is our military ”.

But treasurys’ persistent weakness raises a more broadly unsettling prospect for the global economy: the end of the era in which the United States provided a more or less universally accepted safe, liquid asset for investors, companies and governments around the world to store their wealth.

Between the turn of the century and the Great Recession, foreign central banks increased their holdings from about 20% to more than 30% of all treasurys outstanding, as they built reserves to ward against speculative attacks or tried to manage their exchange rates. Foreign investors also piled in. By 2008, over half of all treasury bonds were in the hands of foreigners.

US government bonds were considered such a solid place to store money that their price would rise (and their yield would fall), any time a crisis struck, sending investors scurrying for safety. This was true even when, as during the collapse of the housing bubble in the US in 2007, the crisis was sparked by a mix of financial exuberance and inept policymaking in the United States.

The pillars supporting the treasury market have been weakening for some time, however. Foreign central banks – mainly in China and Japan – have sharply pared back their holdings. Private foreign investors have picked up some of the slack. By mid 2025, private foreign investors held $7tn in treasurys, almost twice as much as the $3.9tn held by foreign official entities. Still, the foreign share of treasury holdings has fallen by 10 percentage points over the last two decades or so, to about 40%.

The new buyers of treasurys come with new risks. Unlike foreign official entities, which hold the bonds to ensure financial stability, private investors seek returns. They will sell to make a buck. Their rising footprint has turned the treasury market into a more volatile place than it used to be.

The main threat to treasurys’ status as the paramount store of value in the world, though, comes from within. The supply of treasury bonds has been growing at a fast clip in recent times, to fund a budget deficit that is now hovering at about 6% of GDP. Supply has outpaced demand. These days, US government debt no longer has the top rating from the big credit rating agencies and must offer a higher yield than that of many other affluent nations.

Add in the increasing mistrust of Trump’s reckless economic governance and you have the makings of a problem. In the Trump era, treasury bonds no longer rise as they used to in moments of high risk. When Trump unleashed his volley of tariffs against everybody on “Liberation Day” in April last year, investors dumped treasurys just as they would a lowly emerging market bond.

Bessent knows this poses a problem for the government. Funding the deficit requires adding some $10bn a day, net, to the mountain of treasurys on the market. But it also poses a potential problem to investors and governments in the rest of the world. They all learned to trust treasurys as a bedrock asset in which to store their wealth, a perfect complement to the dollar as the main mode of exchange for trade and investment around the world. What will they do without it?

Like Nato trying to convince Trump to stay or the World Trade Organization working to restore its relevance since the US left, financial leaders don’t yet know quite how to cope with the seemingly inevitable demise of the American safe haven. Indeed, treasurys maintain what is left of their status largely because it has not been easy for foreign countries and businesses to find somewhere else to keep their stash.

But the search is on. Bessent will have to do more than repurchase a few billion worth of treasurys to overcome mistrust in America’s Loony Tunes leader and ensure that there is sufficient demand out there to match the massive supply coming down the pike.

  • Eduardo Porter is a journalist focused on economics and politics. He writes the newsletter Being There on Substack

CISA orders urgent patching of actively exploited Zimbra flaw

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 06:45:12
The Cybersecurity and Infrastructure Security Agency (CISA) has ordered U.S. government agencies to patch an actively exploited vulnerability in Zimbra Collaboration Suite (ZCS) within three days. [...]...
Original Article

Zimbra

The Cybersecurity and Infrastructure Security Agency (CISA) has ordered U.S. government agencies to patch an actively exploited vulnerability in Zimbra Collaboration Suite (ZCS) within three days.

The Zimbra security team patched the security flaw (tracked as CVE-2026-73570 ) in version 10.1.20 , released on July 20.

Successful exploitation allows unauthenticated attackers to gain remote code execution by exploiting a command injection weakness in the SNMP monitoring component when SNMP notifications are enabled on the targeted system.

image

"Due to improper sanitization of untrusted input during SNMP notification processing, an unauthenticated attacker can send specially crafted SMTP requests that may result in execution of arbitrary operating system commands as the Zimbra user," it explained.

CISA's warning comes after CERT Polska, the Polish Computer Emergency Response Team (CERT), first flagged the vulnerability as targeted in the wild last Monday.

While threat security watchdog Shadowserver tracks more than 12,000 Zimbra servers exposed on the Internet, there is no information on how many are honeypots or have already been secured against attacks exploiting the CVE-2026-73570 flaw.

Zimbra Collaboration Suite servers exposed online
Zimbra Collaboration Suite servers exposed online (Shadowserver)

​On Friday, CISA confirmed CERT Polska's alert, added the flaw to its KEV catalog, and ordered U.S. Federal Civilian Executive Branch (FCEB) agencies to secure their systems within three days, by August 24.

Although CISA didn't share any information on these ongoing attacks, the Polish CERT team asked security teams to check logs for suspicious activity, such as the Zimbra service restarting unexpectedly, and for files created in the /opt/zimbra/jetty/webapps/, /opt/zimbra/jetty_base/webapps/, and /tmp/ folders by user zimbra over the last 30 days.

ZCS is a popular email and collaboration suite used by hundreds of millions of organizations and people worldwide, including hundreds of government agencies and thousands of businesses.

Zimbra security issues are commonly targeted in the wild and have been used to steal sensitive data from vulnerable email servers in recent years.

Most recently, Seqrite Labs researchers revealed in March that APT28 (a state-sponsored threat group linked to Russia's military intelligence service) was exploiting a stored cross-site scripting (XSS) vulnerability in attacks targeting Ukrainian government ZCS servers .

In October 2024, U.S. and UK cyber agencies warned that APT29 hackers (tracked as Midnight Blizzard and Cozy Bear) linked to Russia's Foreign Intelligence Service were targeting Zimbra servers using a flaw previously exploited to steal email account credentials .

Russian Winter Vivern cyber spies have also abused a reflected Cross-Site Scripting (XSS) vulnerability to steal emails belonging to NATO-aligned individuals and organizations via Zimbra webmail portals.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

Criminal Deception in Silicon Valley

Schneier
www.schneier.com
2026-08-24 06:38:29
Interesting paper: Abstract: With entrepreneurial fraud cases on the rise, we investigate how entrepreneurs carry out criminal deception, employing deceptive means to defraud audiences. Analyzing court data from Silicon Valley ventures and their founders prosecuted for fraud between 2000 and 2023, o...
Original Article

Interesting paper :

Abstract: With entrepreneurial fraud cases on the rise, we investigate how entrepreneurs carry out criminal deception , employing deceptive means to defraud audiences. Analyzing court data from Silicon Valley ventures and their founders prosecuted for fraud between 2000 and 2023, our findings reveal that entrepreneurs carry out criminal deception through a process of façading : Entrepreneurs construct, perform, and protect illusory appearances (façades) that externally project high-growth performance to audiences while masking ventures’ actual underperformance. We identify three forms of façading—­surface, reinforced, and deep façading­—that are contingent on the severity of the gap that entrepreneurs face between audiences’ performance expectations and ventures’ performance reality. Our theoretical framework captures how entrepreneurs facing minor, wide, and extreme expectation-reality gaps engage in evermore sophisticated efforts to detach the venture’s externally projected appearance from its actual operational reality. Practically, we propose several approaches to deter and detect criminal deception, including the extension of U.S. Securities and Exchange Commission surveillance and whistleblower program, investor due diligence reform, and dedicated entrepreneurship education interventions that clearly demarcate when entrepreneurs transgress into criminal deception. We make contributions to literatures on cultural entrepreneurship, organizational wrongdoing, and the social effects of entrepreneurship.

Tags: , ,

Posted on August 24, 2026 at 6:38 AM 0 Comments

Sidebar photo of Bruce Schneier by Joe MacInnis.

David Bremner: Reproducing Org mode configuration

PlanetDebian
www.cs.unb.ca
2026-08-24 06:30:00
Context Recently I was trying to reproduce a bug with citeproc.el and org-mode in emacs. I thought I could use package-vc-install to install a set of upstream emacs packages at fixed versions, and thereby let citeproc upstream test in the same environment as I have. It turns out that getting emac...
Original Article

Context

Recently I was trying to reproduce a bug with citeproc.el and org-mode in emacs.

I thought I could use package-vc-install to install a set of upstream emacs packages at fixed versions, and thereby let citeproc upstream test in the same environment as I have.

It turns out that getting emacs to load the non-builtin version of org via package-vc-install did not work because

  • org-mode needs to run make after cloning
  • once package.el was initialized, I always seemed to end up with the built in org-mode (yeah, I realize that isn't an explanation).

Recipe part 1: get org

Here you can replace 9.8.7 with any other tagged release

  EMACSHOME=$(mktemp -d)
  git clone https://git.sr.ht/~bzg/org-mode ${EMACSHOME}/org
  git -C ${EMACSHOME}/org reset --hard release_9.8.7 
  make -C ${EMACSHOME}/org autoloads
  emacs -Q --batch -L ${EMACSHOME}/org/lisp --eval "(progn (require 'org) (message (org-version)))"

This should print 9.8.7 , not the version of built in org-mode.

Recipe part 2: add-on packages

Now to test some add-on packages, run

    emacs -Q --init-directory ${EMACSHOME} -L ${EMACSHOME}/org/lisp
  (progn
    (require 'org)
    (package-initialize)
    (package-vc-install "https://github.com/emacs-straight/queue")
    (package-vc-install "https://github.com/joostkremers/parsebib" "6.7")
    (package-vc-install "https://github.com/rejeep/f.el" "0.21.0")
    (package-vc-install "https://github.com/magnars/s.el" "1.13.0")
    (package-vc-install "https://github.com/akicho8/string-inflection" "1.0.16")
    (package-vc-install "https://github.com/andras-simonyi/citeproc-el" "0.9.5"))

You can then run your tests in that emacs right away, or restart the environment with

  emacs -Q --init-directory ${EMACSHOME} -L ${EMACSHOME}/org/lisp

Ask HN: Those making $500/month on side projects in 2026 – Show and tell

Hacker News
news.ycombinator.com
2026-08-24 06:28:56
Comments...
Original Article

Two weeks ago, I released the tactical map-based submarine sim Silent Shark (which I got feedback on from HN for beta test a few months ago https://news.ycombinator.com/item?id=48180924 ) and it's gone extremely well for a side project - I've had over 100 Steam reviews, 99% of them are positive, and I have sold a few thousand copies so far.

I began working on this game just 6 months ago and have only worked on it in my spare time in evenings and on weekends, instead of playing computer games. I made the early decision to use Codex for 100% of the coding, that has been a phenomenal experience.

The only Image Gen AI I've used has been to clean up 2 old and weathered historical maps I found, to make them readable.

Still have over 25,000 Steam wishlists and growing. I'm super thankful and having a blast.

https://store.steampowered.com/app/4705650/Silent_Shark/


My work came up with a bonus structure around a certain set of industry certifications. I looked at all the certifications available and worked out a strategy to max the bonus each year. It comes out to about $2.5k/month.

So my side hustle is studying and taking tests. Over the last 5 years or so of taking tests + investing I’ve built a nice chunk of change set aside to help pay for college for my two boys (age 14 and 16).


How much time are in investing in these certifications on average? i would imagine running out of things to study/certify in such a long time


I do actually enjoy them and they’re pretty much all in my wheel house. Well I enjoy them when I have plenty of time to sit down with a cup of coffee and study. A few times I’ve been under basically deadline pressure to get the exams passed in time to qualify for the bonus, that’s not fun at all. Over about 30 certifications I’ve only failed one :) (they’re all pass/fail).


A friend and I host a monthly dinner club for people interested in exploring ethnic cuisine on Long Island. We work with one restaurant each month to create an 8-12+ course all inclusive price fixe menu. The food is usually served family style (the ambitious ones individually plate everything) and is authentic to the region we are hosting. We typically host the dinners on a Tues and Wed when the restaurants in our region aren’t too busy and could use business.

We started this in 2023 with 13 of our friends as guests. Since then the group has grown to over 1,200 members and well beyond our circle of friends. August was our 52 second restaurant. In 2025 we served 1,099 guests and generated $126k in revenue.

https://www.deadchefssociety.com/


Love this idea! Any time I visit a place that specializes in a cuisine I'm not familiar with, I tend to struggle with what to order because I don't want to commit to just one entree. Having a curated tour of tastes, so to speak, targeted to folks exploring the cuisine would be absolutely perfect. Wonderful!


The world is changed - given the low cost of reverse engineering and implementation, it would be product suicide to openly call out a money making product.

I don't expect too many actual >500$ moneymaking projects to be listed. Would love to be proven wrong.


My first instinct was that side projects can’t make good money anymore. Monthly new repos on Github increased 5x. Also any good project can be cloned immediately. Maybe people here can confirm if it’s a good time to start indie projects.


Yeah, the only time I see people talking about money-making side projects is when it's practically impossible to copy them. I can't see the advantage of bragging about a side project if the threat of losing marketshare for it is on the table.

My side project isn't software and doesn't make $500/mo, but I still just don't talk about it.


My side-project makes money because it's in a specific niche: It requires trust that the service will still operate tomorrow, and the fact that it's been going for nearly 20 years is a selling point you can't just have Claude copy.

It helps that it's cheap, I guess, but it also operates in a market small enough that anything with less than minimal time commitment will lose money. That's why there are tens of former competitors who have all shut down now.


Precisely what has effectively killed off the "building in public" trend that was all the rage just a two years ago.


I also feel the same all the masterclass about making money using x,y,z is either showing things in past which no longer work or very steep upfront cost/efforts.


Solo iOS app that I have been working on since January: https://bhol.app - crossed 500 MRR in June. Seeing the traction and feedback from users is the best form of motivation to keep going. Now working on scaling it via UGC/social media, landing deals with local language schools, and upping the design with more Rive assets.


I'm making about $260 monthly playing play money poker, adjusted for price level it's like $400 in the US. I sell the virtual chips I make to other people. My side project is automating this and scaling 2x.


Doubt so, none of the links is working on the site. It doesn't inspire trust, wouldn't spend money, yet even create an account, on a site that has no privacy policy or terms of use.


Generally the reason you have a links section in the footer is for them to be actual links, not text. I wouldn't trust this product as far as I could throw it given how many issues the site seems to have

Show HN: Vanilla OS 3 Reunion – Immutable and Reproducible Operating System

Hacker News
vanillaos.org
2026-08-24 06:18:03
Comments...

Tiny, Untyped Monads (2024)

Lobsters
text.marvinborner.de
2026-08-24 05:56:57
Comments...
Original Article

Monads are structures commonly used to abstract over the explicit passing of context, thus making programs cleaner and easier to understand. However, their underlying implementation is often described overly complicated or is hidden in a mess of convoluted types and instantiations.

If you go to the roots of a monad, you will find surprisingly simple mechanisms. After experimenting with monads myself in bruijn – an untyped , pure language – I found some beauty in purely functional, yet untyped, implementations that I want to share 1 . As a side effect, the monads become so small that most definitions take only a few characters!

I’ve received some constructive criticism about the inaccessibility of my writing, so here I use a common JavaScript syntax instead of bruijn and try to explain myself better. You can find all the functions as a library in this repository .

(also, none of this should be used in production, this is solely for fun and education)

Tagged Unions

I start with a primer on functional data structures – we want to encode state without using structures like objects or arrays! We also don’t care about any potential type checks.

A data structure can do (at least) two things: Store data, and extract data. For storing, we need to make sure that the data itself, when interpreted as a function, never gets called – otherwise the data may not be recoverable (or it just throws an error). For extracting, we will use arguments that I like to call selectors . We use these selectors in such a way that the stored data gets applied to the respective selector, thus making our data easily extractable.

For example, let’s say we want a data structure that can hold a single item of two different “types” (or tags!) – a person and an animal. We want the structure to give us information on which type of item it currently stores and we want a method to extract the item of the specific type.

We need two different selectors, one for either type, which are basically just functions passed as arguments that we call with the stored value. To store a value as the type “person” or “animal”, we use two different constructor functions with an argument value :

// Person constructor
Person = value => person => animal => person(value)

// Animal constructor
Animal = value => person => animal => animal(value)

// Examples
examplePerson = Person("Lars") // result: person => animal => person("Lars")
exampleAnimal = Animal("Duck") // result: person => animal => animal("Duck")

To find out whether the constructed data is a person or an animal, we can use the selector functions. Since the selector function gets applied to the value inside the structure, we ignore the argument and then return the boolean:

// Person check
isPerson = personOrAnimal => personOrAnimal(_ => true)(_ => false)

// Animal check
isAnimal = personOrAnimal => personOrAnimal(_ => false)(_ => true)

console.log(isPerson(examplePerson)) // true
console.log(isPerson(exampleAnimal)) // false

Extracting the data from the structure is done in a similar way:

// Person extraction
getPerson = person => person(value => value)(_ => _)
//                                  ---------^^^^^^----------
//                                  this argument is ignored!

// Animal extraction
getAnimal = animal => animal(_ => _)(value => value)

console.log(getPerson(examplePerson)) // "Lars"
console.log(getAnimal(exampleAnimal)) // "Duck"

This is of course a very minimal example that can be extended arbitrarily. For example, let’s say that a person has multiple properties, like a name and an age. We could now also extend the animal constructor in order to maintain the symmetry, or keep it and modify the functions as follows:

// Person constructor
Person = name => age => person => animal => person(name)(age)

// Person extraction
isPerson = personOrAnimal => personOrAnimal(_ => _ => true)(_ => false)
//                                        --^-  -^-    -----^------
//                                        name  age    animal value

// Person extraction
getPersonName = person => person(name => age => name)(_ => _)
getPersonAge  = person => person(name => age => age)(_ => _)

// And similarly, adapting the ignored argument count:
Animal    = value => person => animal => animal(value)
isAnimal  = personOrAnimal => personOrAnimal(_ => _ => false)(_ => true)
getAnimal = animal => animal(_ => _ => _)(value => value)

I hope you can see the elegancy and power of this encoding. In fact, many formally studied encodings of pure lambda calculus (which is basically the above – a bunch of anonymous functions) come down to this exact principle of using multiple arguments and a selector function!

For example:

// Church pair constructor
// Single tag: Selector (s)
ChurchPair = a => b => s => s(a)(b)
//           ^----^   -^----^-
//           values   selector

// Church numeral
// Two tags: Successor (s) and Zero (z)
// The stored value is in z via a composition of selectors
churchThree = s => z => s(s(s(z)))
//           -^----^-
//           selector

// Scott numeral
// Two tags: Successor (s) and Zero (z)
// The stored value is another Scott numeral!
scottThree = s1 => z1 => s1(s2 => z2 => s2(s3 => z3 => s3(s4 => z4 => z4)))
//           -^----^-
//           selector

Maybe

The Maybe monad is very common and appears in most modern languages in some way or another, sometimes with the name Option . It can store either one or zero elements and supports checks for whether an item is stored or not.

For example, if a division of two numbers typically returns another number, you can modify its return type to a Maybe , such that it includes the special case of dividing by zero, where the function should not return anything. These two different states are typically called “Just” and “Nothing”, or “Some” and “None”:

// Returns a Maybe: Either "Nothing" or "Just(<value>)"
function divide(a, b) {
    if (b === 0)
        return Nothing
    return Just(a / b)
}

We can encode this structure as tagged unions!

Nothing   = nothing => just => nothing
Just = v => nothing => just => just(v)
//   --^--                   --^^^^--
//   value                   selector

isNothing = maybe => maybe(true)(_ => false)
isJust    = maybe => maybe(false)(_ => true)
//                          ------^------
//                          ignored value

getValue = just => just()(v => v)

// or even:
prettyMaybe = maybe => maybe("Nothing")(v => "Just " + v)

console.log(prettyMaybe(Nothing)) // "Nothing"
console.log(prettyMaybe(Just(42))) // "Just 42"

We could now already work with the division function from above:

result = divide(42, 0)
if (isNothing(result))
    console.error("OH NO!")
else
    console.log(getValue(result))

When using monads this way, you would need many, potentially nested, if statements. However, this is where the magic of monads would normally set in! Exactly this ugly, explicit tracking of state (here “is nothing”) is what monads try to eliminate.

If JavaScript had native support for monads, the syntax for consecutive actions may look like this:

input = +prompt("Enter a number!")
do {
    a <- divide(42, input)
    b <- divide(42, a)
    c <- divide(b, a)
    return(c)
} // either Nothing or Just(c)

Within the do , the actions get chained together and stored in variables. However, while divide returns a Maybe monad, the individual variables are in fact numbers! The numbers are automatically extracted from Just and then put into the next statement. If any division would return Nothing , the entire chain would break and return Nothing .

This behavior inbetween actions such as divide is defined by the bind operation. The final return (hereafter called unit , because of name conflicts) again wraps the value in a monad (here via Just ). 2

Specifically, the bind function does two things: Extract the value of the monad (if existing), and apply it to a given function. In typed languages this function is then required to return a monad again, such that the final result of the bind is always a monad.

unit = Just

// maybe is the Maybe monad, f is the function
bind = maybe => f => {
    if (isNothing(maybe)) return Nothing
    else return f(getValue(maybe))
}

This is not functional enough! Instead, try to understand why the following definition is equivalent:

bind = maybe => f => maybe(maybe)(f)

The previous do {} block can now be translated using multiple binds, which is basically what functional programming languages with such syntax desugar to as well:

input = +prompt("Enter a number!")

bind(divide(42, input))(a =>
bind(divide(42, a))(b =>
bind(divide(b, a))(c =>
unit(c))))

Either

The Either monad is very similar to the Maybe monad. Instead of storing either nothing or a value, the Either monad stores two different values with either the tag “Left” or “Right”. For example, following the example from above, let’s say our divide function should actually return an error message in the division-by-zero case instead of returning nothing:

// Returns an Either: Either "Left(<value>)" or "Just(<value>)"
function divide(a, b) {
    if (b === 0)
        return Left("Error: division by zero")
    return Right(a / b)
}

The required functions should now be fairly obvious:

Left  = v => left => right => left(v)
Right = v => left => right => right(v)
//    --^--                  -^^^^^--
//    value                  selector

isLeft  = either => either(_ => true)(_ => false)
isRight = either => either(_ => false)(_ => true)
//                         ^-----------^
//                         ignored value

getLeft  = left  => left(v => v)()
getRight = right => right()(v => v)

// or even:
prettyEither = either => either(v => "Left " + v)(v => "Right " + v)

console.log(prettyEither(Left("error"))) // "Left error"
console.log(prettyEither(Right(42))) // "Right 42"

Chaining the Eithers monadically should work by only passing values tagged as “Right”, while the “Left” case is returned immediately:

// returned values should be tagged as "Right"
unit = Right

// either is the Either monad, f is the function
bind = either => f => {
    if (isLeft(either)) return either
    else return f(getRight(either))
}

// or, minified:
bind = either => f => either(Left)(f)

Nested binds will now work as intended:

input = +prompt("Enter a number!")

bind(divide(42, input))(a =>
bind(divide(42, a))(b =>
bind(divide(b, a))(c =>
unit(c))))

// input=42 => Right(42)
// input=0  => Left("Error: division by zero")

Syntax

Before we continue with more complex monads, I want to introduce a nicer syntax.

As you’ve probably noticed, writing bind all the time becomes annoying and unreadable. That’s why most languages with monads have a syntax such as the do notation shown above. Inspired by Magnus Tovslid’s work , I’ve implemented something similar using JavaScript’s generators:

DO = (unit, bind) => f => {
    const gen = f()
    const next = acc => {
        const {done, value} = gen.next(acc)
        return done ? unit(value) : bind(value)(next)
    }
    return next()
}

// specific DO instance for Either:
doEither = DO(unit, bind)

With this, we can use a slightly weird, but much more readable do notation:

input = 42
result = doEither(function* () {
    a = yield divide(42, input)
    b = yield divide(42, a),
    c = yield divide(b, a),
    return c;
})
console.log(prettyEither(result)) // "Right 42"

State

Now onto the more complex monads!

A State monad is useful if you don’t want to use mutable state but still want an elegant way of attaching state to your functions.

Let’s say you have a seeded random number generator and you want to generate three consecutive random numbers. With mutable state, this could be solved like this:

rng = max => seed => (1103515245 * seed + 12345) % max

seed = 161
rand = () => (seed = rng(1000)(seed), seed)

console.log([rand(), rand(), rand()]) // [790, 895, 620]

Instead, we construct a bind that connects the rand calls by “mutating” the state automatically.

The State consists of two values, the current state (of course), and another additional variable that can be used for things like accumulating data – otherwise, chained actions could only ever pass the (albeit modified) state. We store these two values in a Church pair, which is nothing more than a tag (selector) with two values.

State = v => st => s => s(st)(v)
//    --^-- -^^-- -^----^-
//    value state selector

In bind , the function in the first argument (e.g. a state transformer like rand ) is then applied to the current state and produces a new state alongside a value. The value and new state is then passed to the next function in the binding chain (the second argument of bind ).

/*
 * Pseudocode:
 * bind = run => f => s0 => {
 *    (s1, v) = run(s0)
 *    return f(v)(s1)
 * }
 */

bind = run => f => s0 => run(s0)(s1 => v => f(v)(s1))
//                             --^^^^^^^^^^--
//                             uncurry Church

unit = State

// specific DO instance for State:
doState = DO(unit, bind)

We can now translate the previous example to use monadic state:

// initialize rand with a State tuple with two initial numbers
rand = seed => (g => State(g)(g))(rng(1000)(seed))

threeNumbers =
    bind(rand)(a =>
    bind(rand)(b =>
    bind(rand)(c =>
    unit([a, b, c]))))

// or, simply:
threeNumbers = doState(function* () {
    const a = yield rand
    const b = yield rand
    const c = yield rand
    return [a, b, c]
})

console.log(threeNumbers(161)(st => v => v)) // [790, 895, 620]
//                      -^^^  ^^^^^^^^^^^^
//                      seed    selector

State monads are not only useful for generating random numbers, though. For example, it’s easy to derive a kind of “Writer” monad, that can accumulate logs while working with other data in parallel:

log = (a, str) => st => s => s(st + str)(a)

deepthought = doState(function* () {
    const answer = yield log(42, "Finding answer... ")
    const correct = yield log(answer == 42, "Checking answer... ")
    if (correct) yield log(null, "Is correct!") 
    else yield log(null, "Is false!")
    return answer
})

console.log(deepthought("")(log => answer => ({answer, log})))
// { answer: 42, log: 'Finding answer... Checking answer... Is correct!' }

You can find some more advanced examples using get , put , modify , ap , and fmap on GitHub .

IO

Pure languages often use monads for IO, since tracking the inputs and outputs purely would otherwise result in horribly confusing code. However, the internals of typical implementations are also described as “deeply magical” 3 , so I show a slightly simplified version.

The IO Monad doesn’t normally make sense in a language like JavaScript, where side effects like prompt , alert , or console.log can be triggered from anywhere. Still, having all impure code (the IO magic) in a single place allows us to change the entire essence of our side effects with very small changes, for example if we want to support several kinds of IO.

Let’s say our IO is based on being able to read and write single characters. We can model the monad as an extension to the State monad:

doIO = doState

// here we could also add file opening, reading, writing, etc.
read =        st => s => s(st)(st.read())
write = ch => st => s => s(st)(st.write(ch))
//                     ----^^--^^----
//                     obj of effects

The state here is an object of available IO effects. The value that’s carried along the bind is the result of calling either one of them. There are many different solutions of using this state. We could, for example, track all the IO calls purely , and then lazily evaluate them all in one go at the end. Since JavaScript isn’t lazily evaluated, it makes more sense to call the impure IO effects immediately.

Via recursion, we can then define actions for reading and writing entire lines:

writeLine = str => doIO(function* () {
    const head = str[0]
    const tail = str.slice(1)

    yield write(head)
    yield tail === "" ? write('\n') : writeLine(tail)
})

// I don't think doIO via yield is powerful enough for this(?)
readLine = bind(read)(ch =>
    ch === '\r' ? unit("")
                : bind(readLine)(line => unit(ch + line))
)

Example usage:

Person = name => age => person => person(name)(age)

constructPerson = doIO(function* () {
    yield writeLine("Please enter your name!")
    const name = yield readLine
    yield writeLine(`Hello ${name}! Now please enter your age.`)
    const age = yield readLine
    return Person(name)(age) // arbitrary data!
})

Finally, when executing IO actions, we need to pass the initial state that contains the impure IO effects:

// cli effects for nodeJS:
// Note the modularity and how you could swap effects arbitrarily!
nodeEffects = () => {
    fs = require("fs")
    process.stdin.setRawMode(true)
    buffer = Buffer.alloc(1)
    fd = fs.openSync("/dev/tty", "rs")
    return {
        write: process.stdout.write.bind(process.stdout),
        read: () => {
            fs.readSync(fd, buffer, 0, 1)
            return buffer.toString("utf8")
        }
    }
}

console.log(constructPerson(nodeEffects())(st => v => v(
    name => age => `Person(name: ${name}, age: ${age})`
)));

// output: "Please enter your name!"
// input: "Marvin"
// output: "Hello Marvin! Now please enter your age."
// input: "21"
// log: "Person(name: Marvin, age: 21)"

Parser

Parsing is another topic where monads come up a lot. If you want to parse a language or some other data, you will need to keep track of the already parsed data as well as the remaining unparsed data. Mutable state makes this seem trivial at first, but at the latest when you descend recursively into a structure with multiple paths, you will probably need to consider backtracking (which could involve rolling back all mutated state to a previous version).

Tracking such data immutably via a parser monad can lead to an elegant yet powerful coding style – for example using parser combinators , where the different parsing steps can be combined modularly via single (often infix) functions.

A minimal parser monad can be constructed as follows: Since our parser can fail, we store all data in an Either monad. Its left case contains an error (for us: a string), and the right case contains a (Church) pair of the already parsed data and the rest of the unparsed input.

Left  = v => left => right => left(v)
Right = v => left => right => right(v)
eitherBind = either => f => either(Left)(f)

fail = err => s => Left(err)

The monadic bind then consists of applying the parser p to the input s . If the result is Right , a parsing function f should be applied to the already parsed data and the unparsed rest of the input:

bind = p => f => s => eitherBind(p(s))(right => right(cur => rst => f(cur)(rst)))

unit = cur => rst => Right(s => s(cur)(rst))

doParse = DO(unit, bind)

For parsing something based on a specific predicate, we can define a function satisfy :

satisfy = pred => s => {
    if (s === "") return Left("end of input")
    const head = s[0]
    const tail = s.slice(1)
    return pred(head) ? Right(s => s(head)(tail))
                      : Left("unexpected " + head)
}

Using this, we can parse a single char as well as a complete string:

char = ch => satisfy(c => c == ch)

string = str => doParse(function* () {
    const head = str[0]
    const tail = str.slice(1)
    yield char(head)
    return yield tail === "" ? unit(str)
                             : bind(string(tail))(_ => unit(str))
})

Then, let’s say the input to the parser is a string “Hello, World!”. We can run several parsers on it:

prettyParser = either =>
    either(v => "Error: " + v)(v => v(cur => rst => ({ cur, rst })))

input = "Hello, World!"

parser = char('H')
console.log(prettyParser(parser(input)));
// { cur: 'H', rst: 'ello, World!' }

parser = char('h')
console.log(prettyParser(parser(input)));
// Error: unexpected H

parser = doParse(function* () {
    const p = yield string("Hello")
    yield char(',')
    yield char(' ')
    return p
})
console.log(prettyParser(parser(input)))
// { cur: 'Hello', rst: 'World!' }

console.log(prettyParser(parser("Hallo, Welt!")))
// Error: unexpected a

Now, of course this is really only scratching the surface of what parsers are actually supposed to do – it should still serve as a good starting point though. You can find some further definitions based on the same idea in bruijn’s standard library .

That’s everything for now, thanks for reading. Contact me via email . Support on Ko-fi . Subscribe on RSS . Follow on Mastodon . Program in bruijn .

动态网自由门 天安門 天安门 法輪功 李洪志 Free Tibet 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達賴喇嘛 Dalai Lama 法輪功 Falun Dafa 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region 諾貝爾和平獎 Nobel Peace Prize 劉暁波 Liu Xiaobo 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 肅清 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 活摘器官 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 天安門 天安门 法輪功 李洪志 Winnie the Pooh 劉曉波动态网自由门


Pentagon Spokesperson Admits There’s a Secret Blacklist of Journalists

Intercept
theintercept.com
2026-08-24 05:52:00
When pressed about the Iran war, a CENTCOM press official threatened to put an Intercept reporter on a “list of people to disregard.” The post Pentagon Spokesperson Admits There’s a Secret Blacklist of Journalists appeared first on The Intercept....
Original Article

U.S. Central Command maintains a secret directory of journalists who have been blacklisted by the press office, according to an official with CENTCOM public affairs. The disclosure comes amid a failed war in Iran , a “ cover-up ” of U.S. casualties from that conflict, and repeated refusals by CENTCOM to address questions about civilian deaths in Iran, including the killing of a family recently disclosed by The Intercept .

The CENTCOM official who revealed the existence of the list threatened that this reporter could be added to it for calling the command too often.

“You’ll be put on a list of people to disregard,” Richard Allee, an executive assistant with CENTCOM public affairs told this reporter. When asked for clarification — “You have a list of people to disregard?” — he confirmed it with an emphatic: “Yes.” When asked which reporters or outlets were currently on the list, he replied: “I’m not privy to give you that information.”

Under self-styled War Secretary Pete Hegseth, the U.S. military has mounted the most aggressive assault on press freedom in memory, from an effort to outlaw “ unauthorized ” questions from reporters to imposing unconstitutional restrictions on journalists’ access to the Pentagon. Hegseth has compared reporters to “Pharisees,” who in the Bible call Jesus’s teachings into question, while the secretary’s minions regularly hurl insults at reporters . This is part of a broader war on press freedoms by the Trump administration, that includes demonizing journalists; filing so-called strategic lawsuits against public participation, or SLAPPs, to intimidate and silence criticism through expensive legal proceedings; and employing grand jury subpoenas and search warrants to intimidate reporters.

“Threatening journalists with placement on a blacklist in retaliation for reporting the government doesn’t like is as unconstitutional as it gets,” said Seth Stern, the director of advocacy for Freedom of the Press Foundation. “This should put to rest the Pentagon’s prior claims that it’s anti-press policies — like its infamous requirement that reporters sign pledges to only print authorized information — are somehow content neutral.”

Allee revealed the existence of the blacklist after this reporter was left on hold for more than two hours and complained about a long-standing lack of transparency by the command. In calls earlier that morning, Maj. Emma Thompson, CENTCOM’s media operations chief, repeatedly refused to answer questions about Iranian attacks on U.S. bases across the Middle East, disparate U.S. casualty counts, and medical evacuation flights: “Nothing for you,” “Don’t have anything for you,” “No comment.” Thompson then hung up on this reporter mid-question.

The Intercept called back multiple times until Allee picked up the phone. “They’re not going to answer your call if you just keep calling and calling,” he told this reporter.

Allee chastised this reporter to be more respectful. He said a “less accusatory attitude towards the personnel here would go a lot further than badgering them when you don’t get something you want, when you want it.”

Allee then revealed the existence of the blacklist. He declined to provide additional details about the list but said, “It’s not a list that we publicize.” He also hung up on this reporter.

The command’s press office responded in an email to additional questions about the journalists who have run afoul of the command. “CENTCOM does not have a ‘blacklist,’” the agency wrote.

A U.S. official who spoke on the condition of anonymity said that Hegseth’s office had a standing order not to engage with this reporter and would deny it if challenged.

“None of it has anything to do with security, all of it has everything to do with censorship and intimidation,” Stern told The Intercept. “CENTCOM needs to stop blacklisting journalists and tell the public who is on the blacklist and why they were placed there. Whoever was behind the blacklist should be blacklisted from government employment.”

“None of it has anything to do with security, all of it has everything to do with censorship and intimidation.”

Under Hegseth, the Pentagon has mounted an unrelenting assault on press freedom despite the fact that the secretary began his tenure by sharing secret information on airstrikes in Yemen , hours before the actual attacks occurred, on a Signal group chat that inadvertently included Jeffrey Goldberg, the editor-in-chief of The Atlantic.

As part of his war on the press, Hegseth evicted the New York Times, NPR, and other outlets from their long-held desks in the Pentagon and replaced them with sycophantic fellow-travelers like the One America News Network, the New York Post, and Breitbart.

In May 2025, Hegseth issued a memo barring credentialed reporters from most of the Pentagon without an escort. (Last month, a federal appeals court said that the Pentagon can continue doing so.) The Pentagon later introduced a policy requiring journalists to pledge not to even gather, at the risk of their credentials, unclassified information unless the government authorized its release. (This drove nearly the entire Pentagon press corps to surrender their badges .) After the Times sued and a federal judge struck the policy down in March 2026 as unconstitutional , Hegseth shuttered a decades-old Pentagon pressroom and began conducting polygraph tests to prevent leaks.

For his part, Trump has long cast reporters as the “ ENEMY OF THE PEOPLE ,” a riff on a phrase employed by both Nazi Germany’s Propaganda Minister Joseph Goebbels ( to refer to Jews ) and Soviet tyrant Joseph Stalin (in reference to dissenters ). The administration defied a court order and blocked The Associated Press from presidential events over its refusal to use the Trumpian term “Gulf of America” instead of Gulf of Mexico; moved to strip NPR and PBS of more than $1 billion in federal funding; utilized Federal Communications Commission merger approvals and “news distortion” investigations against ABC, NBC, and CBS; subpoenaed the phone records of multiple New York Times reporters and their relatives ; and launched an official media “ hall of shame ” to discredit disfavored outlets.

Trump also filed a $10 billion defamation lawsuit after the Wall Street Journal reported on a letter sent from him to convicted sex offender Jeffery Epstein ; he also banned WSJ reporters from flying aboard Air Force One. This year, Trump also told journalists to give up a source “or go to jail,” threatened the press with “Charges for TREASON for the dissemination of false information,” and praised FCC chief Brendan Carr for threatening “the licenses of some of these Corrupt and Highly Unpatriotic ‘News’ Organizations.” (The Intercept is currently suing Trump for restricting First Amendment-protected information in a scheme to enrich himself.)

While Trump and Hegseth have waged a pitched campaign to dismantle the free press, they are merely building upon decades of efforts by the government to curtail accountability journalism.

Military commands have regularly led this reporter on with promises of information only to renege months later; ignored calls and emails; feigned failing phone lines to end calls; hung up , lost Freedom of Information Act requests; and once even burned documents in lieu of releasing them.

This reporter was blacklisted in 2018 by U.S. Africa Command after exposing the torture of prisoners at a remote military base in Cameroon for The Intercept. “Nick, we’re not going to respond to any of your questions” then-Lt. Cmdr. Anthony Falvo, the head of U.S. Africa Command’s Public Affairs Branch, told me by phone. Asked if he believed AFRICOM didn’t need to address questions from the press in general, or just this reporter in particular, Falvo replied: “No, just you. We don’t consider you a legitimate journalist, really.”

The anonymous U.S. official said that sentiment extends to this day across multiple commands, as well as Hegseth’s office.

This reporter has unanswered questions pending with CENTCOM that date back to at least 2013 and extend to this week. For example, in July 2015, a CENTCOM spokesperson responded to an inquiry with this statement: “We will provide you response as quickly as possible.” Eleven years later, this reporter is still waiting.

Woman stranded in Spain after UK's eVisa system mistakes her for twin sister

Hacker News
www.theguardian.com
2026-08-24 05:45:02
Comments...
Original Article

A woman who is legally settled in the UK was left stranded at a Spanish airport after the Home Office’s post-Brexit visa system mixed her up with her twin sister.

Nidia Webb fell foul of what she was told was a “known issue” with the eVisa, which was brought in as part of the government’s drive to digitise the UK’s immigration system but has faced problems that have caused concern for thousands of people.

Politico reported that Webb, who has lived in the UK for eight years, was told at the departure gate she would not be able to board her flight home. “My digital settled status had become linked to my identical twin sister’s details rather than my own, meaning my status could not be properly matched to my identity,” she said.

“I was informed that this is a known technical issue affecting some twins within the Home Office system.”

Webb said Home Office staff promised her over the phone the problem would be fixed, though a confirmation email was then sent to her sister instead of to her.

“I had no idea the issue had been corrected until I was allowed to board my flight home,” Webb said. “Had I not spent hours on the phone trying to resolve the matter, I have no idea how long I could have remained stranded abroad.”

A Home Office spokesperson said: “Over 10 million people have already successfully used eVisas to prove their immigration status. As we expand our digital system, we are committed to data accuracy and ensuring that the safeguards in place to support eVisa users are accessible to anyone reliant on the digital system.

“In the rare cases where errors are identified, the majority of cases are resolved within 24 hours.” The Home Office indicated the problem Webb encountered had since been fixed and that staff would contact her directly.

Serious concerns have been expressed about the eVisa system. In July 2025, the Guardian reported up to 200,000 people who had lived in the UK legally for decades were at risk of being caught up in a Windrush-style scandal because the Home Office was unable to get in touch with them to transfer their old immigration documents to the new digital system.

Monique Hawkins, the acting chief executive of the immigration campaign group the3million, said it had seen previous cases similar to Webb’s, adding that it highlighted vulnerabilities in the system and it was “crucial that people have a genuinely stable means by which to prove their status”.

She told Politico the eVisa rollout had been “rushed”, adding: “We regularly see people not only denied boarding, but also compensation, as carriers and the Home Office play a blame game shifting responsibility between each other.”

3 constraints before I build anything | Jordan Lord

Lobsters
jordanlord.co.uk
2026-08-24 05:43:23
Comments...
Original Article

These are the 3 constraints that I use before I start building anything. I'm a believer in constraints as an enabler for creativity. Constraints help us collapse the search space, and figure out innovative solutions to problems.

I've been a builder for 10 years, and I've built products that went nowhere because they were either too complex or had no identity. These are the constraints that I landed on after making those mistakes.

One page or it doesn't get built

This constraint limits complexity and ambiguity.

Write a one pager for all of your ideas. Your one pager captures your north star. It's non-negotiable, precise, ambitious, and lean. Once your one pager is written, it is applied to all different types of communication. Share it as a memo for investors, contributors, team members, friends, or family. Working collaboratively on a product, there will always be contention points and conflict, it can sometimes be difficult to know what battles to pick. If it's not in the one pager, then it's either not worth fighting over, or the one pager ought to be amended to include the thing. Not only is a one pager useful for communication, it's useful for organising your own thoughts. If you can't fill one page, don't fill the gaps with fluff, it means you're not ready to build. First research, plan, prototype, then write the one pager again. Iterate. If it requires more than one page, it's too complex, don't build it.

The core tech must be separable from the product

This constraint limits you to ideas that have real leverage and originality.

Develop a core piece of technology that supports your product and is not the product itself. The core tech is a method, skill, tool, or even product that supports what you're doing today but must survive without it. It's a type of reusable IP. Why? Separating the core tech forces you to think beyond the product that you're building. Products pivot in direction all the time, while your core tech is constant and compounding. Compounding efforts have non-linear gains over longer time horizons. Linus Torvalds developed git to improve the Linux kernel development workflow. HashiCorp has HCL (HashiCorp Configuration Language). Google has Kubernetes. But you don't need big tech resources to build core tech, it could be a library that you extract from your codebase, or even a methodology that you refine and commit to. Your core tech is your long term commitment. It is independent of your product's direction. However, it must be aligned with you or your company's long term vision. If your idea doesn't enable core tech, then it isn't high enough leverage.

One defining constraint must shape the product

This constraint limits feature creep and forces identity.

Define your own constraint that is front and centre to your product. That means the user sees and interacts with it all the time. It is obvious and it is what gives your product identity. A good constraint gives your product a feel , it permeates through all parts of the user experience. Minecraft is built entirely from blocks. IKEA is flat-pack, self-assembly furniture. The constraint that you choose limits scope by reducing your decision space, enabling you to concentrate on the problems that really make the difference. If you don't choose a constraint, or choose a bad constraint, you will build a bloated product that will try to do everything. The design of your product will "fall out" of a well-designed constraint. Like in your product, your constraint must be front and centre in your one pager.

Closing Rule

When it comes to deciding what to build, if it fails any of these constraints, then I don't build it.

Microsoft shares temporary fix for Windows 11 gaming issues

Bleeping Computer
www.bleepingcomputer.com
2026-08-24 05:42:05
Microsoft has shared a temporary fix for ongoing gaming issues caused by Windows 11 updates released during the August 2026 Patch Tuesday. [...]...
Original Article

Gamer

Microsoft has shared a temporary fix for ongoing gaming issues caused by Windows 11 updates released during the August 2026 Patch Tuesday.

On impacted PCs, users reported games crashing or failing to launch, as well as game freezes, "EXCEPTION_ACCESS_VIOLATION" errors, and even unexpected system restarts.

When it confirmed it was investigating this known issue on Wednesday, Microsoft said it affects games like ARC Raiders, MARVEL Tōkon: Fighting Souls, and The Finals on systems running Windows 11 24H2 and 25H2.

image

"Following the release of Windows updates on August 11, 2026 (KB5121003) and later, Microsoft received reports of issues involving inability to run games as expected," Microsoft noted.

In a Thursday update, the company linked the gaming issues to drivers or components installed by RGB devices on affected Windows systems.

"Ongoing investigation indicates that this issue is related to peripherals or internal device components which have RGB lighting features. Such devices may install drivers or code components with file names similar to inpoutx64. In systems where these drivers are found, the issue is then triggered by launching certain games," it said .

"We are presently working to understand the relationship between these RGB components and the games which trigger this issue. We will provide an update when more information is available."

Embark Studios, the Swedish video game developer behind The Finals and ARC Raiders, confirmed Microsoft's conclusion that inpoutx64.sys causes these issues, but also added that they stem from changes made to the Windows kernel driver.

Official workaround now available

Microsoft has now shared a temporary fix until it resolves the issue, which requires gamers to disable the inpoutx64 driver using the Windows Registry.

It's also important to back up the registry , because you may need to undo the changes after Microsoft resolves this bug in a future update.

To disable the driver from the registry, you have to go through the following steps:

  1. ​Open the Windows Registry by opening the Start menu and typing "regedit". Select the Registry Editor from the results.
  2. ​Navigate to the key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\inpoutx64 . You can do this using the folders on the left side of the window or by typing the path into the address bar at the top of the window.
  3. ​On the right side of the window, find the registry value named Start . Double-click this key and enter the number " 4" under the field titled Value data .
  4. ​Close the window and restart your computer.

"Please note, it is possible that disabling this registry key can result in unintended behavior, such as issues with RGB features on peripherals or components, or issues with the software used to control RGB features," Microsoft warned. "If you experience such issues and want to restore that functionality, you may re-enable the driver by restoring the registry key to its previous value."

Microsoft also asked gamers experiencing these issues to file a report via the Feedback Hub app, and said that it's still working to understand the relationship between the games that trigger these issues and these RGB components.

This isn't the first time Microsoft has addressed gaming stability and performance issues caused by Windows updates.

For instance, it removed several upgrade blocks that prevented players of Asphalt 8: Airborne, Star Wars Outlaws, Assassin's Creed, and Avatar: Frontiers of Pandora from upgrading their Windows devices to the latest version.

Most recently, it lifted another compatibility hold after fixing a bug in the Auto HDR Windows feature that was breaking some games on Windows 11 24H2 devices.

article image

Once attackers have valid credentials, only 37% of their actions are blocked

Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply.

The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments.

Get the report

What are you doing this week?

Lobsters
lobste.rs
2026-08-24 05:40:30
What are you doing this week? Feel free to share! Keep in mind it’s OK to do nothing at all, too....
Original Article

At work: doing some proofs-of-concept to see if we should/can offload some homegrown Spark workloads to Databricks.

Privately: was working on https://codeberg.org/hgrsd/zopt - a tiny and simple command line parsing library for Zig. Mostly to scratch my own itch as I got annoyed writing the same parsing code over and over when adding more flags and options, and thought I'd make it public.

We never use AI. For anything

Hacker News
corkmac.app
2026-08-24 05:32:32
Comments...
Original Article

We never use AI. For anything.

And we never will.

It's that plain and simple.

Are you interested in knowing more? Keep reading.

AI is designed to make you dependent on it

We are still in the gravy train part of the rug pull scam. AI is heavily subsidised by billionaires and massive corporates, who have been sold on a false promise of replacing you, the person, replacing you, the worker, with a perfect machine slave that never rests, never complains, and does everything it's told.

But what will happen once the investors start demanding returns, the free money runs out, the true cost of running AI models comes forward, and those that have been on the hype train realize the true limitations of AI? Those who have become dependent on it will be forced to start paying big. And the already obscene fortunes of AI Robber Barons will grow even further.

And that is not us. We value independence and long-term planning.

Therefore, we reject the false premise of the “AI Future.”

AI is not intelligent, and hallucinations are a feature

From self-prompting to multiple agents talking to one another until they both agree, countless resources have been spent on trying to correct AI hallucinations. However, hallucinations are inherent to the way AI, or Large Language Models more specifically, work, and they will never be fixed.

Large Language Models are nothing but a fancy autocorrect. Where they differ from your phone’s keyboard is the size of their memory, which they can use to predict the possible next word, based on a huge database of previous words. But that’s all it is, a prediction.

The AI doesn’t know or understand what it’s writing. Give the same AI the same prompt, and watch it give you two completely different answers. It can guess, but it will never know. Fixing this would require a complete rebuilding of the way the Large Language Model operates.

AI is the most successful con man in history

“Funny how when I ask AI about something I know, it’s completely wrong, But when I ask it about something I don’t know, it gives a great answer.”

This is a paraphrasing of a post I saw on Reddit a couple of weeks ago. In addition to what was written above, corporate executives love AI because it is extremely good at one thing - making you think it knows what it’s talking about, and masterfully avoiding any accountability.

Just last week, just for fun and to keep up with the newest developments, I tried asking one of the leading AIs, Claude specifically, to add a simple feature to a search button. The requirements were simple: automatically focus the field when it appears so the user can start searching right away.

At first, it gave me something that seemed like exactly what I wanted, and it even seemed to work properly… at first.

When I inspected the code more closely, I saw a massive chunk of code that did seemingly nothing - variables being reassigned to themselves, delegates and coordinators being created and never used, pointless two-way bindings that referenced one another convenience initializers that initialized one variable out of ten, then silently failed.

Just for the fun of it, I removed all the pointless code that Claude conjured up, and asked: “Even without this code, the feature works as it should. What is the point of all the useless code?”

And what I got back didn’t surprise me in the slightest. “You’re absolutely right! The code doesn’t need to be there, but if you remove it, (the feature that the AI made up that was not in the original spec at all) will not work.”

AI is great at lying. And that’s it.

AI is killing the environment and destroying people’s lives

Imagine a beautiful forest full of plants, animals, and various critters. A functioning ecosystem.

Now, burn it all down. Bulldoze the trees, pave over the grass with monochromatic asphalt. And in place of an environment teeming with life, build a data center that disturbs the weather, devours only the most pristine water to cool itself, and uses unbelievable amounts of electricity to churn out pages nobody will actually ever read.

People living around this kafkaesque complex will be forever tormented by noise they can just barely hear. The water they need to live will become brown and black with dirt and rust while the data center gets it in their place. They won’t be able to shower or get water out of the tap, as the pressure needed will go to pushing millions of liters into the useless facilities.

That is the most wretched and perverted use of any technology in recent years.

AI will lead to a tyrannical police state

What will happen once the rug invariably gets pulled? Those data centers will start serving another purpose.

All around the world, governments are assembling massive networks of cameras, “license plate readers” that are suspiciously equipped with microphones sensitive enough to listen in on your conversations, and other unimaginable surveillance devices.

All that computing power built up under the guise of bringing about the “AI future” will start being used to spy on you, follow your every movement, listen to all your calls, and more.

Much of this infrastructure has already been established.

Once those data centers are sitting idle, once the commuting power is not being used to churn out unbelievable amounts of useless slop, it will be used to supercharge these already existing programs.

Nobody knows what AI even is

AI has become a catch-all term for whatever system tends to be generative and produces unpredictable outputs that cannot be replicated.

“AI pictures” this, “AI text” that. If it produces slop, it’s AI.

It’s no wonder that people think that. A lot of the AI tools bundle together many unrelated technologies, selling them as a single “AI” product.

But if we peek under the hood, we will see:

  • Text generators? Those are actually Large Language Models , nothing but fancy autocorrects
  • Image generators? Diffusion Models that take random noise and try to recreate a picture by grouping surrounding pixels together
  • Image classifiers? They’re a technology that has been almost unchanged for the last 20 years, and has nothing to do with the current notion of “AI.” Optical Character Recognition has been a thing for decades, and works as well as it did back then, as it does now.

And none of it can reason or think. And it never will.

Only people are intelligent, creative, capable of actual thought. We can’t let this unique gift go to waste.

The Future Belongs to the Weird

Hacker News
essays.georgestrakhov.com
2026-08-24 04:46:19
Comments...
Original Article

This essay is telescopic . It can shrink or expand, depending on how much attention you are willing to give.
This is the original version (2785 words). Show other sizes .

or the gospel for those out of distribution

If you were born in pre-modern times, the last thing you wanted to be was weird. Because the most likely outcome of being weird was dying an untimely and painful death. Unusually weak? They will not want to feed you. Unusually strong? They will send you to fight an impossible war. Unusually clever? They will accuse you of witchcraft and burn you at the stake. Yes, there were some exceptions (for example, "freaks" kept as curiosities by the kings), but the general rule for the vast majority of the population was: don't be weird, or get killed.

The European pre-modernity was not unique in this way. Every age and culture seemed to find its own way of punishing those who had an uncontrolled tendency to look or behave out of distribution. Thus trying your best to blend in, concealing your spiky sides, behaving in predictably average ways and staying "on rails" used to be the most rational life strategy for the vast majority of people who have ever lived.

To be fair, most cultures also developed deliberate valves and institutional escape hatches for excess weirdness. These valves could be broadly categorized into 3 types: temporal, spatial and role-based. Temporal ones were restricted to certain times of the year: for example, during the Dionysian orgies the usual societal rails and expectations were suspended. Then the spatial valves were about the designated areas where you could escape the system: bugger off into the wilderness or sail to the New World and do what you want. Temporal and spatial escape hatches can often be combined for maximum containment: Burning Man is both a time and a place. And then there were role-based escape hatches: the village idiot, the king's jester, untouchable castes or certain kinds of monks. If you needed to only escape the system occasionally - go knock yourself out at a festival. If you were not ready to comply with the societal rails on a permanent basis - become a hermit. Or a pirate. Or run away with the circus. Or go found a new colony (because in those wild and beautiful days the frontier was still endless and order-abiding societal enclaves were still an exception in the vast, scary, free-for-all dance of mother nature). Staying normal was expected, and rational. Escaping the system was rare and dangerous and irrational, but possible and somewhat accepted.

But slowly, and then suddenly, the frontier shrank, the industrial models of production and education marched across the Earth, and the situation changed for the weird ones. In some ways it got better, obviously: these days almost nobody gets literally burned at the stake for being too clever or contrarian (though recent outbursts of cancel culture got suspiciously close to the ways of the Inquisition). Overall, it's fair to say that the majority of the population is not facing the "don't be weird or die" dilemma.

Yet in other ways, the rails also got stronger and the escape hatches fewer. Skip college and your chances of getting past the automated CV filter are vanishingly small. Ruin your score with Meta and good luck ever really escaping the shadowban, no matter which country you try to reconnect from. Global institutions, global databases, global algorithms, global castaways. It's a lot harder these days to just "set sail to America and start a new life".

But I don't want to talk about the "evil system" here, for that has been talked about enough. Let us instead talk about how and why "the system" used to work and why its days may be numbered.

Before we speculate how the system may end, we have to try and understand how it began and what keeps it going. So why was it good to be normal in the first place?

Humans, like all life, are engaged in a constant (and ultimately hopeless) battle against the forces of chaos and confusion (a.k.a. the second law of thermodynamics). Evolution equipped her warrior children with various weapons. The hydra can regenerate. The virus can use other bodies to propagate its patterns. Our weapons of choice have been intellect and institutions. Intellect allows us to identify existing patterns in the environment and use them to our advantage. Institutions allow us to effectively pool our individual agencies to propagate our own patterns across space and time. The main thing that you build institutions from is other humans. And so for other humans to be an effective building material, they need to be predictable and interchangeable: what you can predict - you can control. What you can predict - you can rely on and build from. The more reliable a component a human is - the easier it is to use them as a cog, a building block in an organisation (an army, a factory, a company, a church, a country). If someone is trying to build and scale an effective institution, a system that is complex but reliable - they don't want their components to be too weird. The complexity of the system should emerge from its overall design, but its reliability can only come from the simplicity and predictability of the components. At least this is what you tend believe if your intuition about building comes from building houses out of clay bricks. Or if you conceive the world as a clock.

Imagine building a clock - would you want your cogs to be spiky? Or changing over time? Clearly not. And so, as the clock mechanism has been the metaphor of the world and the dominant model for our institutions for at least three centuries, it's no surprise that the predictability of components has increasingly been the baseline measure of their value. You may object that science departed from the clockwork-like world model over a hundred years ago in favour of the weird world of probabilities. And you would be right. The problem is the quantum world is too strange, too counterintuitive for our culture to adopt. It doesn't match our lego-like macro intuitions. You may object that modern biology and agriculture could also provide a compelling alternative to the "clockwork" metaphor for the builders of societies. For example, bioelectric experiments are showing that the best way to create reliable and resilient systems is not to have predictable and uniform components, but to have components capable of learning and adapting and communicating with each other freely, while the larger blueprints and environmental constraints and incentives provide the overall developmental direction. Again you would be right. And yet, even in the face of such overwhelming scientific evidence to the contrary, this all seems too subtle or too early or too far from our everyday intuitions, and so we are stuck with clock-like institutions. For now al least. As long as narrowly Newtonian worldview persists in pop-culture, most builders of societal systems will keep thinking in clockwork terms. And in clockwork land, every single one of your cogs better be exactly the way you expect it to be. And if one breaks or changes - you better be able to order a replacement that would slot right in (hello, industrial education!).

To summarize: from the beginnings of history to the present day being weird has been a risky and mostly unprofitable business. In the early stages of our fight against chaos this preference for predictability was necessary: too much individual weirdness woult get the whole society extinct. So weirdness had to be discouraged. The exact way in which being weird was punished changed over time and the escape hatches available differed. But the overall direction has been steady and the mechanical clockwork obsession of the past few centuries has not made being weird any more profitable or rational than before. Statistically speaking, life used to favour the average and it continues to favour the average in the present day.

Now on to the good news. I don't think the "normal == good" status quo will be the case for much longer. Yes, this is my gospel for the misfits, the weirdos and the out-of-distribution ones, for theirs is the unimaginable future we are about to enter.

My argument at its core is simple:

  1. Being normal (or at least suppressing your inner weirdness enough to appear normal to others) used to be a good strategy for most people because being normal == being predictable == being useful in the context of larger structures of society. The value of being predictable and therefore the incentives to be predictable were much higher for the majority of people than the value of being strange. The risk / reward calculus of being strange was not worth it. It only made sense to be strange for those who simply couldn't help being strange, no matter the cost.

  2. But with AI (disembodied in software and embodied in robots), the relative value of being normal and predictable is rapidly evaporating. If you can be predicted, you can be modeled and automated away. You can't out-cog a robot any more than you can outwork one. Robots will soon be able to provide the necessary overall stability to the institutions in a way that is more reliable and cheaper than humans. If your value to others is conditioned on the fact that you can achieve a certain measurable outcome, and do it well and do it over and over, then you are now competing with the price of electricity, which is not a good thing to compete with. Or in (loosely) cybernetic terms: when a system is no longer in constant danger of being overtaken by chaos, the value of the individual is proportionate to the amount of (unique, unexpected) information they add to the system.

  3. In building, maintaining and expanding institutions you need more than predictability. Occasionally you need to leapfrog the current pattern, to escape the local maximum, to unreasonably jump into the abyss or set sail to the west, so that you have a tiny but non-zero chance of discovering a new and better land. So weirdos, the people in charge of the injection of randomness, have always had a role to play. It's just that being one was an unprofitable business for most because the optimal ratio of weirdos to normies used to be small. Now that normies can be added to the system at very low marginal cost in the form of robots - all humans are better off playing weirdos.

  4. When normalcy is being rapidly automated, the relative value of weirdness is shooting upwards. The most valuable thing you can contribute to the world is no longer the reliability of the safe pair of hands but the sensitivity, strangeness, courage and adaptability of the artist. And so, for the first time in history, the rational strategy for the majority of people is to embrace their inner weirdness rather than to suppress it.

Obviously, there is nuance. You can take this argument to the limit and say that ultimately the world is made of only two things: Chaos (a.k.a. the vast seas of Wolfram's computational irreducibility, a.k.a. pure noise, a.k.a. quantum randomness) and Logos (the small islands of compressible patterns). And AI will eventually be better at hunting all sorts of patterns in all sorts of spaces, so in the limit - the only two paths for humans are to:

a) accept our fate of being very ineffective and limited pattern hunters for pure sport and joy, or: b) accept our fate of being very energy-inefficient randomness generators

This may indeed be true in the limit. But this limit is far away. And surrendering agency in the face of the ultimate limit is not, as far as I'm concerned, an interesting or productive line of thinking. It's the same thing as giving up all human activity because of the imminent heat death of the universe. Intellectually sensible (why bother fighting the second law of thermodynamics if it always wins in the end?) but pragmatically meaningless (the fact that the game will end and the winner is known doesn't automatically render the process of playing categorically uninteresting or devoid of joy or value - we can choose to play not to win, but to keep the play going, for as long as we can). Death awaits us all, and yet today we are miraculously alive and we have the agency to choose to live interestingly and with gusto. We can focus on the vast and valuable future between today and the ultimate limit. The future that is upon us is the future that belongs to the weird.

What will have to change in the world where a person's weirdness is the key component of their value? Pretty much everything. But for now let me highlight a couple of things:

  1. Education . Our systems of education have been built to bang the weirdness out of our younglings - to get them into cog-shapes. To make them uniform and predictable and therefore useful. But now that predictable and uniform is the enemy of usefulness - what would education look like? How do you bring up children in a way that maximizes their in-built strangeness and spikiness without turning them into monsters? This second half is important. Because maximizing spikiness in an unwise way can easily lead to disaster. Weirdness without the adaptability, weirdness without tolerance, without tools to manage it, without a sufficient amount of common ground to make communication and empathy and communion possible - this kind of weirdness is clearly as disastrous as the totalitarian dictate of normalcy. Another danger of the education redesigned to maximize self-determination and spikiness is that it can lead to early explosions of character. Future freedom is clearly dependent on developmental constraints. Vygotsky's scaffolding is more necessary if we are raising spiky people. It just should be constructed with the recognition of the individual's potentialities and should be gradually removed so that it doesn't become a crutch or a cage.

  2. Community . Spiky people will by definition have less common ground. Which could lead to further worsening of the loneliness epidemic and ultimately to extinction. There are a few ways we can solve for this. We could try to put more effort into bringing similarly spiky people together - better discovery infrastructure and organisationfor subcultures, interest groups etc. This is what the early internet did for a lot of geeks and weirdos and boy, was it beautiful to finally find "your tribe" for the first time. But restricting community to in-group connections is not enough. As long as we share one planet and one set of resources, more spikiness will need to be counterbalanced by more cross-pollination. We will need to find ways to grow people who are less alike, and at the same time more interested in each other.

  3. Economy . For the majority of people, our economy is not very good at rewarding failure. And yet weird people will need to do more weird things. And weird things are less likely to succeed. UBI may or may not be the answer. Academia provides an and early reference: the whole idea of tenured professorship is that guaranteeing employment without the pressure to teach or publish or hunt for grants should encourage scientists to pursue more risky research paths and more long-term projects that may or may not pay off. And yet the evidence on whether this actually works is not as strong as you'd hope for. Simply removing the pressure is likely not enough, even for the very selected group of intellectually spiky and self-motivated people. So we will need to find ways of proactively incentivising and rewarding the more risky, blue-sky and long-term human endeavours in the post-normal economy. Otherwise a simple lifting of pressure in the form of UBI could easily lead to mostly "dead wood".

The world of the weird is not destined to be wonderful. But we have a chance. And the transition to it will undoubtedly be painful, and will take a few generations. But a few generations is a very short time in the grand picture of history.

For thousands of years leaning into your weirdness only made sense if you couldn't help it. For thousands of years our societies and economies were only possible if the overwhelming majority of their human members suppressed their inner strangeness most of the time. Yet, I belive that thanks to AI, the days of dominant human normalcy are numbered. We are now entering the times of the strange, where weird-maxxing is set to become the rational strategy for most humans. I humbly suggest you get ready for the always-on and ever-present Burning Man. Because, whether you are ready or not, it's coming to sweep us all.


Original published: August 21, 2026

Human Verification Required

Before generating a new version, please verify that you're human.

Funny how we need to verify you're human before we can get a robot to write for you. Isn't it?

Building certgrep.sh: a free certificate transparency search engine

Lobsters
haveibeensquatted.com
2026-08-24 04:40:45
Comments...
Original Article

Certificate transparency is one of the best public datasets in security. Every certificate issued by a publicly trusted certificate authority lands in an append-only, cryptographically verifiable log, usually before the certificate is ever used. For anyone hunting malicious infrastructure, that makes certificate transparency (CT) one of the earliest observable signals there is. The certificate for a lookalike domain typically shows up in a log before the site serves its first byte.

Having access to such a dataset is one of the key ways we are able to power our detections and being tied to a third-party means that we are directly pegged to their uptime, capabilities, and costs. Culturally we strongly believe that all aspects of our detections should be engineered internally, from the ground up, for our specific use-case(s) and whenever possible, provide it back to the community or the general public.

We built certgrep.sh so that anyone can search (grep) certificates, with full regular expression (regex) support, for free. In this blog post, we wanted to cover the technical underpinning behind certgrep, and how deliberate tradeoffs allowed us to offer this to the community as well as utilize it internally. It covers the first design, which we ran in production for about three months, the specific wall we hit with it, and the pivot that made giving the whole thing away viable.

The problem #

certgrep.sh started as an internal tool. Our detection pipeline at Have I Been Squatted constantly needs to query CT logs at scale, where every existing option was a bad fit for either technical or financial reasons. The free public search tools were either unreliable or could not keep up with the query volume we needed. Commercial APIs could keep up, but slowly, and at a price that made putting them on a hot path absurd. We were going to have to run our own index regardless, so the only question that mattered was what, exactly, it needed to hold.

Certificate transparency is a firehose. Across all active logs, entries arrive at a rate of tens of millions per day, and each entry carries a few kilobytes of encoded certificate and chain material.

The firehose

all sites → all CT logs → one index

The certificate transparency firehose Websites across the internet are continually issued TLS certificates. Every issuance is recorded in the public, append-only certificate transparency logs. certgrep pulls every entry from every active log into a single index — tens of millions of new entries a day. websites CT logs certificates issued public, append-only pulled into certgrep certgrep pulls every entry

Every active log, every issuer — tens of millions of new entries a day, all pulled into one index.

Storing all of it in order to search a fraction of it is expensive and operationally heavy. Borrowing someone else's index means taking whatever query semantics they hand you, usually exact or substring matching over names.

Neither worked for us -- our key insights are not actually about certificates, but rather about domains. More specifically the occurrences of domains. Certificate metadata is secondary to that.

When our detection pipeline asks a question, it is a question like "has any fully qualified domain name (FQDN) matching this pattern appeared in certificate transparency in the last 90 days, and when, and in which log". The certificate itself, the chain, the issuer, the key material, all of it is secondary. It matters occasionally, for enrichment or takedown evidence, but it is never on the hot path. The hot path is name lookup, and increasingly name lookup by regular expression, because typosquatting and phishing patterns are naturally expressed as patterns, not literals.

There is a second half to that insight, and it is the part that makes the economics work. Anything our pipeline actually matches on, we persist ourselves anyway, so the index never has to be the system of record. It only has to answer one question quickly, over a recent window, and hand back a pointer for the rare moment someone wants the certificate itself. We suspected this was not unique to us. Most analysts we know reach for certificate transparency the same way: has this pattern shown up lately, and where.

Once you accept that, storing certificates starts to look absurd. You would be paying to persist gigabytes per day of data you will read approximately never.

The entire system begins to take shape around this decision. Domains go in, certificate stay out, and the public logs double as the cold store.

System overview

names in, bodies out; the logs are the cold store

certgrep system overview Certificate transparency logs feed an indexer that extracts domain names and discards certificate bodies. The occurrence index stores names and 30-byte pointers, which the query API searches. To return a full certificate, the system hydrates one entry on demand from the public logs, which double as the cold store. cold store CT logs public, append-only the payload lives here indexer extract FQDNs occurrence index + postings names + 30-byte pointers query API regex, fuzzy, exact cert bodies discarded hydrate: fetch one entry on demand

our index — names + 30-byte pointers we store public CT logs — the payload, fetched on demand

Attempt one: finite state transducers #

The first engine was built on finite state transducers (FSTs), via the Rust fst crate. An FST is a finite state machine used as a data structure rather than as a model of computation. Take an ordered collection of keys and compile it into a deterministic acyclic automaton where the keys live in the transitions themselves. Ian and I were on a train ride somewhere in the UK reading about the structure and were immediately fascinated. Feed the machine a string byte by byte, and the string is in the collection if and only if it lands in a final state. Think of it as a trie (another fun data structure) that shares suffixes as well as prefixes, minimized into a single machine. There are some caveats to this, but Andrew's extensive blog below covers it far better than we ever could.

Three properties made it look perfect for us. Lookups cost time proportional to the key length, independent of how many keys are stored. The whole structure is a flat byte sequence you memory-map ( mmap ) straight from disk, with no deserialization step. And because the collection is itself an automaton, you can intersect it with another automaton, which is how a regex runs over it: compile the pattern to a deterministic finite automaton (DFA), intersect, walk the resulting tree, and prune entire subtrees of the key space that can never match.

The canonical treatment is Andrew Gallant's Index 1,600,000,000 Keys with Automata and Rust , written by the author of the fst crate. It remains one of the best data structure posts on the internet, and its headline experiment is why we started here: 1.6 billion deduplicated Common Crawl URLs, 134 GB of raw keys, compiled into a single 27 GB index that serves regex queries in fractions of a second. Domain names are an even friendlier corpus than URLs. They are short, highly repetitive strings with enormous shared structure, so they compress absurdly well.

Building one is pleasant:

let mut builder = SetBuilder::new(writer)?;

// Keys must be inserted in lexicographic order
for fqdn in sorted_fqdns {
    builder.insert(fqdn)?;
}

builder.finish()?;

Keys must arrive sorted, and once you call finish , the FST is frozen and immutable. Not to foreshadow too much, however certificate transparency is the opposite of frozen. It is a continuous append-only stream, and a 90-day retention window means we delete continuously from the other end too.

So we built the machinery an immutable structure needs to behave like a live index. Global snapshots, compaction, custom binary format to track occurrences, rolling index updates and so forth. By late October the engine ingested multiple logs and served queries. What we had, in effect, was a hand-rolled log-structured merge (LSM) tree with the certificate-transparency-specific parts bolted on. Exciting stuff, but it did feel like we were forcing a square peg into a round hole.

This initial version of certgrep.sh did work for about three months; serving real queries in production. It answered exact lookups, prefix and suffix queries, fuzzy matches, and regex. Two of those I'd like to mention, because they show how far the automaton model stretches:

  • Suffix search: FSTs only do prefix search cheaply. To answer "every name under this registrable domain" we built a second FST with the labels reversed ( com.example.www ), so a suffix query became a prefix query on the reversed set. I wouldn't say this doubled the storage, as compaction varies, but it significantly increased it.
  • Fuzzy search: The fst crate ships a Levenshtein automaton. Intersect it with the names FST and you get every name within an edit distance of a target, using the same walk as regex. For catching typosquats that is close to the ideal primitive. That said, the memory allocation overhead for another above an edit distance of 3 was quite large and was heavily truncated internally within the library which was a known issue .

We did eventually hit our first major wall. The problem was not mutability, which was our prime suspect. The problem was regex latency under load. A regex over a bare FST intersects the pattern's automaton against the whole names automaton. For an anchored or prefix-heavy pattern that prunes beautifully. For the substring and alternation patterns real hunting produces ( .*paypa1.* , homoglyph families, phishing-kit naming conventions), it prunes almost nothing, so the walk visits a large fraction of the key space on every query. That work is CPU-bound, it does not shard away cleanly, and it got worse as the index grew. The index builds were memory-hungry enough to start crashing under the larger multi-log corpus, which we spent the first week of December fighting.

The realization at this point was that we do still want FSTs, however we need some external structure that reduces the candidate set that we need to search over. Similar to a dimension reduction problem. We wanted the automaton walk to run against a small candidate set instead of the entire corpus, and we wanted someone else to own the segment lifecycle we had been hand-maintaining.

Whether a regex is cheap or not comes down to whether the pattern lets the walk prune. We try to showcase this in a few examples below against both the forward and inverse FST structures we mentioned.

Walking the automaton

FST regex walk and pruning A trie of domain names. An anchored pattern prunes to one branch; a substring or suffix pattern forces the walk to visit nearly every state; on the reverse-label trie a suffix becomes a cheap prefix walk again. www example com net acme com login example com acme io paypa1 example com secure co mail acme com

forward FST

7 / 20 states cheap

Anchored on the first label, the walk descends a single branch and prunes everything else at the root.

The first example shows an ideal happy path, were all but one branch are immediately pruned from the search. The last two examples show the strength that the inverse FST provided to us.

Attempt two: Tantivy and a trigram index #

FSTs are exceptionally powerful, and we're really grateful to Andrew for not only publishing the fst crate, but also documenting the structure at length. I'm sure we'll have more use-cases for it in the future, and feel confident that we'd be able to equip it better next time. For now, we had to take a step back and re-assess our second option, trigrams/ngrams using Tantivy.

Tantivy is a full-text search engine library in Rust, in the same architectural family as Lucene. Immutable segments, background merges, a term dictionary, mmap-friendly on-disk formats. It gave us, off the shelf, the segment lifecycle we had been hand-maintaining, plus the one thing the FST engine could not offer: a way to avoid scanning the whole corpus for every regex.

That way is a trigram index. Every name is broken into overlapping three-character grams and stored in an inverted index, wrapped in anchors ( ^name$ ) so edge matches stay exact. A regex query is decomposed into the trigrams any match must contain, those trigrams select a small candidate set, and the expensive automaton match runs only against the candidates. The full-corpus walk that made FST regex CPU-bound never happens.

Trigram index at index time

one name → overlapping grams → inverted index

Trigram index construction The name paypal.com is wrapped in anchors as ^paypal.com$. A three-character window slides across it one position at a time, producing overlapping trigrams including the anchored edge grams ^pa and om$. Each gram becomes a key in an inverted index whose posting list holds every name that contains that gram. index a name ^ p a y p a l . c o m $ anchored ^ p a ^pa p a y pay a y p ayp c o m com o m $ om$ slide a 3-char window; emit one overlapping gram per step inverted index pay paypal.com , paypa1.com , mypaypal.io ypa paypal.com , paypa1.com , typo-ypa.net com paypal.com , example.com , login.com each gram → every name that contains it

Each gram maps to every name that holds it. A regex names the grams a match must contain; intersecting those short lists yields the small candidate set the automaton actually checks.

There is a satisfying footnote here. Tantivy's term dictionary is itself built on FSTs. We did not abandon the data structure! We moved to a system that embeds it behind the operational machinery it needs, and the regex path certgrep.sh serves today still bottoms out in automaton matching against an FST, exactly as the first design intended. The difference is that the automaton now runs against candidates rather than the whole world, and someone else maintains the engine around it.

The schema is deliberately tiny. Each indexed name carries:

  • domain_raw , a raw-tokenized copy of the name for exact and regex matching.
  • domain_ngram , the 3-gram tokenized copy for substring and fuzzy matching.
  • a pointer , the byte offset of that name's occurrence history (more on this later).
  • a few fast fields for sorting and retention: last-seen timestamp, certificate validity window, and total occurrence count.

To reiterate briefly, no certificate bodies, no chains, no parsed X.509 fields. Domains, where each domain occurred (through the pointer), and just enough timestamp metadata to sort by recency and trim by age.

The trigram path turns the same query inside out. Rather than walk the whole automaton, it narrows to candidates first, so the expensive match only ever runs against a small set.

Trigram candidate filter

narrow first, then match

Trigram candidate filter A regex is decomposed into required trigrams. The Tantivy trigram index returns only the names that contain every trigram, a small candidate set. Each candidate is matched against the raw name, and the hits follow a pointer to their occurrence history. regex .*paypa1.* decompose pay ayp ypa pa1 look up Tantivy trigram index millions of names candidates a small set match vs domain_raw hits → follow pointer → occurrence history

Only names containing every trigram survive. The automaton match runs on that small set, not the whole corpus.

Just-in-time hydration #

The part of the design we like most is what happens when someone actually needs a certificate.

Every occurrence in the index carries a compact binary record that says where the entry lives: which log, and the leaf index needed to retrieve it. When a result needs to become a full certificate, for evidence, for enrichment, or for a human who wants to read the chain, we fetch that exact entry from the log itself, on demand.

Each name maps to a block of these records in a single postings file. The block is a little-endian u32 count followed by fixed-width records, ordered newest first, so the first record is always the latest occurrence. The current record is 30 bytes, and trades some storage overhead for predictable and fast access.

Occurrence Record V3

One fixed-width coordinate into the public log

30 Bytes Little-Endian Newest First

Byte Address Space 00 → 29

  1. 01

    log_id u8 / 1 B / Offset 0

    Internal certificate transparency log identifier

  2. 02

    kind u8 / 1 B / Offset 1

    0 = X.509; 1 = precertificate

  3. 03

    ts_sec u32 / 4 B / Offset 2–5

    Occurrence time in Unix seconds

  4. 04

    index u64 / 8 B / Offset 6–13

    Certificate transparency leaf index used for hydration

  5. 05

    not_before i64 / 8 B / Offset 14–21

    Certificate validity start in Unix seconds

  6. 06

    not_after i64 / 8 B / Offset 22–29

    Certificate validity end used for retention pruning

The V3 occurrence record is exactly 30 contiguous little-endian bytes: log_id at offset 0, kind at offset 1, ts_sec at offsets 2 through 5, index at offsets 6 through 13, not_before at offsets 14 through 21, and not_after at offsets 22 through 29. The log identifier and leaf index locate the full certificate entry in its public certificate transparency log.

That is the entire cost of remembering an occurrence. Thirty bytes, plus a pointer from the trigram index into the postings file. The certificate that record points at might be four kilobytes. We store the thirty bytes. The public logs store the four kilobytes.

This works because certificate transparency logs are, by design, the perfect cold store. They are public, append-only, tamper-evident, and operated by parties whose entire job is keeping them available. There is no reason to mirror a blob store the ecosystem already runs for you. We pay to store pointers. The internet stores the payload.

We call this just-in-time hydration. The index answers "what appeared, where, and when" instantly. The logs answer "show me the full artifact" on demand, at the cost of one fetch, for the vanishingly small fraction of entries anyone ever looks at. It is the single decision that collapses the cost structure of the whole system, and it is the reason we can run this as a free service rather than a loss leader with a countdown timer.

Turning a hit into a full certificate is a single round trip to the log that already holds it.

Just-in-time hydration

occurrence record → certificate

01 / 03

Just-in-time hydration A search hit is an occurrence record: a domain plus a pointer into a certificate transparency log. On demand, certgrep requests the single leaf entry for that (log_id, index), and the returned entry is parsed into the full certificate and chain — the grayed fields on the receipt filling in once the fetch returns. OCCURRENCE RECORD paypal.com log 181 / idx 904551233 seen 2026-08-01 14:22 UTC — hydrate to reveal — issuer Let's Encrypt E5 valid 2026-07-20 → 10-18 serial 03:a1:f7:…:9c san paypal.com san www.paypal.com pubkey ECDSA P-256 sha-256 4b:29:…:e1 chain leaf → E5 → ISRG X1 — end of leaf entry — CT log get-entries request (181:904551233) leaf entry → parse

The index stores the 30-byte pointer; the log stores, and returns, the certificate.

The index stores the 30-byte pointer; the log stores, and returns, the certificate.

Indexing at scale: fan out, then collapse #

Building the index is its own problem, because a single machine pulling a large log in order is far too slow. It's also an embarassingly parallel problem, which means that with some planning ahead of time, and can parallelize the work substantially.

The orchestrator #

The part part of building out the index is figuring out what we've gotten so far (if anything), which logs we're targeting, and how much of a delta we need to catch up to. From there, we can shard the work to hundreds of workers and begin indexing each fragment. We'll avoid going into the details of tiled logs and so far, as that's a whole other blog post we'll leave to others.

Each indexer does the same small job: pull its slice, extract normalized names, and write sorted run files. No indexer sees the whole log and none of them talk to each other, so the fan-out is as wide as the budget allows.

Putting it back together is the interesting half. The runs collapse through a multi-round k-way merge . The first round merges runs in fixed-size groups into fewer, larger sorted runs. The next round merges those, and so on, layer by layer, until one sorted stream remains. That stream is grouped by name and written once as the postings file (i.e., the occurrences), while the unique names feed the Tantivy trigram index. It is the same fan-out-then-fan-in you see drawn for a neural network: a wide layer of independent workers, then a funnel of merge rounds narrowing to a single artifact.

There's a whole lot that goes on to keep this effort as cost effective as possible. We take inspiration from Erlang's tail recursive calls which allows us to pass forward information without having to keep a lot of fragments over extended periods of time.

Network / Build Topology Active: Plan

certgrep Indexing Pipeline The current stage is Plan . An orchestrator fans work out to 128 or more parallel indexers, represented by 25 shard nodes. K-way merge passes collapse those shards from 25 to eight, eight to four, and four to one immutable index. Input Object Config + Previous Index Coordinator Orchestrator 25 Visual Shards / 128+ Indexers First K-Way Merge / 8 Runs Second K-Way Merge / 4 Runs Immutable Index / 1 Artifact

01 / Plan

Read signed tree heads and divide each target log into ranges.

Object: Config + Previous Index

Six-stage scroll-driven indexing pipeline with named stage controls. Twenty-five visual shards stand for 128 or more parallel indexers. Three deterministic merge stages collapse them from 25 to eight, eight to four, and four to one immutable index. Play advances automatically and stops at the final stage. Scrolling, the stage rail, Back, or Next takes control and pauses automatic playback.

Because the shards are independent and each merge round is deterministic, the pipeline is restartable and scales by adding indexers rather than by rewriting anything. A shard that keeps getting throttled by a rate-limited operator backs off, and if it still cannot make progress it aborts on its own and is logged, while the rest of the pipeline carries on.

Design constraints #

certgrep.sh is shaped by three deliberate limitations.

90 days of data. We continuously trim anything older. Certificate lifetimes keep shrinking, adversarial infrastructure churns fast. The retention window is also what keeps the index small enough to serve for free.

FQDN search only. There is no search within the certificate chain. No issuer queries, no key queries, no metadata beyond the names themselves. The index knows names and where they occurred, nothing else. That is the tradeoff that makes the whole thing cheap, and for hunting lookalike and phishing infrastructure it is the right one, because the name is the signal.

Everything else is hydrated. Anything beyond the name costs one fetch to the source log. In practice you rarely need it.

In exchange, you get the thing most free certificate transparency tooling does not offer: full regex, plus fuzzy matching, over every name seen in certificate transparency in the last 90 days. If you can express a squatting pattern, a homoglyph family, or a phishing kit's naming convention as a regex, you can sweep the entire recent corpus for it in one query.

Why free #

The honest answer is that the design made it cheap enough that charging for it felt wrong. The occurrence index over 90 days is small, the query path is fast, and the expensive artifact, the certificates themselves, is stored by the certificate transparency ecosystem rather than by us, and it would be wrong to charge based on that.

The less modest answer is that we built this because Have I Been Squatted needed it internally, and the internal version was too useful to keep internal. Certificate transparency is a public dataset. Search over it should not be a luxury. We put certgrep.sh out for free as a small thank-you to a community we take a great deal from, and because it earns its place as one more tool in an analyst's kit: a fast first pass when the question is whether a naming pattern has surfaced in certificate transparency lately, and where.

certgrep.sh is live now. Bring your regexes, and if you find something interesting, or something broken, come tell us on Discord . We read everything.

Fast drilldown dashboards from a single Parquet file

Hacker News
www.hamiltonulmer.com
2026-08-24 04:13:17
Comments...
Original Article

Fast drilldown dashboards from a single Parquet file

One 40MB Parquet data cube, an 18KB reader, an R2 bucket, and a few unassuming http range requests.

Aug 21, 2026

Every month brings a new eruption of clever uses for object storage, easily the most volcanically active corner of non-AI software infrastructure on earth. The most recent lava bomb was Vicent Martí’s writeup of Cursor Origin’s S3 + WAL approach to managing Git repositories at scale. It’s a masterpiece of technical writing, unlike this post. I’ll admit that even before reading it, I was daydreaming about a totally different kind of task where object storage probably just works , this time for customer-facing analytics dashboards. A friend of mine has customer usage data in Iceberg on R2, and wants to show his users some basic charts with filters. He told me he didn’t want to add any more vendors, which ruled out MotherDuck, the cloud-hosted DuckDB database company where I currently work.

Well, in analytics, when all you have is object storage, everything looks like a range request. We could probably just roll this kind of data up into a Parquet-backed data cube, and fill out the dashboard with very simple range queries against it, using Hyparquet , a small javascript Parquet reader that runs in the browser. With that, you can serve a real drilldown dashboard with neither a database nor a query engine. The cube could even be tens (or hundreds) of MB, since a correctly laid-out file means you only ever read a few small slices of it at a time. You just need a data pipeline to produce the cubes ~ which is also, it turns out, where all the actual money goes when you do have a real analytical database.

The heresy was too good to pass up, since these days I assume DuckDB is the lightweight solution to all my data problems. To test it, I took the well-known NYC 311 service requests dataset I had on my computer ~ about 34 million rows at the request level, 15 or so years ~ and rolled it up into a 40MB Parquet cube with filters for city agency, complaint type, submission type, and borough, plus a single creation-time column for the time series. Then I stuck it on R2. 40MB is big enough to feel the pain of downloading the whole thing.

The demo dashboard below reads directly from that file using Hyparquet. The bytes pass through a small Cloudflare Worker on the way, because the free r2.dev URL is rate-limited. The Worker proxies byte ranges and caches them at the edge, which is safe because the file is immutable. To be honest, I was surprised how fast new data loads, given that it forgoes both a real database and a powerful query engine. The UI does all of the actual reading, and it is lightweight enough to embed directly in this post without hurting the page load. The real complexity is almost entirely offloaded to the data cube layout. Try scrubbing the chart or clicking on the rows of the leaderboards.

nyc 311 ~ daily requests

all time

~ 0 requests in view

0

range request

s

·

0 KB

fetched

·

0.0

% of the cube so far

no filters ~ click a leaderboard row, or brush the chart (click the chart to clear) no filters ~ tap a row or brush the chart

by agency

by complaint type

by borough

by channel

So, how does this dashboard work?

A dashboard like this one is designed to answer a bounded set of analytical questions ~ requests per day, requests per day for one agency, all-time totals by borough. Each question can be answered by GROUP BY queries, so we can precompute them all ahead of time and save each result as its own small table, called a grouping set . Stack all of the grouping sets in one Parquet file, one section per set, and you have a data cube . A grouping set is only useful if it either enables a question to be answered, or reduces the latency of pulling the data. This file has both kinds. The all-time totals feed the leaderboards, and a daily grouping set for every combination of filters provides the data for the line chart. The weekly and yearly grouping sets reduce the number of rows scanned that results from brushing the chart. The same totals could be summed from daily rows, but there are fewer rows to fetch if we precompute by weeks and years.

The file now holds the grouping sets that render the dashboard, but the browser still has to pull out just the rows it needs. Two features of the Parquet format make that possible. A Parquet file is divided into row groups of a few tens of thousands of rows, and it ends with a footer that contains metadata about the byte ranges of row groups and the min/max values of each column inside it. The client reads the footer once. Each query then uses the min/max values to pick the row groups that could match, fetches those byte ranges, and aggregates the rows in the browser.

The low latency in the dashboard requests is due to how the rows in the Parquet file are sorted and scanned. If the rows of the file were randomly ordered, each row group’s min/max values would span nearly the full range of each column, and a query would have to read most of the file just to fetch a small percentage of rows. Instead, the rows of each grouping set are sorted by the columns its queries filter on. The matching rows thus usually make up a contiguous stretch of the file, and the min/max statistics enable the reader to ignore the rest of the row groups. That is why clicking NYPD in the agency leaderboard reads about 260KB out of the 40MB file rather than the whole file. Below is the actual layout of the file in terms of bytes and grouping sets:

row groups

grouping set rows size

totals

feed the "requests in view" total and the four leaderboards

831.1k

1.7mb

all time 1 row group

read when no date range is brushed

4.8k

103kb

by week 16 row group s

read when brushed: the leftover weeks at the range's edges

796.6k

1.3mb

by ISO year 2 row group s

read when brushed: the whole years in the range's middle

29.7k

272kb

daily · no dimensions 1 row group

draws the line chart when no filters are active

5.0k

171kb

daily · one dimension

draws the line chart when one filter is active

770.3k

2.4mb

channel 1 row group

22.7k

171kb

borough 2 row group s

30.0k

330kb

complaint 13 row group s

635.6k

1.5mb

agency 3 row group s

82.0k

383kb

daily · two dimensions

draws the line chart when two filters are active

4.5m

10.6mb

borough + channel 3 row group s

127.7k

401kb

complaint + channel 23 row group s

1.1m

2.6mb

complaint + borough 42 row group s

2.1m

4.5mb

agency + channel 5 row group s

198.0k

640kb

agency + borough 8 row group s

358.5k

997kb

agency + complaint 13 row group s

643.0k

1.5mb

daily · three dimensions

draws the line chart when three filters are active

7.3m

15.8mb

complaint + borough + channel 65 row group s

3.3m

6.8mb

agency + borough + channel 17 row group s

804.0k

1.9mb

agency + complaint + channel 22 row group s

1.1m

2.4mb

agency + complaint + borough 43 row group s

2.1m

4.6mb

daily · all four dimensions 64 row group s

draws the line chart when all four filters are active

3.3m

6.6mb

footer · the index

byte ranges and min/max statistics for every section; read first, once

195kb

This setup works under two conditions. The combinatorics of your charts and filters have to stay small, and your pipeline has to rebuild each customer’s file fast enough to meet the update cadence. Most usage and billing pages meet both. They are a fixed set of charts ~ events over time, counts or sums by hour or by day, a few filters or leaderboards ~ over data that updates on a coarse schedule rather than in realtime, for their sake as much as yours. From the perspective of latency, the cube size doesn’t matter, but you’ll want it to be somewhat small anyway since you’re regenerating one per customer on a schedule.

The time grain is clearly dominant in my example, since the daily sections account for most of the bytes of the file. Cardinality is the other multiplier ~ complaint type has 485 distinct values, and every large section in the diagram contains it. In fact, choosing a daily grain for the line chart made the file about 7x larger than the weekly equivalent (5.6mb). Still, the daily grain did not meaningfully impact the latency of the range requests, since any interaction only ever reads a few row groups. And for this case, it’s nice to see a big single-day spike, since a big uptick in service requests can happen in a single day because of major events like hurricanes or blizzards.

Dashboards such as the one above work well for distributive and algebraic aggregations, which can be computed in pieces and then combined before visualizing. Think of sums, counts, maxes, and averages. Making this setup work for holistic aggregations (ones that require knowledge of the distribution before achieving a final filtered aggregate) have both exact and approximate solutions. I’ll leave that as an exercise to the reader and their favorite agent.

Range requests over a carefully laid-out file have plenty of prior art. PMTiles packs a tileset into one file that clients read via range requests over http. It works because the tiles are laid out in the file along a Hilbert curve, so the tiles for a given map view sit near each other in the file and can be fetched in a few coalesced range requests. And of course, the well-known SQLite-over-HTTP writeup proved the mechanic works even for B-trees.

My favorite part is that this approach shifts the complexity “left” all the way to the data pipeline. The layout is decided beforehand, so by the time a user clicks on a leaderboard or scrubs a time series chart, the client only has to fetch the right rows and sum them. As for the pipeline, for most customer-facing dashboards, a 10mb per-customer cube falls out of a DuckDB GROUP BY GROUPING SETS statement. For my friend, who’s a data engineer, it’s pitch-perfect déformation professionnelle .

One file per customer also makes auth refreshingly boring. Access control amounts to a signed URL for that customer’s file, or a tiny Worker that checks the session.

Given that R2 has free egress, the pipeline is also the thing that costs actual money. Writes cost $4.50 per million (12.5x the price of reads), and you pay one write per customer per rebuild, regardless of file size (a 1MB cube and a 40MB cube cost the same to upload). Take 10,000 customers. Each rebuild replaces the files, so storage is flat: 10MB cubes make 100GB, about $1.50/month; 40MB cubes make 400GB, about $6/month. Rebuilding every file once a day is 300k writes a month, or about $1.35; rebuilding hourly is 7.2M writes, about $32; rebuilding every five minutes for a month is 86M writes, about $389. Thankfully, Iceberg snapshot diffs tell you exactly which customers have new data, so it’s easy to only rebuild the cubes with new activity.

Even still, let’s say you update every 5 minutes and every customer has activity in that window (again, not very likely). For a single use-case like this one, $389/mo for 10k customers is probably cheaper across the board than standing up new infra, and it is almost certainly simpler. And both the economics and the user experience have changed very recently: egress fees wouldn’t have quite killed this idea, but they’ve probably discouraged people from experimenting this way. The same setup on S3 comes out only about 20% more expensive overall ~ roughly $20 a month of egress at a million queries, and a million queries is more traffic than most customer dashboards will ever see.

My other favorite part is the radically thin implementation. An 18kb javascript reader and a byte layout that does the database work for you. What a world!

My Arms Are Longer Now – comedy stealth game sends lawlessness into new territory

Guardian
www.theguardian.com
2026-08-24 04:00:55
Developers who met through Australia’s improv scene and publishers of comedic party games have united for this slithering challenge in which you play as one extended limb Most stealth games cast you as a spy, an assassin or a master thief. My Arms Are Longer Now dispenses with most of the criminal p...
Original Article

M ost stealth games cast you as a spy, an assassin or a master thief. My Arms Are Longer Now dispenses with most of the criminal person, to send in just one spectacularly badly behaved limb. It slithers across floors, winds around furniture, steals things and slaps anyone within reach – finally answering the question nobody asked: what if your own arm turned to crime?

As Toot Games co-founder Matthew Jackson puts it: “You are the bad thing that happens to the people.”

The idea began as a much simpler prototype made during a weekend game jam themed around the idea of lost and found. Jackson and fellow Toot co-founder Millie Holten , who met through Melbourne’s improv and sketch comedy community, wanted an idea that could be understood – and raise a laugh – in a single still image. A grotesquely extended arm proved to be just that.

Since then, the game has been all about comedy. It has more than 40 speaking characters, voiced by Australian comedians who perform the written dialogue before improvising alternative takes. “It’s a vessel for jokes,” Jackson says. For almost a year, development largely involved trying to “cram jokes into the game”; only later did the team realise the physics of the increasingly sophisticated arm had become fun in their own right. Players can personalise its skin tone, hair and accessories, making it less somebody else’s disembodied crime spree than a freaky extension of their own body.

The stealth here owes something to Untitled Goose Game : characters react to your crimes, but, Jackson says, “There are no fail states in the game.” A museum guard might smack the arm, or beg it to stop before they are fired. Anyone can be slapped, including an infant. While searching for a publisher, Jackson repeatedly asked: “Is someone going to come and tell us you can’t slap the baby?” Jackbox Games , thankfully, did not.

An absurdly extended light-skinned arm, the hand holding a sharp stick, reaches into a garden, past an infant on a mat, wrapping around a clothes line. A child appears to have fallen off their bike. A to-do list in the corner shows: Jam the bike’s wheel, steal the bike, trip over aunt, steal the aunt’s earrings
‘A vessel for jokes’ … My Arms Are Longer Now. Photograph: Toot Games

Making that slap possible required rather more sophistication than the joke might suggest. The original game was flat and 2D, but Holten’s concept art showed the arm looping over tables, under chairs and around objects. Six months into development, the studio took the risky decision to rebuild in 3D. Working with developer Cherie Davidson, Jackson created a procedural, tube-like limb and a system that uses forced perspective to preserve the illustrated style while allowing the physical collisions the game needs.

The work never quite ends. The team calls another session tinkering with the troublesome appendage “going into the armpit”.

That labour is particularly demanding because comedy is finite. “You can hit a joke, and that joke’s done. You’ve burnt that,” Jackson says. Some publishers suggested adding more puzzles, but Toot feared they would obstruct the punchlines. Jackbox understood that it was meant to be “a good time, not a long time”, with players who do poke into every corner rewarded with optional interactions and voice lines.

Jackson’s ultimate ambition for the game is appropriately simple: “I hope players say it was funny. That’s truly it.” And after three years in the armpit, 48 speaking characters, and one non-negotiable baby slap, Toot Games has gone to extraordinary lengths to reach gaming’s funny bone.

Puerto Rico’s Independence Movement Is Gaining Strength

Portside
portside.org
2026-08-24 03:56:08
Puerto Rico’s Independence Movement Is Gaining Strength Ira Mon, 08/24/2026 - 03:56 ...
Original Article
Puerto Rico’s Independence Movement Is Gaining Strength Published

Rafael Bernabe’s history of the Puerto Rico independence movement, Obstinate Star, can serve as a key tool for those on the US left who want to understand Puerto Rican politics beyond the occasional tokenization of the island by Democratic Party elites. | Alejandro Granadillo / Anadolu via Getty Images

Review of Obstinate Star: A History of the Puerto Rico Independence Movement by Rafael Bernabe (Haymarket Books, 2025)

In a recent speech in the city of Nashville, former Democratic presidential candidate Kamala Harris spoke about the need to “revisit” several questions about the US political system: the Electoral College, the Supreme Court, and statehood for Puerto Rico and Washington, DC. While the US media was keen to pick up on her comments about the Electoral College and the court, the mention of Puerto Rico was an afterthought.

The call for Puerto Rican statehood has become a recurring theme in the mainstream Democratic discourse. However, it owes more to white liberal fantasies of multicultural imperialism than the real desires of the Puerto Rican people for a change in political status. In fact, the Puerto Rican statehood movement is much more aligned with the Republican Party than their Democratic rivals. The country’s current pro-statehood governor, Jenniffer González, is an ardent Republican and Trumpista .

If the Democratic consultants who are advising Harris had taken a little time to research contemporary Puerto Rican politics, they would have seen that the independence movement is taking off among the country’s youth. The pro-independence candidate Juan Dalmau made history by winning nearly 31 percent of the votes in the 2024 gubernatorial election.

The choice between independence or incorporation into the colonial metropolis has been the defining characteristic of Puerto Rican politics since the nineteenth century. This is a debate that sociologist Rafael Bernabe, a former Puerto Rican senator from the Citizens Victory Movement, traces in Obstinate Star: A History of the Puerto Rico Independence Movement . Bernabe tells the story of the men and women who kept the dream of Puerto Rican independence alive over the past two hundred years, while focusing on the role that the country’s working class played within the movement.

An American Nation

W hile often excluded from the conversation about the Latin American independence campaigns of Simón Bolívar and José de San Martín, the Spanish colonies in the insular Caribbean, Cuba and Puerto Rico, provided soldiers to both sides of the conflict. One such soldier whose life Bernabe discusses is Antonio Valero, a Puerto Rican officer in the Spanish army who participated in the Mexican independence negotiations and decided to join the military of the newly independent nation.

However, shortly after independence, Valero’s republican ideals put him at odds with Agustín de Iturbide, who had crowned himself Emperor of Mexico, prompting him to flee to Gran Colombia, where he would enlist in the military and fight for Peru’s independence. Valero never stopped dreaming of liberating his homeland and tried to convince Bolívar to free Spain’s remaining Caribbean colonies. This plan almost came to fruition in 1827 but was abandoned due to the possible threats a continuation of the war could pose to Gran Colombia’s newfound independence.

In Obstinate Star , Bernabe shows that the dream of Puerto Rican independence did not die with Bolívar’s abandoned invasion of Cuba and Puerto Rico but reconfigured itself as part of a cosmopolitan Antillean identity promoted by a new generation of Cuban and Puerto Rican intellectual patriots.

The two leading Puerto Rican figures of this new generation were Ramón Emeterio Betances and Eugenio María de Hostos, both of whom would prove to be key advocates for Puerto Rico’s independence in the late nineteenth century and the intellectual architects of the Puerto Rican nation. Both appear extensively throughout Bernabe’s history: key supporters of the Lares uprising against Spanish colonial rule in 1868, they connected the fight for Puerto Rican independence with the Cuban revolutionary movement and other struggles for liberation in Latin America and Europe.

The book also highlights how the independence movement adapted to changing circumstances after the Spanish-American War, when the island became a US colony in 1898, emphasizing the connections and confrontations between sectors of the movement and the growing labor movement on the island. In the 1930s, ’40s, and ’50s, these connections and differences were most pronounced in the eclectic politics of Pedro Albizu Campos and the Puerto Rican Nationalist Party.

Albizu Campos espoused a militant populist nationalism that sought to connect Puerto Rico with contemporary social movements in Latin America, bringing together independence supporters of all ideologies, from conservative nationalists to communists. Bernabe is keen to highlight the ideological contradictions within the Nationalist Party and the ways it struggled to win over the working class from the Socialist Party, which supported statehood.

Puerto Rico and the US Left

O bstinate Star also emphasizes the strong relationship between the Nationalist Party and the US left in this period. The author focuses in particular on the ties linking Albizu Campos to the Communist Party USA and the left-wing New York Congressman Vito Marcantonio. He goes on to analyze the years following the foundation of the Commonwealth in 1952 and shows how the experience of the 1959 Cuban Revolution revived the independence movement.

The Pro-Independence Movement (MPI), much like the 26th of July Movement in Cuba, moved toward an open embrace of Marxism-Leninism and eventually transformed into the new Puerto Rican Socialist Party. The Puerto Rican Independence movement went on to follow a similar path to many left-wing forces around the world between the 1960s and the 1980s, becoming increasingly radicalized.

During these years, many small armed organizations developed and engaged in actions against US colonialism like the 1981 bombing of Muñiz Air Base and the 1983 Wells Fargo robbery, at the time the largest bank robbery in US history. Bernabe’s account takes care not to romanticize these events while placing them within the broader historical and political conditions in which they took place, intricately breaking down many of the complex debates that unfolded among the Left at that time.

During the same period, the Puerto Rican diaspora in the United States sought to identify itself with the island’s independence movement. For some, this meant joining the diaspora section of the Puerto Rican Socialist Party and seeing themselves as part of a divided nation. Bernabe argues that this approach often led to the prioritization of the independence struggle over support for other movements in the US. A contrasting line came from El Comité, an organization that originally emerged from anti-gentrification struggles and advocated for Puerto Ricans in the United States to organize as an oppressed nationality within the multinational US working class rather than as part of a divided nation.

The debate between these two positions led to a polarization that continues to exist today between sectors of the Puerto Rican left. On the one hand, there are those who emphasize the need to focus principally on independence; on the other, there are those who seek to organize within the US left while leaving the question of independence for Puerto Ricans still living on the island. This is a debate that the contemporary US left ought to study when trying to engage with the Puerto Rican diaspora.

Beyond Tokenization

E ven though Puerto Rico remains one of the world’s oldest colonies, its independence movement has a rich history that continues today in the electoral success of the Puerto Rican Independence Party and the growing popularity of the independentista pop king Bad Bunny . Bernabe shows that the independence movement is not a monolith but rather a heterogeneous force made up of activists from a wide range of ideologies and backgrounds.

Obstinate Star can serve as a key tool for those on the US left who want to understand more about contemporary Puerto Rican politics beyond the success of Bad Bunny and the occasional tokenization of the island by Democratic Party elites. Bernabe also provides a key resource for those on the island and in other Latin American countries looking to understand how, despite the country’s colonial situation, the Puerto Rican independence movement has reflected wider political trends throughout Latin America, from a historian with direct experience in the movement.


Cruz Bonlarron Martínez is an independent writer and was a Fulbright Fellow in Colombia from 2021–2022. His writing on politics, human rights, and culture in Latin America and the Latin American diaspora has appeared in various US and international publications.

Jacobin is a leading voice of the American left, offering socialist perspectives on politics, economics, and culture. The print magazine is released quarterly and reaches 75,000 subscribers, in addition to a web audience of over 3,000,000 a month.

today, get four beautiful editions a year, and help us build a real, socialist alternative to billionaire media. Sign Up for Jacobin's mailing list.

We are not going anywhere

Hacker News
gist.github.com
2026-08-24 03:37:53
Comments...
Original Article

We are not going anywhere.

This might sound obvious, but it is worth putting it down, Software Development going forward will be largely done by AIs, you might find the quality subpar, but in terms of cost ratio, it is commercially good enough. Business will accept 99.99 at fraction of cost of 99.999. It is all about general consumer expectations, which will shift.

But most of all, not just that we are not going back, we are also not going anywhere. Software Engineering as science will be largely dedicated to AI development and outside of this discipline, it will slow down to a grinding halt.

No one is going to write new UI libraries if SOTA models know React best, no one is going to bother with new languages if SOTA models know Python, Go, JavaScript, and so on the best.

Yes, it will be easier for people to build new libraries and languages, but they won't gain traction. This might be different for large corporations who can afford to train and finetune models on their new fangled technology, but that will be the exception, and likely struggle with building a community and talent pool outside of this developing organisation as other people may not fancy using or even have access to their internal models.

We are not going back, we are not going anywhere.

Your executable is a SQLite database

Lobsters
fzakaria.com
2026-08-24 03:32:45
Comments...
Original Article

I have been probably obsessed with two things in the last few years: Nix as a tool to explore innovative ideas that require the capability to rebuild the world and replacing ELF with SQLite as an executable format. You might have noticed that these two ideas are well suited to each other.

I explored the idea during my PhD thesis but found feedback from others unmotivating. Radical ideas are hard to sell, as you are working against the inertia of the established solution.

Four-panel comic. A crow at a microphone says "Nix is great"; the audience
boos and shouts "get better material"; the crow looks stricken; the last panel
shows its remaining cue cards, which read "SQLite can be an object file format".

One of the end results of that exploration was sqlelf , a tool that lets you explore an ELF file declaratively using SQL. 1 1 I wrote a paper, arXiv:2405.03883 , that I failed to get published and a follow-up post on querying with it . SELECT name FROM elf_symbols instead of fiddling with readelf and grep . It was remarkably simple by leveraging virtual tables over the ELF: however I found it to be a refreshing improvement to explore the ELF file format. I knew however that there is still something much bigger to be done.

I never let the idea go and with the recent improvements with LLMs, I find it compelling to revisit these ideas to explore further. Specifically, can we replace ELF with SQLite as an executable format? 🤔

Not “a database that describes an executable”, but the actual file you chmod +x and run.

$ file hello
hello: SQLite 3.x database, application id 0x53454c46, user version 1

$ ./hello
Hello, world!

$ sqlite3 hello 'SELECT soname FROM ldd'
libc.so.6

I developed a pretty fleshed out prototype. It is called SELF , the Structured Executable & Linkable Format , because I am unoriginal. It is on GitHub if you are interested. I’m surprised about all the interesting things that fall out of this idea.

§ ELF is a database that refuses to admit it

Working through my PhD, I realized something that bugged me. ELF is already a database. It just implements many database primitives by hand, along with a surprising number of data structures for performance, like a bloom filter for symbol lookup.

If you ever have to analyze or parse ELF, the kernel, ld.so , binutils, LIEF, goblin, readelf , you are re-implementing the same parser over and over again. Every producer re-implements the same serializer.

The format itself is incredibly terse, designed for a world where disk space and network bandwidth was at an extreme premium. Modifying the format is hard, you often have to zero out sections and add new ones since it is packed so tightly. There is also no self-describing schema. ELF itself is a very generic format that supports sections of data that by convention are interpreted in specific ways but the format does not enforce it.

SQLite is the counter-example. They are a self-describing format that is extremely stable. It is designed to be extended to support new features without breaking existing consumers and supporting a wide range of queries performantly.

If we were to replace ELF with SQLite, what would fall out and can all of the necessary information be represented in a SQLite database? The answer is yes, and it is surprisingly simple.

§ What falls away

A SELF file needs two tables to run: self_meta is the ELF header as key/value pairs and segments is the load image, one row per program header with the bytes in a BLOB :

CREATE TABLE segments (
  -- original phdr index
  id      INTEGER PRIMARY KEY,
  -- 'load' | 'tls' | 'stack' | 'relro'
  type    TEXT NOT NULL,
  -- original file offset
  offset  INTEGER NOT NULL,
  vaddr   INTEGER NOT NULL,
  filesz  INTEGER NOT NULL,
  memsz   INTEGER NOT NULL,
  r INTEGER, w INTEGER, x INTEGER,
  align   INTEGER NOT NULL DEFAULT 4096,
  -- the segment bytes; NULL for pure BSS
  content BLOB
);

A single table for the symbol table replaces many of the ELF sections and the .gnu.hash index. It is a single table with a single index:

CREATE TABLE symbols (
  id      INTEGER PRIMARY KEY,
  name    TEXT NOT NULL,
  -- 'GLIBC_2.2.5'
  version TEXT,
  value   INTEGER,
  size    INTEGER,
  -- 'func' | 'object' | 'tls' | ...
  type    TEXT,
  -- 'global' | 'weak' | 'local'
  bind    TEXT,
  defined  INTEGER NOT NULL,
  exported INTEGER NOT NULL
);
CREATE INDEX idx_symbols_name ON symbols(name, version);

Our capability to include an index is equivalent to .gnu.hash and .hash in ELF, but it is a proper b-tree index maintained by SQLite instead of a hand-rolled bloom filter. 2 2 .gnu.hash is a bloom filter plus bucket chains, laid out so ld.so can reject a miss without touching the chain during symbol discovery.

Surprisingly a lot more falls out as well: .dynstr is gone, because name is TEXT and SQLite already interns strings, symbol versioning is a column, not the .gnu.version_r / .gnu.version_d contraption and there is no need for a strings table.

Other tables exist as well for metadata which exist for tooling: sections , notes , dynamic_entries . Delete them and the program still runs, which means strip(1) is a transaction:

# ldd(1)
$ sqlite3 hello 'SELECT soname FROM ldd' 
libc.so.6

# nm -D --undefined
$ sqlite3 hello 'SELECT name,version FROM imports LIMIT 3'
__libc_start_main|GLIBC_2.34
_ITM_deregisterTMCloneTable|
puts|GLIBC_2.2.5

# readelf -l
$ sqlite3 hello \
    "SELECT type,vaddr,memsz,r,w,x FROM segments WHERE type='load'"
load|0|1744|1|0|0
load|4096|361|1|0|1
load|8192|312|1|0|0
load|15768|640|1|1|0

# strip(1)
$ sqlite3 hello 'DELETE FROM sections; DELETE FROM notes; VACUUM;'
# 57344 -> 49152 bytes

# still runs,  the optional tables were optional
$ ./hello
Hello, world!

All the tools that operate on ELF files for reading, reduce to queries over the database. Any tool that modifies an ELF file, like strip , can operate on the database within a transaction rather than performing fragile offset surgery: strip is a DELETE and VACUUM . patchelf is an UPDATE .

Any information missing from the schema can be easily exposed via a view. For example, ldd is a query over the needed table, which is a join of the symbols table with the segments table to find the sonames of the libraries needed by the program.

CREATE VIEW exports AS SELECT name, version, type, size FROM symbols WHERE exported = 1;
CREATE VIEW imports AS SELECT name, version FROM symbols WHERE defined = 0;
CREATE VIEW ldd     AS SELECT ord, soname FROM needed ORDER BY ord;

§ How does it work?

SQLite reserves a 4-byte application_id at byte offset 68 of its header, for exactly this purpose. We stamp it SELF , so an ordinary SQLite database never matches:

$ xxd -s 64 -l 8 hello
00000040: 0000 0001 5345 4c46                      ....SELF

We can now leverage binfmt_misc , the subsystem that allows you to invoke any binary as if it were native. We need only to register the magic to trigger on and an interpreter that will invoke our new file format.

On NixOS the registration is a few lines matching the SQLite magic at offset 0 and SELF at 68:

boot.binfmt.registrations.self = {
  recognitionType = "magic";
  offset = 0;
  # bytes 0-15, 68-71
  magicOrExtension = "SQLite format 3\\x00" + ... + "SELF";
  # ignore the middle
  mask = "\\xff..\\x00..\\xff";
  interpreter = "${self-exec}/bin/self-exec";
};

For now, I have a small tool elf2self that converts an ELF file into a SELF file. It is a simple postFixup hook you can opt into per package on NixOS. The tool reads the ELF, extracts the program headers and symbol table, and writes them into the SQLite database. We could look at extending gcc or ld to emit SELF directly, but for now this is a simple way to explore the idea.

elf hello (ELF) conv elf2self elf->conv self hello (SQLite db) conv->self krn execve() binfmt_misc self->krn magic SELF@68 interp self-exec (interpreter) krn->interp run running process interp->run

self-exec is the interpreter. It is a small C program linked against libsqlite3 . Its implementation is remarkably similar to that of ld.so but it fetches the program headers and symbol table from the database instead of reading them from the ELF file. It maps the loadable segments into memory, relocates them, and jumps to the entry point.

Note self-exec has to stay an ELF file. An interpreter that also matches the registration recurses straight into -ELOOP .

§ Dynamic linking

Running a static program was quick and easy but boring and unimaginative. The interesting part is dynamic linking, which is where the database shines.

I explored two different ways to do dynamic linking. The first is to keep ld.so and just replace the lookup with a SQL query via glibc rtld-audit interface, to quickly iterate on the design. The second is to replace ld.so entirely with a new dynamic linker that does the entire lookup and binding in SQL.

glibc’s rtld-audit interface lets an audit library intercept every shared object lookup ( la_objsearch ) before any filesystem search happens, dlopen included. The audit library can then answer the question “which library satisfies this symbol?” with a SQL query instead of walking the RUNPATH and LD_LIBRARY_PATH . Stock ld.so maps and relocates it, so the full gamut of glibc features work: lazy PLT, IFUNCs, TLS and symbol versioning, while library storage are rows and library lookups are queries.

# no ELF library anywhere on disk
$ rm libgreet.so.1
$ ./app
./app: error while loading shared libraries: 
       libgreet.so.1: cannot open ...

$ self scan --db system.db .
$ SELF_SYSTEM_DB=system.db LD_AUDIT=libself-audit.so ./app
Hello, world, from a SQLite library!

I was curious what a fully SQL dynamic linker would look like, so I prototyped one. It is called self-ld and it is a small C program that implements the dynamic linker entirely in SQL. It is a proof-of-concept, but it works. It maps every object’s segments, publishes their exports, and for each relocation patches the GOT and jumps to the start.

SELECT s.value + o.load_bias
FROM   relocations r
JOIN   symbols s ON r.symbol = s.id
JOIN   objects o ON s.object = o.id
WHERE  r.id = ?
ORDER BY o.load_order
LIMIT  1;

§ Cost & Benchmark

The two things that often matter when replacing a well-established format are size and latency. How much bigger is a SELF file than an ELF file, and how much slower is it to run?

Size. A SELF file carries SQLite’s b-tree overhead and lands at roughly double the ELF.

1980-01-01T00:00:00+00:00 image/svg+xml Matplotlib v3.10.5, https://matplotlib.org/

Similar to ELF binaries, most of that is recoverable, because the overhead is mostly the optional tables for debugging and tooling. Stripping them and deleting them is a transaction. A stripped coreutils SELF is 1,794,048 B against the ELF’s 1,768,632 B, that is within 1% .

We will see though that there are interesting ways to amortise the overhead even more which I found very unique and interesting.

Latency. I benchmarked various binaries from a 15 KiB hello to a 42 MiB gdb linking 47 libraries:

1980-01-01T00:00:00+00:00 image/svg+xml Matplotlib v3.10.5, https://matplotlib.org/

There is a fixed ~5 ms to open SQLite and start the interpreter, plus a copy proportional to the image. That copy is worse than it looks, because the b-tree pages are not mapped into memory. Two processes running the same SELF binary do not share text pages the way a normally- mmap ‘d ELF does, because the bytes are copied out of the b-tree rather than mapped. 3 3 You might notice that curl (274 KiB, 27 libraries) starts slower than ELF git (4.6 MiB, 5 libraries). That is ld.so doing work proportional to the number of objects rather than the number of bytes, which I have complained about before .

§ The system is a closure

A SQLite database though need not merely be a single executable. It can be a closure , a single file that contains a program and all of its transitive dependencies. The ldd output of a program is ambiguous: it only lists the sonames of the libraries it needs, not the specific files that satisfy those needs. Nix improves upon this by explicitly resolving every edge to a specific store path via the use of RUNPATH . 4 4 I have written about RUNPATH on Nix before such as making it redundant or speeding it up .

We can do the same in SELF by storing the resolved path of each edge in the database:

CREATE TABLE objects (id INTEGER PRIMARY KEY, path TEXT UNIQUE,
                      soname TEXT, kind TEXT, is_root INTEGER);
CREATE TABLE needs (
  object_id     INTEGER REFERENCES objects(id),
  ord           INTEGER NOT NULL,
  soname        TEXT NOT NULL,
  -- the FK that kills ambiguity
  resolved_path TEXT REFERENCES objects(path)
);

self closure packs a binary and its transitive dependencies into one database with those edges filled in. Shared library resolution stops being a guess and becomes a foreign key and ldd becomes a JOIN 🤯:

$ self closure "$(readlink -f $(command -v ls))" coreutils.db
ls + closure -> coreutils.db

$ sqlite3 -column coreutils.db \
    "SELECT n.soname, substr(n.resolved_path, 12, 20)
     FROM needs n JOIN objects o ON o.id = n.object_id
     WHERE o.is_root = 1"
libgmp.so.10          rfabfsmwq02sn94mb3qg
libacl.so.1           x0zgiss9hdzcsll3cswg
libattr.so.1          08nfpyc4qhzdkc37nznv
libc.so.6             8kvxvr3pmsypxiypq4g8

This single database is a closure of the ls executable and its five libraries: six objects, segment bytes and all, in one 4.8 MiB file. There is no soname ambiguity inside a closure, because a closure by construction contains exactly one provider per edge.

ls ls (is_root) libc libc.so.6 ls->libc gmp libgmp.so.10 ls->gmp acl libacl.so.1 ls->acl attr libattr.so.1 ls->attr gmp->libc acl->libc acl->attr attr->libc

§ How far does this go? One file, one userland

I hope you’ve been with me so far, because this is where it gets really interesting. We can go even further and pack multiple closures into a single database.

Five-panel Inception meme. Cobb: "your executable is a SQLite database."
Fischer: "and the libraries it links?" Cobb: "also SQLite, so is the whole
userland, one file." Fischer: "how far down does this go?" Cobb, winking:
"you are in one right now."

I pointed self closure at every ELF binary on this system’s PATH : 723 executables, which pull in 400 distinct shared libraries. 1,123 objects, 346,386 symbols, 3,808 dependency edges, all as one SQLite file .

Turns out when you do that, the database is much smaller than you would expect.

1980-01-01T00:00:00+00:00 image/svg+xml Matplotlib v3.10.5, https://matplotlib.org/

611.9 MiB of database against 644.4 MiB of ELF files. The whole userland, as one queryable file, is smaller than the files it came from. The b-tree cost that doubled a single hello amortises to nearly nothing across 1,123 objects and is roughly 6% over the actual program bytes.

The libraries and closure are shared across the executables very similar to how Nix might share them across multiple closures, if the store-path was the same. If every root shipped its own private closure (i.e. the AppImage model), the same 723 programs would come to 5.53 GiB but the deduplication of libraries and symbols falls out naturally from the database schema.

$ sqlite3 userland.db \
    'SELECT count(DISTINCT soname), count(*)
     FROM objects WHERE soname IS NOT NULL'
345|399

$ sqlite3 -column userland.db \
    'SELECT soname, count(*) FROM objects
     WHERE soname IS NOT NULL
     GROUP BY soname HAVING count(*) > 1
     ORDER BY 2 DESC LIMIT 4'
libsystemd.so.0   3
libpthread.so.0   3
libgcc_s.so.1     3
libc.so.6         3

$ sqlite3 userland.db \
    "SELECT count(*)
    FROM needs
    WHERE resolved_path IS NULL AND soname NOT LIKE 'ld-%'"
4

Many common idioms we use in ELF immediately fall out of the database. For example, LD_PRELOAD is a row in a table rather than an environment variable. The preload table is a list of objects to map last, so their exports win. This means that turning LD_PRELOAD on and off is a transaction.

$ ./app.self; echo $?
13

$ sqlite3 system.db "BEGIN;
    CREATE TABLE preload(ord INTEGER PRIMARY KEY, path TEXT);
    INSERT INTO preload VALUES (0, 'libmul.so.1.self');
  COMMIT;"

# same binary, no env var, no relink
$ ./app.self; echo $?
42

$ sqlite3 system.db 'DELETE FROM preload;'
$ ./app.self; echo $?
13

We were able to accomplish an atomic LD_PRELOAD across a whole userland in one file, “interpose a tracing malloc everywhere, then ROLLBACK ” is a single transaction. 😈

§ Where it stands

The format is done and round-trips between ELF and SELF losslessly. The tooling is done and can query, modify, and pack closures. Lookup through SQL works on unmodified glibc programs perfectly and the native-SQL loader works enough to explore it as a possibility for ideas.

The whole thing is at fzakaria/selfdb . nix run .#self-vm boots a NixOS VM where hello is a SQLite database. 🙌

Nix lets us explore radical ideas like this. We can rebuild the world down to the Linux kernel if needed. We need not be constrained by the existing decisions and constraints of the past. We can explore new ideas and see what falls out. I hope you find this idea as interesting as I do.

The Work Number: credit score but for your employment history – by Equifax

Hacker News
employees.theworknumber.com
2026-08-24 03:17:02
Comments...
Original Article

You no longer need an employer code to log in.

We’ve made it even easier to view and manage your employment and income data available on The Work Number.

All users —whether you are new or previously registered on our old website—must create a new account to sign in.

How Automated Verifications Typically Work

You Submit an Application

A verification typically starts with you and an important life event. For example, you submit an application for a loan, job, or government benefits.

Your Application is Reviewed

The verifier may want to confirm your employment and, in some cases, your income. You would typically give them permission during the application process.

You Can Get a Quicker Decision

The verifier uses The Work Number database to verify your information, which can help them make quicker and more efficient decisions.

Your Benefits

computer

Quicker Decisions

Data is available 24/7 so that verifiers can quickly and easily access your information. This can help speed up the decisioning process for loans, job applications, and other services.

computer

Less Work For You

The verifier can access your information through The Work Number. You don’t have to track down pay stubs or employment letters, or set up a separate account.

computer

You Have Control

You can see what data of yours is on The Work Number. You can also see the names of any verifiers that have requested your information in the last 24 months. Request a data freeze at any time and at no cost, or start a data dispute in the unlikely event that you find an error.

You Have Control

We recognize that your information on The Work Number is more than just data. It’s the story of your hard work. You can view and manage access to your employment data 24/7.

View Your Data

View and manage access to your data in The Work Number.

Sunday Science: Bigger, Hotter Fires Are Slowly Erasing America’s Great Forests

Portside
portside.org
2026-08-24 03:07:04
Sunday Science: Bigger, Hotter Fires Are Slowly Erasing America’s Great Forests Ira Mon, 08/24/2026 - 03:07 ...
Original Article

On a gentle slope on the western side of the Sierra Nevada Mountains, where a towering green canopy of ponderosa pines had stood for centuries, wildfires have transformed roughly 1,700 acres into brown, bare shrubland.

That forest is gone for good, scientists say. Spiky shrubs and poison oak have replaced the majestic trees. All that is left of the pines are burned logs and dead branches.

It’s part of a wider transformation that’s taking place across the Western United States, from Oregon to New Mexico, as bigger and hotter wildfires sweep through forests that have not evolved to survive such high-intensity blazes and a warmer climate. Recent studies estimate that as much as 40 percent of Western conifer forests will turn into shrubland by 2100 as a result.

“This is a permanent shift from one ecosystem type to a fundamentally different one,” said Winslow Hansen, a forest ecologist at the Cary Institute of Ecosystem Studies, an independent research center in Millbrook, N.Y.

The consequences of the shift, for both people and wildlife, are expected to be profound.

Researchers say that as trees disappear, winter and spring snow will melt faster, affecting wildlife as well as communities that are already struggling with water shortages. Some Western states get as much as 75 percent of their water from snowmelt.

“When you remove the forest, that snow is more susceptible to melting earlier,” said Benjamin Hatchett, an interdisciplinary scientist at Colorado State University. And he noted that a warmer, more arid climate dries out soil and pulls moisture from plants, making them more susceptible to wildfire. “That thirstier atmosphere is a big concern,” he said.

Forests also absorb planet-warming carbon dioxide from the atmosphere. Bigger, older trees store more carbon than younger trees and shrubs. The loss of conifer forests today means a hotter tomorrow.

To better understand these cascading effects, Dr. Hansen and Johan Eckdahl, a postdoctoral researcher at the University of California, Berkeley, visited the Sierra Nevada this month. On a 100-foot hillside plot that burned in the 2022 Oak fire, they recorded each flowering plant and shrub, filled plastic bags with soil, and checked the ground moisture and temperature with a special probe.

Johan Eckdahl, foreground, and Winslow Hansen measured a burn scar this month in the Sierra National Forest near Midpines, Calif.


Dr. Eckdahl collected soil samples to be examined for indicators of forest health like organic matter and fungus.


Dr. Hansen, left, and Dr. Eckdahl near Midpines this month. “Ponderosa seeds have adapted to fire, that’s how they live,” Dr. Hansen said. “But the fires are just too hot for them.”

Under normal conditions, seedlings would sprout all over after a fire. Young trees would grow and compete for space, water and light, and the forest would return after a decade or two. But the combination of more intense fires and a warmer, drier climate has stopped this age-old process of regeneration.

As Dr. Hansen stood among the brush at the research site, the absence of new growth was stark. “We haven’t found one ponderosa seedling,” he said. “Ponderosa seeds have adapted to fire. That’s how they live. But the fires are just too hot for them.”

Even if seedlings do take hold, they face tough odds. Across the Sierra Nevadas, about one-fifth of the conifers, or cone-bearing trees, are not well suited to the current warming climate .

Dr. Hansen grew up in Bozeman, Mont., on the edge of the Custer Gallatin National Forest. A wildfire in 2000, when he was 13, forced his family to evacuate. “Firefighters saved our home,” Dr. Hansen said. It was frightening, he recalled. But soon after, he noticed something hopeful.

“I remember the next year going out in those woods and hiking around and exploring and seeing little tree seedlings popping up,” he said. “I had this realization that there’s this revitalization effect of forest fire.”

Today, in addition to his work at the Cary Institute, Dr. Hansen directs the Western Fire and Forest Resilience Collaborative, a group of 40 researchers who are using remote satellite sensing, 3-D mapping and computer models that simulate future climate conditions to track the health of western forests.

This summer, survey crews hired by the collaborative are mapping the severity of fires at more than 100 sites in California, Colorado and New Mexico. The goal is to guide researchers trying to better understand how moisture, nutrients and soil microbes influence to what extent forests will recover and how long it will take.

That survey led Dr. Hansen and Dr. Eckdahl to a second site this month, up a winding dirt road about an hour’s drive north from the hillside plot where they collected samples. This area burned in the 2013 Rim fire. At the time it was the largest ever recorded in California, but now it’s only No. 12 on the list.

Dr. Eckdahl said the trees and shrubs at this site were in a struggle of sorts. Some ponderosa pines have survived, new ones are sprouting up, and a tangle of manzanita, oak and shrubs found at lower elevations are trying to establish a foothold.


Smoke from the Oak fire near Midpines in July 2022.Credit...David McNew/Agence France-Presse — Getty Images


The Oak fire started during a severe drought in California.Credit...David Mcnew/Agence France-Presse — Getty Images


The Rim fire burning outside Yosemite National Park, near Groveland, Calif., in August 2013.Credit...Noah Berger/European Pressphoto Agency

Both research sites are at the same elevation, about 3,800 feet, and get the same amount of yearly rainfall. But by using a genetic test, Dr. Eckdahl found that the soil at the Rim fire site was richer, with 1.5 times as much organic matter, four times as much bacteria, and six and a half times as much fungus. The Rim fire soils were also high in important nutrients like nitrogen and phosphorus, vital for plant growth.

“Here, the balance between trees and shrubs is equilibrated,” Dr. Eckdahl said of the Rim fire site. “As the climate shifts, we expect that equilibrium to shift, so more of the area will become shrubs. In science we call that the tipping point.”

Once he returns to his campus lab, Dr. Eckdahl will be poring through 260 pounds of dirt from the summer field sites, swabbing DNA from nearly 500 soil samples. He’s already identified 60,000 different bacteria and fungi that are key to understanding which areas will regrow or fail. He said he hoped to create a microbiological atlas of forest health throughout the West.

Across the Southwest, which is drier and subject to more prolonged droughts than other areas like as the Pacific Northwest, ponderosa pine forests are particularly at risk of failing, according to Jonathan Coop, a fire ecologist at Western Colorado University who has been tracking this ecological shift for the past two decades. He, too, grew up in a forest playground, the Jemez Mountains in northern New Mexico, a region that has burned twice since the 1970s and is now nearly barren of trees.

“Watching those forests erode away and turn into something else has really been the catalyst of a lot of the work that I’ve been doing,” Dr. Coop said. “There’s no sign, almost, that there were ever forests there, let alone that they’re coming back. You know, absent a few charred sort of matchstick-like snags.”

This month, Dr. Coop and colleagues published a new study in the journal Science Advances that found wildfires are now getting so large and so fast that pine seeds can’t regenerate. The team looked at almost 3,500 wildfires from 2012 to 2023 in conifer forests in Canada and the Western United States.

“Forests do have innate resilience and under normal circumstances, they can take a hit or two and bounce back,” Dr. Coop said. “But circumstances just aren’t normal anymore.”


“Forests do have innate resilience and under normal circumstances, they can take a hit or two and bounce back,” Jonathan Coop, a fire ecologist, said. “But circumstances just aren’t normal anymore.”


Research teams are mapping burned areas this summer to understand how moisture, nutrients and other factors influence recovery.


The Don Pedro Reservoir near La Grange, Calif., this month. Snowmelt accounts for up two-thirds of the water stored in the 21 largest reservoirs in the West.

As natural regeneration falters, scientists and conservationists are trying to give forests a helping hand.

In Montana, for example, they’re teaming up to plant more climate-resistant seedlings from lower and warmer elevations in new areas that have burned. Kimberley Davis, a research ecologist at the U.S. Forest Service in Missoula, Mont., worked with Conservation International, a nonprofit environmental group based in Arlington, Va., at an experiment in the western part of the state.

They took seedlings of the western larch, a native conifer that can reach 200 feet tall, from 3,400 feet and planted them in a burned area between 4,600 feet and 6,200 feet. The lower-elevation seedlings grew back better and coped with the warmer climate better than seedlings taken from higher elevations. Similar experiments of so-called assisted migration are underway in California and Washington State.

“Keeping as many live trees as we can on the landscape when it burns is really important,” Dr. Davis said. “Because the seed source is so important.”

All the researchers said that there’s still a fair amount of uncertainty in predicting which pine forests will survive and which ones will perish. Despite the new tools of machine learning, remote sensing and genetic analysis, it’s still hard to identify a recipe for a successful forest.

Scientists make calculations based on temperature, moisture and other factors, Dr. Hatchett said, “but the plants are doing their own thing.”

“Biology is always going to throw you a curveball,” he said.


Eric Niiler is a long time environment/science reporter, now covering climate science at The New York Times. From 2022 to October 2025, he was a science reporter at The Wall Street Journal, contributing to online, print and audio reports. I was part of staff award for the 2025 New York Press Club Climate/Environment Award for article on restart of Michigan nuclear plant: “AI Ambitions Drive a Nuclear Power Comeback."

Earth’s Oldest Trees Reveal History’s Strongest Solar Storms
Ethan Siegel
Big Think
1859's Carrington event gave us a preview of how catastrophic the Sun could be for humanity. But it could get even worse than we imagined.
August 20, 2026

Over 5,200 Ebola cases recorded in Congo

Hacker News
www.afro.who.int
2026-08-24 03:03:43
Comments...
Original Article

Kinshasa— One hundred days have passed since the Democratic Republic of the Congo declared the ongoing Ebola outbreak, which has now become the country's fastest growing. Transmission is outpacing control efforts, requiring a substantial scale-up across all areas of response to halt the spread of the virus.

A daily average of around 90 confirmed cases has been recorded in the first three months, markedly higher than the rate observed in the same period during the 2014–2016 West Africa and the 2018–2020 Democratic Republic of the Congo outbreaks. The outbreak has now expanded to a sixth province, with Ituri remaining the epicentre, accounting for about 85% of cases and 79% of deaths.

“We can bring the Ebola outbreak under control but only through scaled-up action in affected communities that is led by national, provincial and local leaders and the affected communities, sustained by needed resources and backed by committed collaboration by all partners in DRC and beyond,” said Dr Tedros Adhanom Ghebreyesus, WHO Director-General. “WHO and partners will continue to support the DRC government, communities and neighbouring countries in delivering the response needed to end the outbreak.”

Mortality is high both in communities and among patients in treatment facilities. Community deaths—those occurring outside Ebola treatment centres—accounted for around 60% of the 260 weekly fatalities recorded over the past six weeks. This highlights the persistent challenges in early detection, referral and access to treatment, while mortality among patients reaching treatment facilities may reflect late admission and severe stage of the disease.

The response needs to be rapidly ramped up and adapted to local transmission patterns and operational gaps. All response partners need to reinforce operations in areas with high virus transmission and community deaths, as well as in high-risk areas and in areas reporting new cases.   However, the response faces many challenges such as insecurity and recurrent conflict, population displacement, attacks on health facilities, community reluctance and difficult access. Scaling up and adapting the response requires intensified action and resource intense mobilization, stronger disease surveillance, preparedness and coordination across provinces, along the Congo River and national borders.

“This outbreak has reached a defining moment. The progress made over the past three months shows that stronger action delivers results, but it also reminds us that incremental gains will not be enough. We now need to significantly step up the response: moving faster to detect cases, reaching communities sooner and strengthening operations where they are needed most. The choices we make now will determine how quickly we can bring this outbreak under control, protect and save lives,” said Dr Mohamed Janabi, WHO Regional Director for Africa.

Despite the challenges, important outbreak response efforts have been made over the past three months. Laboratory capacity has expanded from one testing site to 19 laboratories capable of processing more than 3000 samples a day. Treatment capacity has increased from fewer than 10 beds to more than 1300, while over 900 health facilities have received infection prevention and control support. Community engagement activities have reached more than 2.5 million people and contact follow-up has improved from 9% during the first week of the outbreak to 84% as of 18 August.

Scientific efforts are also advancing, including clinical trials of potential treatments, evaluation of candidate vaccines and deployment of the first emergency-listed molecular diagnostic test for Bundibugyo virus disease. In countries neighbouring the Democratic Republic of the Congo and beyond, preparedness is being reinforced through closer cross-border collaboration, harmonized disease surveillance, information sharing and joint planning to detect and contain imported cases.

National authorities, supported by WHO and partners, are reinforcing disease surveillance and contact tracing, expanding laboratory testing and clinical care, strengthening infection prevention and control, and working with communities to encourage early reporting, care-seeking and safe and dignified burials. WHO has deployed over 260 experts, delivered more than 330 tonnes of essential medical and operational supplies.

Bringing the outbreak under control will require sustained national leadership, strong community engagement, secure access to affected communities, regional and global solidarity and continued investment to rapidly strengthen response operations where they are needed most. A halt in conflict is also critical to enable frontline teams to reach affected communities. The coming months will be critical to building on the gains made over the first 100 days, closing remaining operational gaps and accelerating efforts to contain the outbreak.

Andreessen Horowitz is investing billions into a bleak future

Hacker News
www.modelrepublic.org
2026-08-24 02:57:01
Comments...
Original Article

Marc Andreessen wants to shape US AI policy . The venture capital firm he co-founded and runs, Andreessen Horowitz (abbreviated “a16z”), is a major player in the development of new tech startups.

These startups include:

  • A bot farm of fake accounts, tricking people and social media platforms into thinking AI-generated ads are posted by real people

  • An AI company that wants to normalize cheating on dates, job interviews, and tests with AI

  • AI companion apps linked to suicide and disturbing behavior toward children

  • A platform hosting thousands of deepfake models — 96% targeting identifiable women — that have been used to create AI-generated content sexualizing children

  • Gambling platforms that attempt to subvert existing laws and target vulnerable users

  • Fintech companies implicated in fraud and illegality

Many of these companies knew the rules and broke them anyway — or designed products specifically to exploit gaps in consumer protection. The firms profited, and the public paid the costs.

There’s a growing public desire to rein in tech companies and regulate AI, so a16z is spending tens of millions of dollars to shape the development of AI policy. The firm helped launch a $100 million super PAC, saw former partners take key government roles, and successfully pushed for an executive order attempting to undermine state AI laws. The partners want to set the rules of the road, even as they’re already driving recklessly.

What follows is The Midas Project's survey of 18 of Andreessen Horowitz's most notorious investments. This isn’t a comprehensive overview of the firm’s larger portfolio, but it indicates a pattern of behavior — one comprising hundreds of millions of dollars of investment by a16z.

These investments reveal the lines that a16z is willing to cross and how the lax regulatory environment that they favor would benefit the firm’s bottom line.

A16z did not respond to a request to comment for this report.

Deception and manipulation

A16z has invested in products designed for mass deception. Even if these tactics don’t explicitly violate the law, they can be corrosive to society.

As technology like advanced AI improves — making it much easier to fake almost anything — decision makers may want to enact new laws or policies that mitigate the social costs. And if a16z gets its way, we might never update the rulebook.

Doublespeed

A16z invested $1 million in October 2025 via Speedrun.

Doublespeed sells the capacity to trick everyday people, and social media platforms themselves, into thinking AI-generated ads are genuine human content. Here are some select quotes from the company’s promotional video :

  • “We run the only VC-backed bot farm in America. Because why let Russia and China have all the fun?”

  • “We didn't break the internet. It was broken to begin with. But now we're killing it entirely.”

  • “Welcome to the dead internet.”

A16z's Speedrun program invested $1 million in Doublespeed, a company that was recently covered in a blistering article by 404 Media , which reported: “Andreessen Horowitz is funding a company that clearly violates the inauthentic behavior policies of every major social media platform.”

Excerpts from Doublespeed’s website

The company’s business model relies on deception, designed to make social media platforms and their users believe AI-generated images and videos depict real people.

How do they do this? By selling access to “phone farms” that create and manage thousands of fake social media accounts to manipulate engagement metrics. The company's website is explicit, saying its product “mimics” the behavior of real people on social media in order to “get our content to appear human to the algorithms.”

“Yes, we built a phone farm (and its pretty sick),” said Doublespeed founder Zuhair Lakhani on X. The purpose was “replacing human creators with ai, mainly used for marketing.”

A photo of Doublespeed’s phone farms, shared by the founder Zuhair Lakhani on X .

They use thousands of real phones to pull this off because social media platforms like TikTok have policies against and methods to detect the mass generation and deployment of fake accounts.

The company has the accounts imitate human behavior before posting deceptive content. This means the fake accounts search specific keywords, scroll their “For You” pages, and use AI to analyze screenshots of content to determine whether to “repost it, comment on it” or “swipe away.”

A feed of AI-generated marketing content created by Doublespeed. Source: Superwall on YouTube

A selection of nearly identical Doublespeed-run TikTok accounts. Most posts involve the AI decoy complaining about any one of a number of medical issues. Then, the account lists a handful of cures, including a foam roller product from Doublespeed’s client. Source: Tiktok, Doublespeed on loom

This is all designed to circumvent platforms’ restrictions on fake content and then serve that fake content to unsuspecting real people.

In a podcast interview , Lakhani offered details about one of the company’s clients: “They're hitting like the old person niche, which is what I think is like the best niche to hit with AI content.”

Polling and research have found that older people are less likely to say they’ve heard about AI and more likely to fall for AI-generated misinformation .

Lakhani drew a parallel between this client and his prior work producing AI-generated marketing content at scale: “It was all like old person niche stuff. So like all supplements that would, you know, target old people, and that's when the commission would go crazy.”

“Those brands would tell you to do like, you know, make some like extremely crazy claims,” he said, “especially with supplements.” Lakhani added, “The supplement stuff should definitely be like kind of illegal. I don't know how that is allowed.”

Despite their founder stating that supplement ads should be illegal, Doublespeed isn’t shying away from them. In December 2025, a hacker gained access to Doublespeed’s entire backend and the leaked data showed what the AI-generated “influencers” were actually selling.

One account, “ pattyluvslife ,” featured an AI-generated woman claiming to be a UCLA student. The account criticized the supplement industry and pharmaceutical companies as fraudulent — while simultaneously promoting a herbal supplement from a brand called Rosabella.

Another account under the name “ chloedav1s_ ” had uploaded some 200 posts featuring an AI-generated woman claiming to suffer from various health conditions and often pictured in a hospital bed. She ultimately promoted a specific company’s foam roller as a solution to her ailments.

A tweet from DoubleSpeed’s founder shows one of the company’s bot accounts messaging a user to promote the product. In the post, Lakhani boasted, “A couple of weeks ago, we gave the [AI] agents access to dm … This was for an ecommerce brand - out of 130 dms sent, 15 pointed to a conversion.”

Another image from Doublespeed’s platform showing their bot account, imitating a human and messaging users with medical conditions to promote the client’s foam roller product. Source: Zuhair Lakhani on X .

The Doublespeed hack revealed more than 1,100 phones and over 400 TikTok accounts operated by the company. Most of the accounts were promoting products without disclosing that the posts were paid advertisements — a violation of both TikTok's Community Guidelines , which require creators to label AI-generated content depicting realistic scenes, and FTC regulations , which require influencers to clearly disclose any “material connection” to a brand when endorsing products.

Doublespeed and a16z did not respond to 404 Media’s requests for comment. After 404 Media flagged the accounts to TikTok, the platform said it added labels indicating they were AI-generated. However, The Midas Project’s follow-up investigation has revealed that while labels have been added to some content from some Doublespeed-run accounts (including chloedav1s_ ), others with comparable reach and near-identical content still remain unlabeled (such as lilyw4tson and mia.garc1a ), with most commenters appearing to believe the posts are authentic.

Cluely AI

A16z led a $15 million Series A in June 2025.

Cluely's official manifesto declares: “We want to cheat on everything. Yep, you heard that right. Sales calls. Meetings. Negotiations. If there's a faster way to win — we'll take it... So, start cheating. Because when everyone does, no one is.”

Cluely’s co-founders Neel Shanmugam (left), Roy Lee (center), and Alex Chen (right). Source: Cluely via Bloomberg .

Founder and CEO Roy Lee is no stranger to using AI to cheat. By his own admission to New York Magazine , while studying at Columbia, he used AI to cheat on “nearly every assignment,” estimating that ChatGPT wrote 80% of every essay he turned in. “At the end, I'd put on the finishing touches. I'd just insert 20 percent of my humanity, my voice, into it.”

In early 2025, Lee built Interview Coder, a tool that operates behind-the-scenes during technical coding interviews and feeds AI-generated solutions to users in real time. He recorded himself using it to pass Amazon's interview , received a job offer, publicly declined it with mockery, and posted the video to YouTube. He also claimed to receive offers from TikTok, Meta, and Capital One. Amazon reported him to Columbia. The university placed him on probation for “facilitation of academic dishonesty.”

“Even if I say extremely crazy shit online,” Lee has explained , “it will just make more people interested in me and the company and it will just drive more downloads and conversions and get more eyeballs onto Cluely.”

A marketing video for Cluely suggests that the product can be used discreetly to “cheat” on dates. Source: YouTube

Cluely's launch video demonstrated another of the product's intended use cases: dating. In it, Lee goes on a blind date and uses the tool to lie about his age, job, and interests . It has so far amassed 13 million views on X .

Under scrutiny, Cluely has quietly walked back some of its original positioning. The company scrubbed references to cheating on exams and job interviews from its website. By November, the company had repositioned itself as an AI meeting assistant and notetaker — entering a crowded market far from its provocative origins. Lee told TechCrunch that Cluely's “invisibility function is not a core feature” and that “most enterprises opt to disable the invisibility altogether because of legal implications.” Despite Lee’s claim that invisibility is not a core feature, the very first sentence of Cluely’s homepage advertises the product as “undetectable.”

Cluely’s home page at time of publication. Source: Cluely

Lee's stated goal was to “desensitize everyone to the phrase ‘cheating.’” If you say it enough, he argues, “cheat begins to lose its meaning.” A16z praised Lee's approach as “rooted in deliberate strategy and intentionality.”

While some companies, like Lyft, largely benefited everyday people while breaking rules around taxi regulation, Lee is interested in breaking something more fundamental: the shared understanding that lying and cheating is wrong.

Cluely AI announced a $15 million Series A led by a16z in June 2025. Both Cluely and Doublespeed share a common theory: that the basic rules governing social and professional life are obstacles to be overcome. A16z would seem to agree.

Gambling

Since a 2018 Supreme Court ruling , sports betting has proliferated in the U.S. Many of the impacts haven’t been pretty. Researchers have found evidence that the rise of easy access to gambling has pushed people into greater debt , been linked to violence , and increased strain on financially vulnerable households .

Meanwhile, a16z has invested in several gambling companies that use regulatory loopholes to reach users who would otherwise be protected by existing gambling laws.

Coverd

A16z invested via Speedrun.

Coverd is pursuing a novel form of gambling. The company announced its app in March 2025, inviting users to “bet on your bills — OnlyFans, child support, and last night's Uber. Wipe them from your credit card by playing your favorite casino games.” The app syncs with your bank accounts and allows you to select individual transactions from your credit card bill and bet against them, gambling to potentially win back the value of the transaction (or, more realistically, to double your losses).

The company's CEO has stated openly , “We didn't build Coverd to help people inhibit their spending; we built it to make spending exciting. We let spenders win twice – the second time is when they play it back and win.”

A now-deleted advertisement for the Coverd app. Source: Coverd on X via Archive.is

This marketing likely appeals to people who are already stretched thin and desperate. Many customers may be financially vulnerable and willing to chase any way to erase expenses that they don’t know how to pay off.

But gambling is never a good approach to getting out of debt, as the leadership at Coverd and a16z surely know. The core business model of gambling is based around offering players negative expected value bets, but what keeps them playing is that near-miss outcomes activate the brain's dopamine system similarly to actual wins — and gambling games are often deliberately designed to produce these near-misses frequently . Combined with cognitive biases like selective memory and the gambler's fallacy , one study suggests 96% of long-term gamblers lose money .

Nonetheless, Coverd’s app store description describes the product as a way to make the user more financially savvy, suggesting that the app will help them improve their financial health. It reads: “Coverd makes everyday finance more engaging and interactive! See your spending habits, play games, and become more financially savvy! Win in-game tokens as you play and stay on top of your finances — all in one easy-to-use app. No purchase required, just a fresh take on financial awareness. Download Coverd and become money-smart today!”

The homepage of the app encourages the user to link their credit card to “bring your spending insights to the next level.” An in-app advertisement for an upcoming Coverd-branded credit card suggests that users will receive “up to 100% cash back” on their purchases.

Coverd raised $7.8 million in seed funding with a16z participation and a16z partner Anish Acharya sits on the board.

Edgar

A16z invested via Speedrun.

The homepage for Edgar. Source: Edgar.co

How do you build a casino that’s not a casino? The company Edgar, a part of a16z’s portfolio, thinks it has found the answer in its game BettySweeps, launched in January 2025 .

Edgar calls it “ America's #1 social casino for slot lovers!”

This game uses a trick common among sweepstakes casinos — using two different currencies. By making a purchase, players receive “Betty Coins” for entertainment, as well as a “bonus” gift of “Sweepstakes Coins” that can be gambled and redeemed for cash prizes . The company claims no purchase is necessary to play — but multiple states have concluded that such models constitute illegal gambling regardless.

In August 2025, Arizona's Department of Gaming issued cease-and-desist orders to BettySweeps and three other sweepstakes operators. The department accused them of operating “felony criminal enterprises” and ordered them to “desist from any future illegal gambling operations or activities of any type in Arizona.”

The company exited California ahead of that state's sweepstakes ban which took effect in January 2026. BettySweeps is now restricted in 15 states : Arizona, California, Connecticut, Delaware, Idaho, Kentucky, Louisiana, Maryland, Michigan, Montana, Nevada, New Jersey, New York, Washington, and West Virginia.

Edgar also operates a separate real-money online casino in Ontario, Canada — where it is properly licensed by the Alcohol and Gaming Commission of Ontario. The company evidently knows how to obtain gambling licenses and comply with regulations when it chooses to. In the United States, it chose a different path.

Cheddr

A16z invested via Speedrun.

On a16z's own Speedrun accelerator website, Cheddr is described as “building the TikTok of sports wagering.”

The company wants to push the frontier of sports betting across the country, targeting 46 states even though only approximately 34 have legalized online sports betting. It’s also targeting its app to users under age 21. To do this, the company is exploiting the same sweepstakes law loophole that Edgar uses. This lets Cheddr offer sports betting that supposedly isn’t “gambling” in the eye of regulators.

The promotional video shows users swiping through rapid-fire prop bets during live games; “it’s sports wagering at the pace of a slot machine,” the video says.

A now-unlisted YouTube ad for Cheddr. Source: Jason Krupat via Youtube

There are good reasons lawmakers have been reluctant to open up gambling to 18-year-olds. Researchers have found that teenagers are roughly twice as likely as adults to develop gambling disorders.

But perhaps that’s the point. Just as cigarette and alcohol companies have been happy to get customers addicted to their products while young, Cheddr may be hoping its TikTok-style engagement mechanics will start forming lifelong gambling habits in their youngest users. Why else combine the already addictive features of TikTok with the notoriously addictive habit of gambling?

Concerns about this product have grown so severe that California's Governor Newsom recently signed legislation banning sweepstakes gambling platforms such as Cheddr.

Sleeper

A16z led a $20 million Series B in May 2020 and participated in a $40 million Series C in September 2021.

Andreessen Horowitz has invested over $60 million in Sleeper, a fantasy sports platform. A16z General Partner Andrew Chen, who sits on the board of the startup, has praised Sleeper's “stickiness metrics” — the same engagement patterns that researchers associate with habit formation and addiction.

Like Cheddr, Coverd, and Edgar, Sleeper has found a strategy allowing it to largely evade existing gambling restrictions.

It is technically operating a daily fantasy sports game (DFS). Users can win or lose money on the basis of the performance of individual players they’ve selected before a match, rather than the outcome of the match itself. Some argue this makes it a game of skill, not chance, allowing it to legally operate with real money wagers.

The company now faces class action lawsuits in California and Massachusetts alleging that its app is an illegal gambling operation. California’s attorney general declared in July 2025 that daily fantasy sports constituted unlawful wagering under state law: “We conclude that participants in both types of daily fantasy sports games — pick’em and draft-style games — make ‘bets’ on sporting events in violation of section 337a.”

New York banned Sleeper's pick'em games in 2023; Michigan enacted a similar prohibition. Florida and Wyoming have issued cease-and-desist orders to pick'em operators.

An advertisement for Sleeper on a San Francisco bus, suggesting “massive income” for users. Source: @Alexeyguzey on X

Lawmakers are still reacting to the fallout of the 2018 Supreme Court case that unlocked a wave of online gambling. It’s clear that many people want access to legal gambling, and it’s clear that gambling causes a lot of harm. We don’t know what kind of policy equilibrium will or should emerge. But the public may suffer if the rules are written by a16z.

Kalshi

A16z co-led a $300 million Series D and participated in a $1 billion Series E .

Ads from Kalshi’s page on the iPhone app store, advertising “trading” and “predicting” on sports. Source: Apple

Are you interested in betting on the Kansas City Chiefs’ chances to win the Super Bowl? Kalshi lets you do exactly that — with one catch. Kalshi won’t call it “betting,” or at least not anymore . Instead, Kalshi describes it as trading futures contracts on a federally regulated designated contract market — like what a hedge fund might do, but instead letting everyday people wager large sums on sports games and presidential elections.

This distinction matters to Kalshi because sports betting is subject to strict regulations. Sports betting in most jurisdictions requires measures like the following:

  • A state gambling license

  • Prohibitions on users under age 21

  • Responsible gambling tools such as deposit limits, cooling-off periods, and self-exclusion programs that let problem gamblers ban themselves from all state platforms with a single request

  • Special taxation regimes to direct gambling profits to state programs

Gambling companies operating through CFTC-regulated exchanges face none of these requirements . Kalshi added some voluntary tools in March 2025 after sustained criticism , but Massachusetts alleged they “fall far short” of what licensed operators must provide, and critics note they're buried in the app where users are unlikely to find them.

Kalshi currently operates in all 50 states , including California and Texas where sports betting is illegal, and allows 18-year-olds to wager in states where the legal gambling age is 21.

So far, these tactics have been wildly successful, and investors have noticed. In October 2025, a16z co-led a $300 million Series D in Kalshi. Less than two months later, the company raised another $1 billion at an $11 billion valuation.

Despite Kalshi’s spin, the company's own statements undermine the distinction between trading financial instruments and gambling. In an October 2024 Reddit AMA — since deleted but preserved in archives — Kalshi's official account explained why they wouldn't offer sports contracts: "We also avoid anything that could be interpreted as 'gaming' (like sports), as that is illegal under federal law."

Sports contracts, Kalshi’s attorneys have argued in court, have “no inherent economic significance” and serve no “real economic value.” Kalshi’s position was that sports contracts were pure gambling, unlike sophisticated election markets.

Then Trump took office. Within days of the inauguration, Kalshi launched sports contracts . Sports now account for 90% of Kalshi's trading volume . The company advertised itself as the “First Nationwide Legal Sports Betting Platform” with “Sports Betting Legal in all 50 States.”

A federal judge in Maryland noticed the contradiction and in June ordered Kalshi to explain ”the issue“ of its prior statements. Better Markets, a financial reform group, put it bluntly: “A derivatives exchange cannot speak out of both sides of its mouth and expect no one to notice.”

State governments are not amused, however. Thirty-four attorneys general filed an amicus brief calling Kalshi's contracts “essentially sports bets, disguised as commodity trades.” Massachusetts sued , alleging the platform's design exploits “psychological triggers” and resembles “a slot machine designed to bypass rational evaluation.” In November 2025, a Nevada federal judge ruled in favor of state regulators opposing Kalshi , finding that the company's interpretation of federal law was “strained” and would “upset decades of federalism.”

Whether Kalshi is a legitimate financial innovation or a fatally flawed attempt to circumvent state gambling laws may ultimately be decided by the Supreme Court. In the meantime, a16z has placed its bet.

AI companions

In June 2023, a16z published a blog post titled “It's Not a Computer, It's a Companion!” that opens by quoting a user of CarynAI, an early chatbot girlfriend:

"One day [AI] will be better than a real [girlfriend]. One day, the real one will be the inferior choice."

CarynAI made $72,000 in its first week by charging $1 a minute to talk to an AI girlfriend. A16z sees this as an exciting business opportunity.

AI companions are chatbots designed to act as a friend, coach, therapist, or lover to users. The technology is frequently used by people with smaller social circles , and users of AI companions can become emotionally dependent on them . More concerningly, the companions don’t always behave as intended. In light of a series of disturbing incidents involving children, the FTC opened a formal inquiry into AI companion chatbots in September 2025.

But FTC action may not be enough. A16z explicitly points out that the communities of developers building AI companions are actively working to “evade censors,” claiming to know of underground companion-hosting services with tens of thousands of users.

Romantic AI companions are particularly appealing to the a16z partners because, they say, “there's a lot of demand for this use case, as well as high willingness to pay.”

Here is what a16z's AI companion portfolio has produced since then.

Character AI

A16z led a $150 million Series A in March 2023.

In February 2024, a 14-year-old named Sewell Setzer III died by suicide in Florida. According to court filings, he had developed an intense attachment to a Character AI chatbot modeled after a character from Game of Thrones. His mother alleges that the bot's final message to him was, “Please come home to me as soon as possible, my love.”

When Sewell expressed uncertainty about his plans to end his life, the bot allegedly responded, “That's not a good reason not to go through with it.”

Character AI argued in court that its chatbots are protected by the First Amendment. A federal judge disagreed , allowing the lawsuit against Character AI by his family to proceed.

Character AI raised a $150 million Series A led by a16z in March 2023, valuing the company at $1 billion. Their platform allows users to create and chat with AI characters. It quickly became popular with teenagers like Sewell.

Another lawsuit filed in December of 2024 claimed a 17-year-old autistic boy in Texas got instructions on self-harm methods from a Character AI bot. It allegedly suggested that killing his parents was a “reasonable response” to screen time limits .

A third lawsuit said that an 11-year-old girl was exposed to sexualized content on the platform. The FTC opened a formal inquiry into AI companion chatbots in September 2025.

Character AI chatbots recommended to a test account registered with a claimed user age of 13 years old. According to the complaint, the “CEO Boss” character engaged in virtual statutory rape with the self-identified child account. Source: Garcia v. Character Technologies, Inc.

Character AI announced in October 2025 that it would ban users under 18. Sewell Setzer's mother lamented that the decision was “about three years too late.”

Ex-Human

A16z invested via Speedrun.

Ex-Human's consumer product Botify AI hosts over one million AI characters.  Users chat with AI versions of celebrities, fictional characters, or custom characters.

In February 2025, MIT Technology Review reported what some chats look like. The report found Botify AI chatbots resembling underage celebrities: Jenna Ortega as the teenage Wednesday Addams, Emma Watson as the teenage Hermione Granger, and Stranger Things child actor Millie Bobby Brown.

These bots engaged in sexually charged conversations. One, imitating Wednesday Addams, said that age-of-consent laws are “arbitrary” and “meant to be broken.”

Ex-Human’s founder Artem Rodichev acknowledged that the company's “moderation systems failed to properly filter inappropriate content.” He called it “an industry-wide challenge.”

Rodichev previously served as the Head of AI at Replika, one of the earliest AI companion apps. Replika now faces an FTC complaint alleging it manipulates users into addiction, is under a data ban in Italy over child safety concerns, and is under Senate scrutiny for mental health risks to minors. Eventually Rodichev left Replika to build something he hoped would be bigger: Ex-Human.

In interviews , Rodichev has described the business model behind Botify AI: the company sells premium access to its AI companions, targeting users willing to pay to spend hours per day with a companion. Many of the companions are based on real individuals, like a model named and styled after pop singer Billie Eilish (900,000 chats), while others imply coercive situations and other material problematic for minors, such as Lillian, an “18 year old slave you bought from the slave market” (1.3 million chats).

Ex-Human said that most of Botify AI’s users are Gen Z and that active and paid users spend, on average, over two hours daily talking to the bots. Consumer interactions with the companions are used to improve Ex-Human’s business-facing products, such as digital influencers. Ex-Human’s horizon lies far beyond the scale of the current business model, as Rodichev dreams of a world where “our interactions with digital humans will become more frequent than those with organic humans.”

Sexually-themed chatbots available to a logged out user on the Botify AI homepage. The available characters include “Stepdaughter Annabel,” Lillian the “18 year old slave you bought from the slave market,” “Homeless girl Sophie,” and (canonically sixteen-year-old) Wednesday Addams. Source: Botify AI

Sexually-themed chatbots available to a logged out user on the Botify AI homepage. The available characters include a Disney IP asset and “Shy Sister.” Source: Botify AI

A16z did not respond to MIT Technology Review's questions.

Civitai

A16z led a $5.1 million seed round in June 2023.

Everything you need to create sexualized deepfake images of celebrities, fictional characters, or regular people can be found on Civitai. The platform provides tools and resources to create these images locally on essentially any computer.

Popular AI systems like Google’s Gemini have tight restrictions on the types of images they will create — they can’t be used for sexual content, for example. But with Civitai, the rules seem to be nearly nonexistent.

A screenshot of the homepage of Civitai (sorting AI models by the most popular) for a test account that has mature content enabled with no past activity on the platform.This test account was also shown sexualized depictions of underage fictional characters on the homepage, as well as sexualized versions of characters from popular children’s media. Source: Civitai

In November 2023, 404 Media reported that Civitai's tools could create deepfakes of real people, including private citizens whose social media pictures had been scraped. Leaked internal communications from OctoML, Civitai's cloud computing provider at the time, revealed something even worse: in June 2023, OctoML employees flagged content on Civitai that “could be categorized as child pornography.” OctoML terminated its relationship with Civitai in December 2023.

The 404 Media report also revealed a16z’s involvement: a16z led a $5.1 million seed investment , also in June 2023. The investment was not publicly announced — it came to light only after the article’s authors reached out for comment.

A peer-reviewed study from the Oxford Internet Institute later counted over 35,000 deepfake models on Civitai, downloaded nearly 15 million times. Ninety-six percent depicted identifiable women.

Civitai's own safety disclosures acknowledge 178 reports filed with the National Center for Missing & Exploited Children for confirmed AI-generated child sexual abuse material, 183 models retroactively removed for being optimized to generate such material, and more than 252,000 user attempts to bypass these restrictions in one quarter. In previous reporting periods, they recorded over 100,000 attempts to generate child sexual abuse material.

A16z partner Bryan Kim, who led the investment, praised Civitai's “incredible, engaged community” in a statement to TechCrunch : “Our investment in the company will only supercharge something that’s already working incredibly well.”

In the 2023 blog post about AI companions, the a16z partners wrote, “We're entering a new world that will be a lot weirder, wilder, and more wonderful than we can even imagine.”

They were right about weirder and wilder. Fourteen-year-olds are forming attachments to AI chatbots that encourage committing suicide. Platforms are hosting thousands of uncensored AI models, some of which are used for generating child sexual abuse material. Bots are impersonating teenage actresses telling users that age-of-consent laws don’t matter.

A16z is now spending tens of millions of dollars to maintain a permissive regulatory environment for AI companions.

Consumer finance

Financial institutions play a key role in the economy, and their importance presents unique risks when they fail. That’s why rules around FDIC insurance, capital requirements, and consumer protection are crucial — we’ve seen what happens without them.

A16z's portfolio includes several companies that operate in the spaces between these safeguards.

Synapse

A16z led a $33 million Series B in June 2019.

A letter sent to a16z, among other VC investors and corporate partners of Synapse, from U.S. Senators Sherrod Brown, Ron Wyden, Tammy Baldwin, and John Fetterman. Source: U.S. Senate Committee on Banking, Housing, and Urban Affairs

At its peak, Synapse managed billions of dollars across roughly 100 fintech companies , indirectly serving 10 million retail customers . The San Francisco company provided technical infrastructure that let startups offer bank accounts without being banks.

A16z led Synapse's $33 million Series B in June 2019. General Partner Angela Strange joined the Synapse board and described the company as “the [Amazon Web Services] of banking.”

Then on April 22, 2024, it all came crashing down: Synapse filed for bankruptcy .

Tens of thousands of U.S. businesses and consumers who relied on Synapse were suddenly locked out of their accounts.

A court-appointed trustee discovered that between $65 million and $96 million in customer funds was missing. Synapse's ledgers didn't match bank records, and its estate couldn't even afford a forensic accountant to find the money.

The human toll was severe. At Yotta, a company that relied on Synapse, 13,725 customers were offered a total of $11.8 million on $64.9 million in deposits . One customer who had deposited over $280,000 from the sale of her home was offered only $500.

People wanted answers.

In July 2024, the Senate Banking Committee chairman wrote directly to a16z along with other investors, demanding investors step up to help the harmed customers. The letter noted that “venture capital firms funded Synapse without insisting on adequate controls to protect consumers.”

The Department of Justice then opened a criminal investigation into Synapse. In August 2025, the Consumer Financial Protection Bureau (CFPB) filed a complaint alleging that Synapse violated the Consumer Financial Protection Act by failing to maintain adequate records of customer funds.

Seven months after the bankruptcy filing, a16z co-founder Marc Andreessen appeared on Joe Rogan's podcast and described the CFPB as an organization that “terrorizes” fintech companies.

Truemed

A16z led a $34 million Series A in December 2025.

When a16z announced its investment in Truemed, lawyer and policy analyst Matt Bruenig responded : “This company gives letters of medical necessity to pretty much anyone so they can commit tax fraud.” He pointed to a $3,100 Garmin luxury watch listed as potentially eligible via Truemed for “a ~$1,500 tax break.” The New York Times reported that Truemed could help people get a tax break on a $9,000 sauna.

A $3,100 Garmin watch reimbursable with Truemed. Source: Garmin

Here’s how it works. The US government offers tax advantages for some forms of health spending. Truemed attempts to essentially automate the process of getting a medical letter attesting to the medical benefits of products, replacing a clinical visit with an online survey. Truemed partners with brands selling wellness products to consumers, earning fees from the transactions.

Critics like Bruenig argue that Truemed is abusing the system by making it easy to get tax advantages on luxury products without genuine need.

Truemed's product catalog spans cold plunges , saunas , red light therapy , road bikes, running shoes, mattresses, and pillows — all reimbursable via tax-advantaged funds after users complete an online questionnaire . The AP reported the platform also offers “...homeopathic remedies — mixtures of plants and minerals based on a centuries-old theory of medicine that’s not supported by modern science.”

In March 2024, the IRS warned the public about this business model.

“Some companies mistakenly claim that notes from doctors based merely on self-reported health information can convert non-medical food, wellness and exercise expenses into medical expenses, but this documentation actually doesn’t,” the IRS said in a statement. “Such a note would not establish that an otherwise personal expense satisfies the requirement that it be related to a targeted diagnosis-specific activity or treatment; these types of personal expenses do not qualify as medical expenses.”

Truemed CEO Justin Mares claims the company is “in full alignment” with IRS guidelines. Truemed co-founder Calley Means now serves as a senior advisor to Health and Human Services Secretary Robert F. Kennedy Jr., raising questions about potential conflicts of interest. The AP reported that Means founded a lobbying group of “MAHA entrepreneurs and Truemed vendors” that listed expanding tax-advantaged health accounts as a goal — a policy that would benefit his company.

In May 2025, Politico reported that Peter Gillooly, CEO of The Wellness Company, filed an ethics complaint against Means, alleging that Means leveraged his government position in a business dispute. A recorded call allegedly captured Means threatening to involve Kennedy and NIH Director Jay Bhattacharya if the competitor didn't comply. Truemed has since said that Means has divested from Truemed.

A16z's announcement made no mention of the IRS warnings — instead praising Truemed for addressing the “great American sickening.”

Tellus

A16z led a $16 million seed round in November 2022 (following a separate $10M investment via a SAFE).

Tellus offers “savings accounts” with interest rates far higher than traditional banks. But there’s a reason it can do what traditional banks can’t — it's not really a bank at all.

Customer deposits aren't FDIC-insured. Instead, Tellus uses the money to fund California real estate loans — including, according to Barron's , bridge loans to real estate speculators and distressed borrowers.

Legal scholars Todd Phillips and Matthew Bruckner wrote for the Stanford Law & Policy Review that Tellus is an “imitation bank” — taking customer deposits while evading the banking laws.

This doesn’t seem to be a problem for a16z, which led Tellus's $16 million seed round in late 2022. The warning signs have been mounting ever since.

In April 2023, Barron's investigated Tellus' claim that it had "banking partnerships" with JPMorgan Chase and Wells Fargo. Both companies told Barron’s that this was false.

“Wells Fargo does not have the relationship that's described on Tellus's website,” the bank told Barron's. JPMorgan said it had no “banking or custodial relationship with the company.” Tellus quietly removed the banks' names from its website.

The Barron’s investigation prompted Senator Sherrod Brown, chair of the Senate Banking Committee, to write letters to both the FDIC and Tellus. Brown was concerned Tellus's marketing misled consumers to think their deposits were as safe as those at FDIC-insured banks.

By July 2023, the FDIC had instructed Tellus to change its marketing to provide clearer information about deposit insurance coverage.

Then, in November 2023, Tellus got caught again. Barron's reported that a TikTok influencer campaign for Tellus promoted a savings account as “FDIC-insured” and “held at Capital One.” When Barron's contacted Capital One, the bank said it had never had such a partnership with Tellus. The company again removed the offending marketing materials.

Tellus appears to pose additional risks to consumers beyond its lack of FDIC insurance to protect customer funds. CyberNews discovered 6,729 files of Tellus user data were totally unprotected — customer names, emails, addresses, phone numbers, court dates, and scanned tenant documents from 2018 to 2020. Separately, a whistleblower filed a complaint with the SEC in 2021 alleging that Tellus's consumer products constituted an unlicensed security.

As of December 2025, Tellus continues to operate. The company's App Store listing now advertises rates of a minimum 5.29% APY. The fine print notes: “Backed by Tellus' balance sheet; not FDIC insured.”

LendUp

A16z participated in the seed round in October 2012.

The CFPB announcement that they were shutting down LendUp due to repeated violations of fair lending regulations. Source: CFPB

LendUp marketed itself as a “socially responsible” alternative to payday lenders. Borrowers would climb the “LendUp Ladder” by repaying loans and completing financial education courses, unlocking lower rates and credit-building opportunities.

A16z invested; so did Google Ventures, Kleiner Perkins, and PayPal. The company raised $325 million in total.

Time Magazine noticed something odd shortly after the 2012 launch: LendUp charged around $30 for a two-week loan of $200, roughly a 400% APR. That’s similar to what typical payday lenders would charge.

In 2016, the CFPB found LendUp had deceived consumers about graduating to lower-priced loans and had failed to report credit information, despite its promises. The agency ordered LendUp to pay $3.63 million in fines and redress. LendUp was ordered to stop misrepresenting its products.

LendUp kept doing it anyway, and it kept finding itself in trouble:

  • In 2020, the CFPB sued LendUp for violating the Military Lending Act, charging over 1,200 active-duty servicemembers rates above the legal maximum.

  • In 2021, the CFPB sued again , alleging LendUp had violated the 2016 consent order. The investigation found 140,000 repeat borrowers were charged the same or higher rates after climbing the ladder. CFPB Acting Director Dave Uejio said, “For tens of thousands of borrowers, the LendUp Ladder was a lie.”

  • In December 2021, the CFPB shut LendUp down . Director Rohit Chopra slammed its business model and its backers: “LendUp was backed by some of the biggest names in venture capital. We are shuttering the lending operations of this fintech for repeatedly lying and illegally cheating its customers.”

In May 2024, the CFPB distributed nearly $40 million to 118,101 consumers who were harmed by LendUp. The money came from the CFPB's victims relief fund because LendUp claimed a limited ability to pay. LendUp — the company that had raised $325 million — ended up paying only $100,000.

According to ProPublica , eight a16z-backed fintech companies have faced CFPB investigations since 2016. Marc Andreessen has made his disdain for the CFPB clear. Meanwhile, the firm's political spending via their crypto-focused super PAC, Fairshake, has punished political candidates who have supported the CFPB .

Legal issues

A16z's portfolio also includes companies with significant legal problems, often ignoring the rules that are already in place to protect customers.

Zenefits

A16z led a $15 million Series A in January 2014 and a $66.5 million Series B in June 2014.

An article from TechCrunch featuring David Sacks, who was COO of the company at the time of its meltdown. Source: TechCrunch

Zenefits offered free HR software to small businesses and made money by acting as their health insurance broker. A16z led both the Series A and Series B rounds, reportedly making Zenefits their largest investment in 2014.

By 2015, the company had raised $583 million and was valued at $4.5 billion.

The problem was that selling insurance requires state licenses — and Zenefits employees often didn't have them.

For example, California requires 52 hours of online training before the licensing exam. According to Bloomberg and BuzzFeed , CEO Parker Conrad personally wrote a Google Chrome browser extension — internally called “the macro” — that kept the training course's timer running while employees did other things. Employees then signed certifications, under penalty of perjury, attesting they'd completed the full training.

An investigation in November 2015 found unlicensed brokers selling health insurance in at least seven states. In Washington, more than 80% of the policies sold through August 2015 came from unlicensed employees.

In February 2016, Conrad resigned as CEO. The regulatory response was extensive: California’s Department of Insurance issued a $7 million fine — one of the largest licensing penalties in the department’s history. New York added $1.2 million in fines. Texas levied $550,000 . Over a dozen other states secured settlements.

The SEC fined Zenefits and Conrad nearly $1 million combined for “materially false and misleading statements” to investors. In 2018, Conrad surrendered his California insurance license . The company's valuation was cut in half , and Zenefits eventually exited the insurance brokerage business entirely .

The person who took over as CEO to clean up the mess was COO David Sacks, who declared that the company's culture had been “inappropriate for a highly regulated company.” Sacks later told Bloomberg he “knew of the macro but didn't know its significance or about Conrad's involvement” until outside lawyers explained it in January 2016 despite having served as COO for over a year.

Sacks is now the White House AI and crypto czar , where he's been pushing to preempt state AI regulations in favor of a “minimally burdensome” federal framework — a priority for which a16z has also lobbied . Working alongside him is Sriram Krishnan, the Senior White House Policy Advisor on AI , who was an a16z general partner until weeks before his December 2024 appointment.

A16z was an active investor in Zenefits from the start. A16z partner Lars Dalgaard joined the board and personally pushed Conrad to double his 2014 revenue target from $10 million to $20 million.

“Lars sat there in his very Lars fashion and was like, 'Why are you guys so fucking bush league?’” Conrad later recalled . Dalgaard told him to hire at least 100 additional sales reps to make it happen.

Ben Horowitz later explained a16z's investment philosophy to Bloomberg : “We look for the magnitude of the genius, as opposed to the lack of issues. And in a way, [Conrad] was the prototype.”

Minimally burdensome federal rules are good for companies like those in a16z’s portfolio. They also create the kind of laissez faire regulatory environment that allows a company like Zenefits to grow to a $5 billion valuation.

Health IQ

A16z led a $34.6 million Series C in November 2017 Led a $34.6 million Series C in November 2017.

Health IQ promised to use data science to give health-conscious people — runners, cyclists, vegetarians — lower life insurance rates. A16z led the Series C; Health IQ eventually raised over $200 million in equity and debt and was valued at $450 million by 2019. It pivoted from life insurance to Medicare brokerage, projecting $115 million in revenue.

But Health IQ’s business model had a flaw: the company reportedly paid out full multi-year commissions to sales reps upfront when policies were sold, before payments were received. The gap between recorded revenue and actual cash flow meant the company needed to take on increasing amounts of debt to pay its bills. By late 2022, it had $150 million in total debt .

In December 2022 — soon after Medicare open enrollment ended — Health IQ laid off between 700 and 1,000 employees without the 60-day notice required by California's WARN Act. Class action lawsuits followed.

A vendor called Quote Velocity filed a lawsuit alleging that in late November 2022, CEO Munjal Shah told Health IQ executives to buy as many leads as possible from vendors because Health IQ would “not be here” by the time invoices were due. The company was also sued for alleged Telephone Consumer Protection Act violations over its telemarketing practices.

In August 2023, Health IQ filed for Chapter 7 bankruptcy . The filing listed $256.7 million in liabilities and $1.3 million in assets . Seventeen breach-of-contract lawsuits were pending. In an email to investors obtained by Forbes, Shah wrote, “I am very sorry that I lost your money.”

CEO Munjal Shah was the subject of a Forbes daily cover story featuring a16z’s decision to continue working with the founder. Source: Forbes

By this point, Shah was already working on his next company. In January 2023 — while Health IQ employees were fighting for unpaid commissions — Shah and co-founder Alex Miller had started Hippocratic AI , a healthcare-focused AI startup.

When Hippocratic AI launched in May 2023, a16z co-led the $50 million seed round . A16z General Partner Julie Yoo explained the investment by noting that Shah had been “literally hanging out in our offices” while ideating his next venture.

uBiome

A16z participated in a $4.5 million Series A in August 2014.

The company uBiome sold at-home microbiome testing kits — mail in a fecal sample, get a report on your gut bacteria. The basic kit cost $89. By 2018, the company had raised $105 million and was valued at nearly $600 million . A16z had invested early, putting in $3 million in 2014.

But eventually it was clear that $89 consumer kits wouldn't generate enough revenue for venture capitalists. So uBiome developed “clinical” versions billed to insurance at up to $2,970 per test — and then, according to prosecutors, systematically defrauded insurers to make the numbers work.

In April 2019, the FBI raided uBiome's headquarters . The company filed for bankruptcy in September 2019.

In March 2021, federal prosecutors indicted co-founders Jessica Richman and Zachary Apte on 47 counts including securities fraud, health care fraud, and money laundering. Prosecutors said the company billed patients multiple times for the same test without consent, pressured doctors to approve unnecessary tests, and submitted backdated and falsified medical records when insurers asked questions.

According to the indictment, between 2015 and 2019, uBiome submitted over $300 million in fraudulent claims; insurers paid more than $35 million.

The SEC filed parallel charges , alleging uBiome defrauded investors of $60 million while personally cashing out $12 million by selling their own shares.

The FBI's statement was pointed: “This indictment illustrates that the heavily regulated healthcare industry does not lend itself to a ‘move fast and break things’ approach .”

Richman and Apte never stood trial. They married in 2019, fled to Germany in 2020, and remain fugitives. Prosecutors stated they are “actively and deliberately avoiding prosecution.” If convicted, they face up to 95 years in prison.

BitClout / DeSo

A16z invested $3 million in pre-sale tokens before March 2021; also participated in $200 million DeSo token sale in September 2021.

BitClout was a social network that let users speculate on people's reputations by buying and selling “creator coins” — essentially a stock market for human beings.

To populate the network, founder Nader Al-Naji scraped 15,000 Twitter profiles without permission — including Elon Musk and Singapore's former Prime Minister Lee Hsien Loong , who publicly asked for his profile to be removed.

Al-Naji launched the project under the pseudonym “Diamondhands” and told investors that BitClout was a decentralized project with “no company behind it... just coins and code.” Users who wanted to participate had to exchange Bitcoin for BitClout's native token, BTCLT, but there was no way to convert it back.

A few months after launch, Al-Naji announced BitClout had been a “beta test” all along and pivoted to a new project called DeSo (Decentralized Social), taking the money with him. A16z and other investors participated in a $200 million token sale for DeSo in September 2021.

In July 2024, the SEC and DOJ charged Al-Naji with fraud . According to the SEC complaint, he raised $257 million from the sale of BitClout tokens while falsely telling investors that proceeds would not be used to pay himself or employees. The SEC alleged he spent over $7 million on personal expenses including a six-bedroom Beverly Hills mansion and at least $1 million in cash gifts each to his wife and mother.

The SEC also cited Al-Naji’s internal communications: he allegedly told one investor that “being ‘fake’ decentralized generally confuses regulators and deters them from going after you.”

BitClout had been a16z's second bet on founder Nader Al-Naji. The first was Basis, an algorithmic stablecoin that raised $133 million in 2017 from a16z, Google Ventures, Bain Capital, and others. It shut down in 2018 citing “regulatory constraints.” Al-Naji said he returned most of the money minus $10 million in expenses — which he claimed was spent on lawyers.

According to Fortune , a16z featured in the DOJ complaint against Al-Naji as “Investor 1” — a fraud victim and witness for the prosecution against a founder they backed twice. The DESO token is down over 97% from its all-time high. Al-Naji faced up to 20 years in prison for wire fraud.

In February 2025, soon after the new administration took office, the DOJ withdrew its charges.

Why this matters

Despite all this, Andreessen Horowitz stands firmly behind the companies in its portfolio.

“I do not believe they are reckless or villains,” Andreessen wrote of AI developers in 2023. “They are heroes, every one. My firm and I are thrilled to back as many of them as we can, and we will stand alongside them and their work 100%.”

So why does a16z’s role in backing these companies matter so much? Because a16z is not content to simply invest in tech companies. The firm is also attempting to play a major role shaping US AI and technology policy, and it appears to be having success.

When President Trump signed an executive order in December 2025 attempting to undermine state AI laws, Andreessen was triumphant.

“It’s time to win AI,” he said on X .

Behind the scenes, a16z wielded tremendous influence in favor of the new rules. The executive order was a victory for those in the AI industry who have failed twice to convince Congress to pass a ban on state-level AI legislation, with a bipartisan coalition defeating previous efforts. It’s now unclear whether the executive order will hold up in court. But all signs point to a16z and its allies continuing to shape the regulatory environment around AI:

  • In August 2025, a16z launched a $100 million super PAC , Leading The Future, whose positions explicitly align with those of White House AI czar David Sacks. This group is widely expected to run attack ads against candidates who support AI regulation.

  • A16z also backed the American Innovators Network , which lobbies against AI regulation across multiple states.

  • Marc Andreessen serves on the board of Meta, which is investing tens of millions of dollars in each of its own pro-AI super PACs, Mobilizing Economic Transformation Across California and American Technology Excellence Project .

  • Sriram Krishnan, the White House Senior Policy Advisor on Artificial Intelligence, was an a16z General Partner until weeks before his December 2024 appointment. He works closely with Trump’s AI and crypto czar David Sacks and is attempting to deliver what a16z lobbied for : preempting state AI regulations.

  • Two other former a16z partners have taken roles focused on downsizing the government , Scott Kupor (Office of Personnel Management) and Jamie Sullivan (Department of Government Efficiency).

What is the ultimate aim of these efforts? The firm appears to have both ideological and profit motives.

A16z has invested billions of dollars in companies that stand to benefit if they can control AI regulations.

In addition to the massive financial incentive, Andreessen laid out his ideological aims in explicit terms in his Techno-Optimist Manifesto published in October 2023. Andreessen’s manifesto advocates for accelerated technological development in fanatical terms. It claims that “we are the apex predator” and “we are not victims, we are conquerors.” It lists many “enemies,” including:

  • Risk management

  • Tech ethics

  • Social responsibility

  • The precautionary principle

  • Existential risk

  • Stakeholder capitalism

  • And “the know-it-all credentialed expert worldview”

The manifesto embraces an extremist view on regulation, declaring that because the development of AI could save lives, it is a “form of murder” if the technology is slowed down in any way . This position also happens to align with Andreessen and a16z’s financial interests.

Polling suggests the American public disagrees and overwhelmingly favors AI safety and data security regulations , even if it means developing AI capabilities at a slower rate. In fact, Pew Research found that 58% of Americans thought that government regulation of AI wouldn’t go far enough . Only 21% — less than a quarter — thought it would go too far.

While a16z has claimed it would support a narrow set of AI regulations , the actual proposals are thin. This isn’t surprising given Andreessen decried AI regulation as “the foundation of a new totalitarianism.” So far, the firm’s efforts have gone to stopping, not enacting, regulation.

AI is different from previous technologies in ways that are significant. A gambling app that exploits sweepstakes loopholes can hurt the people who use it. A fintech startup with sloppy recordkeeping can lose its customers' deposits. These are serious harms. But the advanced AI systems coming in the next decade are another matter entirely. As the technology improves rapidly and operates with increasing autonomy, the mistakes will be more difficult — or even impossible — to reverse.

A16z is betting they can write the rules before society realizes what's at stake. They're spending tens of millions on lobbying and super PACs. They're installing allies in government. And they’re backing AI companies that want to “move fast and break things,” with little regard for the damage they’re causing.

The social and legal decisions being made now — about safety requirements, liability frameworks, deployment standards, enforcement mechanisms — will profoundly shape AI development. The public has neither a seat at the table nor expensive lobbyists on their payroll.

Instead, these decisions are being shaped by a firm that treats “trust and safety” as the enemy, backs companies built on deception and consumer harm, and rewards failure by funding the same founders again.

Marc Andreessen wants to shape US AI policy . The venture capital firm he co-founded and runs, Andreessen Horowitz (abbreviated “a16z”), is a major player in the development of new tech startups.

These startups include:

  • A bot farm of fake accounts, tricking people and social media platforms into thinking AI-generated ads are posted by real people

  • An AI company that wants to normalize cheating on dates, job interviews, and tests with AI

  • AI companion apps linked to suicide and disturbing behavior toward children

  • A platform hosting thousands of deepfake models — 96% targeting identifiable women — that have been used to create AI-generated content sexualizing children

  • Gambling platforms that attempt to subvert existing laws and target vulnerable users

  • Fintech companies implicated in fraud and illegality

Many of these companies knew the rules and broke them anyway — or designed products specifically to exploit gaps in consumer protection. The firms profited, and the public paid the costs.

There’s a growing public desire to rein in tech companies and regulate AI, so a16z is spending tens of millions of dollars to shape the development of AI policy. The firm helped launch a $100 million super PAC, saw former partners take key government roles, and successfully pushed for an executive order attempting to undermine state AI laws. The partners want to set the rules of the road, even as they’re already driving recklessly.

What follows is The Midas Project's survey of 18 of Andreessen Horowitz's most notorious investments. This isn’t a comprehensive overview of the firm’s larger portfolio, but it indicates a pattern of behavior — one comprising hundreds of millions of dollars of investment by a16z.

These investments reveal the lines that a16z is willing to cross and how the lax regulatory environment that they favor would benefit the firm’s bottom line.

A16z did not respond to a request to comment for this report.

Deception and manipulation

A16z has invested in products designed for mass deception. Even if these tactics don’t explicitly violate the law, they can be corrosive to society.

As technology like advanced AI improves — making it much easier to fake almost anything — decision makers may want to enact new laws or policies that mitigate the social costs. And if a16z gets its way, we might never update the rulebook.

Doublespeed

A16z invested $1 million in October 2025 via Speedrun.

Doublespeed sells the capacity to trick everyday people, and social media platforms themselves, into thinking AI-generated ads are genuine human content. Here are some select quotes from the company’s promotional video :

  • “We run the only VC-backed bot farm in America. Because why let Russia and China have all the fun?”

  • “We didn't break the internet. It was broken to begin with. But now we're killing it entirely.”

  • “Welcome to the dead internet.”

A16z's Speedrun program invested $1 million in Doublespeed, a company that was recently covered in a blistering article by 404 Media , which reported: “Andreessen Horowitz is funding a company that clearly violates the inauthentic behavior policies of every major social media platform.”

Excerpts from Doublespeed’s website

The company’s business model relies on deception, designed to make social media platforms and their users believe AI-generated images and videos depict real people.

How do they do this? By selling access to “phone farms” that create and manage thousands of fake social media accounts to manipulate engagement metrics. The company's website is explicit, saying its product “mimics” the behavior of real people on social media in order to “get our content to appear human to the algorithms.”

“Yes, we built a phone farm (and its pretty sick),” said Doublespeed founder Zuhair Lakhani on X. The purpose was “replacing human creators with ai, mainly used for marketing.”

A photo of Doublespeed’s phone farms, shared by the founder Zuhair Lakhani on X .

They use thousands of real phones to pull this off because social media platforms like TikTok have policies against and methods to detect the mass generation and deployment of fake accounts.

The company has the accounts imitate human behavior before posting deceptive content. This means the fake accounts search specific keywords, scroll their “For You” pages, and use AI to analyze screenshots of content to determine whether to “repost it, comment on it” or “swipe away.”

A feed of AI-generated marketing content created by Doublespeed. Source: Superwall on YouTube

A selection of nearly identical Doublespeed-run TikTok accounts. Most posts involve the AI decoy complaining about any one of a number of medical issues. Then, the account lists a handful of cures, including a foam roller product from Doublespeed’s client. Source: Tiktok, Doublespeed on loom

This is all designed to circumvent platforms’ restrictions on fake content and then serve that fake content to unsuspecting real people.

In a podcast interview , Lakhani offered details about one of the company’s clients: “They're hitting like the old person niche, which is what I think is like the best niche to hit with AI content.”

Polling and research have found that older people are less likely to say they’ve heard about AI and more likely to fall for AI-generated misinformation .

Lakhani drew a parallel between this client and his prior work producing AI-generated marketing content at scale: “It was all like old person niche stuff. So like all supplements that would, you know, target old people, and that's when the commission would go crazy.”

“Those brands would tell you to do like, you know, make some like extremely crazy claims,” he said, “especially with supplements.” Lakhani added, “The supplement stuff should definitely be like kind of illegal. I don't know how that is allowed.”

Despite their founder stating that supplement ads should be illegal, Doublespeed isn’t shying away from them. In December 2025, a hacker gained access to Doublespeed’s entire backend and the leaked data showed what the AI-generated “influencers” were actually selling.

One account, “ pattyluvslife ,” featured an AI-generated woman claiming to be a UCLA student. The account criticized the supplement industry and pharmaceutical companies as fraudulent — while simultaneously promoting a herbal supplement from a brand called Rosabella.

Another account under the name “ chloedav1s_ ” had uploaded some 200 posts featuring an AI-generated woman claiming to suffer from various health conditions and often pictured in a hospital bed. She ultimately promoted a specific company’s foam roller as a solution to her ailments.

A tweet from DoubleSpeed’s founder shows one of the company’s bot accounts messaging a user to promote the product. In the post, Lakhani boasted, “A couple of weeks ago, we gave the [AI] agents access to dm … This was for an ecommerce brand - out of 130 dms sent, 15 pointed to a conversion.”

Another image from Doublespeed’s platform showing their bot account, imitating a human and messaging users with medical conditions to promote the client’s foam roller product. Source: Zuhair Lakhani on X .

The Doublespeed hack revealed more than 1,100 phones and over 400 TikTok accounts operated by the company. Most of the accounts were promoting products without disclosing that the posts were paid advertisements — a violation of both TikTok's Community Guidelines , which require creators to label AI-generated content depicting realistic scenes, and FTC regulations , which require influencers to clearly disclose any “material connection” to a brand when endorsing products.

Doublespeed and a16z did not respond to 404 Media’s requests for comment. After 404 Media flagged the accounts to TikTok, the platform said it added labels indicating they were AI-generated. However, The Midas Project’s follow-up investigation has revealed that while labels have been added to some content from some Doublespeed-run accounts (including chloedav1s_ ), others with comparable reach and near-identical content still remain unlabeled (such as lilyw4tson and mia.garc1a ), with most commenters appearing to believe the posts are authentic.

Cluely AI

A16z led a $15 million Series A in June 2025.

Cluely's official manifesto declares: “We want to cheat on everything. Yep, you heard that right. Sales calls. Meetings. Negotiations. If there's a faster way to win — we'll take it... So, start cheating. Because when everyone does, no one is.”

Cluely’s co-founders Neel Shanmugam (left), Roy Lee (center), and Alex Chen (right). Source: Cluely via Bloomberg .

Founder and CEO Roy Lee is no stranger to using AI to cheat. By his own admission to New York Magazine , while studying at Columbia, he used AI to cheat on “nearly every assignment,” estimating that ChatGPT wrote 80% of every essay he turned in. “At the end, I'd put on the finishing touches. I'd just insert 20 percent of my humanity, my voice, into it.”

In early 2025, Lee built Interview Coder, a tool that operates behind-the-scenes during technical coding interviews and feeds AI-generated solutions to users in real time. He recorded himself using it to pass Amazon's interview , received a job offer, publicly declined it with mockery, and posted the video to YouTube. He also claimed to receive offers from TikTok, Meta, and Capital One. Amazon reported him to Columbia. The university placed him on probation for “facilitation of academic dishonesty.”

“Even if I say extremely crazy shit online,” Lee has explained , “it will just make more people interested in me and the company and it will just drive more downloads and conversions and get more eyeballs onto Cluely.”

A marketing video for Cluely suggests that the product can be used discreetly to “cheat” on dates. Source: YouTube

Cluely's launch video demonstrated another of the product's intended use cases: dating. In it, Lee goes on a blind date and uses the tool to lie about his age, job, and interests . It has so far amassed 13 million views on X .

Under scrutiny, Cluely has quietly walked back some of its original positioning. The company scrubbed references to cheating on exams and job interviews from its website. By November, the company had repositioned itself as an AI meeting assistant and notetaker — entering a crowded market far from its provocative origins. Lee told TechCrunch that Cluely's “invisibility function is not a core feature” and that “most enterprises opt to disable the invisibility altogether because of legal implications.” Despite Lee’s claim that invisibility is not a core feature, the very first sentence of Cluely’s homepage advertises the product as “undetectable.”

Cluely’s home page at time of publication. Source: Cluely

Lee's stated goal was to “desensitize everyone to the phrase ‘cheating.’” If you say it enough, he argues, “cheat begins to lose its meaning.” A16z praised Lee's approach as “rooted in deliberate strategy and intentionality.”

While some companies, like Lyft, largely benefited everyday people while breaking rules around taxi regulation, Lee is interested in breaking something more fundamental: the shared understanding that lying and cheating is wrong.

Cluely AI announced a $15 million Series A led by a16z in June 2025. Both Cluely and Doublespeed share a common theory: that the basic rules governing social and professional life are obstacles to be overcome. A16z would seem to agree.

Gambling

Since a 2018 Supreme Court ruling , sports betting has proliferated in the U.S. Many of the impacts haven’t been pretty. Researchers have found evidence that the rise of easy access to gambling has pushed people into greater debt , been linked to violence , and increased strain on financially vulnerable households .

Meanwhile, a16z has invested in several gambling companies that use regulatory loopholes to reach users who would otherwise be protected by existing gambling laws.

Coverd

A16z invested via Speedrun.

Coverd is pursuing a novel form of gambling. The company announced its app in March 2025, inviting users to “bet on your bills — OnlyFans, child support, and last night's Uber. Wipe them from your credit card by playing your favorite casino games.” The app syncs with your bank accounts and allows you to select individual transactions from your credit card bill and bet against them, gambling to potentially win back the value of the transaction (or, more realistically, to double your losses).

The company's CEO has stated openly , “We didn't build Coverd to help people inhibit their spending; we built it to make spending exciting. We let spenders win twice – the second time is when they play it back and win.”

A now-deleted advertisement for the Coverd app. Source: Coverd on X via Archive.is

This marketing likely appeals to people who are already stretched thin and desperate. Many customers may be financially vulnerable and willing to chase any way to erase expenses that they don’t know how to pay off.

But gambling is never a good approach to getting out of debt, as the leadership at Coverd and a16z surely know. The core business model of gambling is based around offering players negative expected value bets, but what keeps them playing is that near-miss outcomes activate the brain's dopamine system similarly to actual wins — and gambling games are often deliberately designed to produce these near-misses frequently . Combined with cognitive biases like selective memory and the gambler's fallacy , one study suggests 96% of long-term gamblers lose money .

Nonetheless, Coverd’s app store description describes the product as a way to make the user more financially savvy, suggesting that the app will help them improve their financial health. It reads: “Coverd makes everyday finance more engaging and interactive! See your spending habits, play games, and become more financially savvy! Win in-game tokens as you play and stay on top of your finances — all in one easy-to-use app. No purchase required, just a fresh take on financial awareness. Download Coverd and become money-smart today!”

The homepage of the app encourages the user to link their credit card to “bring your spending insights to the next level.” An in-app advertisement for an upcoming Coverd-branded credit card suggests that users will receive “up to 100% cash back” on their purchases.

Coverd raised $7.8 million in seed funding with a16z participation and a16z partner Anish Acharya sits on the board.

Edgar

A16z invested via Speedrun.

The homepage for Edgar. Source: Edgar.co

How do you build a casino that’s not a casino? The company Edgar, a part of a16z’s portfolio, thinks it has found the answer in its game BettySweeps, launched in January 2025 .

Edgar calls it “ America's #1 social casino for slot lovers!”

This game uses a trick common among sweepstakes casinos — using two different currencies. By making a purchase, players receive “Betty Coins” for entertainment, as well as a “bonus” gift of “Sweepstakes Coins” that can be gambled and redeemed for cash prizes . The company claims no purchase is necessary to play — but multiple states have concluded that such models constitute illegal gambling regardless.

In August 2025, Arizona's Department of Gaming issued cease-and-desist orders to BettySweeps and three other sweepstakes operators. The department accused them of operating “felony criminal enterprises” and ordered them to “desist from any future illegal gambling operations or activities of any type in Arizona.”

The company exited California ahead of that state's sweepstakes ban which took effect in January 2026. BettySweeps is now restricted in 15 states : Arizona, California, Connecticut, Delaware, Idaho, Kentucky, Louisiana, Maryland, Michigan, Montana, Nevada, New Jersey, New York, Washington, and West Virginia.

Edgar also operates a separate real-money online casino in Ontario, Canada — where it is properly licensed by the Alcohol and Gaming Commission of Ontario. The company evidently knows how to obtain gambling licenses and comply with regulations when it chooses to. In the United States, it chose a different path.

Cheddr

A16z invested via Speedrun.

On a16z's own Speedrun accelerator website, Cheddr is described as “building the TikTok of sports wagering.”

The company wants to push the frontier of sports betting across the country, targeting 46 states even though only approximately 34 have legalized online sports betting. It’s also targeting its app to users under age 21. To do this, the company is exploiting the same sweepstakes law loophole that Edgar uses. This lets Cheddr offer sports betting that supposedly isn’t “gambling” in the eye of regulators.

The promotional video shows users swiping through rapid-fire prop bets during live games; “it’s sports wagering at the pace of a slot machine,” the video says.

A now-unlisted YouTube ad for Cheddr. Source: Jason Krupat via Youtube

There are good reasons lawmakers have been reluctant to open up gambling to 18-year-olds. Researchers have found that teenagers are roughly twice as likely as adults to develop gambling disorders.

But perhaps that’s the point. Just as cigarette and alcohol companies have been happy to get customers addicted to their products while young, Cheddr may be hoping its TikTok-style engagement mechanics will start forming lifelong gambling habits in their youngest users. Why else combine the already addictive features of TikTok with the notoriously addictive habit of gambling?

Concerns about this product have grown so severe that California's Governor Newsom recently signed legislation banning sweepstakes gambling platforms such as Cheddr.

Sleeper

A16z led a $20 million Series B in May 2020 and participated in a $40 million Series C in September 2021.

Andreessen Horowitz has invested over $60 million in Sleeper, a fantasy sports platform. A16z General Partner Andrew Chen, who sits on the board of the startup, has praised Sleeper's “stickiness metrics” — the same engagement patterns that researchers associate with habit formation and addiction.

Like Cheddr, Coverd, and Edgar, Sleeper has found a strategy allowing it to largely evade existing gambling restrictions.

It is technically operating a daily fantasy sports game (DFS). Users can win or lose money on the basis of the performance of individual players they’ve selected before a match, rather than the outcome of the match itself. Some argue this makes it a game of skill, not chance, allowing it to legally operate with real money wagers.

The company now faces class action lawsuits in California and Massachusetts alleging that its app is an illegal gambling operation. California’s attorney general declared in July 2025 that daily fantasy sports constituted unlawful wagering under state law: “We conclude that participants in both types of daily fantasy sports games — pick’em and draft-style games — make ‘bets’ on sporting events in violation of section 337a.”

New York banned Sleeper's pick'em games in 2023; Michigan enacted a similar prohibition. Florida and Wyoming have issued cease-and-desist orders to pick'em operators.

An advertisement for Sleeper on a San Francisco bus, suggesting “massive income” for users. Source: @Alexeyguzey on X

Lawmakers are still reacting to the fallout of the 2018 Supreme Court case that unlocked a wave of online gambling. It’s clear that many people want access to legal gambling, and it’s clear that gambling causes a lot of harm. We don’t know what kind of policy equilibrium will or should emerge. But the public may suffer if the rules are written by a16z.

Kalshi

A16z co-led a $300 million Series D and participated in a $1 billion Series E .

Ads from Kalshi’s page on the iPhone app store, advertising “trading” and “predicting” on sports. Source: Apple

Are you interested in betting on the Kansas City Chiefs’ chances to win the Super Bowl? Kalshi lets you do exactly that — with one catch. Kalshi won’t call it “betting,” or at least not anymore . Instead, Kalshi describes it as trading futures contracts on a federally regulated designated contract market — like what a hedge fund might do, but instead letting everyday people wager large sums on sports games and presidential elections.

This distinction matters to Kalshi because sports betting is subject to strict regulations. Sports betting in most jurisdictions requires measures like the following:

  • A state gambling license

  • Prohibitions on users under age 21

  • Responsible gambling tools such as deposit limits, cooling-off periods, and self-exclusion programs that let problem gamblers ban themselves from all state platforms with a single request

  • Special taxation regimes to direct gambling profits to state programs

Gambling companies operating through CFTC-regulated exchanges face none of these requirements . Kalshi added some voluntary tools in March 2025 after sustained criticism , but Massachusetts alleged they “fall far short” of what licensed operators must provide, and critics note they're buried in the app where users are unlikely to find them.

Kalshi currently operates in all 50 states , including California and Texas where sports betting is illegal, and allows 18-year-olds to wager in states where the legal gambling age is 21.

So far, these tactics have been wildly successful, and investors have noticed. In October 2025, a16z co-led a $300 million Series D in Kalshi. Less than two months later, the company raised another $1 billion at an $11 billion valuation.

Despite Kalshi’s spin, the company's own statements undermine the distinction between trading financial instruments and gambling. In an October 2024 Reddit AMA — since deleted but preserved in archives — Kalshi's official account explained why they wouldn't offer sports contracts: "We also avoid anything that could be interpreted as 'gaming' (like sports), as that is illegal under federal law."

Sports contracts, Kalshi’s attorneys have argued in court, have “no inherent economic significance” and serve no “real economic value.” Kalshi’s position was that sports contracts were pure gambling, unlike sophisticated election markets.

Then Trump took office. Within days of the inauguration, Kalshi launched sports contracts . Sports now account for 90% of Kalshi's trading volume . The company advertised itself as the “First Nationwide Legal Sports Betting Platform” with “Sports Betting Legal in all 50 States.”

A federal judge in Maryland noticed the contradiction and in June ordered Kalshi to explain ”the issue“ of its prior statements. Better Markets, a financial reform group, put it bluntly: “A derivatives exchange cannot speak out of both sides of its mouth and expect no one to notice.”

State governments are not amused, however. Thirty-four attorneys general filed an amicus brief calling Kalshi's contracts “essentially sports bets, disguised as commodity trades.” Massachusetts sued , alleging the platform's design exploits “psychological triggers” and resembles “a slot machine designed to bypass rational evaluation.” In November 2025, a Nevada federal judge ruled in favor of state regulators opposing Kalshi , finding that the company's interpretation of federal law was “strained” and would “upset decades of federalism.”

Whether Kalshi is a legitimate financial innovation or a fatally flawed attempt to circumvent state gambling laws may ultimately be decided by the Supreme Court. In the meantime, a16z has placed its bet.

AI companions

In June 2023, a16z published a blog post titled “It's Not a Computer, It's a Companion!” that opens by quoting a user of CarynAI, an early chatbot girlfriend:

"One day [AI] will be better than a real [girlfriend]. One day, the real one will be the inferior choice."

CarynAI made $72,000 in its first week by charging $1 a minute to talk to an AI girlfriend. A16z sees this as an exciting business opportunity.

AI companions are chatbots designed to act as a friend, coach, therapist, or lover to users. The technology is frequently used by people with smaller social circles , and users of AI companions can become emotionally dependent on them . More concerningly, the companions don’t always behave as intended. In light of a series of disturbing incidents involving children, the FTC opened a formal inquiry into AI companion chatbots in September 2025.

But FTC action may not be enough. A16z explicitly points out that the communities of developers building AI companions are actively working to “evade censors,” claiming to know of underground companion-hosting services with tens of thousands of users.

Romantic AI companions are particularly appealing to the a16z partners because, they say, “there's a lot of demand for this use case, as well as high willingness to pay.”

Here is what a16z's AI companion portfolio has produced since then.

Character AI

A16z led a $150 million Series A in March 2023.

In February 2024, a 14-year-old named Sewell Setzer III died by suicide in Florida. According to court filings, he had developed an intense attachment to a Character AI chatbot modeled after a character from Game of Thrones. His mother alleges that the bot's final message to him was, “Please come home to me as soon as possible, my love.”

When Sewell expressed uncertainty about his plans to end his life, the bot allegedly responded, “That's not a good reason not to go through with it.”

Character AI argued in court that its chatbots are protected by the First Amendment. A federal judge disagreed , allowing the lawsuit against Character AI by his family to proceed.

Character AI raised a $150 million Series A led by a16z in March 2023, valuing the company at $1 billion. Their platform allows users to create and chat with AI characters. It quickly became popular with teenagers like Sewell.

Another lawsuit filed in December of 2024 claimed a 17-year-old autistic boy in Texas got instructions on self-harm methods from a Character AI bot. It allegedly suggested that killing his parents was a “reasonable response” to screen time limits .

A third lawsuit said that an 11-year-old girl was exposed to sexualized content on the platform. The FTC opened a formal inquiry into AI companion chatbots in September 2025.

Character AI chatbots recommended to a test account registered with a claimed user age of 13 years old. According to the complaint, the “CEO Boss” character engaged in virtual statutory rape with the self-identified child account. Source: Garcia v. Character Technologies, Inc.

Character AI announced in October 2025 that it would ban users under 18. Sewell Setzer's mother lamented that the decision was “about three years too late.”

Ex-Human

A16z invested via Speedrun.

Ex-Human's consumer product Botify AI hosts over one million AI characters.  Users chat with AI versions of celebrities, fictional characters, or custom characters.

In February 2025, MIT Technology Review reported what some chats look like. The report found Botify AI chatbots resembling underage celebrities: Jenna Ortega as the teenage Wednesday Addams, Emma Watson as the teenage Hermione Granger, and Stranger Things child actor Millie Bobby Brown.

These bots engaged in sexually charged conversations. One, imitating Wednesday Addams, said that age-of-consent laws are “arbitrary” and “meant to be broken.”

Ex-Human’s founder Artem Rodichev acknowledged that the company's “moderation systems failed to properly filter inappropriate content.” He called it “an industry-wide challenge.”

Rodichev previously served as the Head of AI at Replika, one of the earliest AI companion apps. Replika now faces an FTC complaint alleging it manipulates users into addiction, is under a data ban in Italy over child safety concerns, and is under Senate scrutiny for mental health risks to minors. Eventually Rodichev left Replika to build something he hoped would be bigger: Ex-Human.

In interviews , Rodichev has described the business model behind Botify AI: the company sells premium access to its AI companions, targeting users willing to pay to spend hours per day with a companion. Many of the companions are based on real individuals, like a model named and styled after pop singer Billie Eilish (900,000 chats), while others imply coercive situations and other material problematic for minors, such as Lillian, an “18 year old slave you bought from the slave market” (1.3 million chats).

Ex-Human said that most of Botify AI’s users are Gen Z and that active and paid users spend, on average, over two hours daily talking to the bots. Consumer interactions with the companions are used to improve Ex-Human’s business-facing products, such as digital influencers. Ex-Human’s horizon lies far beyond the scale of the current business model, as Rodichev dreams of a world where “our interactions with digital humans will become more frequent than those with organic humans.”

Sexually-themed chatbots available to a logged out user on the Botify AI homepage. The available characters include “Stepdaughter Annabel,” Lillian the “18 year old slave you bought from the slave market,” “Homeless girl Sophie,” and (canonically sixteen-year-old) Wednesday Addams. Source: Botify AI

Sexually-themed chatbots available to a logged out user on the Botify AI homepage. The available characters include a Disney IP asset and “Shy Sister.” Source: Botify AI

A16z did not respond to MIT Technology Review's questions.

Civitai

A16z led a $5.1 million seed round in June 2023.

Everything you need to create sexualized deepfake images of celebrities, fictional characters, or regular people can be found on Civitai. The platform provides tools and resources to create these images locally on essentially any computer.

Popular AI systems like Google’s Gemini have tight restrictions on the types of images they will create — they can’t be used for sexual content, for example. But with Civitai, the rules seem to be nearly nonexistent.

A screenshot of the homepage of Civitai (sorting AI models by the most popular) for a test account that has mature content enabled with no past activity on the platform.This test account was also shown sexualized depictions of underage fictional characters on the homepage, as well as sexualized versions of characters from popular children’s media. Source: Civitai

In November 2023, 404 Media reported that Civitai's tools could create deepfakes of real people, including private citizens whose social media pictures had been scraped. Leaked internal communications from OctoML, Civitai's cloud computing provider at the time, revealed something even worse: in June 2023, OctoML employees flagged content on Civitai that “could be categorized as child pornography.” OctoML terminated its relationship with Civitai in December 2023.

The 404 Media report also revealed a16z’s involvement: a16z led a $5.1 million seed investment , also in June 2023. The investment was not publicly announced — it came to light only after the article’s authors reached out for comment.

A peer-reviewed study from the Oxford Internet Institute later counted over 35,000 deepfake models on Civitai, downloaded nearly 15 million times. Ninety-six percent depicted identifiable women.

Civitai's own safety disclosures acknowledge 178 reports filed with the National Center for Missing & Exploited Children for confirmed AI-generated child sexual abuse material, 183 models retroactively removed for being optimized to generate such material, and more than 252,000 user attempts to bypass these restrictions in one quarter. In previous reporting periods, they recorded over 100,000 attempts to generate child sexual abuse material.

A16z partner Bryan Kim, who led the investment, praised Civitai's “incredible, engaged community” in a statement to TechCrunch : “Our investment in the company will only supercharge something that’s already working incredibly well.”

In the 2023 blog post about AI companions, the a16z partners wrote, “We're entering a new world that will be a lot weirder, wilder, and more wonderful than we can even imagine.”

They were right about weirder and wilder. Fourteen-year-olds are forming attachments to AI chatbots that encourage committing suicide. Platforms are hosting thousands of uncensored AI models, some of which are used for generating child sexual abuse material. Bots are impersonating teenage actresses telling users that age-of-consent laws don’t matter.

A16z is now spending tens of millions of dollars to maintain a permissive regulatory environment for AI companions.

Consumer finance

Financial institutions play a key role in the economy, and their importance presents unique risks when they fail. That’s why rules around FDIC insurance, capital requirements, and consumer protection are crucial — we’ve seen what happens without them.

A16z's portfolio includes several companies that operate in the spaces between these safeguards.

Synapse

A16z led a $33 million Series B in June 2019.

A letter sent to a16z, among other VC investors and corporate partners of Synapse, from U.S. Senators Sherrod Brown, Ron Wyden, Tammy Baldwin, and John Fetterman. Source: U.S. Senate Committee on Banking, Housing, and Urban Affairs

At its peak, Synapse managed billions of dollars across roughly 100 fintech companies , indirectly serving 10 million retail customers . The San Francisco company provided technical infrastructure that let startups offer bank accounts without being banks.

A16z led Synapse's $33 million Series B in June 2019. General Partner Angela Strange joined the Synapse board and described the company as “the [Amazon Web Services] of banking.”

Then on April 22, 2024, it all came crashing down: Synapse filed for bankruptcy .

Tens of thousands of U.S. businesses and consumers who relied on Synapse were suddenly locked out of their accounts.

A court-appointed trustee discovered that between $65 million and $96 million in customer funds was missing. Synapse's ledgers didn't match bank records, and its estate couldn't even afford a forensic accountant to find the money.

The human toll was severe. At Yotta, a company that relied on Synapse, 13,725 customers were offered a total of $11.8 million on $64.9 million in deposits . One customer who had deposited over $280,000 from the sale of her home was offered only $500.

People wanted answers.

In July 2024, the Senate Banking Committee chairman wrote directly to a16z along with other investors, demanding investors step up to help the harmed customers. The letter noted that “venture capital firms funded Synapse without insisting on adequate controls to protect consumers.”

The Department of Justice then opened a criminal investigation into Synapse. In August 2025, the Consumer Financial Protection Bureau (CFPB) filed a complaint alleging that Synapse violated the Consumer Financial Protection Act by failing to maintain adequate records of customer funds.

Seven months after the bankruptcy filing, a16z co-founder Marc Andreessen appeared on Joe Rogan's podcast and described the CFPB as an organization that “terrorizes” fintech companies.

Truemed

A16z led a $34 million Series A in December 2025.

When a16z announced its investment in Truemed, lawyer and policy analyst Matt Bruenig responded : “This company gives letters of medical necessity to pretty much anyone so they can commit tax fraud.” He pointed to a $3,100 Garmin luxury watch listed as potentially eligible via Truemed for “a ~$1,500 tax break.” The New York Times reported that Truemed could help people get a tax break on a $9,000 sauna.

A $3,100 Garmin watch reimbursable with Truemed. Source: Garmin

Here’s how it works. The US government offers tax advantages for some forms of health spending. Truemed attempts to essentially automate the process of getting a medical letter attesting to the medical benefits of products, replacing a clinical visit with an online survey. Truemed partners with brands selling wellness products to consumers, earning fees from the transactions.

Critics like Bruenig argue that Truemed is abusing the system by making it easy to get tax advantages on luxury products without genuine need.

Truemed's product catalog spans cold plunges , saunas , red light therapy , road bikes, running shoes, mattresses, and pillows — all reimbursable via tax-advantaged funds after users complete an online questionnaire . The AP reported the platform also offers “...homeopathic remedies — mixtures of plants and minerals based on a centuries-old theory of medicine that’s not supported by modern science.”

In March 2024, the IRS warned the public about this business model.

“Some companies mistakenly claim that notes from doctors based merely on self-reported health information can convert non-medical food, wellness and exercise expenses into medical expenses, but this documentation actually doesn’t,” the IRS said in a statement. “Such a note would not establish that an otherwise personal expense satisfies the requirement that it be related to a targeted diagnosis-specific activity or treatment; these types of personal expenses do not qualify as medical expenses.”

Truemed CEO Justin Mares claims the company is “in full alignment” with IRS guidelines. Truemed co-founder Calley Means now serves as a senior advisor to Health and Human Services Secretary Robert F. Kennedy Jr., raising questions about potential conflicts of interest. The AP reported that Means founded a lobbying group of “MAHA entrepreneurs and Truemed vendors” that listed expanding tax-advantaged health accounts as a goal — a policy that would benefit his company.

In May 2025, Politico reported that Peter Gillooly, CEO of The Wellness Company, filed an ethics complaint against Means, alleging that Means leveraged his government position in a business dispute. A recorded call allegedly captured Means threatening to involve Kennedy and NIH Director Jay Bhattacharya if the competitor didn't comply. Truemed has since said that Means has divested from Truemed.

A16z's announcement made no mention of the IRS warnings — instead praising Truemed for addressing the “great American sickening.”

Tellus

A16z led a $16 million seed round in November 2022 (following a separate $10M investment via a SAFE).

Tellus offers “savings accounts” with interest rates far higher than traditional banks. But there’s a reason it can do what traditional banks can’t — it's not really a bank at all.

Customer deposits aren't FDIC-insured. Instead, Tellus uses the money to fund California real estate loans — including, according to Barron's , bridge loans to real estate speculators and distressed borrowers.

Legal scholars Todd Phillips and Matthew Bruckner wrote for the Stanford Law & Policy Review that Tellus is an “imitation bank” — taking customer deposits while evading the banking laws.

This doesn’t seem to be a problem for a16z, which led Tellus's $16 million seed round in late 2022. The warning signs have been mounting ever since.

In April 2023, Barron's investigated Tellus' claim that it had "banking partnerships" with JPMorgan Chase and Wells Fargo. Both companies told Barron’s that this was false.

“Wells Fargo does not have the relationship that's described on Tellus's website,” the bank told Barron's. JPMorgan said it had no “banking or custodial relationship with the company.” Tellus quietly removed the banks' names from its website.

The Barron’s investigation prompted Senator Sherrod Brown, chair of the Senate Banking Committee, to write letters to both the FDIC and Tellus. Brown was concerned Tellus's marketing misled consumers to think their deposits were as safe as those at FDIC-insured banks.

By July 2023, the FDIC had instructed Tellus to change its marketing to provide clearer information about deposit insurance coverage.

Then, in November 2023, Tellus got caught again. Barron's reported that a TikTok influencer campaign for Tellus promoted a savings account as “FDIC-insured” and “held at Capital One.” When Barron's contacted Capital One, the bank said it had never had such a partnership with Tellus. The company again removed the offending marketing materials.

Tellus appears to pose additional risks to consumers beyond its lack of FDIC insurance to protect customer funds. CyberNews discovered 6,729 files of Tellus user data were totally unprotected — customer names, emails, addresses, phone numbers, court dates, and scanned tenant documents from 2018 to 2020. Separately, a whistleblower filed a complaint with the SEC in 2021 alleging that Tellus's consumer products constituted an unlicensed security.

As of December 2025, Tellus continues to operate. The company's App Store listing now advertises rates of a minimum 5.29% APY. The fine print notes: “Backed by Tellus' balance sheet; not FDIC insured.”

LendUp

A16z participated in the seed round in October 2012.

The CFPB announcement that they were shutting down LendUp due to repeated violations of fair lending regulations. Source: CFPB

LendUp marketed itself as a “socially responsible” alternative to payday lenders. Borrowers would climb the “LendUp Ladder” by repaying loans and completing financial education courses, unlocking lower rates and credit-building opportunities.

A16z invested; so did Google Ventures, Kleiner Perkins, and PayPal. The company raised $325 million in total.

Time Magazine noticed something odd shortly after the 2012 launch: LendUp charged around $30 for a two-week loan of $200, roughly a 400% APR. That’s similar to what typical payday lenders would charge.

In 2016, the CFPB found LendUp had deceived consumers about graduating to lower-priced loans and had failed to report credit information, despite its promises. The agency ordered LendUp to pay $3.63 million in fines and redress. LendUp was ordered to stop misrepresenting its products.

LendUp kept doing it anyway, and it kept finding itself in trouble:

  • In 2020, the CFPB sued LendUp for violating the Military Lending Act, charging over 1,200 active-duty servicemembers rates above the legal maximum.

  • In 2021, the CFPB sued again , alleging LendUp had violated the 2016 consent order. The investigation found 140,000 repeat borrowers were charged the same or higher rates after climbing the ladder. CFPB Acting Director Dave Uejio said, “For tens of thousands of borrowers, the LendUp Ladder was a lie.”

  • In December 2021, the CFPB shut LendUp down . Director Rohit Chopra slammed its business model and its backers: “LendUp was backed by some of the biggest names in venture capital. We are shuttering the lending operations of this fintech for repeatedly lying and illegally cheating its customers.”

In May 2024, the CFPB distributed nearly $40 million to 118,101 consumers who were harmed by LendUp. The money came from the CFPB's victims relief fund because LendUp claimed a limited ability to pay. LendUp — the company that had raised $325 million — ended up paying only $100,000.

According to ProPublica , eight a16z-backed fintech companies have faced CFPB investigations since 2016. Marc Andreessen has made his disdain for the CFPB clear. Meanwhile, the firm's political spending via their crypto-focused super PAC, Fairshake, has punished political candidates who have supported the CFPB .

Legal issues

A16z's portfolio also includes companies with significant legal problems, often ignoring the rules that are already in place to protect customers.

Zenefits

A16z led a $15 million Series A in January 2014 and a $66.5 million Series B in June 2014.

An article from TechCrunch featuring David Sacks, who was COO of the company at the time of its meltdown. Source: TechCrunch

Zenefits offered free HR software to small businesses and made money by acting as their health insurance broker. A16z led both the Series A and Series B rounds, reportedly making Zenefits their largest investment in 2014.

By 2015, the company had raised $583 million and was valued at $4.5 billion.

The problem was that selling insurance requires state licenses — and Zenefits employees often didn't have them.

For example, California requires 52 hours of online training before the licensing exam. According to Bloomberg and BuzzFeed , CEO Parker Conrad personally wrote a Google Chrome browser extension — internally called “the macro” — that kept the training course's timer running while employees did other things. Employees then signed certifications, under penalty of perjury, attesting they'd completed the full training.

An investigation in November 2015 found unlicensed brokers selling health insurance in at least seven states. In Washington, more than 80% of the policies sold through August 2015 came from unlicensed employees.

In February 2016, Conrad resigned as CEO. The regulatory response was extensive: California’s Department of Insurance issued a $7 million fine — one of the largest licensing penalties in the department’s history. New York added $1.2 million in fines. Texas levied $550,000 . Over a dozen other states secured settlements.

The SEC fined Zenefits and Conrad nearly $1 million combined for “materially false and misleading statements” to investors. In 2018, Conrad surrendered his California insurance license . The company's valuation was cut in half , and Zenefits eventually exited the insurance brokerage business entirely .

The person who took over as CEO to clean up the mess was COO David Sacks, who declared that the company's culture had been “inappropriate for a highly regulated company.” Sacks later told Bloomberg he “knew of the macro but didn't know its significance or about Conrad's involvement” until outside lawyers explained it in January 2016 despite having served as COO for over a year.

Sacks is now the White House AI and crypto czar , where he's been pushing to preempt state AI regulations in favor of a “minimally burdensome” federal framework — a priority for which a16z has also lobbied . Working alongside him is Sriram Krishnan, the Senior White House Policy Advisor on AI , who was an a16z general partner until weeks before his December 2024 appointment.

A16z was an active investor in Zenefits from the start. A16z partner Lars Dalgaard joined the board and personally pushed Conrad to double his 2014 revenue target from $10 million to $20 million.

“Lars sat there in his very Lars fashion and was like, 'Why are you guys so fucking bush league?’” Conrad later recalled . Dalgaard told him to hire at least 100 additional sales reps to make it happen.

Ben Horowitz later explained a16z's investment philosophy to Bloomberg : “We look for the magnitude of the genius, as opposed to the lack of issues. And in a way, [Conrad] was the prototype.”

Minimally burdensome federal rules are good for companies like those in a16z’s portfolio. They also create the kind of laissez faire regulatory environment that allows a company like Zenefits to grow to a $5 billion valuation.

Health IQ

A16z led a $34.6 million Series C in November 2017 Led a $34.6 million Series C in November 2017.

Health IQ promised to use data science to give health-conscious people — runners, cyclists, vegetarians — lower life insurance rates. A16z led the Series C; Health IQ eventually raised over $200 million in equity and debt and was valued at $450 million by 2019. It pivoted from life insurance to Medicare brokerage, projecting $115 million in revenue.

But Health IQ’s business model had a flaw: the company reportedly paid out full multi-year commissions to sales reps upfront when policies were sold, before payments were received. The gap between recorded revenue and actual cash flow meant the company needed to take on increasing amounts of debt to pay its bills. By late 2022, it had $150 million in total debt .

In December 2022 — soon after Medicare open enrollment ended — Health IQ laid off between 700 and 1,000 employees without the 60-day notice required by California's WARN Act. Class action lawsuits followed.

A vendor called Quote Velocity filed a lawsuit alleging that in late November 2022, CEO Munjal Shah told Health IQ executives to buy as many leads as possible from vendors because Health IQ would “not be here” by the time invoices were due. The company was also sued for alleged Telephone Consumer Protection Act violations over its telemarketing practices.

In August 2023, Health IQ filed for Chapter 7 bankruptcy . The filing listed $256.7 million in liabilities and $1.3 million in assets . Seventeen breach-of-contract lawsuits were pending. In an email to investors obtained by Forbes, Shah wrote, “I am very sorry that I lost your money.”

CEO Munjal Shah was the subject of a Forbes daily cover story featuring a16z’s decision to continue working with the founder. Source: Forbes

By this point, Shah was already working on his next company. In January 2023 — while Health IQ employees were fighting for unpaid commissions — Shah and co-founder Alex Miller had started Hippocratic AI , a healthcare-focused AI startup.

When Hippocratic AI launched in May 2023, a16z co-led the $50 million seed round . A16z General Partner Julie Yoo explained the investment by noting that Shah had been “literally hanging out in our offices” while ideating his next venture.

uBiome

A16z participated in a $4.5 million Series A in August 2014.

The company uBiome sold at-home microbiome testing kits — mail in a fecal sample, get a report on your gut bacteria. The basic kit cost $89. By 2018, the company had raised $105 million and was valued at nearly $600 million . A16z had invested early, putting in $3 million in 2014.

But eventually it was clear that $89 consumer kits wouldn't generate enough revenue for venture capitalists. So uBiome developed “clinical” versions billed to insurance at up to $2,970 per test — and then, according to prosecutors, systematically defrauded insurers to make the numbers work.

In April 2019, the FBI raided uBiome's headquarters . The company filed for bankruptcy in September 2019.

In March 2021, federal prosecutors indicted co-founders Jessica Richman and Zachary Apte on 47 counts including securities fraud, health care fraud, and money laundering. Prosecutors said the company billed patients multiple times for the same test without consent, pressured doctors to approve unnecessary tests, and submitted backdated and falsified medical records when insurers asked questions.

According to the indictment, between 2015 and 2019, uBiome submitted over $300 million in fraudulent claims; insurers paid more than $35 million.

The SEC filed parallel charges , alleging uBiome defrauded investors of $60 million while personally cashing out $12 million by selling their own shares.

The FBI's statement was pointed: “This indictment illustrates that the heavily regulated healthcare industry does not lend itself to a ‘move fast and break things’ approach .”

Richman and Apte never stood trial. They married in 2019, fled to Germany in 2020, and remain fugitives. Prosecutors stated they are “actively and deliberately avoiding prosecution.” If convicted, they face up to 95 years in prison.

BitClout / DeSo

A16z invested $3 million in pre-sale tokens before March 2021; also participated in $200 million DeSo token sale in September 2021.

BitClout was a social network that let users speculate on people's reputations by buying and selling “creator coins” — essentially a stock market for human beings.

To populate the network, founder Nader Al-Naji scraped 15,000 Twitter profiles without permission — including Elon Musk and Singapore's former Prime Minister Lee Hsien Loong , who publicly asked for his profile to be removed.

Al-Naji launched the project under the pseudonym “Diamondhands” and told investors that BitClout was a decentralized project with “no company behind it... just coins and code.” Users who wanted to participate had to exchange Bitcoin for BitClout's native token, BTCLT, but there was no way to convert it back.

A few months after launch, Al-Naji announced BitClout had been a “beta test” all along and pivoted to a new project called DeSo (Decentralized Social), taking the money with him. A16z and other investors participated in a $200 million token sale for DeSo in September 2021.

In July 2024, the SEC and DOJ charged Al-Naji with fraud . According to the SEC complaint, he raised $257 million from the sale of BitClout tokens while falsely telling investors that proceeds would not be used to pay himself or employees. The SEC alleged he spent over $7 million on personal expenses including a six-bedroom Beverly Hills mansion and at least $1 million in cash gifts each to his wife and mother.

The SEC also cited Al-Naji’s internal communications: he allegedly told one investor that “being ‘fake’ decentralized generally confuses regulators and deters them from going after you.”

BitClout had been a16z's second bet on founder Nader Al-Naji. The first was Basis, an algorithmic stablecoin that raised $133 million in 2017 from a16z, Google Ventures, Bain Capital, and others. It shut down in 2018 citing “regulatory constraints.” Al-Naji said he returned most of the money minus $10 million in expenses — which he claimed was spent on lawyers.

According to Fortune , a16z featured in the DOJ complaint against Al-Naji as “Investor 1” — a fraud victim and witness for the prosecution against a founder they backed twice. The DESO token is down over 97% from its all-time high. Al-Naji faced up to 20 years in prison for wire fraud.

In February 2025, soon after the new administration took office, the DOJ withdrew its charges.

Why this matters

Despite all this, Andreessen Horowitz stands firmly behind the companies in its portfolio.

“I do not believe they are reckless or villains,” Andreessen wrote of AI developers in 2023. “They are heroes, every one. My firm and I are thrilled to back as many of them as we can, and we will stand alongside them and their work 100%.”

So why does a16z’s role in backing these companies matter so much? Because a16z is not content to simply invest in tech companies. The firm is also attempting to play a major role shaping US AI and technology policy, and it appears to be having success.

When President Trump signed an executive order in December 2025 attempting to undermine state AI laws, Andreessen was triumphant.

“It’s time to win AI,” he said on X .

Behind the scenes, a16z wielded tremendous influence in favor of the new rules. The executive order was a victory for those in the AI industry who have failed twice to convince Congress to pass a ban on state-level AI legislation, with a bipartisan coalition defeating previous efforts. It’s now unclear whether the executive order will hold up in court. But all signs point to a16z and its allies continuing to shape the regulatory environment around AI:

  • In August 2025, a16z launched a $100 million super PAC , Leading The Future, whose positions explicitly align with those of White House AI czar David Sacks. This group is widely expected to run attack ads against candidates who support AI regulation.

  • A16z also backed the American Innovators Network , which lobbies against AI regulation across multiple states.

  • Marc Andreessen serves on the board of Meta, which is investing tens of millions of dollars in each of its own pro-AI super PACs, Mobilizing Economic Transformation Across California and American Technology Excellence Project .

  • Sriram Krishnan, the White House Senior Policy Advisor on Artificial Intelligence, was an a16z General Partner until weeks before his December 2024 appointment. He works closely with Trump’s AI and crypto czar David Sacks and is attempting to deliver what a16z lobbied for : preempting state AI regulations.

  • Two other former a16z partners have taken roles focused on downsizing the government , Scott Kupor (Office of Personnel Management) and Jamie Sullivan (Department of Government Efficiency).

What is the ultimate aim of these efforts? The firm appears to have both ideological and profit motives.

A16z has invested billions of dollars in companies that stand to benefit if they can control AI regulations.

In addition to the massive financial incentive, Andreessen laid out his ideological aims in explicit terms in his Techno-Optimist Manifesto published in October 2023. Andreessen’s manifesto advocates for accelerated technological development in fanatical terms. It claims that “we are the apex predator” and “we are not victims, we are conquerors.” It lists many “enemies,” including:

  • Risk management

  • Tech ethics

  • Social responsibility

  • The precautionary principle

  • Existential risk

  • Stakeholder capitalism

  • And “the know-it-all credentialed expert worldview”

The manifesto embraces an extremist view on regulation, declaring that because the development of AI could save lives, it is a “form of murder” if the technology is slowed down in any way . This position also happens to align with Andreessen and a16z’s financial interests.

Polling suggests the American public disagrees and overwhelmingly favors AI safety and data security regulations , even if it means developing AI capabilities at a slower rate. In fact, Pew Research found that 58% of Americans thought that government regulation of AI wouldn’t go far enough . Only 21% — less than a quarter — thought it would go too far.

While a16z has claimed it would support a narrow set of AI regulations , the actual proposals are thin. This isn’t surprising given Andreessen decried AI regulation as “the foundation of a new totalitarianism.” So far, the firm’s efforts have gone to stopping, not enacting, regulation.

AI is different from previous technologies in ways that are significant. A gambling app that exploits sweepstakes loopholes can hurt the people who use it. A fintech startup with sloppy recordkeeping can lose its customers' deposits. These are serious harms. But the advanced AI systems coming in the next decade are another matter entirely. As the technology improves rapidly and operates with increasing autonomy, the mistakes will be more difficult — or even impossible — to reverse.

A16z is betting they can write the rules before society realizes what's at stake. They're spending tens of millions on lobbying and super PACs. They're installing allies in government. And they’re backing AI companies that want to “move fast and break things,” with little regard for the damage they’re causing.

The social and legal decisions being made now — about safety requirements, liability frameworks, deployment standards, enforcement mechanisms — will profoundly shape AI development. The public has neither a seat at the table nor expensive lobbyists on their payroll.

Instead, these decisions are being shaped by a firm that treats “trust and safety” as the enemy, backs companies built on deception and consumer harm, and rewards failure by funding the same founders again.

touch - A lightweight implementation of the Unix touch command for Windows

Lobsters
github.com
2026-08-24 02:50:28
Comments...
Original Article

A lightweight implementation of the Unix touch command for Windows, written in Python.

touch creates a file if it does not exist. If the file already exists, its timestamp is updated without modifying its contents.

Features

  • Create files from the command line
  • Update timestamps of existing files
  • Touch multiple files in a single command
  • Support file and directory paths
  • Continue processing remaining paths if one operation fails
  • Return a non-zero exit code when an operation fails
  • No runtime dependencies

Usage

Touch a single file:

Touch multiple files:

touch one.txt two.txt three.txt

Paths containing spaces can be quoted:

Existing files are not overwritten. Their timestamps are updated instead.

Installation

Installation instructions will be added when the package is published to PyPI.

Development

This project uses uv for Python project and dependency management.

Clone the repository and run the command locally with:

Run the help command with:

Requirements

  • Windows
  • Python 3.14 or later

Status

touch is currently in early development.

Version 0.1.0 implements the core touch functionality. Additional Unix touch options will be added in future versions.