Should ChatGPT Read Your Encrypted Messages?

Internet Exchange
internet.exchangepoint.tech
2026-08-27 09:45:55
OpenAI’s new iMessage plugin for ChatGPT lets users search their messages and draft and send replies through the chatbot on their desktop. But should they?...
Original Article
privacy and security

OpenAI’s new iMessage plugin for ChatGPT lets users search their messages and draft and send replies through the chatbot on their desktop. But should they?

Should ChatGPT Read Your Encrypted Messages?
Daniela Zampieri / The AI-Deal / Licenced by CC-BY 4.0

By Mallory Knodel

Until recently, if most people wanted an LLM to help them compose a witty reply or a sensitive breakup text, they had to copy their messages out of their messaging app and paste them into a chatbot. Now, OpenAI’s new iMessage plugin for ChatGPT Work and Codex users on Mac lets users search their messages and draft and send replies through the chatbot on their desktop.

As Bloomberg notes , there are several layers of permission required before the plugin works, so no one will install it by accident. But for the people on the other end of the equation, the unsuspecting users on an end-to-end encrypted platform sending messages to their contacts, there is no such protection.

This plugin bypasses the essential promise of E2EE: that only the sender and intended recipients can read a message. That is because it appears that the plugin reads the decrypted message on the computer, then sends them to OpenAI’s servers so a third party can read the plain text.

This is exactly the scenario my co-authors and I discussed in our paper “ How To Think About End-To-End Encryption and AI: Training, Processing, Disclosure, and Consent ,” in which we concluded that processing E2EE content outside the device is only compatible with encryption if no third party can see it, and the content is used only to fulfil the user’s request.

The OpenAI iMessage plugin violates the first three of our four recommendations from the paper, and partially violates the fourth as it does not require meaningful consent from both parties. Our recommendations were:

  1. Training. Using end-to-end encrypted content to train shared AI models is not compatible with E2EE.
  2. Processing. Processing E2EE content for AI features (such as inference or training) may be compatible with end-to-end encryption only if the following recommendations are upheld:
    1. Prioritize endpoint-local processing where possible
    2. No third party can see or use any E2EE content without breaking encryption
    3. A user’s E2EE content is exclusively used to fulfill that user’s requests
  3. Disclosure. Messaging providers should not make unqualified representations that they provide E2EE if the default for any conversation is that E2EE content is used (e.g., for AI inference or training) by any third party.
  4. Opt-in consent. AI assistant features, if offered in E2EE systems, should generally be off by default and only activated via opt-in consent. Obtaining meaningful consent is complex, and requires careful consideration including but not limited to: scope and granularity of opt-in/out, ease and clarity of opt-in/out, group consent, and management of consent over time.

One of my co-authors, Andrés Fábrega and I, discussed the findings of the paper in a piece for Tech Policy Press in February 2025, " Can Bots Read Your Encrypted Messages? Encryption, Privacy, and the Emerging AI Dilemma ," which I am republishing below. It predates this plugin by eighteen months, but it feels important to surface it again as many more people decide how much of their private communications to trust to chat bots.

Can Bots Read Your Encrypted Messages? Encryption, Privacy, and the Emerging AI Dilemma

By Mallory Knodel and Andrés Fábrega. Originally published in Tech Policy Press .

It may seem like AI chatbots are taking over every digital application, whether we like it or not. You might have noticed more AI note-taking bots in online conferencing platforms, some of which offer end-to-end encryption (E2EE). Then Apple Intelligence plans were announced, promising application redesigns to offer AI features across its phone and laptop operating systems. The latest changes have come from Meta AI’s integration in WhatsApp, replete with “ bots nobody wants .”

Any time new features are added to an E2EE messaging app, it raises concerns about privacy and security. So, what concerns are raised by the addition of AI bots? How can we evaluate those concerns? As AI becomes more embedded into encrypted services, is it possible to resolve the tension between the privacy users expect from E2EE and the data access needed for AI functionality? With our colleagues at Cornell and NYU, we set out to answer these questions.

We uncovered several facets of this question from both a technical and legal perspective and published a paper laying practical recommendations for E2EE messaging platforms and regulators. It’s also important that we outline the practical solutions and recommendations for the public. You can read the full preprint paper here .

Background

Online messaging systems that allow communication between users (such as iMessage, WhatsApp, and Signal) are intermediaries to every communication between users. End-to-end encryption (E2EE) is a standard secure communication system that is designed to ensure that only the sender and the intended recipients can read communications between them. Messages that are encrypted are called “ciphertexts,” and content that is not encrypted, even if it’s an image or video, are called “plaintexts.” The core requirement of private and confidential messaging is that the service provider (and any other third parties) cannot read these communications.

AI assistants are programs designed to interpret everyday language and perform computational tasks. Today’s AI assistants are able to handle a wide range of tasks, including text analysis, content creation, code generation, language translation, and more. At the core of these technologies are programs trained on data to identify patterns, e.g., large language models (LLMs) such as OpenAI’s ChatGPT, Google’s Gemini, and Meta’s Llama, which process complex inputs (queries) and provide contextually relevant responses.

Putting this together, it seems impossible that an application with no access to message content can initiate AI processing on that same message content. To introduce AI in E2EE, the strictness of E2EE is widened in two dimensions: what is an “end,” and where is the end.

It would not be a strict violation of E2EE system design if you were to copy and paste your messages into a chatbot (though you might be violating the norms of confidentiality and privacy in the context of the conversation). If an application were to facilitate that for you, however, it would need to guarantee that the processing happens in a way that preserves E2EE, such as processing on the end—your device—and not on another computer, such as the application servers. Apple Intelligence has proposed the use of “trusted execution environments” (TEE) as the way to keep private the data used for AI training and processing.

However, a key finding in our analysis is that TEEs are insufficient to achieve the strict confidentiality and privacy guarantees of E2EE. But first, let’s discuss what this looks like in practice:

How AI Interacts with Your Encrypted Messages

AI features—such as message summarization, smart replies, and chatbots—are being seamlessly integrated into a wide range of applications with the goal of enhancing user experience. However, AI models critically require access to vast amounts of plaintext user data to power these tools. There are two main ways in which AI features interact with application data. First, they receive user data as part of queries during regular feature usage. For example, a message summarization tool receives as input a list of sent and received messages and outputs a summary of these. Second, user data is generally used to continuously train and refine the AI features. For example, data could be used to fine-tune models and improve their general performance, personalize models for the usage patterns of individual users, etc.

These considerations raise significant concerns for integrating AI features in E2EE applications. Processing of user content—during regular feature usage and model training—could expose sensitive user data to the parties who own the AI models. While some lightweight features can be implemented with smaller models that live on end-user devices (and thus, all data is processed locally), other features require offloading user data to more powerful models on the application servers. This is directly in tension with the strong security promises of E2EE applications, which require that no user data is visible to third parties.

There are a number of privacy-enhancing tools that attempt to address these issues and allow cloud-based AI models to process user data while protecting it from model owners. However, these tools offer varying degrees of security, not all of which offer the same strong privacy guarantees of E2EE. It is critical that any adopted solution is compatible with E2EE, and that the models' processing of user data does not undermine users' privacy expectations. Unfortunately, none of the existing technologies that are compatible with E2EE security, such as fully-homomorphic encryption (FHE), are yet practical solutions since they currently cannot efficiently evaluate the large models used in AI applications. On the other hand, more practical approaches, such as hardware-based solutions (e.g., storing models inside TEEs), do not meet the strong confidentiality guarantees of E2EE, and raise additional security considerations. While these represent a substantial privacy improvement over plaintext processing and may be an appropriate solution for other contexts, they are not suitable for E2EE environments.

Furthermore, even if an AI feature could somehow process user content in an encrypted manner (e.g., if FHE were to become practical for this task), training AI models with E2EE data raises an additional security concern: it is well-known that AI models often inadvertently “ memorize ” training data, which can lead to reproduction of this data during model responses, or even deliberate extraction by actors who can query the model in the form of “ adversarial attacks .” So, even if training is performed privately, E2EE data could be exposed to other application users who can query (but not observe) the model. While certain technologies address memorization and adversarial attacks (e.g., differential privacy), these do not meet the strong security of E2EE.

"Whose Bot Is It?" The Tension Between AI, E2EE, and Ownership

We need to address the key tension: users often treat AI assistants as personal tools, but these bots belong to corporations that control data access. Especially in the context of E2EE messaging, we risk treating encryption like one more feature that might contraindicate the use of AI, but it’s more than that.

Users might expect their data to remain private when communicating with these bots, especially since platforms advertise E2EE features. However, driven by business incentives, we are seeing a trend away from privacy and towards the use of novel user data—some of it from messaging platforms using E2EE—to train AI models, sometimes without explicit user consent. This practice would not only undermine the privacy protections that E2EE is meant to provide, but also puts at greater risk the massive privacy gains made over the last decade.

At the same time, AI assistants aren’t very good (yet), and many people don’t want them . Like dark patterns, this just adds to the number of repetitive failures in corporate tech that have desensitized our intuition about real measures of performance when applications are working for us and not companies.

Practical Solutions and Recommendations to Regulators and Platforms

Our technical and legal analysis is meant to inform the design and implementation of AI in E2EE platforms so as to preserve user privacy and expectations of confidentiality. Verbatim are the recommendations based on our findings:

  1. Training . Using end-to-end encrypted content to train shared AI models is incompatible with E2EE.
  2. Processing . Processing E2EE content for AI features (such as inference or training) may be compatible with end-to-end encryption only if the following recommendations are upheld:
    1. Prioritize endpoint-local processing whenever possible.
    2. If processing E2EE content for non-endpoint-local models,
      1. No third party can see or use any E2EE content without breaking encryption, and
      2. A user’s E2EE content is exclusively used to fulfill that user’s requests.
  3. Disclosure . Messaging providers should not make unqualified representations that they provide E2EE if the default for any conversation is that E2EE content is used (e.g., for AI inference or training) by any third party.
  4. Opt-in consent . If offered in E2EE systems, AI assistant features should generally be off by default and only activated via opt-in consent. Obtaining meaningful consent is complex and requires careful consideration, including but not limited to the scope and granularity of opt-in/out, ease and clarity of opt-in/out, group consent, and management of consent over time.

Similarly, regulators and platforms can make design decisions to mitigate some of the privacy challenges posed by AI features to E2EE applications, such as:

  • Opt-in Features : AI features should be off by default and only activated via explicit opt-in mechanisms. Each individual feature should have a separate opt-in mechanism, with unambiguous disclosure notices of what each feature entails. Once activated, users should be able to subsequently turn off AI features if they desire.
  • Privacy Settings and Granularity : Messaging services should provide granular privacy settings that let users control what specific data is used for AI features and how much is stored or processed.
  • Ease of Setting Adjustment: AI-related settings (such as turning off AI features or adjusting data usage policies) should be easy to find and navigate . There must be a low barrier to toggling off.
  • Clear Disclosure : Messaging services should be transparent about when and how AI interacts with encrypted messages, including the precise level of security offered by their systems. This includes specifying whether AI features process user data in ways that provide weaker privacy protections than E2EE (e.g., using trusted hardware). These disclosures should be clearly and prominently displayed. Relatedly, companies should adopt a policy of over-disclosure , ensuring that users are fully informed about data usage even when interacting with AI.
  • Data Ownership and Access : Services should clarify who owns and controls the data AI uses, ensuring users understand that they are interacting with corporate-owned models and not private personal assistants.

We recommend that regulators consider mandating these five practices and that platforms take proactive steps to implement them.

Practical Solutions and Recommendations for the Public

Aside from informing technologists, companies and regulators, it’s important to provide actionable steps the public can take to protect their privacy in the era of AI and encryption. Based on what we know about how companies like Apple and Meta plan to integrate AI into applications that have promised privacy, here is what anyone can do to help maintain their privacy and confidentiality:

  • Choose OS-level app permissions carefully : Device-wide AI capabilities like Apple Intelligence mean that you need to be aware of which of your applications interact with AI features.
  • Review App Settings : Regularly check the privacy settings on your applications. If you're concerned about privacy, turn off AI-based features like message summarization or smart replies.
  • Be Aware of What You’re Sharing : Be mindful of the data you share with AI services, especially personal or sensitive information that could be used for training or other purposes. When applications tell you they might use your data for training AI, believe them. Passwords, contact information, and a wide variety of sensitive information might end up in an AI model and out of your control.
  • Beware of Opt-in Conditions : If you choose to invoke MetaAI or Apple Intelligence features in a private or confidential setting, be sure you understand the limitations– is it for all chats? Is it forever?
  • Talk to Your Contacts: If you are having sensitive conversations over E2EE services, have a conversation with relevant contacts, and make sure they aren’t inviting bots to the conversation.

Conclusion

AI features are being developed at a rapid pace, raising significant security risks for users of E2EE applications. It is crucial that AI innovation does not come at the expense of user privacy, and that the strong protections expected from E2EE applications are maintained. Absent perfect technical solutions, service providers should inform and empower users to navigate the interplay between AI and privacy, with transparent disclosures of how data is processed, user-friendly consent mechanisms, and granular controls over how data is used.


Love IX? You can help keep us going!

If you value our work, there are lots of ways you can help support us. Including some that don't cost you anything!

  • Subscribe. If you're not already a paid subscriber, that's the simplest way to support independent writing about technology, human rights and the internet. Until the end of the month, we're offering £20 off annual subscriptions.
  • Make a tax-deductible donation. Internet Exchange is a project of Exchange Point Institute, a 501(c)(3), so you can support our public education work directly.
  • Get your employer to match it. If you work in tech — or anywhere with an employee giving program — search Exchange Point Institute in Benevity. Many companies match employee donations, so your gift could be worth twice as much (or more).
  • Fund or hire us. We also take on funded projects and fee-for-service work in technology, human rights, research, communications and public education.
  • Sponsor a newsletter. We accept sponsorships from values-aligned organizations working in public-interest technology, digital rights, open standards, or related social impact areas.

However you do it: help us bring the conversations shaping the internet into the mainstream.

Support the Internet Exchange

If you find our emails useful, consider becoming a paid subscriber! You'll get access to our members-only Signal community where we share ideas, discuss upcoming topics, and exchange links. Paid subscribers can also leave comments on posts and enjoy a warm, fuzzy feeling.

Not ready for a long-term commitment? You can always leave us a tip .

Become A Paid Subscriber

From the Group Chat 👥 💬

This week in our Signal community, we got talking about:

The US State Department designated Autistici/Inventati (A/I Collective) a terrorist organization. A/I is a volunteer-run collective, founded in 2001, that provides free services like email, web hosting and the Noblogs platform to a large antifascist and anti-capitalist user base. This comes just over a month after Secretary of State Marco Rubio hosted representatives from more than 65 countries at a conference to rally global opposition to ‘left-wing terrorism,’ and vowed more designations would come “soon.”

What seems to frustrate the State Department most is that A/I's services are built around data minimisation. Its fact sheet laments that A/I's users remain "anonymous, untraceable, and beyond the reach of the law." The designation has no legal force in Italy, but it could still prove perilous for A/I's members living under a far-right government.

After the announcement, group members expressed concern for collectives that also provide online communication tools for people and groups working on liberatory social change. The politics of Trump and Rubio are threatening the principles of independent internet providers, just as US Big Tech is consolidating power.

You can read A/I’s statement about the designation

here

.

ICYMI, in a related story Germany's state interior ministers urged the federal Interior Ministry to pursue a full ban on the activist platform indymedia.org through website seizures, takedown orders, and network blocks, plus travel limits for suspected left-wing extremists. (DE) https://de.indymedia.org/node/749687

Want to join the group chat? Become a paid subscriber.


🚨

Stop press! Do you enjoy our links? Links are now available to paid subscribers only. Become a paid subscriber today.

AI Skeptics: From Mathematics to AI Safety (with Jacob Tsimerman)

Math Babe
mathbabe.org
2026-08-26 08:46:44
We were psyched to talk to Fields Medalist Jacob Tsimerman about his decision to leave his math professorship and move to Silicon Valley to work at OpenAI on the Safety team: Apple Spotify YouTube...
Original Article

Home > Uncategorized > AI Skeptics: From Mathematics to AI Safety (with Jacob Tsimerman)

We were psyched to talk to Fields Medalist Jacob Tsimerman about his decision to leave his math professorship and move to Silicon Valley to work at OpenAI on the Safety team:

Apple

Spotify

YouTube

Categories: Uncategorized

Comments (0) Trackbacks (0) Leave a comment Trackback

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Your email address will not be published. Required fields are marked *

Ads in Apple Maps Have Now Launched

Daring Fireball
9to5mac.com
2026-08-27 16:02:35
Ryan Christoffel, 9to5Mac: Apple confirmed to 9to5Mac that the ads rollout in Maps began in the last few days. And it will continue ramping in the weeks ahead to all users. There are two places you’ll find ads in the Maps app: Before searching: Suggested Places in the search screen will featu...
Original Article

Apple has officially launched ads in Apple Maps, with the rollout ramping up in the coming weeks. Here are the details.

Ads in Apple Maps are officially rolling out now in US and Canada

Earlier this year, Apple announced that Maps would get ads in the US and Canada starting this summer. With September almost here, that window was closing.

But Apple has officially hit its target: Apple Maps now officially includes ads.

Apple confirmed to 9to5Mac that the ads rollout in Maps began in the last few days. And it will continue ramping in the weeks ahead to all users.

There are two places you’ll find ads in the Maps app:

  1. Before searching : Suggested Places in the search screen will feature an ad.
  2. After searching : Ads will appear in search results when relevant.

Ads appear just like every other business listing, except they have a small blue badge that says ‘Ad.’ You can see examples of ads in the images above.

Like Apple’s ads policy with other services, the company touts user privacy protections for ads in Maps. Per Apple Newsroom :

Ads on Maps builds on Apple’s broader privacy-first approach to advertising, and maintains the same privacy protections Maps users enjoy today. A user’s location and the ads they see and interact with in Maps are not associated with a user’s Apple Account. Personal data stays on a user’s device, is not collected or stored by Apple, and is not shared with third parties.

If you’re interested in booking ads for your business, Apple has a promotional offer available now as detailed here .

What do you think of Apple’s new ads implementation? Let us know in the comments.

* Buy iPhone with 15% discount from Apple refurbished

Best iPhone accessories

Add 9to5Mac as a preferred source on Google Add 9to5Mac as a preferred source on Google

FTC: We use income earning auto affiliate links. More.

‘How Europe Is Killing Makers and Micro-Entrepreneurs’

Daring Fireball
lectronz.com
2026-08-27 15:42:48
Alain Pannetrat, founder of Lectronz: 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 wor...
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!

Grand Theft Auto VI’s long-overdue gameplay reveal – as it happens

Guardian
www.theguardian.com
2026-08-27 14:48:00
Under some strange circumstances, Rockstar is broadcasting the first (official) gameplay footage of Grand Theft Auto VI, the most-anticipated game of the year. Follow along for everything you need to know. Hello and welcome to the Guardian’s GTA 6 liveblog! I’m Keza MacDonald, video games editor, an...
Original Article

Keith Stuart

Keith Stuart

So before the Netflix extended preview starts, a quick re-cap. GTA 6 is set in the state of Leonida which is Rockstar’s version of Florida. The two playable lead characters are Jason Duval and Lucia Caminos, low ranking operatives for the local smuggler, Brian Heder, but now they’re looking for a way out. Can they escape Vice City or will they be dragged down into the murk by the alligator of petty crime?

All of that pales in comparison to the last week’s set of leaks, though, which have shown an awful lot of the finished game. Rockstar called the leak “devastating” in a statement, and has been aggressively pursuing the perpetrators.

Earlier this year, another hacker group named ShinyHunters also threatened to release stolen data:

Keith Stuart

Keith Stuart

Good evening everyone. Welcome to Vice City! As you may have seen, this month has seen a series of GTA 6 leaks distributed across the internet by a hacker (or hacker group) named Cyberleek. Did they spell ‘leek’ like the vegetable on purpose? We may never know.

Anyway, the leaks have taken the form of short video clips from the game showing different aspects, and hinting at some of the major new features. We’ll try and avoid spoilers on here, but Polygon has a story on the latest batch.

Keza MacDonald

Keza MacDonald

The first major Grand Theft Auto 6 leak happened back in 2022, when a teenager breached Rockstar’s internal Slack channel and posted around 90 minutes of in-development video footage. The British teenager behind that hack was sentenced to an indefinite hospital order in 2023. Here’s a quick primer on what happened then:

Hello and welcome to the Guardian’s GTA 6 liveblog! I’m Keza MacDonald, video games editor, and along with our games correspondent Keith Stuart I’ll be taking you through all the context around the upcoming reveal of the biggest game of the decade.

In about 15 minutes, Rockstar Games will broadcast the first gameplay footage of Grand Theft Auto 6 via Netflix. This game – more than a decade in the making – is sure to be one of the most successful (and most expensive) games ever made, quite probably the most successful, when it releases on November 18. But there have been some strange circumstances surrounding its slow reveal over the past year or so, not least a number of leaks that mean many gamers will have seen a lot of what’s about to be shown already.

Dirk Eddelbuettel: prrd 0.0.7 at CRAN: Maintenance

PlanetDebian
dirk.eddelbuettel.com
2026-08-27 14:42:00
A new minor release of prrd arrived at CRAN this morning: the a first release in two and a half years. prrd facilitates the parallel running [of] reverse dependency [checks] when preparing R packages. It is used extensively for releases I make of Rcpp, RcppArmadillo, RcppEigen, BH, and others. The ...
Original Article

prrd 0.0.7 at CRAN: Maintenance

A new minor release of prrd arrived at CRAN this morning: the a first release in two and a half years. prrd facilitates the parallel running [of] reverse dependency [checks] when preparing R packages. It is used extensively for releases I make of Rcpp , RcppArmadillo , RcppEigen , BH , and others.

prrd screenshot image

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

This release updates continuous intgegration files, switches to Authors@R, and robustifies one SQLite aspect.

The release is summarised in the NEWS entry:

Changes in prrd version 0.0.7 (2026-08-27)

  • Updates to DESCRIPTION have been made as CRAN requirements change

  • The continuous integration setup was updated several times

  • The database connection now uses sqliteSetBusyHandler

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

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

/code/prrd | permanent link

Nvidia Starts Pac as AI Chip Maker Builds DC Influence Force

Hacker News
news.bgov.com
2026-08-27 14:34:40
Comments...
Original Article

Exclusive

Aug. 27, 2026, 3:30 PM UTC ; Updated: Aug. 27, 2026, 4:08 PM UTC

Nvidia Corp. launched a political action committee Thursday to dole out donations to federal candidates, the company’s latest move to build a high-powered influence apparatus in Washington.

As lawmakers and the Trump administration wrangle over an artificial intelligence regulatory framework and voters express concerns about the technology ahead of the midterm elections, Nvidia has been building its influence footprint in the nation’s capital.

The world’s most valuable company, with a market cap of more than $5 trillion, makes chips that power AI.

NVIDIA Corporation Employees Federal Political Action Committee, which will be funded by voluntary contributions from eligible employees capped ...

Learn more about Bloomberg Government or Log In to keep reading:

See Breaking News in Context

Providing news, analysis, data and opportunity insights.

Already a subscriber?

Log in to keep reading or access research tools and resources.

Autism mutations drive neurodevelopmental pathology

Hacker News
www.science.org
2026-08-27 14:23:43
Comments...

The AI ‘Ghosts’ Contaminating Academic Publishing

403 Media
www.404media.co
2026-08-27 14:14:29
“The academic record is being quietly haunted” by researchers with names like Elena Vasquez and Marcus Chen....
Original Article

“Elena Vasquez and Marcus Chen have appeared as volcano experts, astronauts, thriller protagonists, podcast hosts, and academic co-authors across hundreds of independently produced AI-generated documents, never having lived,” a new preprint research paper from Samsung and the University of Warsaw said.

The paper identified a number of names that co-authored hundreds of AI-generated academic papers, articles, and books. The authors don’t actually exist, but are instead names that large language models repeatedly produce when tasked with generating experts in certain fields.

The paper, titled “ The Ghost Couple: Correlated LLM Name Priors and Their Haunting of the Web and Academic Publishing ,” utilized a known phenomenon where certain LLMs will keep coming up with the same names in certain contexts. For example, In June, Sam wrote about how ChatGPT, Gemini, and Claude were likely to use the name Elias Thorne in fiction they generated, and that the character was often a lighthouse keeper. Similarly, users noticed that if they ask ChatGPT to generate a software developer, their name will often be Marcus Chen .

From The Ghost Couple: Correlated LLM Name Priors and Their Haunting of the Web and Academic Publishing

The researchers were able to show not only that LLMs often default to the same names, but that they produce “correlated character ensembles,” meaning some names were more likely to appear together. Other names that were consistently generated by AI models include Elena Amara Okafor from Claude, Aris Thorne and Lena Petrova from Gemini, and Elara Voss from ChatGPT.

Earlier this month, I reported a story about Research Gold, a company that offered what it claimed was human medical research, but that was in fact entirely AI generated . The founder and lead methodologist for that company was named Elena Vasquez. Research Gold removed Elena Vasquez from its site after I published the story.

Michał Brzozowskim, the lead author of the paper, told me that searching for these names on Google turned up other instances of AI generated personalties. For example, following the killing of Alex Pretti at the hands of U.S. Border Patrol agents in January, a rumor spread on Facebook that he was fired from his nursing job for misconduct allegations. Snopes reported that the false statement was attributed to “executive director Dr. Elena Vasquez,” who does not exist.

Brzozowskim was able to search databases of academic papers for the names they knew LLMs often generated.

“On Zenodo, a CERN operated repository that mints real DataCite DOIs, we identify 1,655 ghost-authored records claiming nonexistent journals with fabricated publication dates.” A DOI, or a Digital Object Identifier, is a string of characters and numbers used to identify academic papers. The researchers saw that many of the papers authored by these AI names were backdated, meaning their publication dates were different from the date they were uploaded to Zenodo.

Anyone with a free account can create a DOI on Zenodo, but the existence of AI generated papers with DOIs has impacts on other parts of the web and academic publishing.

“These [AI generated papers] carry real DOIs harvestable by any scholarly aggregator; the infrastructure for large-scale scholarly record contamination is already in place. Ghost names additionally appear on ResearchGate, forming synthetic research groups with collaborators drawn from multiple model families, and are indexed without verification by Google Scholar and Semantic Scholar [...] The academic record is being quietly haunted.”

Research Gate and Google Scholar are both aggregators of academic publishing that are likely to come up in search results.

The researchers say that different LLMs and versions of those LLMs generate certain names so consistently, they think they can use them to determine the provenance of AI slop. For example, the name Elena Vasquez was particularly common in content generated by Claude Sonnet 4, so papers that list her as an author were likely generated by that LLM. However, Brzozowskim said that this level of accuracy might not hold for long now that AI generated content with these names is flooding the internet and feeding back into all AI models that are scraping the internet for training data.

The fact that AI academic publishing is struggling to deal with the load of AI generated content isn’t new. We’ve previously reported that scientific journals have published AI generated text , that AI is impacting the peer review process , and that the open-access repository for preprint academic research Arxiv will now ban authors for a year if they are caught submitting AI generated work . The potential upside of this research is that these names might allow us to detect this AI generated content more easily.

About the author

Emanuel Maiberg is interested in little known communities and processes that shape technology, troublemakers, and petty beefs. Email him at emanuel@404media.co

Emanuel Maiberg

Previewing the Model Hardware Standard

Hacker News
www.anthropic.com
2026-08-27 14:04:50
Comments...
Original Article

We’re opening a research preview of the Model Hardware Standard (MHS), a shared specification for AI agents to safely operate physical devices, to a first group of scientific research labs and advanced manufacturers. MHS enables AI agents to operate multiple lab and manufacturing instruments, such as microscopes, liquid handlers, and robotic arms, in parallel, and perform intricate tasks ranging from routine drug discovery experiments to laser calibration on a quantum computer. The development of MHS began as a collaboration between Anthropic and HHMI Janelia Research Campus .

It typically takes a lab or manufacturing facility weeks, if not months, to set up and integrate their hardware. Most devices don’t communicate with each other, instead requiring specialists to build bespoke integrations. MHS reduces this integration work to hours or minutes. And by incorporating AI into these tools, MHS also helps researchers and engineers more readily orchestrate autonomous, round-the-clock experiments and workflows, with agents able to reason through each step in an experiment, update parameters in real time, and, in some cases, recover from hardware errors without intervention.

We’re sharing an early version of MHS with partners across science, robotics, electronics, and manufacturing so we can collaborate to build safety evaluations and develop best practices for AI systems operating physical equipment, ahead of making the standard open source. MHS works with any device that has a programmable interface. It is also model-agnostic, and any agent harness can access it using standard protocols, such as the Model Context Protocol . To apply for access to the research preview, head here .

How MHS works

Before and after the Model Hardware Standard (MHS).

Getting multiple devices in a lab or on a factory floor to communicate with one another can be challenging, even setting aside the added difficulty of integrating AI into the setup. Each device tends to have its own programming interface, and so far there has been no standardized way to integrate them. And once the devices are connected, there is no common way for them to share data with an AI agent, nor to let the agent operate them safely.

MHS addresses these challenges by introducing a standardized driver: software that translates between a computer’s operating system and a hardware device. The MHS driver uses a simple set of primitives—commands like “read” (for example, “get temperature”) or “write” (for example, “set temperature”)—that any hardware device can understand and act on. And it makes each device discoverable in a standard format, so that devices and agents can find each other and communicate across networks without needing a bespoke “translator” program in between.

The MHS driver also helps an AI agent understand how to use a device it has never seen before, giving it information about machine characteristics that may not be discernable from code alone (for example, the weight of a robot arm, which is important for knowing how to manipulate it safely). To date, much of this information has been stored in paper manuals, on a user’s computer, or as tacit knowledge. But the MHS driver contains tags that let the user write this information directly in natural language (users can either do this themselves, or by chatting to an agent that interviews them about their hardware setup). With the information from these tags, the MHS driver then automatically produces a reference file with information about a device’s general characteristics, such as what it can measure, what can be adjusted, and what safety limits will be enforced. This file gives the agent everything it needs to know to operate the device.

After the devices are connected and the agent knows how to use each one, the agent needs a way to control the hardware. For MHS, there are three such mechanisms: MCP, the command line interface, and code files (APIs). These work together to enable orchestration across multiple devices via a single line of code.

Once the agent can control the devices, it’s able to receive operating data from each one and supervise and direct the work at a high level. The agent can sequence steps across instruments, monitor results, and adjust parameters as conditions change in real time. When the agent needs to execute long-running tasks or operate devices faster than its online reasoning would allow, it can chain together driver commands from one or more devices in code files. This allows the devices to carry out operations themselves, without the agent needing to reason at every step.

As we’ve tested MHS, we’ve found that Claude interacts with experiments and hardware in an exploratory manner, much as a scientist would. For example, we observed Claude make an adjustment to a laser, observe the results through a camera to assess how its adjustment moved the laser beam, and repeat the process, seeking to understand the sequence of events. Claude then packaged what it learned into code files, writing a deterministic script that let it align the laser without having to reason at each step, so the whole process could run as a single command.

Early examples from MHS

We are only just beginning to see what people can do with frontier models and MHS, but our hope is that the standard can be of use to researchers, engineers, and other practitioners in speeding up the process of discovery and experimentation in any domain that uses devices with a programmable interface.

As we developed MHS, we shared it with a handful of labs and hardware manufacturers in biotech, robotics, quantum computing, and other fields. Across these early projects, we saw MHS reduce the time it took to integrate devices, make it possible to iterate faster in a variety of experimental settings, and assist with the live operation of machines and real-time fault detection. Below, our partners share the details of some of their early projects involving MHS.

Genentech: Implementing MHS for lab automation

Researchers at Genentech implemented and tested MHS as a proof of concept for automating the BCA protein assay, a standard procedure to measure total protein concentration in a sample, which requires coordinating across a liquid handler, a robotic arm, and a plate reader.

University of Washington Baker and Pinglay labs: Bringing AI agents to the bench

Zihao Song, a PhD student in the University of Washington Baker and Pinglay labs, used MHS to build a dashboard to remotely monitor his instruments; an AI agent-supervised qPCR (which copies a target DNA sequence through repeated cycles of heating and cooling) that watches amplification curves and halts the procedure at the right moment; and an integration between a robotic arm and a liquid handler for collision-free plate handoffs.

Carnegie Mellon University: Determining dose-response curves through rapid automation

Researchers at Carnegie Mellon University used MHS to run serial dilution dose-response experiments about three times faster than before, with an AI agent orchestrating a liquid handler, a plate reader, a robotic arm, and monitoring cameras spread across three computers with fundamentally incompatible interfaces.

HHMI Janelia: Using MHS to accelerate microscopy research

At HHMI Janelia Research Campus, researchers are using MHS to speed up a range of microscopy-related projects. Here, Virginie Ruetten, a scientist in the Ahrens lab who studies how sleep helps the body recover from stress, shares how she used MHS to unify and orchestrate a rig that previously involved seven different vendor programs without a shared interface.

QuEra Computing: Using MHS in quantum laser stabilization

QuEra, a company that builds quantum computers using neutral atoms, used MHS to give an AI agent control over parts of the laser system inside its quantum machines. The agent developed a controller that recovers the laser’s “lock”—the ultra-precise frequency the lasers must hold to interact with the atoms—99.3% of the time without human intervention.

Tetsuwan Scientific: Using MHS to run qPCRs to profile local pollution

Researchers at Tetsuwan integrated MHS with its automated biology lab platform, ResearchOS. MHS helped orchestrate a qPCR workflow to contribute to citizen science efforts to characterize pollution in California’s San Pedro Creek.

Hardware vendors and the software companies that support them are also building MHS support into their equipment so AI agents can more easily discover and operate their devices. For example:

  • Amazon Web Services will support MHS through Strands Robots, the library for connecting AI agents to physical devices. AWS will provide participants a private, pre-release version of the Strands Robots package for the duration of the MHS research preview.
  • Automata is adding MHS support to LINQ, their lab automation platform, to perform intelligent error handling of instruments in autonomous labs.
  • Danaher and Anthropic are actively exploring how MHS-supported capabilities could enable its smart instruments and autonomous laboratories to scale biomedical research and development.
  • Doosan Robotics is testing MHS with their robotic arms, including to perform automated quality assurance and coordinate tasks across multiple robots.
  • MBF Bioscience is building an MHS driver for ScanImage, the software that runs laser-scanning microscopes in hundreds of neuroscience labs worldwide, to integrate AI agents into real-time data analysis and experiments.
  • QIAGEN is experimenting with MHS through a working proof of concept on its nucleic acid purification platform, QIAsymphony Connect, showing how AI agents could help laboratories troubleshoot instrument issues faster, guide operators through recovery, and improve instrument uptime while reducing risk to biological samples.
  • Tecan is adding MHS support for their Fluent liquid handling platforms so AI agents can discover and operate them directly.
  • Universal Robots has had early access to MHS and plans to add support to its robotics platform.

Joining the research preview

These early results from our partners are encouraging, but we have more work to do on the standard before we open-source it. As a large language model, Claude learns about the physical world through text and images, meaning its spatial and physical reasoning have limitations that still require expert oversight. When working with protein samples, for example, Genentech researchers had to guide Claude to recognize that errors caused by foaming in samples were physical failures, not software bugs, that could only be mitigated through the appropriate physical corrections.

MHS also doesn’t yet work with hardware that lacks a programming interface, so we’re working with the manufacturers of such devices to build in MHS drivers. Many developers already use Claude Code to work with individual pieces of physical equipment; for the next phase of MHS, we hope to expand the standard to cover more of the devices developers build on. Early adopters include Hugging Face, who are adding MHS support in LeRobot, their robotics library, and Raspberry Pi, who are enabling MHS integration across a number of their products following successful tests using their Camera MHS Driver.

We will also use the research preview to build additional safety evaluations with our launch partners and strengthen protections for the use of AI in the physical world. We are developing a physical safety roadmap to further bolster our safeguards policy and enforcement coverage against the risk of misuse. When we open-source MHS, we will release findings from the research preview as part of our guidance for deploying the standard safely.

We’re inviting stakeholders across industries to join the waitlist for our research preview of MHS. If you’d like to participate, submit your interest here .

Acknowledgments

MHS began as a collaboration between Alek Kemeny on Anthropic’s Beneficial Deployments team and Arco Bast, a postdoctoral scientist at HHMI Janelia Research Campus. Bast was running complex brain-imaging experiments on a rig that combined lasers, motorized focusers, and specialized cameras from different vendors with no common interface. To speed up his experiments, he developed a shared memory dictionary that enabled the instruments to communicate with one another at memory speed. Kemeny and Bast worked together to integrate AI models into that interface.

We thank everyone who has contributed to this work so far, including, but not limited to, Aaron Boswell, Ben Arthur, Boaz Mohar, Gagan Bhat, Mark Kittisopikul, Nadine Yasser, Nick Purcell, Takashi Kawase, and Virginie Ruetten. We look forward to moving MHS forward with our industry partners and, soon, with the open-source community.

Related content

Funding better evaluations of AI’s impact on wellbeing

We’re launching a $5 million grant program to fund independent research into how AI impacts users’ wellbeing.

Read more

How Claude’s text watermark works

In this article, we share answers to some of the questions we’ve received about how our chosen watermarking method works, whether it affects Claude’s outputs, and why we’re making this change.

Read more

Improving Fable 5's biology safeguards

We’re making updates to Claude Fable 5’s biology safeguards in a way that substantially reduces false positives. Fable 5 users will now experience many fewer “fallbacks”—where the system switches to a less capable model after they make a biology-related query.

Read more

Show HN: Voronoi Go

Hacker News
voronoigo.com
2026-08-27 14:03:37
Comments...

Trump Sanctions UK Pro-Palestine Group as "Terrorists." An American Former Member Wonders f He Can Go Home.

Intercept
theintercept.com
2026-08-27 13:59:57
Anti-genocide organizers say the "terrorism" label is intended to crush direct action against Israeli weapons shipments. The post Trump Sanctions UK Pro-Palestine Group as “Terrorists.” An American Former Member Wonders f He Can Go Home. appeared first on The Intercept....
Original Article

When police in Kent, United Kingdom, arrested American peace activist Max Geller in 2021 for chaining himself to a van parked in front of an Israeli-owned weapons factory, he knew he might be jailed and face charges for his protest.

What he didn’t realize was that he could be hit with U.S. sanctions five years later for his past ties to a so-called terrorist organization.

The Trump administration on Wednesday announced sanctions against the U.K.-based anti-genocide protest group Palestine Action , which organized the 2021 demonstration and dozens of subsequent actions at U.K. factories owned by Israel’s largest weapons manufacturer, Elbit Systems. The goal, in the U.S. government’s words, is to “protect Americans from the risks posed by far-left terrorism.”

“A major threshold has been crossed,” said Geller, who was previously Palestine Action’s spokesperson but left the group in 2025. “They’re now treating regular Americans who want to effectively oppose genocide as terrorists.”

The specific parameters of the U.S. sanctions are not yet clear, but Treasury Secretary Scott Bessent pledged the government would “continue to cut the financial lifelines of these groups until they are eliminated.” Sanctioned groups and individuals cannot receive funds, goods, or services from American people or business — meaning they’re cut off from both the U.S. banking system and from any donations from Americans who might want to support them. They can have an isolating global effect: Financial institutions outside the U.S. that do business with American companies are often hesitant to affiliate with sanctioned individuals.

As a result, the sanctions could severely curtail their organizing abilities — and restrict their ability to try to stop the flow of weapons that Israel is using to carry out its ongoing genocide in Gaza.

“We are facing unprecedented attacks on dissent by the same powers that are committing genocide in Gaza,” said Huda Ammori, co-founder of Palestine Action, in an interview with The Intercept. “We are at a point in history where it’s extremely crucial to continue to resist and grow in our movement, rather than back down and to adapt and become less reliant on institutions which are essentially controlled by the powers we’re fighting against.”

While the new U.S. sanctions are a part of a long history of post-9/11 policies in its so-called war on terror, the U.K. government has made itself notorious for its specific draconian crackdown on pro-Palestine dissent. Last year, as Palestine Action members began to face terror charges in court for their demonstrations, the U.K. government proscribed the group as a terrorist organization. The organization in the U.K. immediately ceased operations after the terror proscription. Dozens of members in the U.K. are facing criminal trials for their actions at Elbit weapons factories, and more than 1,200 people have been arrested and charged under the U.K.’s Terror Act for attending rallies merely supporting the group.

Reporting from The Telegraph, which first reported the sanctions, suggested Ammori and fellow co-founder Richard Barnard would face lifetime bans from traveling to the U.S., and that British citizens who continue to support the group would be met with harsh visa restrictions.

Geller, who lives in London, wondered if his bank accounts would be frozen, along with his Venmo and PayPal accounts. He said he normally travels back and forth between the U.S. and U.K. to visit his elderly parents — and the thought of doing so now “suddenly has become scary.”

“They want people scared to even think about supporting or engaging in this kind of work,” Geller said. “This is about materially hurting Palestine.”

The new sanctions against Palestine Action, which were announced alongside sanctions against Autistici/Inventati and Masar Badil, were the latest attack in President Donald Trump’s ongoing campaign to suppress advocacy for Palestinian rights and opposition to Israel’s genocide in Gaza. Last year, Trump issued sanctions against the International Criminal Court after the court ordered war crime arrest warrants for Israel’s leaders. Those sanctions targeted people and organizations that work with the court, such as U.N. Special Rapporteur on the Occupied Palestinian Territories Francesca Albanese, who has been outspoken about the crippling effects of the sanctions . The administration has also sanctioned long-standing Palestinian human rights organizations for their work with the ICC.

“The Trump administration is once again weaponizing counterterrorism authorities to criminalize Palestinian political organizing and solidarity,” said Raed Jarrar, advocacy director with Democracy for the Arab World Now , which last month sued to reverse the Trump sanctions on the ICC. “Sanctions are supposed to target genuine threats to national security, not serve as a political weapon against movements challenging Israel’s treatment of Palestinians.”

The vagueness of the new sanctions is meant to strike fear in anyone who is considering support for the sanctioned group, civil liberties advocates told The Intercept. Does a social media post expressing support violate sanctions? How about hosting a talk with an individual in the group?

“Treasury hasn’t been clear on where the line is, and that’s part of the chilling effect,” said Xiangnong (George) Wang, a staff attorney at the Knight First Amendment Institute who specializes in U.S. sanctions. “In sanctioning Palestine Action, I think their target is more broadly a community of people and groups, including Americans who engage with Palestine Action.”

The Treasury Department did not respond to The Intercept’s request for comment.

The sanctions also follow the government’s case against pro-Palestine organizer Fergie Chambers, a past supporter of Palestine Action who was detained for extradition in Spain last month on alleged charges of funding terror groups. The humanitarian aid group Sameer Project, which provided meals and services to Palestinians in Gaza, previously received financial support from Chambers and this month announced it had paused operations in Gaza due to lack of funds.

The Trump-era crackdowns have extended beyond Palestine and Israel, targeting leftists groups in the U.S. who most recently have resisted Immigration and Customs Enforcement’s mass deportation campaign . Under National Security Presidential Memorandum 7, or NSPM-7, the administration has used post-9/11 terrorism laws against protesters , such as pursuing terrorism charges and decades-long prison sentences in the Prairieland Detention Center trial and the government’s case against protesters in Minneapolis .

The repression, said Ammori, has “expanded much more overtly to be used to crush any type of dissent.”

Despite the U.K.’s crackdown on Palestine Action, support for the group and Palestine remains energetic. Rallies in solidarity with Palestine Action and Palestinian rights continue to sprout up across the country even as the government has arrested at least 3,000 people for simple actions such as holding signs that read “I support Palestine Action.” And last year, Elbit closed its facility in Bristol after being targeted by Palestine Action, days before the government outlawed the group.

In the U.S., the group formerly known as Palestine Action U.S., now called Unity Fields as of August 2024, no longer has ties to the U.K.-based group. Though Palestine Action in the U.K. is dormant, secretive cells of Palestine Action are based throughout the U.S. and are continuing to carry out actions . Other Palestine Action cells are targeting the Israeli weapons supply chain in other countries such as Spain, Germany, Ireland, and Poland.

“We have a responsibility to create a huge dent in the Israeli war machine,” Ammori said. “They need to be profitable to operate, and if they’re operating, they’re killing Palestinians — it’s really as simple as that.”

Float Bloat: vector serialization gone wrong

Lobsters
bonsai.io
2026-08-27 13:12:50
Comments...
Original Article

Bonsai has discovered a pervasive issue with vector search across the entire ecosystem, impacting millions of implementations, and present in official vendor SDKs, documentation, tutorials, and articles.

Most embedding models return vectors as float32, but many clients cast and serialize them as float64. That doubles the precision, which doubles the disk and network cost. The extra digits add no accuracy, so you're paying to store and move noise.

We call this problem "Float Bloat"

one embedding value what your encoder prints

+0 wasted bytes per 768-dim vector. These are digits that encode nothing your float32 didn’t already hold

We estimate this problem globally at over 20 Petabytes of unnecessary disk storage overhead.

What does the problem look like? Suppose you get a vector from your favorite model, embeddings API, or inference provider. It will return a list of float32s as the vector:

[ -0.011625106, 0.014652754, 0.0172214, -0.0177951529, 0.027116421, 0.06390719, 0.0082179, ... ]

But when the client casts and serializes the embedding, it raises the values' precision to float64 and adds meaningless digits to every dimension:

[ -0.011625106446444988, 0.014652754180133343, 0.017221400514245033, -0.017795152962207794, 0.02711642161011696, 0.063907191157341, 0.008217900060117245, ... ]

The added precision is just a side effect of floating point conversion (known as widening). It is not more accurate, and the additional digits take up disk space and network bandwidth. Depending on the vector database and search algorithm used, this can also result in additional CPU overhead when calculating vector similarity.

How often does it happen?

At Bonsai, we sampled 18 diverse vector search clusters across all tiers, and found that 12 out of those 18 contained float bloat. All the way from sandbox through enterprise.

We also found it in the main branch of the world's most popular embedding vendor SDK, and in the public documentation of the world's largest cloud companies. It's present in hundreds of blogs and tutorials, and in numerous open source repos.

How does it happen?

Nobody does this on purpose. It's the default behavior in several popular languages used for vector search. Take this Python example. You have an embedding stored in an object and you need to serialize it, either for transfer or storage:

# Python with NumPy
embedding = my_numpy_vec.tolist() #<-- this is the culprit
json.dumps(embedding)

The above will provide float64 widened from float32.

In Python, The fix is cryptic and must be done explicitly, which explains the high prevalence of the problem:

# Python with NumPy
values = my_numpy_vec.tolist()
embedding = [float(f"{value:.9g}") for value in values]
json.dumps(embedding)

Unless care is taken, the problem surfaces often during binary to JSON conversions, conversion to base64 and back, and when the incorrect numeric type is used in the client.

A float32 has nine digits and a float64 has seventeen.

A float32 has a 24-bit mantissa and at most 9 significant digits . Cast it to float64 and the value is unchanged, but it now lives on a far finer grid that needs up to 17 digits . The default serializer will then cast and print all 17.

The serializer usually gets the blame, but the extra digits come from the cast. Most encoders will print a genuine float32 correctly; the value just tends to get promoted to float64 before it ever reaches them.

Real dtype Mantissa bits Round-trip digits Format
bfloat16 8 4 %.4g
float16 11 5 %.5g
float32 24 9 %.9g
float64 53 17 shortest

Estimating impact

We serialized the same 768-dim vector across five languages. Widened JSON runs ~1.8× the shortest-float32 text and ~5× the raw float32 binary. This is about 8 wasted bytes per value, and it repeats on every stored copy and every network hop. A re-index, replica, snapshot, and client cache are four copies and four hops, each carrying the widened precision.

Corpus (768-dim) Widened JSON Shortest text float32 binary Text fix saves Binary saves
1M vectors 15.2 GB 8.6 GB 3.1 GB 6.6 GB 12.1 GB
10M vectors 151.8 GB 86.0 GB 30.7 GB 65.8 GB 121.1 GB

Use this handy calculator to estimate how much of your overhead is waste.

Widened JSON, all copies

Recovered by %.9g (lossless text fix)

~43% smaller, same values, fewer digits

Recovered by going binary

~80% smaller: base64 / Arrow / pgvector, exact

Rough annual bill on the wasted text

commodity object storage + one cross-region ship / yr · order-of-magnitude

Ready to power your search with AI?

Launch a fully managed Elasticsearch or OpenSearch cluster, with built-in vector search and AI capabilities.

Create an AI Ready Search Cluster

Find and Fix It

In the languages with no float32 scalar ( JavaScript, Python, Ruby ), widening is forced the instant a value leaves the typed array, so the fix is to format the digits yourself. In the ones that keep a real float ( Java, C#, Rust ), the fix is simpler: delete the up-cast and let the native encoder see the float32 . Every fix below is lossless.

JavaScript no float32 scalar

◤ where it bloats

JSON.stringify([...f32arr])
// a Float32Array element
// reads back as float64

◦ corrected

'[' + Array.from(f32arr,
  x => x.toPrecision(9)
).join(',') + ']'

Python no float32 scalar

◤ where it bloats

json.dumps(vec.tolist())
// .tolist() promotes f32
// to a Python float (double)

◦ corrected

'[' + ','.join(
  '%.9g' % x for x in vec
) + ']'

Ruby no float32 scalar

◤ where it bloats

JSON.generate(vectors)
// Ruby Float is always
// 64-bit; no f32 exists

◦ corrected

'[' + vectors.map { |x|
  '%.9g' % x
}.join(',') + ']'

Java opts into double

◤ where it bloats

temp.add((double) v[y][j]);
// double[] → Jackson
// prints 17-digit doubles

◦ corrected

float[] embedding = v[y];
// Jackson emits
// shortest-float32

C# opts into double

◤ where it bloats

double[] Embedding { get; }
Serialize(embedding);
// store truncates to f32 anyway

◦ corrected

float[] Embedding { get; }
Serialize(embedding);
// or ReadOnlyMemory<float>

Rust resists by default

◤ where it bloats

json!(vec_f32)
// serde's json! macro
// widens during serialize

◦ corrected

to_string(&vec_f32)
// serde (ryu) emits
// shortest-float32

We've also released a new agent skill bonsai-fix-float-bloat , available in the Claude Marketplace as part of omc/search-skills that can find and fix this issue for you. See it in our Search Skills repository on Github.

It's almost never your embedding service

We surveyed OpenAI, Voyage, Cohere, Jina, Google, AWS, and Huggingface inference endpoints on float32 models. Every native wire we could sample emits shortest-float32 decimals. If your stored vectors are seventeen digits long, look at your client because that's probably the problem.

Where it actually enters

SDK .tolist() calls, OpenAI-compatible wrapper shims, framework serializers, and “save embeddings to JSON” tutorials. OpenAI’s own SDK even requests compact base64 float32 bytes, then throws the win away with .tolist() .

The cure already shipped

Cohere, Voyage, and Jina expose int8 , binary , and base64 output types. A 1024-d binary vector is 128 bytes versus ~11 KB of widened JSON. Most tutorials ignore them and hand-roll json.dumps instead.

The fix, in order of preference

The bug needs two things on the storage path: a promotion to float64 , and writing it as decimal text. Break either link and the bloat is gone.

  1. Serialize at the real precision. %.9g (Python/C), f32 ryu (Rust), strconv.AppendFloat(b, x, 'g', -1, 32) (Go), toPrecision(9) (JS).
  2. Don't leave binary in the first place. If both ends are yours, ship base64 float32 bytes, Arrow, npy, or protobuf repeated float .
  3. Pass through without re-serializing. If you're only relaying already-correct text, stream the bytes; don't parse-then-re-encode.

Also, talk to us at Bonsai if you're interested in seeing how we can help scale up your hybrid and vector search needs.

UNIX V4 workshop at Low Resource Computing

Lobsters
github.com
2026-08-27 12:43:34
Comments...
Original Article

UNIX V4 workshop at Low Resource Computing

At the Low Resource Computing 2026 workshop at Dartmouth, I hosted an interactive session on UNIX V4. This version of UNIX was recently recovered from a 1974 magnetic tape found at the University of Utah and is the earliest complete machine-readable snapshot of UNIX. I taught how to do software development using the tools of the day, particularly the ed text editor with a teletype, and participants solved a coding challenge, all signed into the same machine.

This repository reproduces the disk image and terminal logs from the workshop, as well as my setup .

Heathkit H19 displaying LRC 2026 text art in the o8 font

Terminals

Before the workshop, I modified the kernel to support up to 32 simultaneous terminal connections, raised from the previous 20. It uses 16 KL terminals and 16 DC terminals. I would have also configured 16 DH terminals, bringing the total up to 48 terminals, the theoretical limit for this version of UNIX, but the PiDP-11 fork of the SIMH emulator does not support this multiplexer.

I had two physical terminals connected (a Silent 700 teleprinter and a Heathkit CRT terminal), 29 telnet connections from participants' laptops, as well as the main console on the PiDP-11.

Find the terminals you used in this list:

The logs for each terminal line

I describe my configuration for reproducibility, though the notes are mostly intended for myself. I will rework it into a tutorial for configuring V4–V7 later.

Getting started

I handed out printed manuals to teach the system in the manner of the day. The ed manuals were particularly helpful. Alex even came back the next day using ed commands I didn't teach, from having read it all. I had also hoped to setup the man command, but didn't get it working in time.

First, we created user accounts for everyone. Since this was accomplished by editing /etc/passwd , I handled this for most people, to avoid people overwriting others' changes. They were creative with their user IDs.

% cat /etc/passwd
root::0:1::/:
bin::3:1::/bin:
thalia::4:4::/usr/thalia:
ben::5:5::/usr/ben:
alex::9:9::/usr/alex:
newt::64:64::/usr/newt:
auberon::18:18::/usr/auberon:
ncb::12:12::/usr/ncb:
joe::88:88::/usr/joe:
cody::25:25::/usr/cody:
hash::31337:31337::/usr/hash:
dnm::55555:55555::/usr/dnm:
ty::1990:1990::/usr/ty:
justin::70:70::/usr/justin:
yang::16::16::/usr/yang:
doug::8:::/usr/doug:
amitb::6:6::/usr/amitb:
voytilla::7:7::/usr/voytilla:
kevin::10:10::/usr/kevin:
michael::30:30::/usr/michael:
bx::42:42::/usr/bx:
hacker::256:256::/usr/hacker:
jordan::69:69::/usr/jordan:
dominic::111:111::/usr/dominic:

Quirks

Perhaps the largest adjustment was that everyone instinctively reached for backspace to fix typos, but it would instead send a literal ASCII backspace character. This happened hundreds of times. Early UNIX was designed for printing terminals and, of course, text cannot be cleared once it's printed on paper. Instead, it used # to erase the last character and @ to erase the current line, borrowed from Multics. One participant marveled at how instinctive this was for me. amitb found that the erase character could be configured to backspace with stty erase '^h' , but alas that only worked in later versions of UNIX.

Another pervasive surface difference was that cd was named chdir until V7. Participants ran into cd: not found about 100 times.

But by the end, this was no longer a limitation and someone hacked the shell to laugh at you if you typed cd :

% cd dir
haha
% ed /usr/source/s2/sh.c
10267
/cd/;/}/p
                if(equal(cp1, "cd")) {
                        prs("haha\n");
                        return;
                }

A modification to sh to print "haha" for cd

A confusing quirk was that login would sometimes use an all-caps mode for compatibility with the Teletype Model 33. It cycles between terminal settings until one works, so if you can't sign in, it attempts under all-caps mode. This was especially prone to happen for the KL terminal sessions. That driver assumes that the terminal is always connected and doesn't wait for it to be ready, so the initial login: prompt would always be lost. After pressing return, it would then cycle to the next setting and present an all-caps prompt, making your whole session uppercase. This happened about 14 times.

LOGIN INCORRECT.
NAME: ROOT
# CD /USR
CD: NOT FOUND
# CHDIR /USR

Paper

I brought my TI Silent 700 Model 707/1200 teleprinter to demonstrate computing on paper. Before the world transitioned to CRT terminals, teletypes printed your session onto paper. The paper was your monitor and cut/paste was done with scissors and tape.

Thalia holding a roll of paper printed by the Silent 700

Alex was particularly fond of the teletype and was usually found sitting behind it. Auberon found the long roll of paper so amusing that she will show this photo of me holding it to her students to show how computing has progressed.

We used up the last bit of paper by printing a meter-long Saturn V rocket ASCII art , preceded by a countdown of ten beeps. Streaks of red in the paper warned us of the impending end, and the rocket looked bloodied.

A photo of the Heathkit H19 displaying LRC 2026 text art with the o8 FIGlet font became the unofficial icon of the workshop, and it was printed onto stickers.

Challenge

I challenged participants to backport the winning program of the inaugural International Obfuscated C Code Contest, mullender.c , from UNIX V7 in 1984 to V4 in 1974. It exploits quirks of the early cc and backporting it touches surprisingly deep into the system for something so short. This was one of the first things I did with UNIX V5, before we recovered V4, so I figured it could be doable for new users.

This program prints a :-) smiley face scrolling across the screen, but is written in PDP-11 and VAX machine code. It is as follows:

/* Portable between VAX11 && PDP11 */
short main[] = {
        277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
        -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
        14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
        4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
        0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
        4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#',
        0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
        'p', 072163, 'r', 29303, 29801, 'e' };

I placed the program at /usr/thalia/mullender.c and hints at /usr/thalia/hints/ , then set them loose.

Three users solved the challenge: alex , kevin , and jordan .

Alex and Travis collaborated and used Travis' HP calculator to convert between bases. Jordan used dc (desk calculator) to perform arithmetic.

% dc
_30419
15
-
p
    -30434
q

The original uses a non-existent system call to add a delay between prints, but this doesn't work in V4, as non-existent syscalls trap with Bad system call -- Core dumped instead. The solution involves replacing it with some other syscall that does not produce an effect. Alex and Kevin matched what I did, switching it to getuid , but Jordan instead chose smdate . This syscall originally would set the modified time of a file, but it was removed, as it caused issues for tools that observed file times. Its nullsys handler has no effect, but it still consumes an argument, so it skips the sob branch and prints extra fast.

% ed /usr/sys/ken/sysent.c
1957
/45/
        0, &nosys,                      /* 45 = tiu */
/getuid/
        0, &getuid,                     /* 24 = getuid */
/smdate/
        1, &nullsys,                    /* 30 = smdate */

Alex scripted the hexadecimal syntax fixes by using the old behavior of the Thompson shell: Commands that consume stdin would read from the script file until they exited, so commands and input were interleaved with no quoting like the later heredocs.

% cat /usr/alex/hint3b
ed mullender.c
/0xbef/s//05757/
/0x52d7/s//051327/
/0x4bc/s//02274/
g/0x9/s//011/
/0x7e82/s//077202/
/0x8/s//010/
/0x6176/s//060566/
w
q
% sh hint3b
469
469
% 

auberon , bx , and amitb successfully backported the syntax changes and cody almost finished that.

bx learned the db debugger and traced program execution.

amitb formatted it artistically:

/* Portable between VAX11 && PDP11 */
int main[] {
        277, 04735, -4129, 25, 0,
    477, 1019, 3055, 0, 12800, -113,
  21119, 21207, -1006, -7151, 0, 1212,
 020004, 14880,               10541,
 2056, 04010,                 4548,
 3044, -6716,                 9, 4407,
 6, 5568,                     1,
 -30460, 0,                   9, 5570,
 512, -30419,                 32386,
 0760, 6, 0, 4, 02400, 15, 0, 4, 1280,
  4, 0, 4, 0, 0, 0, 8, 0, 4, 0, 44,
   0, 12, 0, 4, 0, 35, 0, 020, 0, 4,
    0, 30, 0, 026, 0, 24950, 120,
      25712, 112, 072163, 114,
          29303, 29801, 101
};

After this, they had become quite proficient in ed.

Playing

Besides programming, people also found the games in /usr/games . Hunt the Wumpus was rather popular and someone discovered a difference in bj from the traditional Blackjack rules.

% /usr/games/wump
Instructions? (y-n) y

Welcome to 'Hunt the Wumpus.'

The Wumpus lives in a cave of 20 rooms.
Each room has 3 tunnels leading to other rooms.

A legend

Doug McIlroy visited on the third day of the workshop. He was the first-ever UNIX user, and responsible for it growing beyond the initial research group. He gave a talk on bare m4, a single-operation version of the m4 macro processor with only define , which is nonetheless Turing-complete.

Doug McIlroy explaining bare m4

Afterwards, he setup an account, doug , for himself on UNIX V4. He was accustomed to later versions of ed that allow omitting the closing slashes and the later passwd format, but he still had the muscle memory.

We chatted about the early years of UNIX: They used a Teletype Model 33 ASR as the console teletype until the end, even though they didn't use it for programming, as a hardcopy terminal was useful. Ken and Dennis worked at night, out of his sight, and although they had terminals setup at home, they worked better together and dutifully came into the Labs. Early UNIX distributions were produced with the GE 635, since it had a magtape drive, but the PDP-11 didn't. Bob Morris and Ken wrote a program that printed a million digits of e and used a roll of paper. Doug's speech synthesizer wasn't widely distributed, but I pointed out that V4 had a Screw Works driver. Doug wrote the roff for Multics.

It was a privilege sharing a UNIX system with Doug. Since research progressed so quickly, this would have been the first time in 52 years that he had used this version of UNIX.

Hacking

Ben was particularly curious about the limits of the user and group IDs and changed his several times.

ben::5:5::/usr/ben:
ben::65535:65535::/usr/ben:
ben::-1-1::/usr/ben:
hacker::256:256::/usr/hacker:

He first tried unsigned -1, then signed -1. He hypothesized that it simply used scanf , so a sign would be accepted, but the parsing was simpler than that and still produced a usable uid. However, his entry was missing a colon, so he couldn't sign in anyways.

% ed /usr/source/s1/login.c
2884
/uid =/;.+2p
        uid = 0;
        while (*np != ':')
                uid = uid*10 + *np++ - '0';

After reading the shell source, he realized that any uid equal to 0 mod 256 was a super user, so he made an account with a uid of 256 and was treated as root.

% ed /usr/source/s2/sh.c
10267
/acname =/;/}/p
        acname = "/usr/adm/sh_acct";
        promp = "% ";
        if(((uid = getuid())&0377) == 0) {
                promp = "# ";
                acname = "/usr/adm/su_acct";
        }
q
% ^D
login: hacker
# 

Messaging

We had at least 11 users active simultaneously, though there were probably more at other times:

# who
root    tty0 Aug 18 10:36
ty      tty1 Aug 18 10:52
hash    tty2 Aug 18 10:50
root    tty8 Aug 18 10:53
ty      ttyc Aug 18 10:54
newt    ttyk Aug 18 10:43
cody    ttyl Aug 18 10:48
alex    ttym Aug 18 10:48
newt    ttyn Aug 18 10:39
dnm     ttyq Aug 18 10:49
ncb     ttyt Aug 18 10:43

Some messaged themselves:

# write root

␇␇␇Message from root...
hiiiiiii
hiiiiiii

and to others:

# 
␇␇␇Message from alex...
hey! what ar you doing???
EOT

# 
# write alex
{not much!!! hacking the planet)
# 

Mail was sent:

% mail kevin
is this thEOT
ing on

% 

and I wrote directly to others' terminal devices:

% who
% cat > /dev/tty1
hello
how
are
you
% 

Finishing

By the end, we had become acquainted with the system, learned ed , programmed a bit in C, played some games, mailed each other, and used up a whole roll of paper. Great success!

login: thalia
% cat thanks
thank_you
from_darpa_dan

The final group, just before decommissioning UNIX V4

We found a division by zero bug in FFmpeg with a vibecoded fuzzer

Hacker News
code.ffmpeg.org
2026-08-27 13:53:40
Comments...
Original Article

Hello.

This is a bug found with our fuzzer: https://github.com/daedalus/fuzzer/

File : libavformat/vpk.c:89
Severity : Medium — crafted 21-byte input crashes any FFmpeg-based application that opens a malicious .vpk file or stream
Root cause : vpk_read_packet divides vpk->last_block_size by par->ch_layout.nb_channels without checking whether nb_channels is zero. A malformed VPK header can set nb_channels = 0 , causing SIGFPE on the division.

Description

The Sony PS2 VPK demuxer ( libavformat/vpk.c ) reads audio blocks from a custom container format. In vpk_read_packet , the last block of the stream is handled specially:

if (vpk->current_block == vpk->block_count) {
    unsigned size = vpk->last_block_size / par->ch_layout.nb_channels;
    unsigned skip = (par->block_align - vpk->last_block_size)
                    / par->ch_layout.nb_channels;
    ...
}

Both size and skip divide by par->ch_layout.nb_channels . When nb_channels is zero, the CPU raises SIGFPE (integer divide-by-zero exception).

Trigger Chain

  1. Demuxer probe ( vpk_probe ) matches the VPK big-endian magic and assigns the input to the VPK demuxer.
  2. vpk_read_header parses the 24-byte header. The fuzz input sets nb_channels = 0 at header bytes 0x0e 0x11 . vpk_read_header does validate nb_channels > 0 , but in the fuzzer's custom-AVIO path the probe/header data and the later packet-read data can diverge: by the time vpk_read_packet runs, par->ch_layout.nb_channels has reverted to 0 from the original fuzz stream while vpk->last_block_size and vpk->block_count were computed from probe data with a valid channel count. The division is therefore reached with a live-but-zero divisor.
  3. vpk_read_packet reaches the final-block branch and divides by zero on both size and skip .

Crash Input

Hex dump of the 21-byte crash input ( crash_1787378545_34bc062c_sig_signal8.bin ):

00000000  20 4b 50 56 56 50 00 f8 04 00 3b 03 61 39 56 32  | KPVVP....;.a9V2|
00000010  36 36 30 38 50                                    |6608P|
  • Bytes 0–3: 20 4b 50 56 — ASCII " KPV" , which is the VPK big-endian magic VPK byte-reversed across a word boundary
  • Byte 0x0e–0x11: 00 00 00 00 nb_channels = 0 , the crash trigger

GDB Backtrace

Program received signal SIGFPE, Arithmetic exception.
0x00005555557a9877 in vpk_read_packet (s=0x555557fed700, pkt=0x555557fed300)
    at libavformat/vpk.c:89
89   unsigned size = vpk->last_block_size / par->ch_layout.nb_channels;

#0  vpk_read_packet
#1  ff_read_packet
#2  read_frame_internal
#3  av_read_frame
#4  fuzz_ffmpeg
#5  main

Crash Metadata

Field Value
Signal SIGFPE (returncode −8)
Fault address / RIP 0x7ffff48a66d7 (instruction itself)
RSP 0x7fffffffcce0
Execs to find 495,211
Corpus at find 13,188 entries
Elapsed 10 h 43 m
Parent seed 36e65f4009ba0cab
Target SHA256 d704c2a52b21bd33

Exploitability Assessment

Factor Assessment
Crash determinism Deterministic — 21 bytes, single demuxer code path
Trigger depth Shallow — avformat_open_input auto-detects format from magic
Preconditions None — input is self-contained, no network, no heap setup
Signal type SIGFPE (integer divide-by-zero), not memory corruption
Memory safety No OOB read/write, no use-after-free, no NULL dereference
Reach Any application that calls avformat_open_input + av_read_frame on untrusted data
Severity Medium — reliable DoS; not an immediate code-execution primitive

The divide-by-zero is a denial-of-service primitive. There is no controlled write or arbitrary read adjacent to the faulting instruction. The input can be embedded in a .vpk file or a container that identifies itself as VPK to trigger the crash in any FFmpeg-linked application.

Suggested Fix

Add a guard at the top of vpk_read_packet to reject zero-channel streams cleanly:

static int vpk_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    AVCodecParameters *par = s->streams[0]->codecpar;
    VPKDemuxContext *vpk = s->priv_data;
    int ret, i;

    if (par->ch_layout.nb_channels == 0)
        return AVERROR_INVALIDDATA;

    vpk->current_block++;
    ...
}

This is consistent with the existing validation in vpk_read_header ( if (st->codecpar->ch_layout.nb_channels <= 0) return AVERROR_INVALIDDATA; ) and returns a clean error instead of SIGFPE .

Regression Test

/* Trigger: 21-byte VPK stream with nb_channels=0 — SIGFPE in vpk.c:89 */
static const unsigned char vpk_crash[] = {
    0x20, 0x4b, 0x50, 0x56, 0x56, 0x50, 0x00, 0xf8,
    0x04, 0x00, 0x3b, 0x03, 0x61, 0x39, 0x56, 0x32,
    0x36, 0x36, 0x30, 0x38, 0x50
};

/* Expect: av_read_frame returns -22 (AVERROR_INVALIDDATA), does not crash */

Hello. This is a bug found with our fuzzer: https://github.com/daedalus/fuzzer/ **File**: `libavformat/vpk.c:89` **Severity**: Medium — crafted 21-byte input crashes any FFmpeg-based application that opens a malicious `.vpk` file or stream **Root cause**: `vpk_read_packet` divides `vpk->last_block_size` by `par->ch_layout.nb_channels` without checking whether `nb_channels` is zero. A malformed VPK header can set `nb_channels = 0`, causing `SIGFPE` on the division. ### Description The Sony PS2 VPK demuxer (`libavformat/vpk.c`) reads audio blocks from a custom container format. In `vpk_read_packet`, the last block of the stream is handled specially: ```c if (vpk->current_block == vpk->block_count) { unsigned size = vpk->last_block_size / par->ch_layout.nb_channels; unsigned skip = (par->block_align - vpk->last_block_size) / par->ch_layout.nb_channels; ... } ``` Both `size` and `skip` divide by `par->ch_layout.nb_channels`. When `nb_channels` is zero, the CPU raises `SIGFPE` (integer divide-by-zero exception). ### Trigger Chain 1. **Demuxer probe** (`vpk_probe`) matches the `VPK ` big-endian magic and assigns the input to the VPK demuxer. 2. **`vpk_read_header`** parses the 24-byte header. The fuzz input sets `nb_channels = 0` at header bytes `0x0e`–`0x11`. `vpk_read_header` does validate `nb_channels > 0`, but in the fuzzer's custom-AVIO path the probe/header data and the later packet-read data can diverge: by the time `vpk_read_packet` runs, `par->ch_layout.nb_channels` has reverted to `0` from the original fuzz stream while `vpk->last_block_size` and `vpk->block_count` were computed from probe data with a valid channel count. The division is therefore reached with a live-but-zero divisor. 3. **`vpk_read_packet`** reaches the final-block branch and divides by zero on both `size` and `skip`. ### Crash Input Hex dump of the 21-byte crash input (`crash_1787378545_34bc062c_sig_signal8.bin`): ``` 00000000 20 4b 50 56 56 50 00 f8 04 00 3b 03 61 39 56 32 | KPVVP....;.a9V2| 00000010 36 36 30 38 50 |6608P| ``` - Bytes 0–3: `20 4b 50 56` — ASCII `" KPV"`, which is the VPK big-endian magic `VPK ` byte-reversed across a word boundary - Byte 0x0e–0x11: `00 00 00 00` — `nb_channels = 0`, the crash trigger ### GDB Backtrace ``` Program received signal SIGFPE, Arithmetic exception. 0x00005555557a9877 in vpk_read_packet (s=0x555557fed700, pkt=0x555557fed300) at libavformat/vpk.c:89 89 unsigned size = vpk->last_block_size / par->ch_layout.nb_channels; #0 vpk_read_packet #1 ff_read_packet #2 read_frame_internal #3 av_read_frame #4 fuzz_ffmpeg #5 main ``` ### Crash Metadata | Field | Value | |---|---| | Signal | `SIGFPE` (returncode −8) | | Fault address / RIP | `0x7ffff48a66d7` (instruction itself) | | RSP | `0x7fffffffcce0` | | Execs to find | 495,211 | | Corpus at find | 13,188 entries | | Elapsed | 10 h 43 m | | Parent seed | `36e65f4009ba0cab` | | Target SHA256 | `d704c2a52b21bd33` | ### Exploitability Assessment | Factor | Assessment | |---|---| | Crash determinism | **Deterministic** — 21 bytes, single demuxer code path | | Trigger depth | Shallow — `avformat_open_input` auto-detects format from magic | | Preconditions | None — input is self-contained, no network, no heap setup | | Signal type | SIGFPE (integer divide-by-zero), not memory corruption | | Memory safety | No OOB read/write, no use-after-free, no NULL dereference | | Reach | Any application that calls `avformat_open_input` + `av_read_frame` on untrusted data | | Severity | **Medium** — reliable DoS; not an immediate code-execution primitive | The divide-by-zero is a **denial-of-service** primitive. There is no controlled write or arbitrary read adjacent to the faulting instruction. The input can be embedded in a `.vpk` file or a container that identifies itself as VPK to trigger the crash in any FFmpeg-linked application. ### Suggested Fix Add a guard at the top of `vpk_read_packet` to reject zero-channel streams cleanly: ```c static int vpk_read_packet(AVFormatContext *s, AVPacket *pkt) { AVCodecParameters *par = s->streams[0]->codecpar; VPKDemuxContext *vpk = s->priv_data; int ret, i; if (par->ch_layout.nb_channels == 0) return AVERROR_INVALIDDATA; vpk->current_block++; ... } ``` This is consistent with the existing validation in `vpk_read_header` (`if (st->codecpar->ch_layout.nb_channels <= 0) return AVERROR_INVALIDDATA;`) and returns a clean error instead of `SIGFPE`. ### Regression Test ```c /* Trigger: 21-byte VPK stream with nb_channels=0 — SIGFPE in vpk.c:89 */ static const unsigned char vpk_crash[] = { 0x20, 0x4b, 0x50, 0x56, 0x56, 0x50, 0x00, 0xf8, 0x04, 0x00, 0x3b, 0x03, 0x61, 0x39, 0x56, 0x32, 0x36, 0x36, 0x30, 0x38, 0x50 }; /* Expect: av_read_frame returns -22 (AVERROR_INVALIDDATA), does not crash */ ```

M5Stack Launches PaperMono

Hacker News
shop.m5stack.com
2026-08-27 13:50:57
Comments...
Original Article

M5Stack today launches PaperMono, a compact ESP32-S3-based E-Ink development terminal designed for low-power information display, interaction, and connected IoT projects. PaperMono is now available through the M5Stack Store.

Product Value

Featuring a 3.97-inch 4-level grayscale E-Ink display, touch input, integrated frontlight, NFC, LoRa, microSD storage, RTC, and a built-in 1150mAh battery, PaperMono brings display, interaction, power, and connectivity into one integrated device.

Key Features

Display and Interact

The 3.97-inch 4-level grayscale E-Ink display provides a low-power viewing experience with the look and feel of paper. Touch input enables interactive interfaces, while the integrated frontlight supports comfortable use in low-light environments.

PaperMono also supports the CrossPoint Reader firmware , bringing an open and flexible reading experience to this compact E-Ink device.

Connect and Respond

Built-in NFC and LoRa support connected projects such as digital badges, identity displays, remote messages, sensor status screens, and other low-power IoT applications.

Build and Extend

Powered by the ESP32-S3R8 and supported by microSD storage, RTC, IMU, Wi-Fi, and a 1150mAh battery, PaperMono provides an integrated foundation for building and experimenting with E-Ink projects.

Version Comparison

PaperMono is also available in a Lite configuration for makers who want the core E-Ink development experience without NFC or LoRa connectivity. Both versions share the same 3.97-inch touch display, integrated frontlight, and ESP32-S3R8 platform.

PaperMono is designed for connected projects that require near-field identification or long-range, low-power communication. PaperMono-Lite is a focused option for E-Ink development without those connectivity features.

Compare the Versions →

Applications

Detailed Specification

See Detailed Specifications →

Turn Ideas into E-Ink Projects

PaperMono and PaperMono-Lite are now available from the M5Stack Store. Choose PaperMono for NFC and LoRa connectivity, or PaperMono-Lite for the core E-Ink development experience.

Shop PaperMono →

About M5Stack

M5Stack is a leading provider of modular, open-source IoT development solutions. We offer an integrated platform combining easy-to-use hardware, intuitive software, and customization services, empowering developers and businesses to rapidly prototype and deploy innovations across IIoT, smart retail, home automation, AI-powered applications, and STEM education.

Show HN: Yet another minimal and lightweight terminal multiplexer written in Go.

Hacker News
github.com
2026-08-27 13:44:53
Comments...
Original Article

hrdx - run all your coding agents in one terminal

license Go 1.25+

hrdx.dev

What is it?

hrdx is a experimental, minimal and lightweight terminal multiplexer built for the agent era: your projects as workspaces in a sidebar, tabs per workspace, and real terminal panes running Codex CLI , Claude Code , pi , zot or plain shells side by side. Kick off an agent in one project, switch to the next, and let the sidebar spinners tell you who is still working.

  • Real terminals, not wrappers. Every pane is a genuine PTY session with a full terminal emulator behind it. Agent TUIs run exactly as they do standalone: streaming, slash commands, sessions, mouse support, all of it. Panes present a clean terminal identity so capability-sniffing TUIs pick rendering paths that work inside a multiplexer, and HRDX=1 lets tools detect they run inside hrdx.
  • Everything in view. The sidebar shows one hierarchy of workspaces, Git branches, and panes, adding tab rows only when a workspace has multiple tabs. Every pane has a shared status circle: agents become animated braille spinners while working, and an unfocused agent turns orange when it finishes. Focusing the pane acknowledges it and restores green.
  • Feels like your terminal. Scrollback, mouse selection with clipboard copy, drag-to-resize splits, drag-to-reorder workspaces, right-click context menus, and kitty keyboard protocol pass-through so even exotic chords like ctrl+1 reach your agent.
  • Picks up where you left off. Quit and relaunch: shells and agents keep running in a lightweight session holder and reattach exactly where they were, running commands and all. Workspaces, tabs, splits, and ratios come back too, and if a session is truly gone, agents resume their latest conversation from their own session store.
  • Yours to tune. A settings window ( ctrl+b , or the gear in the sidebar) lets you switch individual agents on or off, pick a notification sound for finished turns (including your own audio files), and change the color theme, with user themes as simple JSON files. All persisted. See Themes .
  • Bring your own agent. Register any agent CLI as a custom harness via a small JSON file, including its own busy detection for the sidebar spinner and finish sound. It shows up in pickers, cycling, and settings like the built-ins. See Custom harnesses .
  • Scriptable from outside. A JSON socket API lets scripts and editors inspect workspaces and pane states, open projects, spawn panes, type into agents, wait for them to finish, read their screens, and subscribe to live events. See Socket API .

Install

curl -fsSL https://www.hrdx.dev/install.sh | bash
irm https://www.hrdx.dev/install.ps1 | iex

macOS, Linux, or Windows (10 1809+ / 11, via ConPTY ), plus at least one agent CLI on your PATH: codex , claude , pi or zot . Update on any supported platform with hrdx update .

Run

Open several projects at once, or pick your default agent:

hrdx --cwd ~/Developer/api --cwd ~/Developer/web
hrdx --agent claude

Flags

Flag Purpose
--cwd PATH Open a project as a workspace, repeatable
--agent ID Default agent for new panes: zot , pi , claude , codex (default zot )
--provider ID Pass a provider to every zot pane (zot only)
--model ID Pass a model to every zot pane (zot only)
--reasoning LEVEL Set the reasoning level (zot only)
--continue Resume each project's latest session
--codex-bin PATH Use a specific codex binary
--claude-bin PATH Use a specific claude binary
--pi-bin PATH Use a specific pi binary
--zot-bin PATH Use a specific zot binary
--shell PATH Shell for shell panes (default $SHELL ; on Windows only when resolvable, otherwise %COMSPEC% / powershell.exe )
--state PATH State file for workspace persistence (empty disables)
--fresh Ignore saved workspaces and start clean
--api Serve the control API on a unix socket (default on, --api=false disables)
--persist Keep pane processes alive across restarts via the session holder (default on)

A native Windows hrdx.exe launched from Git Bash ignores an MSYS-only SHELL value such as /usr/bin/bash , which Windows cannot resolve, and falls back to %COMSPEC% . To use Git Bash for panes, pass a native path explicitly, for example hrdx --shell "C:/Program Files/Git/bin/bash.exe" .

Keys

All keys go to the focused terminal, except the ctrl+b prefix (tmux style):

After ctrl+b Action
c or C Split right / below (opens a picker: installed agents or shell)
a or A Split right / below with the default agent directly
s or S Split with a new shell pane directly (right / below), also % / \" and | / -
w New workspace (directory prompt with tab completion, then agent/shell picker)
t New tab in the current workspace (opens the agent/shell picker)
n or p Next / previous tab
] or [ Next / previous workspace
tab or shift+tab Next / previous pane; stays in prefix mode for repeated jumps, esc exits
/ Fuzzy finder over every workspace, tab, and pane: type to filter, arrows select, enter jumps
r Rename the focused pane
m Open the pane context menu
= Equalize all splits
u or d (or pgup / pgdown ) Scroll the focused pane's history
esc / G Back to live output, clear selection
, Settings window: enable / disable agents, notifications
x Close pane (sibling takes its room)
X Close workspace
ctrl+b Send a literal ctrl+b to the pane
q Quit
left / right Scroll the hint row in the footer (narrow terminals)

Panes whose process exits (for example exit in a shell) close automatically; the sibling pane takes the room. Panes that fail to start stay visible with the error.

Custom keys

Prefix keys are remappable via a keys.json next to the state file ( ~/Library/Application Support/hrdx/keys.json on macOS, $XDG_CONFIG_HOME/hrdx/keys.json on Linux, %AppData%\hrdx\keys.json on Windows). It maps action names to a single key; an override replaces that action's default keys. The prefix action remaps the ctrl+b trigger itself, not just an action inside it:

{
  "find": "f",
  "quit": "Q",
  "agent-cycle": "g"
}

Actions: prefix , literal , quit , picker-right , picker-down , agent-right , agent-down , agent-cycle (unbound by default), shell-right , shell-down , workspace , tab-new , tab-next , tab-prev , space-next , space-prev , pane-next , pane-prev , find , close-pane , close-space , equalize , rename , menu , settings , scroll-up , scroll-down , live .

Mouse

Everything is clickable: workspace, tab, and pane rows in the sidebar, the main tab bar, menus, and the settings entry at the bottom. Drag workspaces to reorder them, drag pane borders to resize, right-click for context menus, and drag with the left button to select text (copied straight to your clipboard). Wheel events go to the pane under the cursor: agent TUIs scroll themselves, shells scroll their local history, and shift+pgup / shift+pgdn do the same from the keyboard.

Remote and container panes

Every pane is a real PTY, so a shell pane can connect to a remote host, Docker container, or Kubernetes workload. For an interactive shell:

ssh user@host
docker exec -it -w /workspace container-name sh
kubectl exec -it -n namespace deploy/app -- sh

An agent installed at the target can be launched directly instead:

ssh -tt user@host 'cd /path/to/project && exec codex'
docker exec -it -w /workspace container-name codex
kubectl exec -it -n namespace deploy/app -- codex

Use the same pattern for any supported or custom agent. Authentication and the agent executable, configuration, credentials, and project files must be available at the target.

To make remote and container agents appear in pickers, agent cycling, settings, and the sidebar, register their client command as a custom harness:

[
  {
    "kind": "remote-codex",
    "binary": "ssh",
    "args": ["-tt", "user@host", "cd /path/to/project && exec codex"]
  },
  {
    "kind": "docker-codex",
    "binary": "docker",
    "args": ["exec", "-it", "-w", "/workspace", "container-name", "codex"]
  },
  {
    "kind": "k8s-codex",
    "binary": "kubectl",
    "args": ["exec", "-it", "-n", "namespace", "deploy/app", "--", "codex"]
  }
]

Wrapper scripts are useful when the host, container, namespace, pod, working directory, or authentication setup is dynamic. Set the harness binary to the wrapper path and put any fixed parameters in args .

The session holder keeps the local SSH, Docker, or Kubernetes client process alive when hrdx restarts. It cannot keep an agent alive when its remote host, container, pod, or network connection ends, and it does not automatically reconnect. Workspace Git details are read from the local workspace path, not from the remote filesystem.

Custom harnesses

Any agent CLI beyond the built-ins can be registered by dropping a harness.json next to the state file ( ~/Library/Application Support/hrdx/ on macOS, $XDG_CONFIG_HOME/hrdx/ on Linux, %AppData%\hrdx\ on Windows). Registered harnesses appear everywhere the built-ins do: in the pickers, in agent cycling, as agent panes in the sidebar hierarchy, and in the settings window for enabling and disabling.

[
  {
    "kind": "aider",
    "binary": "aider",
    "args": ["--no-auto-commits"],
    "resume": ["--restore-chat-history"],
    "busy": "Waiting for the model"
  },
  {
    "kind": "goose",
    "idle_title": "goose idle",
    "attention_title": "goose waiting"
  }
]
Field Purpose
kind Identifier used in pickers and pane names (required, must not collide with built-ins)
binary Executable to launch (default: same as kind )
args Extra arguments passed on every launch
resume Arguments that resume the latest session when a restored pane relaunches
resume_first Put the resume args before args (for subcommands like resume --last )
busy A substring visible on screen only while the harness is working; drives the busy spinner and the finish sound. Empty: braille spinner detection, like the built-ins
idle_title Terminal-title substring emitted when the harness is idle; overrides a stale visible spinner
attention_title Terminal-title substring emitted while waiting for user input; overrides the spinner and shows an orange dot when unfocused

Both title fields are optional and have no defaults, since every harness publishes its own markers. Leave them out and the harness is detected purely from the screen, exactly as busy describes. Set them when the harness keeps a spinner on screen while it is really idle or blocked on a prompt: a matching title always outranks the screen scrape. Check what your harness emits with printf '\e]2;...\a' -style OSC titles before picking a substring.

Socket API

While hrdx runs it serves a control API on a unix socket next to the state file ( hrdx.sock ), so scripts, editors, and coding agents can inspect and drive a running session. Disable with --api=false .

The protocol is newline-delimited JSON: send one request per line, receive one response line with the same id .

SOCK="$HOME/Library/Application Support/hrdx/hrdx.sock"   # macOS
# SOCK="$XDG_CONFIG_HOME/hrdx/hrdx.sock"                  # Linux
# hrdx.sock is a native Windows AF_UNIX socket too (%AppData%\hrdx\hrdx.sock).
# WSL has a separate socket namespace and cannot connect to it directly; Git
# Bash does not ship a compatible `nc -U`. Use a native Windows client, such
# as .NET UnixDomainSocketEndPoint or Go's net.DialUnix.

echo '{"id": "1", "method": "status"}' | nc -U "$SOCK"
echo '{"id": "2", "method": "workspace.create", "params": {"path": "~/Developer/api", "agent": "claude"}}' | nc -U "$SOCK"
echo '{"id": "3", "method": "pane.create", "params": {"workspace": "api", "kind": "shell", "split": "down"}}' | nc -U "$SOCK"
echo '{"id": "4", "method": "pane.send_text", "params": {"pane_id": 3, "text": "run the tests", "enter": true}}' | nc -U "$SOCK"
echo '{"id": "5", "method": "pane.wait", "params": {"pane_id": 3, "until": "idle"}}' | nc -U "$SOCK"
echo '{"id": "6", "method": "pane.read", "params": {"pane_id": 3}}' | nc -U "$SOCK"
Method Effect
ping Liveness check, returns pong
status Workspaces, tabs, and panes with id, kind, running, and busy state
workspace.create Open a directory as a workspace ( path , optional agent )
workspace.close Close a workspace by name or path
pane.create Add a pane ( workspace name or path, kind , split : right , down , tab )
pane.send_text Type into a pane ( pane_id , text , optional enter )
pane.read The pane's visible screen as plain text
pane.wait Block until a pane's agent is idle or busy ( until , optional timeout_ms )
pane.close Close a pane by id
events.subscribe Keep the connection open and push events

Successful responses are {"id": "...", "result": {...}} ; failures are {"id": "...", "error": {"code": "not_found", "message": "..."}} with codes not_found , invalid_params , unknown_method , timeout , and error .

After events.subscribe the connection stays open and hrdx pushes lines like {"event": "pane.busy_changed", "data": {"pane_id": 3, "busy": false}} . Events: workspace.created , workspace.closed , pane.created , pane.closed , and pane.busy_changed , so a script can react the moment an agent finishes instead of polling.

Every request is answered by the TUI's own update loop, so the API always sees exactly what is on screen. pane.wait plus pane.send_text is enough to build simple agent pipelines: prompt an agent, wait until it is idle, read the screen, move on.

Themes

hrdx themes are JSON files that override any subset of the built-in colors; missing values inherit the default look. Drop them into a themes/ directory next to the state file ( ~/Library/Application Support/hrdx/themes/ on macOS, $XDG_CONFIG_HOME/hrdx/themes/ on Linux, %AppData%\hrdx\themes\ on Windows) and pick them in the settings window's theme section. The change applies immediately and persists.

{
  "name": "neon",
  "description": "Pink accent, near-black bars.",
  "colors": {
    "accent": 201,
    "bar_bg": "#101010"
  }
}

Values are ANSI 256 color numbers or "#rrggbb" strings.

Color Used for
accent Focused pane frames, highlights, logo, selected items
alt Prefix badge, behind-count in the sidebar
muted Secondary text, hints, idle pane names
faint Inactive pane borders, sidebar divider
good Running dots, input badge
busy Busy spinner and completed-work attention dot
bad Errors, exited dots
bar_bg / bar_fg Header and footer bars
ink Text on accent backgrounds, tab bar strip

See examples/themes/ for a full example.

Notifications

The notification section of the settings window has two independent toggles for finished agent turns: play a sound (built-in ding and chime , or your own audio files) and a system notification, which rings the terminal bell so your platform's native attention indicator fires: dock badge and bounce on macOS, the window manager's urgency hint on Linux, the taskbar/window attention flash on Windows Terminal (depends on its bellStyle setting). No notification daemon or permission required. Add custom sounds with a sounds.json next to the state file; they appear as choices and are previewed when selected:

[
  { "name": "sheep", "file": "~/sounds/maehhh.wav" },
  { "name": "gong", "file": "/Users/me/sounds/gong.aiff" }
]

name is the label in settings (must not collide with built-ins), file any audio file your OS player understands ( afplay on macOS, paplay / aplay on Linux, PowerShell's SoundPlayer on Windows — WAV only there). Missing files are reported in the footer and skipped.

Persistence

Quitting hrdx does not kill your sessions. Pane processes live in a small background process (the session holder) that hrdx starts on demand and talks to over a local socket. Close the TUI, reopen it, and every shell and agent reattaches exactly where it was: running commands keep running, scrollback and screen state are replayed, nothing restarts. The holder is the same hrdx binary, uses no resources worth mentioning, and goes away when you kill its sessions.

Workspaces, panes, split layout, ratios, selection, and holder session ids are saved automatically (default: ~/Library/Application Support/hrdx/state.json on macOS, $XDG_CONFIG_HOME/hrdx/state.json on Linux, %AppData%\hrdx\state.json on Windows). On the next launch the layout is restored and each pane reattaches to its held session. When a held session is gone (rebooted machine, killed holder), the pane starts fresh instead: shell panes get a new shell, and agent panes relaunch resuming their latest session for that directory via the agent's own session store.

--persist=false disables the holder (panes die with the TUI, like a plain terminal). --fresh skips restoring and cleans up now-unreferenced held sessions; --state "" disables persistence entirely.

Development

Windows without make on PATH : go vet ./... && gofmt -l . && go test ./... .

License

MIT

Two German airport workers die of malaria after 'mosquito arrives on plane'

Hacker News
www.bbc.com
2026-08-27 13:33:13
Comments...
Original Article

Getty Images A view of a taxiing area at Frankfurt Airport. A Lufthansa plane sits on the tarmac. Getty Images

Frankfurt is Germany's busiest airport

Two Frankfurt Airport workers have died of malaria after a rare outbreak led to six employees contracting the serious infection spread by mosquitoes.

It is believed the mosquitoes arrived at Germany's busiest airport on a plane, according to German public health officials, triggering an outbreak which was first detected in July.

A spokesperson for airport operator Fraport told the BBC an employee had died as a result of the infection, while public health officials said later on Wednesday that two of the affected individuals had died.

Traps have been installed at the airport and mosquitoes captured will be analysed in a laboratory to determine their species and origin.

"We have provided comprehensive information to all employees and encourage them to consult a doctor if they experience any symptoms," the Fraport spokesperson told the BBC.

The outbreak is being investigated by the Frankfurt Public Health Department.

The BBC understands that six male airport workers in different jobs and different areas of the airport were infected, and officials are analysing blood samples to determine if they were infected by one mosquito or six different mosquitoes.

Later on Wednesday, public health officials in Frankfurt sent a letter to media outlets which said two of the affected individuals had died.

"For the population of Frankfurt, the risk is considered very, very low. The disease is not transmissible from person to person but is always transmitted by mosquitoes," the letter added.

It said laboratory tests to determine the source of the infections were not expected to be available for several weeks.

It was reported in July that the outbreak involved four infected workers.

The Robert Koch Institute - a German federal government agency and research institute for disease control and public health - previously said the four employees fell ill between 4 and 6 July and the mosquitoes were brought in by plane.

The institute said malaria in Germany almost exclusively affects long-haul travellers who were infected in malaria-endemic areas, and that malaria transmitted within a German airport is rare.

"The lack of a travel history can lead to a delayed diagnosis. A delayed diagnosis increases the risk of a severe course of the diseases," the institute said in its epidemiological bulletin.

The last case of airport malaria was in 2023 also at Frankfurt Airport, it added.

Malaria is a disease spread by some types of mosquitoes biting humans, and is mostly found in tropical countries, according to the World Health Organization (WHO).

The infection, which is preventable and curable, is caused by a parasite and does not spread from person to person. However symptoms can be mild or life-threatening.

A thin, grey banner promoting the News Daily newsletter. On the right, there is a graphic of an orange sphere with two concentric crescent shapes around it in a red-orange gradient, like a sound wave. The banner reads: "The latest news in your inbox first thing.”

Get our flagship newsletter with all the headlines you need to start the day. Sign up here.

Saving 100 terabytes of memory by optimizing 1.1.1.1's DNS cache

Hacker News
blog.cloudflare.com
2026-08-27 13:17:57
Comments...
Original Article

Big Pineapple , the platform behind 1.1.1.1 , Gateway DNS , DNS Firewall , AS112 , and several other Cloudflare DNS services, stores over 250 billion DNS cache entries at any given time. At that scale, wasting a single byte per entry costs more than 250 gigabytes of memory across our fleet.

Five successive changes to how cache entries are stored in memory cut the per-entry footprint by over 50%. Across our fleet, these changes freed up roughly 100 terabytes of memory, equivalent to the amount of RAM in 130 of our Gen 13 servers . The cache also got faster. Insert throughput rose 43% and lookup latency dropped 19%, as fewer allocations and better memory locality meant we did not trade speed for space.

What we cache

On cold start, Big Pineapple starts out with an empty cache. As DNS queries arrive, the cache fills until it hits its maximum entry count, at which point we evict older or less popular items to make room.

The exact cache size varies by data center. When EDNS Client Subnet (ECS) is in use, authoritative servers return different answers depending on the client's network, so we cache multiple versions of the same query. This increases both the number of entries and the memory each one consumes, making the optimizations in this post especially impactful for ECS-heavy locations.

Each item in the cache is a key-value pair. The key identifies what was queried:

pub struct CacheKey {
    qname: Name,
    qtype: Rtype,
    authenticated: bool,
    tag: Vec<u8>,
}

The value stores the DNS response itself: the answer, authority, and additional record sections, along with metadata like the creation time, a hit counter, and the Time-to-Live (TTL).

pub struct CacheEntry {
    timestamp: UnixTimeStamp,
    pub inception: Instant,
    pub ttl: Ttl,
    pub hits: u32,
    pub answers: Vec<Record>,
    pub authority: Vec<Record>,
    pub additional: Vec<Record>,
    pub errors: Vec<ExtendedError>,
    ...
}

Both structs have room for improvement. Several fields use types that carry overhead we don't need once the entry is stored.

Benchmarking memory usage

To measure the impact of each change, we benchmark by filling the cache with randomly generated entries that roughly match the traffic distribution we see in production: 56% A records, 25% AAAA , and 19% TXT . Each entry contains between one and four records.

TXT records serve as a stand-in for all non- A / AAAA record types in the benchmark. Their size is randomized between 64 and 224 bytes, close to the average response size we see for variable-length record types.

We track memory usage using a custom allocator that wraps Rust’s System allocator and records the number and size of allocations per cache entry. Alongside memory, we measure insert throughput and lookup latency across the full cache flow to make sure memory savings don’t come at the cost of performance.

These inputs approximate production rather than reproduce it exactly. Process memory also depends on traffic mix, cache occupancy, allocator state, and memory used outside the cache. We therefore measured resident memory across production instances during the rollout.

The cost of capacity

Vec<T> stores three fields: a pointer to heap-allocated data, the current length, and the total capacity. When you push an item, Vec checks whether the length exceeds the capacity and reallocates if needed. If there’s room, it just appends the item and increments the length.

1.png

Once we store a DNS response in the cache, however, we never modify it again. The capacity field serves no purpose, but still costs 8 bytes per Vec . The over-allocated heap space is wasted as well, as a Vec with capacity for eight items but only five stored leaves three slots unused on the heap.

2.png

Using Box<[T]> solves both problems. It can’t grow after creation, so it doesn’t need a capacity field or reserve space for future elements. The same applies to String , which also carries a capacity field. Box<str> drops it.

Each cache entry stores 8 Vec and String fields. Replacing them with Box<[T]> and Box<str> saves 8 bytes per field, 64 bytes per entry. It also eliminates the excess heap memory that Vec reserves for future growth. The combined savings add up to over 15 terabytes with over 250 billion cache entries.

Fewer lists, fewer pointers

Rather than storing the answer, authority, and additional sections in separate lists, we can store a single list with offsets to the start of each section. Since DNS record counts per section fit in a u16 , we can use a u16 (2 bytes) for each offset, compared to the 8-byte pointer and 8-byte length that each separate Box<[T]> requires.

3.png

This removes two lists, each with an 8-byte pointer and 8-byte length, and replaces them with two 2-byte offsets, saving 28 bytes per entry.

These savings do not always map directly to the number of bytes removed from individual fields. Rust inserts padding to satisfy alignment requirements and rounds a struct’s size up to a multiple of its alignment. Removing a small field can therefore eliminate additional padding. For example, we also packed several boolean fields into a single bitflag . This reduced the surrounding padding, causing the struct to shrink by more than the size of the individual booleans.

Dropping the owner

Each DNS record has an owner, the domain the record belongs to. In many cases, this owner is identical to the domain being queried. For example, a query for example.com A returns two records with the same owner:

$ dig example.com A

;; ANSWER SECTION:
example.com.        300    IN    A        198.51.100.1
example.com.        300    IN    A        198.51.100.2

But when a CNAME is involved, for example, the record owner can differ from the queried domain:

$ dig example.com A

;; ANSWER SECTION:
example.com.        300    IN    CNAME    cdn.example.com.
cdn.example.com.    300    IN    A        198.51.100.1
cdn.example.com.    300    IN    A        198.51.100.2

The DNS wire format handles repeated owners using name compression, as defined in RFC 1035 . Rather than encoding the same domain twice, subsequent occurrences store a 2-byte pointer to the first occurrence. A domain like www.example.com can encode just www followed by a pointer to where example.com already appeared in the message.

This works well on the wire, but in our cache we store the full owner name alongside each record. Following compression pointers during cache lookups is expensive on the hot path, so we trade memory for speed.

Most records, however, have an owner identical to the queried domain. For those, we can drop the owner entirely and infer it at read time. When the owner differs, such as the A records behind a CNAME , we store the full name.

pub struct Record {
    owner: Option<Box<Name>>,
    class: Class,
    ttl: Ttl,
    rtype: Rtype,
    data: RecordData,
}

When owner is None , response construction restores the queried domain from the cache key, avoiding a heap allocation. This means the record is no longer self-contained, but the cache key is already available during every lookup. When the owner differs, Some stores a pointer to the full name on the heap.

4.png

In practice, most cached records have an owner identical to the queried domain, so the majority require no heap allocation for the owner field.

Enum sizing

Rust enums are sum types : each variant can carry different data, but the enum is always the size of its largest variant.

pub enum Option<T> {
    Some(T),
    None,
}

Option is either Some and holds a value, or None and holds nothing. Both variants take the same amount of memory. The enum stores a tag indicating the active variant, followed by space large enough for the largest variant’s data. When the variant is None , that space is unused.

For record data, it seems natural to store each DNS record type as an enum variant:

pub enum RecordData {
    A(Ipv4Addr),
    Aaaa(Ipv6Addr),
    Txt(Txt),
    Naptr(Naptr),
    Svcb(Svcb),
    // ...
}

But the enum is always as large as its largest variant. In our case, that’s NAPTR at 136 bytes. It stores three variable-length text fields, a domain name, and two integers. As a result, the full enum, including the variant tag and padding, becomes 144 bytes.

5.png

An A record only needs 4 bytes, and an AAAA record needs 16 bytes. A and AAAA make up over 80% of our traffic, so most records waste over 120 bytes on padding. Since a single cache entry can store many records this quickly adds up.

Boxing the variants

To solve this problem, we can box the larger variants of the enum, moving them to a separate heap allocation. The enum then stores an 8-byte pointer to the heap, where the data takes up only the size it actually requires.

pub enum RecordData {
    // Small and common variants are stored inline
    A(Ipv4Addr),
    Aaaa(Ipv6Addr),
    // Large variants are stored on the heap
    Txt(Box<Txt>),
    Naptr(Box<Naptr>),
    Svcb(Box<Svcb>),
    // ...
}

For A and AAAA records, this saves 120 bytes per record. Smaller variant types like TXT and CNAME also benefit. They still occupy the 24-byte enum, but their heap allocation is sized to their actual data rather than padded to 144 bytes. NAPTR , the largest variant, actually pays slightly more. It now adds the cost of a heap pointer and allocation overhead. But NAPTR records are rare in practice, so the tradeoff is worth it.

6.png

But boxing the larger record variants introduces costs of its own.

The costs of boxing

Boxing has two costs. The first is allocator overhead. Each boxed variant becomes a separate heap allocation, and allocators round up to the nearest size class. Big Pineapple uses jemalloc , an allocator designed for multithreaded, allocation-heavy workloads. jemalloc groups allocations of similar sizes into fixed-size bins. A TXT record requests 32 bytes and fits exactly into a 32-byte bin, wasting nothing, but an MX record requests 40 bytes and rounds up to 48, wasting 8 bytes.

The second cost is poor memory locality. Without boxing, the record enum values for a cache entry sit in a single contiguous allocation. With boxing, data for each boxed variant lives in a separate heap region. Reading it requires following a pointer, and when that pointer lands far from the rest of the entry, the CPU has to fetch a new cache line. With millions of cache entries, boxed data ends up scattered across the heap rather than packed together.

7.png

Neither cost is catastrophic on its own, but eliminating both, as the next section shows, yields a measurable improvement in both memory usage and lookup latency.

Storing records in wire format

An obvious next step would be to store the full DNS response in wire format, patching only per-client fields like the message ID on each lookup. But this has drawbacks. DNSSEC records are only included when the client sets the DO (DNSSEC OK) flag. Storing a complete wire format message means either caching two variants, one with DNSSEC and one without, or filtering them out of an already-built message. There is also a cost to parsing the full message on every lookup, which the enum approach we just described avoids by storing already-parsed records.

As a middle ground, we store just the record data as raw bytes, while keeping the rest of the cache entry as structured fields. Instead of a list of parsed enum variants, we store the records as a single Box<[u8]> containing each record encoded as a 2-byte length prefix followed by its raw bytes.

8.png

This eliminates the per-variant enum overhead and the boxed heap allocations from the previous optimization. The data also becomes packed contiguously, which improves CPU cache locality. The tradeoff is that records can no longer be randomly indexed. We have to iterate through the buffer sequentially. This adds some complexity for features like round-robin rotation of A / AAAA records, but since record counts per entry are small, the cost is negligible.

When building a DNS response from cached records, most record types can be copied directly from the buffer into the outgoing message. Previously, each parsed record had to be serialized field by field back into DNS wire format. The new layout skips that work for A , AAAA , TXT , and all DNSSEC record types by copying their encoded bytes directly. Only records containing domain names, such as CNAME , NS , MX , and SOA , still require parsing so we can apply DNS name compression. Since records that support direct copying make up the vast majority of our traffic, this change reduces work on the lookup path. Combined with improved memory locality, this reduced cache lookup latency by 5% in our benchmarks.

To build the record data buffer, we write into a reusable scratchspace buffer that persists across cache insertions. Since previous writes have already grown it, the buffer rarely needs to be reallocated. Records vary in size, so we do not know the exact buffer size until they have been serialized. Once the records are in the scratchspace buffer, we allocate a Box<[u8]> and memcpy the data into it. This replaces the separate allocation for each boxed record with one allocation for all record data. It also avoids the waste from shrinking a Vec<u8> , where the allocator may not be able to reclaim the unused tail of the original allocation. In our benchmark, this change alone increased cache insert throughput by 13%.

The results

The production measurements show how the benchmarked per-entry savings translated to whole-process resident memory. The graph below shows p90, p98, and p99 memory usage across Big Pineapple instances. The first dashed line marks the start of the rollout on May 18, 2026, and the second marks its completion across all services on July 6, 2026. Each release introduced one or more of the optimizations described above, so memory usage dropped in steps rather than all at once.

As each release rolled out, restarted instances began with empty caches and consumed more memory as those caches filled. The stable plateaus therefore represent steady-state memory usage better than the initial dips.

9.png

Per-instance memory usage dropped across all percentiles. At p99, memory dropped from 9.3 GB to 5.3 GB, a 43% reduction in resident memory. At p90, memory dropped from 6.5 GB to 3.8 GB, a 42% reduction. Instances with fuller caches saw the largest absolute savings.

In our benchmarks, these five optimizations reduced the per-entry memory footprint from 953 bytes to 420 bytes, a 56% reduction. Per-entry allocations dropped from 1.1 KB to 461 bytes. The reductions measured in production are smaller because resident memory includes the cache alongside all other process data. After the rollouts settled, aggregate working-set memory across the fleet was roughly 100 terabytes lower.

Performance also improved. Cache insert throughput increased by 43%, while lookup latency dropped by 19%.

Metric

Before

After

Change

Per-entry net footprint

953 bytes

420 bytes

-56%

Per-entry allocations

1.1 KB

461 bytes

-58%

Cache insert throughput

625,000 entries/s

893,000 entries/s

+43%

Cache lookup latency

828 ns

670 ns

-19%

We plan to reinvest the freed memory into increasing cache capacity without increasing our memory usage, which improves cache hit rates and reduces upstream query volume. We're also exploring further optimizations to the cache itself.

To learn more about Big Pineapple, see How Rust and Wasm power Cloudflare's 1.1.1.1 . If you work on DNS or other large systems, share the optimizations that have worked for you in the Cloudflare Community or on the Cloudflare Developers Discord .

Gemini Omni 1.1 Flash

Hacker News
blog.google
2026-08-27 13:06:32
Comments...
Original Article

Omni now delivers studio-quality video production, including the ability to extend a scene, first and last frame interpolation, crisp 4K upscaling, faster prototyping, and more.


Alisa Fortin

Product Manager, Google DeepMind


Text "Gemini Omni 1.1 Flash Available via APIs" surrounded by various images of people and a squirrel

Your browser does not support the audio element.

Listen to article

[[duration]] minutes

This content is generated by Google AI. Generative AI is experimental

Today, we’re introducing Gemini Omni 1.1 Flash, a new suite of creative controls and generative video capabilities to support developers. Gemini Omni brought real-world reasoning to generative creation, and today’s updates make Omni 1.1 production-ready for professional use via the Gemini API in Google AI Studio.

Whether you’re building generative video workflows, creative tools, or media editing software, these updates make generative video more controllable, faster to iterate on, and polished for real-world deployment. Here’s a look at what’s new:

Extend scenes for longer storytelling

Scene extension allows you to take an existing video and continue generating footage seamlessly from where it left off.

With Omni 1.1, the model can now analyze up to 10 seconds of prior context — a leap from previous models that only referenced the final second. The result is improved visual consistency and narrative adherence, letting you build longer stories or branch into new creative directions. You can extend videos in 10-second increments up to a total cumulative length of 40 seconds.

Here’s how you can extend your scene with the Gemini API:

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-omni-1.1-flash",
    previous_interaction_id=previous_video_interaction.id,
    input=[
        {"type": "text", "text": "Continue the scene."}
    ],
    response_format={
        "resolution": "360p",
    },
)

Specify first and last frames

Achieve smooth transitions and camera movements by specifying the starting and ending frames of a shot. Omni 1.1 generates continuous video between two keyframes, making it ideal for complex camera orbits, zoom transitions, or seamless looping clips.

Prompt 1: A close-up low-angle shot of a stylish drummer in a beige suit playing a red drum kit in a grand hall transitions as the camera whip-pans to the side, revealing an older saxophonist playing alongside a ballet dancer spinning in a white outfit under soft purple stage lights. One continuous shot, no jump cuts.

Prompt 2: The camera zooms into the TV screen, where we see the same woman and the same scene from the beginning. Seamless video. One continuous shot, no jump cuts.

Draft videos more efficiently in 360p

Generate lightweight previews in 360p resolution up to 60% faster* and at a third of the cost compared to Omni 1.1’s standard 720p resolution. This is helpful for rapid prototyping, storyboard iteration, and quick rendering in developer platforms.

*Up to 60% faster generation based on system throughput of 360p vs. 720p resolution

Prompt: A microscopic view of iridescent marine diatoms, displaying intricate, glass-like silica shells with breathtaking natural symmetry. The colors range from deep volcanic amber and warm copper to vibrant turquoise and violet, mimicking the rich palette of earth and ocean. Tiny, delicate structures glow softly against a clean dark field background. High-fidelity scientific imaging, sharp details, organic textures, micro-photography. Maintain the microscope lens effect throughout the entire video.

Upscale up to 4K resolution

Generate polished, high-resolution 1080p or 4K outputs that are ready for professional production with Omni 1.1.

Prompt 1: Fish swimming, tracking shot

Prompt 2: A little chipmunk darting out of the woods from the left side of the screen and sniffing the air inquisitively before darting out of frame on the right side

Prompt 3: Cinematic macro close-up of vibrant golden-orange Japanese maple leaves on a delicate branch, gently rustling and swaying in a soft, rhythmic autumn breeze. Sunlight filters through the translucent foliage, creating a warm, glowing effect. Shallow depth of field, dreamy bokeh background, hyper-detailed textures, photorealistic, 4k.

Add video references in your multimodal input

Reference up to three seconds of video when crafting your scene, allowing you to maintain visual context and character consistency based on video references.

Prompt: Use the three uploaded videos of dancers and replace them with the provided characters. Have them perform their individual dances from the reference videos, all together in the large, open space from the provided image.

The dog character dog.png should do the classical dance from dance3.mp4. The octopus octo.png should do the hip hop dance from dance1.mp4, and the bear bear.png should do the breakdance from dance2.mp4. The final result should be one continuous shot with no scene cuts.

Inspiring concepts for what you can build

Here are a few ideas showing how developers can put these new capabilities into action across custom tools and creative workflows.

See how customers are putting Omni Flash in production

Our customers are already driving real-world production with Gemini Omni Flash via the Agent Platform API. Explore the videos they've created and hear about how they are using the model below.

Build with Gemini Omni 1.1 Flash Today

Pricing table for Gemini Omni 1.1 Flash.

A table with pricing numbers for the Gemini Omni 1.1 Flash model.

Omni 1.1 is rolling out across the Google developer ecosystem:

Omni 1.1 is also available to all Google AI Plus, Pro and Ultra subscribers globally in Google Flow , starting today. Scene extension is available to all Google AI Plus, Pro and Ultra subscribers globally in the Gemini app .

Get the latest news from Google in your inbox

Sign up for our newsletters with product updates, event information, special offers, and more.

Your information will be used in accordance with Google's privacy policy. You may opt out at any time.

Bild AI (YC W25) Is Hiring Product and AI Engineers

Hacker News
www.bild.ai
2026-08-27 13:00:14
Comments...

Flock CEO gets his house blurred out on Google Maps and Zillow

Hacker News
twitter.com
2026-08-27 12:53:01
Comments...

Grok Bot for Linux: Unofficial port of the official app (open source)

Hacker News
github.com
2026-08-27 12:49:47
Comments...
Original Article

Unofficial Ubuntu/Linux build of the Grok Bot desktop app.

Cursor ships Grok Bot for macOS and Windows only. This repo does the same thing the Codex Mac-to-Linux port did: take the official Electron app, put it on a Linux Electron runtime, and replace the Windows-only native addons.

It is not an xAI or Cursor product. Linux is unsupported by them.

What you get

The official Grok Bot UI — bots, the shared computer, sign-in with your Cursor account — running as a native Linux app. No Wine.

Current target: Grok Bot 0.29.0 on Electron 42.1.0 (x86_64).

Ubuntu / Debian

sudo apt install p7zip-full curl unzip build-essential python3 \
  libfuse2 fakeroot
# Node.js 20+ (Ubuntu 24.04: sudo apt install nodejs npm  is too old;
# use https://github.com/nvm-sh/nvm or NodeSource)

git clone <this-repo> grok-bot-linux
cd grok-bot-linux
make build
sudo dpkg -i dist/grok-bot_*_amd64.deb
sudo apt-get install -f -y   # if dpkg reports missing GTK/NSS libs

grok-bot

Or skip the package and run the tree directly:

make build
./dist/Grok_Bot_0.29.0_linux_x64/grok-bot --no-sandbox --ozone-platform-hint=auto

AppImage (needs FUSE 2):

chmod +x dist/Grok_Bot_*_x86_64.AppImage
./dist/Grok_Bot_*_x86_64.AppImage

Sign in with the same Cursor / SuperGrok account you use on the Mac app. Bots live on the cloud computer; this build is the remote control.

Other distros

The tarball in dist/ is a self-contained Electron tree. On Fedora / Arch, install GTK3, NSS, ALSA, and Mesa, then:

tar -xzf dist/Grok_Bot_*_linux_x64.tar.gz
./Grok_Bot_*_linux_x64/grok-bot --no-sandbox --ozone-platform-hint=auto

Build options

Command Result
make detect Newest official Windows version on Cursor's CDN
make build Tarball + .deb + AppImage in dist/
./scripts/build.sh 0.29.0 Pin a specific upstream version
./scripts/build.sh --exe ~/Downloads/Grok_Bot_0.29.0_Setup.exe Use an installer you already downloaded
make install-deb Build if needed and dpkg -i

If Chromium's sandbox cannot take setuid (containers, some Ubuntu defaults), the /usr/bin/grok-bot wrapper adds --no-sandbox . Extra Electron flags go in ~/.config/grok-bot/electron-flags.conf , one per line.

NVIDIA + black window: add --ozone-platform=x11 to that file.

Updates

The in-app updater talks to Windows/macOS feeds and will not install a Linux build. When Cursor ships a new version:

make detect
make build
sudo dpkg -i dist/grok-bot_*_amd64.deb

How this compares to the Mac app

Official Mac app This Linux build
UI / bots / cloud computer yes same app.asar
Sign-in Cursor account same
Native addons Mach-O rebuilt or replaced for Linux
Auto-update official rebuild from the new Windows installer
Support Cursor none (community)

The Mac .dmg is not used here. Extracting it on Linux is awkward, and its native modules are still the wrong ABI. The Windows NSIS installer unpacks with 7z and is the source every working community port uses. Details: docs/how-it-works.md .

Requirements

  • x86_64 Linux, glibc 2.34+ (Ubuntu 22.04 or newer)
  • Eligible Grok Bot plan (same as the official apps)
  • Build machine: p7zip-full , curl , unzip , g++ , python3 , Node 20+

This repository never commits the official installer, app.asar , or built binaries. Those are produced on your machine.

License

Scripts and Linux-native sources in this repo: MIT .

Grok Bot belongs to xAI / Cursor. Electron belongs to the Electron project. See NOTICE.md .

Show HN: See fiber breaks linked to a map

Hacker News
react-networks-lib.rackout.net
2026-08-27 12:37:54
Comments...

Show HN: My Claude quota ran out in 10 minutes, so I made a tool to find out why

Hacker News
github.com
2026-08-27 12:37:44
Comments...
Original Article

Ask Claude Code where your usage went.

You hit a usage limit and don't know why. Your quota drains faster than it used to. You suspect something is eating tokens in the background. The records that answer all of this are already on your computer — Claude Code keeps a log of every request it makes. tare teaches Claude Code to read its own logs, so you can just ask.

No dashboards, no commands to learn. Install once, then ask in plain English.

Tare: the weight of the container, subtracted to find what's inside. Most of what a session costs is the container — context re-sent again and again — and that's exactly what these tools subtract.

Install

One command, in any terminal:

npx skills add kelviq/tare -g -y --copy --agent claude-code

That's it. Nothing else to set up — no accounts, no packages, no configuration. Start a new Claude Code session and it's live — type / and check that tare appears. If it doesn't, see the troubleshooting note — on machines where Claude Code has never installed a skill before, the installer can miss it. (Other ways to install — by hand, for a whole team, or as a Claude Code plugin — are in INSTALL.md .)

Then just ask

Open Claude Code and ask your question the way you'd ask a person. These all work — the words don't have to match, complaining about your limits is enough:

When you hit a limit

Why did I hit my usage limit yesterday?

I got locked out ten minutes into my evening session — how is that possible?

Did I hit the 5-hour limit or the weekly cap?

Why am I burning through my quota so much faster this week?

Where your tokens go

Where did my tokens actually go this week?

Which of my projects is eating my quota?

Which model is costing me the most?

What's the most expensive file Claude keeps re-reading?

How much did that giant session yesterday actually cost me?

Are my MCP servers adding a lot to my context?

How much overhead do subagents and skills add?

Before you start something big

How full is my 5-hour window right now?

Is it safe to start a big refactor now, or should I wait for my window to clear?

Checking for things you forgot

Is something running Claude Code in the background?

Was Claude Code active while I was asleep?

I set up an automation last month — what is it costing me?

Tuning your setup

I started using /clear between tasks — did it actually help? Compare this week to last.

Did the latest Claude Code update change my usage?

What would my usage cost if I were paying for the API directly?

What one change would save me the most?

Reports and sharing

Make me a usage report I can open in my browser.

Give me a summary I can post publicly — with nothing private in it.

Export my usage to a spreadsheet.

Prefer typing commands? /tare runs the full diagnosis, and takes variants for the common asks — asking in plain words always works too:

/tare full diagnosis — where tokens went and why
/tare usage at-a-glance panel — like /usage , with attribution
/tare window how full is the 5-hour window — safe to start?
/tare report [days] build the HTML report and open it
/tare tools [days] what is filling my context
/tare week compare this week with last
/tare share [days] redacted summary safe to post publicly
/tare why did I hit the limit yesterday any question works as the argument
image

What you get back

Not a wall of numbers — a cause. The answer to "why did I hit my limit yesterday?" looks like this:

99% of yesterday's usage came from a tool you're running, not from you. Something spawned 1,553 short Claude Code sessions in your website project — 9,022 requests, up to 51 sessions running at once. Your own hands-on work that day was 93 requests. Each fresh session rebuilds its context from scratch, which is the most expensive way to spend tokens...

...followed by the evidence, what to check, and what to change. And when everything is actually fine, it says that: usage proportionate, no anomaly, here's what's normal for you.

Real output lives in examples/ — a shareable summary produced by /tare share , and the HTML report.

What it knows that a raw token count doesn't

  • Correct totals. Claude Code's log format repeats each API response several times over; naive counting inflates totals — by 86% on the data this was built against. tare deduplicates properly.
  • The real cost of context. A file read early in a long session gets re-sent with every later message. tare charges tools for what they caused , not just what they returned — which is how one big file read early can quietly dominate a week.
  • The rolling window. Limits don't reset when you walk away; work from four hours ago still counts. tare can tell you how full your window was at the exact moment you were locked out.
  • The shape of automation. Hundreds of short parallel sessions is a script, not a person. tare recognises the signature and says so.

Private by design

Everything runs on your machine and nothing leaves it. The scripts make no network connections at all. When you ask for a shareable summary, it contains totals, dates and tool names only — no prompts, no file paths or contents, no commands, no session or account identifiers — so you can post it publicly or send it to a colleague and ask "what am I missing?"

Don't take that on faith: SECURITY.md states exactly what each file reads, writes and sends, and shows how to verify every claim yourself with one grep.

Requirements

  • Claude Code on macOS or Linux
  • Python 3.9+ — already present on every Mac; no packages to install
  • Currently reads Claude Code's logs only, not other coding agents'

Demo

tare-screen-recording.mp4

For developers

Everything the skill does, you can also do by hand: three dependency-free Python scripts with recipes for scripting, cron, CSV export, live per-request telemetry and more — see CLI.md .

Issues and PRs welcome. Useful directions: a live TUI, Windows paths, aggregating anonymised summaries across users to spot patterns no single person can see, and better token estimation for tool results.

MIT licensed.

PaperCut warns of NG, MF flaw exploited in zero-day attacks

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 12:31:53
PaperCut is warning that hackers are actively exploiting a vulnerability in all versions of its PaperCut NG and PaperCut MF print management software in zero-day attacks. [...]...
Original Article

PaperCut

PaperCut is warning that hackers are actively exploiting a vulnerability in all versions of its PaperCut NG and PaperCut MF print management software in zero-day attacks.

The company says it is aware of confirmed attacks on customers and is urging organizations with Internet-exposed PaperCut Application Servers to immediately restrict access to the web interfaces to trusted IP addresses.

"PaperCut Software security response team is investigating active exploitation of a vulnerability affecting PaperCut NG and PaperCut MF," reads an urgent security advisory published Thursday.

image

"We are aware of confirmed customer incidents and are treating this matter with the highest priority."

PaperCut says the vulnerability affects all versions of PaperCut NG and MF, but has not shared details about the flaw or how it is being exploited.

The company says its security team reproduced the vulnerability using information provided by a University customer.

PaperCut has now released emergency patches for customers with public-facing PaperCut NG/MF servers.

"This is an emergency patch for customers with public-facing PaperCut NG/MF servers who are unable to take other mitigating action," reads the advisory.

The company continues to warn customers whose Application Servers are exposed to the Internet to use firewall rules or network access controls to restrict their web interfaces to trusted IP addresses.

PaperCut also shared indicators of compromise that could indicate whether a server has been compromised.

These include suspicious activity from the the legitimate PaperCut pc-app.exe process and server.log files that have been modified, deleted, or are missing.

Administrators should also look for the following errors in server.log :

ERROR No suitable driver found for jdbc:no:x

ERROR DatabaseUtils - Database error looking up cardID: VALUES CAST

However, PaperCut warns that a lack of indicators does not mean that a server has not been compromised.

At this time, PaperCut has not disclosed who is behind the attacks, what attackers are doing after compromising servers, or whether data is being stolen.

PaperCut says it will continue updating its advisory with additional indicators of compromise and remediation guidance as its investigation continues.

BleepingComputer contacted PaperCut with questions about this exploitation and will update the story when we receive a response.

Previous PaperCut flaws exploited in attacks

PaperCut has a history of being targeted by threat actors after security vulnerabilities were disclosed.

In April 2023, attackers began exploiting the critical CVE-2023-27350 PaperCut vulnerability, which allowed unauthenticated attackers to bypass authentication and remotely execute code on vulnerable servers.

Microsoft later linked some of those attacks to the Clop ransomware operation, which exploited vulnerable PaperCut servers for initial access to company networks. Microsoft also observed intrusions that led to LockBit ransomware attacks.

While PaperCut has a Print Archiving feature that can retain documents sent through a server, Clop later told BleepingComputer that it had used the vulnerabilities for initial access to victim networks rather than to steal archived documents directly from PaperCut servers.

The exploitation spread to other threat actors, with Microsoft reporting that Iranian state-backed hacking groups were also exploiting CVE-2023-27350 .

CISA and the FBI issued a joint advisory in May 2023 warning that the Bl00dy Ransomware Gang was also exploiting vulnerable PaperCut servers in attacks against the education sector.

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

The Old Guard is Dying: Platano Progressives Win A New Vision for NY-13

OrganizingUp
convergencemag.com
2026-08-27 12:20:11
Featured illustration: Kimmie Dearest On June 24th, New York City cemented itself as a progressive bellwether in the midst of the far right’s march toward global domination. It was a test of the strength of Mayor Zohran Mamdani’s first year in office; all candidates backed by the mayor swept the pri...

Symmetries in boolean scans

Lobsters
ap29600.github.io
2026-08-27 12:12:37
Comments...
Original Article

Array languages like APL are famous for using many pretty squiggles for representing built-in functions. These are called "primitives" and are different from user-defined functions, because the interpreters know about them and can do fancy optimizations with them, like recognizing special combinations [ 1 ] .

APL programmers have come to rely on these optimizations, for example the vectorization of some combinations like +/ (sum). if you were to feed your typical APL interpreter the function {⍺+⍵}/ - which is functionally equivalent to +/ [ 2 ] since {⍺+⍵} is just a dfn [ 3 ] over + - the interpreter would execute it much slower, not just because executing the abstraction does two function calls per element (one for the dfn, one for the primitive + ) but because it does any at all.

Any respectable APL has a tight loop implemented in native code dedicated to this exact combination, which is why APL can sometimes compete with languages that compile to native code.

Scans and folds

  • fold is a higher order function generalizing the concept of iterating over an ordered collection repeatedly calling a binary function that takes as inputs an accumulator and an element of the collection, and returns a new accumulator.

  • scan is the same, but instead of returning the final value of the accumulator it returns a collection of all intermediate values the accumulator took over the course of the iteration.

In both cases an initial value may or may not be provided, and in the second case the first element is treated as an initial value, and is returned unchanged, concatenated with the scan of the rest of the collection.

APL represents these functions with the operators / and \ , so that

       10 = +/ 1 2 3 4
 1 3 6 10 = +\ 1 2 3 4

In the rest of this article, I’ll be using a fantasy dialect of APL modified to have better behaved fold and scan semantics [ 4 ] to write some functional equations. If you don’t know APL, don’t worry about it, just pretend this is the scan from any traditional functional language like Lisp, Haskell, Ocaml, etc. The main equations will also be translated to Haskell.

Algorithmic esoterica

When I say APLers rely on these, I really mean it! scans, folds, reverse scans, with the operators min, max, plus, times are all familiar, if not even routine operations for the average python programmer who is comfortable with numpy, because they really are useful.

Folding (from the right) with subtraction gives an alternating sum, that’s cute.

APL programs go beyond that. What does scanning with the less-than function do? scanning with not-equal? folding with…​ modulo? [ 5 ]

The issue here is that APL needs escape hatches to handle data dependencies in algorithms, both because it’s syntactically awkward to write loops and because explicitly iterating over an array in APL is mind-numbingly slow when compared to the speed at which the primitive functions run. Scans and folds are a very general way to accumulate information and "move it around" in the array, and they’re APL’s most idiomatic way to do so.

Case study: Resolving quotes

Say you have a string of text containing quote characters, and you want to tell which positions in the string are inside a pair of quotes or not: if you were to write that in C you’d do something like this:

bool in_quotes = false;
for (size_t i = 0; i < n; ++i) {
    if (string[i] == '"') {
        in_quotes = !in_quotes;
    }
}

While in APL you would write the following, where the result is an array containing the values of in_quotes from the previous example. The idea is to scan over the boolean results from comparing each character in the string with the " character.

To see why this works, let’s make the C version branchless by encoding the if statement into arithmetic; to make the similarity more apparent we can write != where ordinarily ^ would be more natural, on the values 0 and 1 they do the same thing.

bool in_quotes = false;
for (size_t i = 0; i < n; ++i) {
    in_quotes = in_quotes != (string[i] == '"');
}

Boolean scans: how many do we really need?

APL has a lot of primitives. it’s the only language I know of which has all non-trivial binary boolean functions built in: here they are, next to their truth tables.

Common name 00 01 10 11

and

0

0

0

1

>

greater than

0

0

1

0

<

less than

0

1

0

0

not equal (xor)

0

1

1

0

or

0

1

1

1

nor

1

0

0

0

=

equal

1

0

0

1

greater than or equal

1

0

1

1

less than or equal (implication)

1

1

0

1

nand

1

1

1

0

This is an issue on an implementer’s side, because many primitives mean many combinations, and writing decent code for each of them costs in labour as well as executable size (therefore instruction cache). Moreover, what qualifies as decent code for a boolean scan is a much higher bar than the snippet I showed above: APL uses packed bit vectors to represent boolean arrays, meaning that these operations have the potential to consume tens of elements per CPU cycle, while by a quick benchmark a naive implementation would handle about 0.6 elements per cycle [ 6 ]

Telling which of these are really useful only looking at the truth tables is not trivial, and it really sucks as a user to learn that the operation that precisely solves your problem is shoddily implemented.

Is there some way that we can reduce the implementation work without sacrificing the performance?

Scan composition rules

The structure of the scan ⍺ f\ ⍵ is as follows:

scan base

Suppose we want to do some pre-processing with a function g to alter the behaviour of the scan: what we’d end up with is a data flow of this kind:

scan pre

The motivation for looking at this is that preprocessing a boolean array with a unary scalar function is just about the cheapest thing we could do, in fact there is only one non-trivial boolean unary scalar function: boolean negation. Let’s keep this observation aside for now, and ask ourselves: is this operation still a scan? If so, what function operand should scan take to produce this result?

It’s apparent that the right argument to f is being fed through g at each step in the iteration, so the answer is {⍺ f (g ⍵)} , which brings us to the simple equation

Equivalent Haskell
scanl f x (map g ys) = scanl (\x y -> f x (g y)) x ys

If g is any function, where is APL’s composition operator "jot" that satisfies

It’s a little trickier to see what effect post-processing with g would have:

scan post

It may look exactly like before, but notice that the input to each subsequent f call is not the same as the value that is sent to the output array, so this is not a scan! To fix this, let’s assume that g has a left inverse g -1 and insert it in between each pair of calls:

scan conj

This is a scan diagram using the function {g ((g⍣¯1) ⍺) f ⍵} , except the initial value x has been preprocessed with g . this gives the equation:

g¨  f\  ←→ (g ) (g(g¯1f))\ 
Equivalent Haskell
map g (scanl f x ys) = scanl (\x y -> g (f (ig x) y)) (g x) ys

Again some composition operators have been used:

(g¯1) g  ←→  ⍝ APL can sometimes find inverses by itself!
 (gf)  ←→ g ( f )
 (gf)  ←→ (g ) f 

And finally we can put these two relations together to find a third.

g  f\ g  ←→ (g ) g(g¯1fg)\ 
Equivalent Haskell
map g (scanl f x (map g ys)) = scanl (\x y -> g (f (ig x) (g y))) (g x) ys

Truth table shuffles

In particular, we are interested in seeing which pairs of primitives are related by one of these three relations, where g is the negation function ~ . We start with the truth tables of our primitives and analyze how they change under the transformations described above.

We represent all of the truth tables at once as the array a with shape 10 2 2

    a
┌┌→──┐
↓↓0 0│
││0 1│
││   │
││0 0│
││1 0│
││   │
││0 1│
││0 0│
││   │
││0 1│
││1 0│
││   │
││0 1│
││1 1│
││   │
││1 0│
││0 0│
││   │
││1 0│
││0 1│
││   │
││1 0│
││1 1│
││   │
││1 1│
││0 1│
││   │
││1 1│
││1 0│
└└~──┘

Composing on the right argument with ~ is the same as reversing the last axis with the function:

Negating the output is just a matter of negating each entry of the table; if we do this, we must also negate the left argument, which we do by reversing the first axis of each truth table (the middle axis here).

And of course we can do both transformations at once

Now we can find out who’s related to whom by searching for the truth tables we got in the original array:

    index  (a)¨a pre post both
┌→──────────────────┐
↓0 1 2 3 4 5 6 7 8 9│
│1 0 5 6 7 2 3 4 9 8│
│7 4 9 3 1 8 6 0 5 2│
│4 7 8 6 0 9 3 1 2 5│
└~──────────────────┘

Now that we know this, we can index into the list of the symbols the truth tables referred to:

┌→─────────┐
↓∧><≠∨⍱=≥≤⍲│
│>∧⍱=≥<≠∨⍲≤│
│≥∨⍲≠>≤=∧⍱<│
│∨≥≤=∧⍲≠><⍱│
└──────────┘

Now, how do we interpret this? along the top row are the original symbols; the second row are the symbols that are related to the top row by the first scan equation we derived above, i.e. ⍺ p\ ~⍵ ←→ ⍺ q\ ⍵ . The third and fourth row, similarly, are related to the first via ~ (~⍺) p\ ⍵ ←→ ⍺ q\ ⍵ and ~ (~⍺) p\ ~⍵ ←→ ⍺ q\ ⍵

Conclusion

We can see that the set , < , covers all columns at least once, therefore if we provide fast implementations of each of these, we can derive decent implementations of the others by just applying these symmetries. This cuts down on implementation time and executable size, without completely sacrificing performance.

None of this is completely new, by the way. The trick ⍺ ≠\ ⍵ ←→ ⍺ =\ ~⍵ is well known among K programmers, since K doesn’t have a builtin not-equal operator. In the same vein, many of these shortcuts are employed in the CBQN interpreter for BQN for the less common combinations .

Appendix A. Brainstorming and observations

I originally discussed this on the APL farm discord server, where some of the users made interesting comments:

Truth tables as finite state machines

In the K language, the form x f\ y , is equivalent to the x a\ y form, where a is a matrix containing the values of f on pairs of non-negative integers. This form advances the state machine [ 7 ] with transitions defined in a over the sequence y . In this interpretation, the concrete transformations we applied to the truth tables take the place of the composition operators in the original equations we defined.

(  x a\ ~y) =   x  (  |'a)\ y
(~ x a\  y) = (~x) (~|  a)\ y
(~ x a\ ~y) = (~x) (~||'a)\ y
Equivalent Haskell
runFsm a x ys = scan (\x y -> (a !! x) !! y) x ys

            runFsm a x $ map (1 -) ys = runFsm      x  (                  map reverse           a) ys
map (1 -) $ runFsm a x             ys = runFsm (1 - x) (map (map (1 -))               $ reverse a) ys
map (1 -) $ runFsm a x $ map (1 -) ys = runFsm (1 - x) (map (map (1 -)) $ map reverse $ reverse a) ys

Invariants under the given transformations

The transformations we gave permute the rows or columns of the tables and/or negate the entries. This implies that the number of ones in the tables either remains equal to 2 or flip-flops between 1 and 3 [ 8 ] . Moreover, since the transformations commute and are self-inverses, our relation is an equivalence relation; we deduce that = and are in a class of their own, with one transformation fixing both operations, and the others fill at least two more.

On these, the transformation ~⌽[0]a can be applied so that there are 3 0s, then ⌽[1]a can be applied to ensure that the single 1 entry occurs on the second column. The only two possibilities are distinguished by whether the 1 value is at a[1;1] (which gives ) or at a[0;1] (which gives < )

Appendix B. Efficient implementation of boolean scans

Xor

A xor scan on a machine word can be implemented efficiently in a few instructions by a typical prefix doubling technique, similar to the one described by Bit Twiddling Hacks

uint64_t xorscan_word (uint64_t word) {
    word ^= word << 1;
    word ^= word << 2;
    word ^= word << 4;
    word ^= word << 8;
    word ^= word << 16;
    word ^= word << 32;
    return word;
}

We only need to handle the carry from the previous word. The typical way to do this would be to xor it with the first bit in word , but this is actually sub-optimal: notice that carry is needed at the very start of each iteration and only updated at the very end, which ties all iterations in a very long dependency chain.

void xorscan_bad (bool initial, uint64_t *words, size_t n) {
    uint64_t carry = (uint64_t)initial;
    for (size_t i = 0; i < n; ++i) {
        uint64_t word = xorscan_word(words[i] ^ carry);
        carry = word >> 63;
        words[i] = word;
    }
}

This compiles to the following core loop, which runs at around 3-4 bits per cycle. (all the timings I’ll give are for memory that is hot in cache, otherwise memory latency would dominate runtime)

Assembly output
.loop:
    xor    (%rdx),%rdi
    add    $0x8,%rdx
    lea    (%rdi,%rdi,1),%rax
    xor    %rdi,%rax
    lea    0x0(,%rax,4),%rcx
    xor    %rcx,%rax
    mov    %rax,%rcx
    shl    $0x4,%rcx
    xor    %rcx,%rax
    mov    %rax,%rcx
    shl    $0x8,%rcx
    xor    %rcx,%rax
    mov    %rax,%rcx
    shl    $0x10,%rcx
    xor    %rcx,%rax
    mov    %rax,%rcx
    shl    $0x20,%rcx
    xor    %rcx,%rax
    mov    %rax,%rdi
    mov    %rax,-0x8(%rdx)
    shr    $0x3f,%rdi
    cmp    %rdx,%rsi
    jne    .loop

On a CPU with super-scalar execution, it would be nice if we could delay the usage of the previous result until the latest possible time. Fortunately xor is associative, so we can just broadcast the carry bit to every position in the final result: now the CPU is free to start executing xorscan_word for the next iteration before the result of the previous one is ready.

void xorscan_good (bool initial, uint64_t *words, size_t n) {
    uint64_t carry = - (uint64_t)initial;
    for (size_t i = 0; i < n; ++i) {
        uint64_t word = carry ^ xorscan_word(words[i]);
        carry = - (word >> 63);
        words[i] = word;
    }
}

This is much faster, processing up to 10.5 bits per cycle.

Assembly output
.loop:
    mov    (%rcx),%rdx
    add    $0x8,%rcx
    lea    (%rdx,%rdx,1),%rax
    xor    %rdx,%rax
    lea    0x0(,%rax,4),%rdx
    xor    %rdx,%rax
    mov    %rax,%rdx
    shl    $0x4,%rdx
    xor    %rdx,%rax
    mov    %rax,%rdx
    shl    $0x8,%rdx
    xor    %rdx,%rax
    mov    %rax,%rdx
    shl    $0x10,%rdx
    xor    %rdx,%rax
    mov    %rax,%rdx
    shl    $0x20,%rdx
    xor    %rdx,%rax
    xor    %rsi,%rax
    mov    %rax,%rsi
    mov    %rax,-0x8(%rcx)
    sar    $0x3f,%rsi
    cmp    %rcx,%rdi
    jne    .loop

If the CPU supports a carry-less multiply instruction (many modern CPUs do!) then xorscan_word can be implemented as carry-less multiplication with the word 0xffffffffffffffff (all ones).

And

All of the above (except for the carry-less multiply) can be applied verbatim, by replacing ^ with & ; however there is a faster method available.

Firstly, a single-word and scan can be implemented much more simply than xor [ 9 ] .

uint64_t andscan_word (uint64_t word) {
    return word & ~(word + 1);
}

This works because adding one turns the first run of ones into a run of zeros, then the negation turns the initial run of zeros back into a run of ones, as well as negating everything else. The final bitwise and sees two matching runs of ones, a matching pair of zero bits, and mismatched bits everywhere else.

Here is an example, with the bits ordered from least to most significant.

word

11100011010101011

word+1

00010011010101011

~(word + 1)

11101100101010100

word & ~(word + 1)

11100000000000000

To extend this to work on an array of words, we observe that at most one word will need an actual scan, because everything before it is known to be all ones already, and everything after it can be unconditionally set to zero.

The full implementation might be something like the following.

void andscan (bool initial, uint64_t *words, size_t n) {
    size_t i = 0;
    if (initial) {
        for (; i < n; ++i) {
            uint64_t word = words[i];
            if (~word) {
                words[i] = andscan_word(word);
                ++i;
                break;
            }
        }
    }
    for (; i < n; ++i) {
        words[i] = 0;
    }
}

This produces two separate loops, the first and most intensive of them can do 62 bits per cycle, while the other gets compiled into a call to memset.

Assembly output
.loop:
    add    $0x8,%rcx
    cmp    %rax,%rdx
    je     .found
    mov    (%rcx),%rsi
    inc    %rax
    cmp    $0xffffffffffffffff,%rsi
    je     .loop

Less-than

This is the most complicated case, and the solution I’ll present comes from the simdjson library, which uses it to find escaped characters. In fact, the intuition behind what <\ does is that it turns off every 1 bit that is at an odd offset in a contiguous sequence of 1 s, which is exactly what you need to figure out which backslashes in a string work as escapes and which are escaped.

uint64_t ltscan_word (uint64_t word) {
    uint64_t guard = word << 1 | 0xaaaaaaaaaaaaaaaa;
    uint64_t parity = guard - word;
    return (parity ^ 0xaaaaaaaaaaaaaaaa) & word;
}

Here is an example, again in little endian bit order.

word

1110000111100111

word << 1

0111000011110011

guard

0111010111110111

parity

1110010000010000

parity ^ odd

1011000101000101

result

1010000101000101

Shifting and setting the odd bits controls whether or not a borrow chain is initiated in the subtraction: the start of a run of 1 s is set to 0 if it is at an even position, otherwise it stays 1 . The last element of a run is also moved past the end to stop the borrow chain. Then subtracting the original bit mask creates a chain of borrows which leaves every bit set in the first case, and just leaves every bit unset in the second case. If we now flip every odd bit, we will have the even bits set in the runs that start at even positions, the odd bits set in the runs that start at odd positions, and some garbage outside of these runs which we clean up with bitwise and.

Like the xor case, the trivial way to chain these together is to clear the first bit whenever the last bit of the previous result is set, though Marshall’s notes on this also mention a smarter way to reduce the length of the critical path.

void ltscan (bool init, uint64_t *words, size_t n) {
    uint64_t carry = (uint64_t)init;
    for (size_t i = 0; i < n; ++i) {
        uint64_t word = ltscan_word(words[i] &~ carry);
        carry = word >> 63;
        words[i] = word;
    }
}

This particular version can do 8.8 bits per cycle.

Assembly output
.loop:
    andn   (%rsi),%rdi,%rdi
    add    $0x8,%rsi
    lea    (%rdi,%rdi,1),%rax
    or     %rdx,%rax
    sub    %rdi,%rax
    xor    %rdx,%rax
    and    %rdi,%rax
    mov    %rax,%rdi
    mov    %rax,-0x8(%rsi)
    shr    $0x3f,%rdi
    cmp    %rsi,%rcx
    jne    .loop

Manchester Airports Group says hackers stole travelers' data

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 12:12:26
The Manchester Airports Group (MAG) disclosed that hackers breached its systems and stole customer data, including Wi-Fi sign-ups from Manchester, Stansted, and East Midlands airports. [...]...
Original Article

Manchester Airports Group says hackers stole travelers' data

The Manchester Airports Group (MAG) disclosed that hackers breached its systems and stole customer data, including Wi-Fi sign-ups from Manchester, Stansted, and East Midlands airports.

The intruder did not access customer payment details, and the attack had no impact on airport operations, the company said.

A statement from the company today notes that the exfiltrated data also "relates to car park, lounge and Fast Track bookings." The list of compromised details includes customers' email addresses, phone numbers, vehicle registration numbers, and postcodes.

image

“The incident has not resulted in any operational disruption,” assured the organization, adding that “Airport operations remain unaffected and customer parking services continue to operate normally.”

Out of an abundance of caution, MAG has temporarily suspended its online “Manage My Booking” service and is instead directing travelers to use its phone line.

MAG is the UK’s largest airport operator, and owner of Manchester, London Stansted and East Midlands airports, which together handle over 66 million passengers yearly.

The company employs 40,000 people and generates annual revenue of £1.5 billion .

After discovering the intrusion, MAG says that it moved quickly to contain it, restricting access to the affected systems, engaging with external experts, and notifying law enforcement.

Potentially exposed customers are advised to remain alert for suspicious communications and avoid clicking on links arriving via email or SMS.

MAG stresses that it will never ask customers for payment card information, banking details, or passwords. Customers should reject and report  to the authorities any attempts to obtain personal, financial, or other sensitive information.

People are also encouraged to follow NCSC’s post-breach recommendations to stay safe.

The company says it has contacted impacted customers directly, but did not disclose the number of affected individuals.

Local media reported that data of up to 8.9 million travelers may have been exposed, citing private MAG statements; however, BleepingComputer has not been able to confirm the figure.

At the time of writing, no ransomware or data extortion groups have claimed the attack publicly.

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

Numerical (In)Stability of Recurrence Relations

Hacker News
www.johndcook.com
2026-08-27 12:10:18
Comments...
Original Article

The previous post gave several examples of three-term recurrence relations for special functions. These relations can be computationally useful, but they have to be applied carefully.

Several years ago I wrote a post on stable and unstable recurrences . In that post I show that the stability of the recurrence relation for Bessel functions produces depends on which kind of Bessel function and which direction the recurrence is applied.

In the forward direction, computing higher order values from lower order values, works well for Bessel functions of the second kind Y n but not for Bessel functions of the first kind J n . In the reverse direction, the recurrence is stable for J n but not for Y n .

I didn’t explain in that post why this is. In this post I will.

Second order linear difference equations have two independent solutions, just like second order linear differential equations. For both kinds of equations, all solutions are linear combinations of the two solutions. Suppose one solution grows with n and the other decays. You may want to compute the decaying solution, but in doing so you might pick up a small component of the growing solution due to rounding error. This post illustrates this phenomena for differential equations, and this post illustrates it for difference equations.

When you look at a plot of Bessel functions in a text book, you’ll probably see a few plots of J n ( x ) and Y n ( x ) for a few small values of n . The functions seem to behave roughly the same way, like sine and cosine. And that’s true, as functions of x .

But it’s not true for J n ( x ) and Y n ( x ) as functions of n for fixed x . As n increases, J n ( x ) decays to zero and Y n ( x ) goes off to −∞.

That’s the source of numerical instability. And there will be similar instability problems for other recurrences where the ratios of the two independent solutions goes to zero or infinity as a function of n .

There are techniques for computing the solution that does not diverse, the so-called minimal solution, such as Miller’s algorithm mentioned here .

A more nuanced view of LLMs

Anarcat
anarc.at
2026-08-25 12:07:58
Also in this series: The Four Horsemen of the LLM Apocalypse The people vs the AI overlords After ranting and railing about LLMs or "AI" as the optimists (or accelerationists?) call it, I figured it might be important to be a little more honest about my use of LLMs and how I think about it mor...
Original Article

Also in this series:

After ranting and railing about LLMs or "AI" as the optimists (or accelerationists ?) call it, I figured it might be important to be a little more honest about my use of LLMs and how I think about it more practically in the world.

The Debian vote context

This is not a coming out. I am not using LLMs on a daily basis, and this blog is, again, written out of my cold dead hands in a dying world, with over-engineered hardware and (to a certain extent, hi Emacs!) software, powered by 100% green energy built on stolen land .

There is a vote going on in Debian . If you're unfamiliar with it, you can catch up at LWN . So far I've essentially said "LLM is bad" which is not a very balanced or useful opinion. Obviously, people are using LLMs, sometimes unknowing or unwillingly, and we need to take that into account. Furthermore, there has been many different blog posts on Debian planet about this. Some that I found balanced , good summaries , even if I didn't fully agree with them , at least some did the basic civil service of being short . But others were just not only Wrong but also so long that I couldn't finish that I just had to write something . 1

This is not an explanation of the ballots, nor how I will vote. This vote is Debian's failure of framing that debate in a reasonable way: we have 8 options on the ballot with many duplicates. We have failed to do the hard work of summarizing and aggregating options into a meaningful set. I doubt the final vote will represent a readable position we can rally around.

I have not read the two months of debates on the topic either. Normally, before voting, I take a cursory look at the debate to see points of view I might have missed. But in this case, it will just make me sad, add noise, and I'm already pretty sure on where I stand on this.

So let me describe how I use LLMs and how I think they fit in our work, as computer engineers and hobbyists.

My LLM use

Debian Packaging

An astute reader has pointed out that I maintain a package in Debian made to use Anthropic. It's actually multiple packages:

As I previously explained in response , I am not entirely comfortable with this work: it's a compromise. In fact, I first uploaded llm to the contrib section of Debian, where we keep software that depends on other non-free software, but I was told that, since yt-dlp was in main , llm belonged there as well.

So I moved it to main , alongside similarly controversial tools like llama.cpp or the python-openai library.

OpenAI and Anthropic usage

An important part of my work is technology watch. I keep tabs on thousands of (new and old) software projects, follow news, and generally try to keep my skills up to date. It's a pretty impossible race , especially as I grow older, but I still think I'm doing the right choices in my job.

Testing large language models is part of that work. At first, I was using ChatGPT's web interface, but it was annoying to copy-paste things into a browser, so I looked for different interfaces.

For a while I tried gptel , a "simple, extensible LLM client for Emacs" but I found it kind of terrifying. Giving a LLM control over an Emacs buffer seems like a security nightmare, so I stopped doing that .

So I use the llm command-line tool to talk to Anthropic's API. I started that in the summer of 2025, when I bought 20$USD of API credits. Before that, I paid for a ChatGPT subscription and then OpenAI credits, which expired and sent me over to Anthropic, which seemed then to have better ethics.

As it turns out, Anthropic is also happy to work for the US military (which is a big red line for me). Anthropic also won't let you talk about the genocide in Gaza , it is destroying physical books , and is blackmailing us to use their product for security coverage .

Needless to say, Anthropic and "Claude" are not my friends, but they seem like the lesser evil in current "frontier models". So I have renewed, a couple of weeks ago, another 20$USD of API credits with Anthropic.

Actual prompts and responses

So what does 20$ give you at Anthropic anyways? What am I using LLMs for and how?

The neat thing with llm is that everything is logged in a sqlite database, so there are some answers that are easy to get:

> llm logs status
Logging is ON for all prompts
Found log database at /home/anarcat/.config/io.datasette.llm/logs.db
Number of threads logged:   7
Number of turns logged:     12
Number of legacy conversations: 543
Number of legacy responses: 970
Database file size:         9.61MB

That is 10MB of logs, with about a thousand prompts.

My logs go back to 2024-03-07, a little over two years ago, and include a mix of Anthropic and OpenAI responses. I used it more in 2024 than 2025, and if the trend continues, I will have used it less in 2026 again:

> llm logs list -n 0  --json | jq -r .[].datetime_utc | sed 's/-.*//' | sort | uniq -c 
    527 2024
    357 2025
     98 2026

It looks like about 10 prompts per month right now, down from a peak of about 60 per month in 2024. It's pretty difficult to analyze those actual logs to get more patterns and I won't run the prompts through a model again to process them.

How I'm using models now

At first, I was using it partly for benchmarking model's capabilities, like Simon Willison does with his pelicans, clearly not trusting its output. But I was impressed by the capacities of the Claude Opus 4.5 model when it wrote this script in January . Impressed, but also scared: it's the first time I felt I could delegate the entirety of my programming to a model. Just run the code, if it works, it works, right?

So what do I use it now? As an example, here are the 10 last prompts in my history:

  1. there is now Claude 5, and a fable model, maybe you know about it?
  2. impress me
  3. not impressive, i already know all of this
  4. chat
  5. in postfix, i have a 300k mailing that happens regularly here. normally, it delivers within about...
  6. is there a way i could have drained the maildrop queue faster without removing the milter?
  7. the problem was that rspamd was timing out on the FUZZY_CALLBACK check. how do i disable that?
  8. how do i disable all spam checks? i just want rspamd to add dkim signatures
  9. how do the default_destination_concurrency_limit and initial_destination_concurrency settings int...
  10. mic check

The first one was me trying to confirm which model I am using, which is not always obvious when going through the whole llm stack I've been using. The following two are an attempt at seeing what the model is capable of and I was "not impressed", to which Claude answered that I have a "high bar", which, fair enough.

The chat is me failing to use a command line, which shows that perhaps I need to readjust that "high bar", again.

The next five are a rather embarrassing debacle in a large Postfix mailing that went sideways, and where I couldn't find an actual Postfix expert of my level to help. The fabled Claude Fable 5 answered rather correctly, but dangerously, that I could empty the queue by disabling the non_smtpd_milters . What Fable (and myself) did not realize is that the milter was also adding DKIM signatures, so while the mailing was expedited, it was done without those precious signatures, which got us promptly blocked at Gmail. We have recovered since, and, thanks to the model and reading the Postfix manual for the hundredth time, that pickup(8) is single-threaded and that we needed to review the architecture of that mailing (and our spam filters) a bit. Many tickets ensued.

The last one is a test I did to make sure my last uploads of llm-anthropic and its dependency worked correctly.

Note that the above excludes 5 questions I asked Anthropic while writing this article, where I asked for synonyms and "what nanometer scale are arduino processors built from? how is an arduino CPU printed?", a question which Wikipedia furiously evades providing a good answer.

Those prompts are pretty typical of my LLM use: I'm testing the models to see if they work at all, but also, out of desperation, I fire off a prompt after I fire off questions to colleagues or search engines (in that order). It's often weird edge cases like the Prometheus query language, Python's matplotlib, LaTeX, Elisp, optimizations, and so on.

I use models for translation a lot. Being fully bilingual, it is common for me to think of a word in French or English and fail to find exactly the right word for that in the other language. Models help with that, and are also useful to find synonyms. Those are low-token uses that seem pretty innocuous to me, but I realize the irony of this after writing about the tower of Babel .

What I am not using models for

I am not using models to write prose.

I am not using models to read prose. If it's generated with LLMs, I stop reading.

I am not using models to write code, with the exception of that single Python script above.

I am generally not using models to review code, with exceptions. If I get stuck on a hard problem, I might feed a piece of code to the model. I repeatedly fed asncounter into Claude to try to fix a performance regression I had introduced. It found micro-optimizations that taught me a thing or two about Python's internal implementations, but overall, it was mostly a waste of time. This was in June 2025, so perhaps now models would fare better. I have not tried again.

I am not using LLMs to do Debian packaging. When I can, I manually review the diffs of packages I upload into Debian, still, by hand.

I do this for the reasons outlined in The Four Horsemen of the LLM Apocalypse , because I refuse to be complicit in the:

  1. aggressive and illegal scraping of the servers I steward
  2. world-wide computer hardware shortage (making it, by the way, nearly impossible to run presumably clean local models) and the attack on our job conditions (also discussed in The people vs the AI overlords )
  3. death of copyright and free software
  4. complication and enshifitication of everything, and the destruction of our communities
  5. the imperialist Nerd Reich that wants to take over the world

Like I reluctantly use Intel computers, I do fire off a prompt. But I still hold on to the dream that we can build communities of practice that hold human knowledge collectively and not offload that as a utility to some megalomaniac billionaire.

Their LLM use I am forced into

So that's me. Clearly, I'm going against the grain here. Everywhere I look, I see LLM-generated code and projects. Slop and botnets have flooded the web.

I use Wadamesh , clearly vibe-coded , because it's the best graphical interface for MeshCore that runs on portable devices. I wish it was made by a human, in a community I could participate in, but it isn't, and I don't.

I package the above llm toolset, which is more and more vibe-coded , but I still review the diffs. And I have to say: I trust Simon here. The code is verbose as hell, feels overengineered, and llm feels slow, but it generally works, and Simon is still at the gate.

The Anthropic SDK is another thing entirely. The 0.91.0 to 0.120 upload , for example, was nuts:

 806 files changed, 72281 insertions(+), 1478 deletions(-)

I explicitly did not review that entire diff. It feels like there's a lot of garbage there to just have a shim between a proprietary API and Python. But this is the hand I've been dealt.

Larger projects LLM use

LLMs are being used in the Linux kernel, Firefox, rsync , Rust, and other places. I don't feel good about this, particularly in Rust, but they at least made a decent policy . I am glad GCC made a policy against LLM contributions and I support the human Emacs project.

We need to have a set of foundational tools that are "clean" in the sense that they are built upon a community of people that understand how they are built.

Maybe that's naive or even impossible. The Linux kernel and GCC, in particular, are massive projects that have long grown past the scale of a single person's understanding. But the theory was that a community of humans can understand collectively .

Now we seem to be throwing up our hands and giving up on that community. That LLMs will just fix the problem, whatever it is. But we're all just one rug pull away from being completely incapable of managing those projects. The argument there is that we'll just switch to local models, but no one is actually doing that. All I see is people use local models as a corner case (for privacy) or as in theory , but in reality, everyone uses the centralized frontier models right now. We just can't fallback.

We're in the same situation we were, a decade or two ago, when Microsoft decided it would kill free office alternatives by making Office free for non-profits. It worked: thousands, if not millions of schools, community groups and individuals stopped looking for alternatives (including free software but also "piracy") for Office and embraced what seemed like a generous offer.

Now Microsoft pulled the plug and Over 170,000 Nonprofits Lost All Their Data .

I'm afraid the rug pull on LLMs will be much worse: never mind that Linus won't be able to use his tireless helper to fix obscure kernel bugs; we're looking at a collapse of the economy so large that we are already talking about bailing out the companies responsible .

In a sense, the most striking thing about the Debian vote is it has actually no option to completely refuse upstream LLM contributions. It seems the community has taken it for granted that it's now impossible to build Debian entirely without LLMs. We lost the battle even without a fight, it seems.

A plea for small

If it has really become impossible for us to manage the complexity we have built, maybe it's time to stop and think about what we're doing in the first place. We're struggling to even bootstrap our current toolchain!

This is one of the things I like the most about working on the mesh: it's low tech, small Arduino devices that is built with decades-old semiconductor processes that is understandable by human beings.

Maybe the answer lies more in single-purpose devices like those communicators and simpler multi-purpose computers than what we have now, which is what the permacomputing movement is about.

Small is beautiful, let's scale it down.

Created . Edited .

Why HPSC Is a Big Deal for Space Exploration

Hacker News
www.windriver.com
2026-08-27 12:01:09
Comments...
Original Article

Spacecraft have historically relied on processors that prioritize survivability over performance. Engineers have long accepted this trade-off because space is an unforgiving environment. Radiation, extreme temperatures, vibration, and multi-year missions demand reliability levels commercial processors cannot provide.

That paradigm may be about to change.

In May 2026, the National Aeronautics and Space Administration ( NASA ) announced its next-gen space processor and entered a testing phase at Jet Propulsion Laboratory (JPL) in Southern California. The processor is part of NASA’s High Performance Spaceflight Computing (HPSC) project, which NASA describes as a radiation-hardened, high-performance system intended to deliver a large increase in spacecraft computing capacity.

Built in partnership with Microchip Technology , HPSC combines multi-core computing, high-speed networking, fault tolerance, AI readiness, and security into a single platform intended for missions ranging from Earth orbit to deep space. The Microchip PIC64-HPSC promises to link NASA mission needs with commercial aerospace demand.

NASA expects HPSC to deliver more than a hundredfold improvement in performance per watt, compared with current space-qualified computing systems. In space, every milliwatt of power saved can be redirected toward instruments, communications, mobility systems, or other mission objectives.

However, HPSC is not only about speeding up spacecraft computers. It enables entirely new ways to explore the solar system.

Why Space Needs a New Kind of Computer

In deep space, a processor error can jeopardize a mission worth billions of dollars. Energetic particles from the sun and cosmic radiation can flip bits in memory, corrupt calculations, or damage electronic components. To survive these conditions, spacecraft computers traditionally sacrifice performance in favor of resilience.

That approach has served missions well for decades, but it is becoming increasingly difficult to support today’s space exploration demands. Future missions require more onboard autonomy, more sophisticated science instruments, and faster decision-making.

HPSC was created to address exactly that challenge.

What Is HPSC?

HPSC is a 64-bit multi-core system-on-chip (SoC) architecture designed specifically for spaceflight applications. It incorporates cache-coherent multi-core processing, radiation-hardened-by-design engineering, fault-tolerant operational capabilities, and integrated high-speed networking. Radiation-hardened and radiation-tolerant variants support different mission classes. Functions can be turned off or placed into lower-power modes when unused.

HPSC supports standard technologies from terrestrial computing environments. Among them are virtualization , artificial intelligence and machine learning workloads, PCIe connectivity , Compute Express Link (CXL), Ethernet networking, time-sensitive networking (TSN), and cryptographic capabilities.

The architecture also includes an integrated 240-gigabit-per-second TSN Ethernet switch, which enables rapid movement of data between sensors, instruments, and onboard computing systems. This effectively allows HPSC to serve as both a computing engine and a networking backbone for future spacecraft.

The Challenge of Communication Delays

One reason for HPSC is the growing importance of spacecraft autonomy.

Communication delays become longer as missions venture farther from Earth. Radio signals require roughly 1.3 seconds to travel between Earth and the moon, but communications with Mars can take between 4 and 24 minutes each way depending on orbital positions. Communications to and from spacecraft around Jupiter will take much longer still.

These delays limit what mission controllers can accomplish in real time. During a critical event such as a landing, human instructions from Earth may result in missed opportunities or dangerous outcomes.

HPSC more readily enables spacecraft to process information locally and make decisions independently. Rather than sending every question back to Earth, future systems could evaluate situations on board, select appropriate responses, and continue operating without interruption.

Enabling Artificial Intelligence in Space

Deploying AI in space presents unique challenges. AI systems require substantial computational resources to support advanced machine learning workloads.

HPSC is designed for AI and edge computing applications . A spacecraft equipped with HPSC could perform sophisticated processing on board rather than transmit collected data back to Earth for analysis. AI models could identify geologically interesting formations, recognize potential hazards, prioritize sampling locations, and dynamically adjust exploration plans. That offers the potential to increase scientific return with less operational overhead.

One example is regarding improving landing and navigation. By enabling rapid analysis of multiple sensor streams simultaneously, the processor can support terrain-relative navigation and autonomous hazard avoidance systems that improve landing accuracy and safety.

Solving the Space Data Explosion

Rising data production and limited Deep Space Network bandwidth are critical concerns. Scientific instruments are improving rapidly. Future spacecraft will generate data volumes that challenge existing communications infrastructure, making it impractical to transmit the collected information back to Earth.

That’s another win for powerful onboard analysis. The spacecraft can become an active participant in scientific discovery by curating incoming images, identifying unusual features, filtering low-value information, and transmitting only the most scientifically valuable observations. The further in space we humans explore, the more important that capability becomes.

A Platform for the Next Generation of Missions

The ultimate promise of HPSC lies not in any single specification but in what those specifications make possible.

Deep-space probes could autonomously adapt observation strategies. Mars rovers could navigate more independently. Space telescopes could analyze observations before transmission. Lunar vehicles could operate with minimal human oversight. Swarms of coordinated spacecraft could share data and make collective decisions using onboard intelligence.

These capabilities represent a significant shift in how missions are conceived and executed. Rather than functioning primarily as remote-controlled machines, future spacecraft may act as intelligent systems that can analyze, prioritize, and respond to their environments in real time.

HPSC Needs a Software Ecosystem — and That’s Where Wind River Comes In

HPSC is not just a next-generation processor. It is the foundation of a broader space-computing ecosystem in which advanced hardware, real-time operating systems, virtualization technologies, and AI frameworks work together to enable increasingly autonomous exploration missions.

The HPSC ecosystem begins with open standards and open source software. Developers can start with familiar environments such as Debian and Yocto Linux, using familiar toolchains such as LLVM, Python, OpenCL, OpenMP, TensorFlow Lite, and other high-performance computing frameworks. When mission assurance, long-term maintenance, certification support, and program risk reduction become requirements, projects can choose commercially supported offerings for enterprise Linux distributions and real-time operating systems.

Wind River’s technologies, such as the VxWorks real-time operating system, the eLxr Linux distribution, and Helix Virtualization Platform hypervisor, have a long history in aerospace and defense applications where they are widely deployed in safety-critical environments where reliability is paramount.

For example, Wind River’s Helix platform enables more sophisticated spacecraft software architectures by allowing multiple operating systems and applications to run securely in isolated partitions on the same multi-core processor. Future spacecraft might run a safety-critical navigation system in one partition, a machine-learning application for terrain classification in another, and scientific instrument processing in a third.

HPSC Taking Off

HPSC combines radiation hardening, fault tolerance, modern multi-core computing, high-speed networking, AI support, and unprecedented improvements in performance per watt to address persistent limitations facing current spacecraft.

More than just a faster processor, HPSC is a step toward a future in which spacecraft can think for themselves. As missions push farther into the solar system, encounter increasingly complex environments, and generate ever-larger volumes of scientific data, that capability may become not merely advantageous but essential.

Small Models Have Arrived

Hacker News
calv.info
2026-08-27 11:56:58
Comments...
Original Article

For the past few weeks, I've been playing with gpt-5.6-luna . It is shockingly capable, fast, and smart. I regularly see it do ~100 tps, and rip around my codebase, email, and knowledge base.

Of course, the biggest thing with luna is the cost . I've tried running some fairly complicated research threads, and it's pretty tough to run up a large bill. Even having it search across thousands of emails, I end up with an API cost in the tens of cents.

With GLM 5.3, we even have a new option at the Pareto frontier.

When doing coding work, I almost always reach for the most expensive and capable models (Fable 5, 5.6 Sol). So it's been easy to miss the progress the small fast models have made.


One thing a few investors I've talked with have mentioned: "It's weird we're not seeing more consumer AI companies. Why is that?"

There's a straightforward answer: token costs.

In the times before AI, the playbook for big consumer apps looked like this...

  • create some sort of compelling website which is fairly cheap to run
  • attract a bunch of users (typically with some virality)
  • raise money, scale to more users
  • create an ads marketplace

This roughly describes most of the big consumer companies (Google, Facebook, Snapchat, etc.). 1

But what if you want to add AI to your product? Well, now you have some real inference costs on every request! Suddenly the amount of capital required increases dramatically.

A pet eval of mine is to build a daily news site, personalized to me:

research @calvinfo on the internet. figure out what news they might like. build a micro-site with today's top stories, personalized for them. search hn, reddit, twitter, etc.

With the previous generation of models (Sonnet class), you'd spend ~$1 to get anywhere. Charging $30/mo is untenable for a consumer app. There's obviously a lot we can optimize here, but if you're charging what the WSJ or The Economist charges, you'd better be delivering similar value.

But looking at luna, the results are pretty decent, and the average cost is ~$0.10. Now we're talking!


Where I think this gets even more interesting is in the world of business.

My Segment co-founder Peter and I were recently comparing notes on a hike. Across his various startups, Peter has seen two kinds of work:

  1. the "IQ 180" work. some mad scientist genius type comes up with some crazy solution you've never thought of.
  2. the "token spewer" work. being ultra responsive, pushing the ball forward across dozens of different fronts.

Peter runs multiple companies. Beyond Segment, he's raised $100m+ for Charm Industrial , and just recently closed a Series A for Revoy . He's incredibly organized and efficient with his time.

And yet, Peter mentioned that ~95% of the work he does falls into bucket 2. It's hopping on calls. Nudging people. Blocking and tackling.

To be clear, Peter says his companies would be dead-in-the-water today without an IQ 180 technical mind solving the deep problems . Just that most of his work falls in bucket 2. 2

I think demand for "frontier-level" models is going to keep compounding. Especially for fields that require novel breakthroughs or discovery (engineering, hard science, model training).

But I also think the demand for "fast/cheap/good-enough" models is just about to take off.

Think of the people you interact with on a daily basis: coworkers, vendors, and customers. Nine times out of ten, you want someone who is super responsive, and just handles things for you. Most of the "human tokens" at companies today are spent this way — hiring skews heavily toward the fast/cheap/good-enough archetype.

There's a lot of work that needs to happen to make fast/cheap/good-enough models a reality for business. New harnesses, prompt injection safety, roles, and permissions. But I'm confident we'll figure that out.

If you're also experimenting with making small models useful, please drop me a line.

  1. Amazon and Netflix are the notable exceptions

  2. Peter is also being modest here. He's sharp as a tack.

The broadcast squeezeback, rebuilt with CSS Grid and WebVTT

Hacker News
www.mux.com
2026-08-27 11:56:03
Comments...
Original Article
View the live demo

Confession: I did not care much about football as recently as May. But by the time España lifted the trophy last month, I was watching matches I had no stake in, still unable to explain offside.

Somewhere in one of those matches, I noticed what the picture on the screen sometimes did: the grassy pitch slides into one corner and scales down, and the space around it opens up and fills with a sponsor card, a second angle, or the studio desk. You don’t miss a moment of the game.

Mmmm, tasty squeezeback

I'd seen that effect a bajillion times without really looking too hard at it. It's just what television does. But during one of my infamous 2am can’t-sleep iPhone research sessions, I learned it actually has a name: a squeezeback .

The closest thing I’ve seen for this effect on the web is a YouTube video where somebody squeezes the frame in After Effects and renders it out. The layout is a picture, baked in before upload, and the most interactive it gets is a hotspot on top of a motion graphic someone already designed.

Which is strange… because a squeeze is just a layout change, and browsers are very good at layout changes! Do it in CSS and the space that opens is a cell you can put a real element in, chosen at playback instead of in post.

Link The flexibility of a smooshy CSS grid

What happens if we put the player in the center cell of a 3×3 grid where the six outer tracks are collapsed to nothing, then animate the track sizes?

A grid with different layouts

.stage {
  display: grid;
  grid-template-columns: 0fr 100fr 0fr;
  grid-template-rows: 0fr 100fr 0fr;
  overflow: hidden;
  transition:
    grid-template-columns 850ms cubic-bezier(0.65, 0, 0.35, 1),
    grid-template-rows 850ms cubic-bezier(0.65, 0, 0.35, 1);
}
.stage[data-layout='right-rail']  { grid-template-columns: 0fr 62fr 38fr; }
.stage[data-layout='lower-third'] { grid-template-rows: 0fr 74fr 26fr; }
.stage[data-layout='squeeze'] {
  grid-template-columns: 5fr 63fr 32fr;
  grid-template-rows: 0fr 82fr 18fr;
  row-gap: 8.9%;
}

Woah. That's an entire motion system! It doesn’t even need a transform on the video or scaling wrapper or requestAnimationFrame loop measuring anything. The video is a normal grid item in a cell that's getting smaller, and the panels parked in the other cells get revealed as their track values leave zero.

The reveal and the shrink are the same event. The panel was always sitting in that cell at full size. The shrink is just the moment the cell stops hiding it. Isn't CSS neat?

That row-gap: 8.9% is the only odd number in there. Percentage gaps resolve against height, and at 16/9 , 8.9% of height is 5% of width, which is exactly the 5fr left column. The top track is 0fr , so that one value makes the space above and below at the same time. Equal inset on three sides.

Unfortunately, you can't write it in cqw and skip the math since the stage is the query container, and a container can't query itself.

Link The timeline is a text file

Video.js v10 is a React video player component library: createPlayer , hooks, composable primitives, etc. but what it doesn't do is invent a scheduling system, because the browser already has a perfectly good one: WebVTT .

cta-cues.vtt

WEBVTT

away-kit
00:00:04.000 --> 00:00:12.000
right-rail

champions-bundle
00:00:26.000 --> 00:00:34.000
squeeze

Every cue has an optional identifier line right above the timestamps that isn’t really used very often, but it's perfect for this use case. The identifier becomes the product key, the payload becomes the layout, and the copy and pricing stay in your app keyed by that id. If you’re working on shoppable video, a merchandiser could retime the whole experience by editing a text file, and your pipeline can generate one per asset without a deployment.

You can add it to the player as a <track> element and let the browser tell you when something is active:

Video player with cues attached

<MuxVideo src={src} autoPlay muted playsInline loop crossOrigin="anonymous">
  <track kind="metadata" label="cta" src="/cta-cues.vtt" default />
</MuxVideo>

Video.js v10’s usePlayer takes a selector arg, so selectTextTrack subscribes you to just the text track slice of the store and nothing else. That matters because you aren't re-rendering on every timeupdate , and you get told when the track has actually registered, because tracks come and go while the engine attaches.

Use the cues

import { usePlayer, selectTextTrack } from '@videojs/react';

const { textTrackList } = usePlayer(selectTextTrack);
const ready = textTrackList.some((t) => t.label === 'cta');

The store models tracks as plain descriptors, so once it says yours exists, you can check the live TextTrack to access the cues themselves:

Handle the cuechange event

track.mode = 'hidden';

track.addEventListener('cuechange', () => {
  const cue = track.activeCues?.[0];
  setActiveCue(cue ? { id: cue.id, layout: cue.text.trim() } : null);
});

A text track has three modes: showing paints cues on screen as captions, disabled stops cuechange firing at all, and hidden parses the cues and fires the events without rendering anything - so that’s the one we’re using to fire layout changes.

Once you're listening for cuechange instead of polling currentTime on a timer, scrubbing backwards through a cue window, looping and seeking all behave correctly without you writing a line for any of them.

You can then bind it to the DOM with one data attribute:

<div className="stage" data-layout={cue?.layout ?? 'full'}>

One warning: for now, you should build the cues in a file rather than in JavaScript, at least as of writing this post. hls.js clears the cues off every text track when it attaches, and v10 ships a mixin that repairs the damage by finding the <track> element and reloading it. A track you created with addTextTrack() has no element to reload, so it silently stays empty while everything else looks correct. We should make that louder or fix it, but file-based VTT will work for now.

Link Let the video light up the room

I’ve always liked the gradient effect that my hue lights spill out behind my TV screen , matching the colors off of the display. Let's create that here, too:

Glowing gradient canvas

<canvas ref={canvasRef} width={32} height={18} className="stage__ambient" />

const ctx = canvas.getContext('2d', { willReadFrequently: true });

let lastDraw = 0;
const tick = (now) => {
  frame = requestAnimationFrame(tick);
  if (now - lastDraw < 100) return;  // ten times a second is plenty
  lastDraw = now;
  if (!video.videoWidth) return;     // nothing decoded yet

  ctx.drawImage(video, 0, 0, 32, 18);
};

frame = requestAnimationFrame(tick);

We can use CSS to stretch a canvas across the stage and blur it into mush, so the revealed space gets lit by whatever is on screen. It’s a pretty performant solution too, so you don’t have to worry too much about the cost of implementing this effect.

Twinsies colors

Twinsies colors

willReadFrequently: true warns the browser you plan to read this canvas back, and without it the canvas lives on the GPU where getImageData stalls every call. Also, videoRef has to point at the actual <video> element.

The Media object you get back from useMedia() is a runtime-agnostic wrapper, and drawImage wants a CanvasImageSource , so handing it the wrapper leaves you with a blank canvas and nothing in the console to explain why.

We can even read and use the frame colors and pull an accent color for the buy button background color.

My first attempt at this averaged the red, green, and blue channels and produced the same olive brown on every frame, because the bright sky and the dark shadows from the video cancel out and land right in the middle of the color wheel.

The fix was to treat the frame’s hue as an angle instead of just an averaged number:

Sample colors from an angle

const weight = saturation * (1 - Math.abs(2 * lightness - 1));
x += Math.cos(hueRadians) * weight;
y += Math.sin(hueRadians) * weight;

There are two constraints for this to work: the player needs crossOrigin="anonymous" and the source needs CORS headers, or getImageData throws an error. And it only works on unencrypted content, because Widevine and FairPlay frames can't be drawn to a canvas at all, so you’d have to catch the throw from drawImage and fall back to a static gradient.

Link Two CSS gotchas

1. Grid fr values only interpolate correctly if the totals match. A track's rendered size is its value divided by the total of every value in the template, so animating between templates with different totals moves the numerator and denominator at separate times. My resting state was 0fr 1fr 0fr and my squeeze was 0fr 76fr 18fr , and the video did this on the way back:

Something's fishy with this animation

0ms   w=63%  h=68%
365ms   w=64%  h=79%     ← 365ms in, the width has moved one percent
630ms   w=92%  h=96%     ← now it's sprinting
724ms   w=100% h=100%

So a single transition working across two axes with two completely different curves created a squeezeback that looked like it was being reeled in on a fishing line. Woah, Nelly! Instead, you have to match the totals so the fraction moves linearly on the curve you asked for.

2. @property fails silently: The Video.js default skin resolves every corner radius from one variable, so the video can be square at full bleed and rounded once it floats free. That means animating a length, and custom properties don't interpolate at all until they're registered:

@property definition

@property --media-border-radius {
   syntax: '<length>';
   inherits: true;
   initial-value: 2rem;  /* ← invalidates the whole rule */
}

The initial-value of a registered property has to be computationally independent, which rules out using rem , em , and percentages, and getting it wrong invalidates the entire rule. The skin default is 2rem , so 2rem is what I wrote and broke the whole thing. Write 32px instead and it works.

javascript

getComputedStyle(document.documentElement).getPropertyValue('--media-border-radius')
// '32px' if it registered, '' if the rule was thrown away

Link How about forms?

You can use this technique to show more than simple Buy Now buttons as demo'ed in the video at the top of this post. In a squeezeback you can use the same panel with different contents of your choice.

The layouts can be a lookup table

newsletter: {
  right: {
    kind: 'form',
    title: 'Match report, every Monday',
    body: 'One email a week. Goals, kits, and whatever we just shipped.',
    action: 'Subscribe',
  },
},

The only issue with this is if the cue expires mid-keystroke, the grid collapses the field out from under them, and the person filling it out wonders wtf just happened to their signup form.

So the cue proposes the layout, and when the form field is focused by the user, it overrides the exit.

Handling form focus within the squeezeback

export function useCueHeldByFocus(cue, containerRef) {
  const [focusHeld, setFocusHeld] = useState(null);
  const lastCue = useRef(null);

  // Capture during render, so a hold that starts mid-cue holds *that* cue.
  if (cue) lastCue.current = cue;

  useEffect(() => {
    const onFocusIn = (event) => {
      if (containerRef.current?.contains(event.target)) {
        setFocusHeld(lastCue.current);
      }
    };

    const onFocusOut = (event) => {
      const node = containerRef.current;
      if (!node?.contains(event.target)) return;
      // relatedTarget is where focus is heading. Staying inside is not an exit.
      if (node.contains(event.relatedTarget)) return;
      setFocusHeld(null);
    };

    document.addEventListener('focusin', onFocusIn);
    document.addEventListener('focusout', onFocusOut);
    return () => {
      document.removeEventListener('focusin', onFocusIn);
      document.removeEventListener('focusout', onFocusOut);
    };
  }, [containerRef]);

  // focusout seems kinda unreliable, so we re-check the live activeElement when the cue changes.
  useEffect(() => {
    if (!focusHeld) return;
    if (!containerRef.current?.contains(document.activeElement)) {
      setFocusHeld(null);
    }
  }, [cue, focusHeld, containerRef]);

  return focusHeld ?? cue;
}

While anything in the panel has focus, the layout freezes. The timeline underneath keeps running, and the moment focus leaves, the grid catches up to wherever it got to. The hold beats an expiring cue and an arriving one equally, because collapsing the field and replacing it are the same problem for someone halfway through typing.

Link The squeeze is older than the web

All of that took an afternoon and a stylesheet. But for funsies, it's worth knowing what it used to take.

Apparently, the hardware could do it by the early eighties. Ampex's ADO and the digital video effects boxes that followed could scale and reposition a live signal in real time, and they cost enough that the capability stayed locked up in post-production, where a squeezeback was a prestige effect you budgeted for. Doing one live was rare enough to be worth remarking on.

Ampex ADO 1000

Then manufacturers folded DVEs into character generators, the box already sitting on the transmission path, and the squeeze stopped being a special effect and became a layout. North American networks started squeezing end credits to trail the next show in the late nineties, Channel 4 carried it across the Atlantic, and the BBC was running live promo squeezes by 2000.

Sports got there at roughly the same time and then seemingly lost interest for six years. TBS put ads beside a live NASCAR race in 2000, the format went dormant across the next rights deal, Turner revived it for the Wide Open Daytona broadcasts from 2007 to 2011, ESPN followed with NASCAR Nonstop until 2014, and Fox spent 2025 pushing side-by-side across its green-flag breaks.

A full twenty years passed between possible and routine, and the gap only closed when the effect moved into a tool people already had open. Too lazy? Too pricey? I feel like an argument could be made either way.

Link Don’t stop there

Every layout in this post returns to full bleed when its cue ends, but nothing requires that. If you leave the last cue open, the video will stay exactly where the squeeze left it, holding a corner of a grid that now has room for a whole page-like layout underneath.

css

.stage[data-layout='handoff'] {
  grid-template-columns: 0fr 30fr 70fr;
  grid-template-rows:    0fr 30fr 70fr;
}

The video keeps a 30% corner and keeps playing, the bottom row opens to full width, and that row can include full product details. Playback remains smooth as a baby’s tuchus, since we’re not touching the video player at all.

You can imagine all kinds of different use cases for this treatment:

  • A sign language interpreter in a corner cell, cued by the VTT so it only appears for the segments that need one.
  • Slides beside a talk, timed by the same text file the video already ships with.
  • A second angle that trades places with the main one (nothing says the center cell has to be the big one).

The demo code is on GitHub . If you build something with it, send it our way!

Suica, Japan's First IC Transit Card

Hacker News
www.tokyodev.com
2026-08-27 11:55:12
Comments...

Japanese polka dot artist Yayoi Kusama dies aged 97

Hacker News
www.bbc.com
2026-08-27 11:54:00
Comments...
Original Article

Reuters Japanese artist Yayoi Kusama poses for a photograph inside her Infinity Mirrored Room installation titled "The Souls of Millions of Light Years Away" during a media preview of her new exhibition at the David Zwirner gallery in New York, U.S. Reuters

Polka dots, pumpkins and infinity room mirrors are hallmarks of Kusama's artistry

Japanese avant-garde artist Yayoi Kusama, who became famous for her colourful polka dot-covered sculptures and installations, has died at the age of 97.

Kusama, who had voluntarily lived in a psychiatric hospital for decades, was known for her bright red wig and her giant, quirky creations.

Her exhibitions drew large crowds around the world, and her vibrant works fetched some of the highest ever prices for a female artist.

A statement from her company said: "Throughout an extraordinary lifetime devoted entirely to artistic creation, Kusama pursued an internationally acclaimed career as a pioneering avant-garde artist whose creative practice encompassed visual art, performance, fiction, and poetry."

Getty Images Yayoi Kusama standing among giant white shapes with multi-coloured polka dots Getty Images

Yayoi Kusama pictured with one of her installations in 2001

Kusama died at a hospital in Tokyo on 14 August, the statement said.

It added: "She continued to paint until her final days, never setting aside her brush, and continued exploration of forever love and eternal soul.

"We will carry forward Kusama's wishes and, through art, continue to bring hope and strength for the future to people around the world."

Kusama became one of the world's most recognisable artists and a global cultural icon in her 80s and 90s, after having been mostly overlooked for decades.

Poorly received by a masculine-dominated art scene of New York in the 1960s, Kusama caused a stir with her exhibitions of phallic sculptures, including a fabric couch, and frequent displays of nudity.

NY Daily News via Getty Images Yayoi Kusama paints body of Kent Feathergill, 1967. NY Daily News via Getty Images

Frequent nudity in her works drew scorn in Kusama's native Japan

In 1965, her work "Infinity Mirror Rooms", in which mirrors and lights create seemingly endless spaces, attracted millions of visitors. Later, her polka dot and pumpkin works became highly sought-after.

However, she became distressed when her ideas were copied by or "inspired" her male contemporaries – including Andy Warhol, Claes Oldenburg and Lucas Samaras – whose works would be displayed at more prestigious galleries.

After spending years watching male artists gain recognition for her work, she returned home to Japan – feeling dejected and distraught.

She entered a psychiatric facility receiving treatment for mental illnesses, where she would live and work for the remainder of her life.

Miraculously, she managed to find a hospital where the doctors were interested in art therapy and checked herself in. Such a secure environment allowed her to focus on creating art.

Through the 1970s and early 80s, her work depicted uncharacteristically dark series' of collages in which she embraced the imagery of natural life cycles.

AFP via Getty Images A series of intertwining tentacles in black and yellow polka dot run through a large room with mirrors in the centre, with visitors walking through it, in Basel in 2025. AFP via Getty Images

She blended this concept with balloon installations in her trademark polka dot style for a major retrospective in Basel in 2025

Kusama went on to become Japan's first solo artist to represent the country at the 1993 Venice Biennale. Twenty-seven years earlier, she had turned up, uninvited, and laid down 1,500 mirror balls on the ground.

The roaring success of the exhibition led to a huge transformation in how she was received both in Japan and abroad.

In 2001, she was awarded the Asahi Prize – recognising outstanding cultural, academic and artistic contributions in Japan.

One of her paintings fetched about $10.5m (£7.7m) at auction in 2022, making her works some of the highest-earning in the world for a female artist.

Getty Images A visitor standing in one of Kusama's Infinity Rooms, seen reflected several times in mirrors surrounded by lights Getty Images

Kusama's Infinity Rooms immersed visitors in the installation using mirrors and lights

She held major exhibitions around the world, including at the Tate Modern gallery in London, which was ran for three years after being extended several times because of its popularity.

Catherine Wood, interim director of Tate Modern, told BBC Radio 4's Today programme on Thursday it was "our most visited exhibition of all time because people really love Kusama's work".

The exhibition invited visitors into the artist's Infinity Mirror Rooms.

"You would step in there and the lights would go down, and it felt like you were looking into the mysteries of the Universe," Wood said. "She was very good at conjuring this sense of wonder and infinity that she was obsessed with."

AFP / Chesnot via Getty Images A composite image shows on the left the sculpture bent over the store painting dots that cover the facade of the building, and on the right a depiction of the huge sculpture in the likeness of Yayoi Kusama standing up between the headquarters of the Maison Louis Vuitton and the Samaritaine department store on March 06, 2023 in Paris, France. AFP / Chesnot via Getty Images

A sculpture of Yayoi Kusama was erected outside Maison Louis Vuitton in Paris in 2023, with the store covered in colourful polka dots

As a child, Kusama experienced hallucinations of embers and flashing – later using her art as a vehicle for others to understand her vision of the world.

"One day, after seeing a tablecloth with a red flower pattern on a desk, I saw the same red flower pattern all over the ceiling, windows and pillars. It filled the room, and covered my body," she wrote in her autobiography.

Kusama was born in 1929 in the rural provincial town of Matsumoto, based in the central Nagano region of Japan.

Her parents did not support her early moves to study painting in Kyoto.

She was later told her artistry caused great shame to her conservative family. Some elements of the US press also criticised what they perceived as an endless desire for publicity – either in her messaging promoting peace or critiquing the art establishment.

View of several of Kusama's giant colourful sculptures in Manchester

Kusama staged a major exhibition in Manchester in 2023

The world, along with her native Japan, radically changed its perception of Kusama in her later life.

Social media fuelled a spike in interest over recent years – with her museum's bold floral shapes and shiny steel orbs turning into a desired backdrop for selfies and poses.

Among her many motifs, the pumpkin has become iconic in her works. To her, the vegetable represented comfort and nostalgia.

She once said in an interview: "Pumpkins speak to me.

"They embody a sense of stability and gives me peace of mind."

This East Village Sandwich Shop Is As Good As You've Heard

hellgate
hellgatenyc.com
2026-08-27 11:49:39
The best lunch in town right now is at the vibrant 20 Blocks....
Original Article

Willy Corman and Jack August are total New Yorkers, born and raised and still living in and crushing on this crazy city. They went to schools you've heard of if you also went to schools here (Corman, in fact, grew up around the corner from where I lived on the Upper West Side when my kids were little, so they definitely toddled around together at Hippo Playground—IYKYK—back in the late 1990s), and they both studied art in college and met while working at the gallery Zwirner six years ago.

Turns out, though, that despite all of life's possible paths before them, Corman and August really wanted to make sandwiches.

"Four years ago Jack asked if I wanted to open a sandwich shop, and I was like, perfect," Corman, also a gallerist , told Hell Gate. "It sounded manageable. But the first year was spent trying to find a space, and a chef, and money, and nothing was working. Finally we said 'fuck it, let's just do something.'"

So the duo charmed their way into a series of weekend popups in downtown community gardens, all profits going to their hosts, which led to a few catering gigs, and then, miraculously, the perfect space opened up on East 4th Street, with room for seating, a big enough kitchen to do interesting stuff (though they did have to install a new gas line, which took many more months than they would have liked) and a relaxed vibe that can only really be manifested mid-block around these parts, away from the avenues.

Say hello to 20 Blocks , now serving some of the city's absolute best sandwiches. And while Corman and August bring an unmistakable NYC energy, confidence, humor, and style to the place, the kicker ingredient here is chef Griffin Valentine, who cooked at places like Gem Wine and Cove before turning his full attention to putting great things between really good bread.

The menu will be a bit fluid, but at the start 20 Blocks features three sandwiches, all total bangers. I'm not even going to rank them—they're all tied for most delicious.

Give us your email to read the full story

Sign up now for our free newsletters.

Sign up

The Tragedy and Ecstasy of AI Companions (with Bridget Todd)

403 Media
www.404media.co
2026-08-27 11:47:59
In her new audiobook, Love at First Prompt: AI and the Future of Intimacy, Bridget Jones and Michael Amato unpack how real people are using chatbots to seek connection, in an era when tech companies are constantly trying to exploit our innermost worlds....
Original Article

Tech companies want you to believe that the chatbots they profit from are the always ready, never judgmental, constantly affirming friend in our pockets. But are the people using them as companions under some kind of deep self-delusion? Or are they seeking something else?

In this week’s interview episode, I was joined by journalist Bridget Todd. Among many other projects and accomplishments, Bridget is the creator and host of the award winning podcast There Are No Girls on the Internet , is a Fellow at the MacArthur Foundation, and an affiliate at Harvard University's Berkman Klein Center for Internet & Society. Her new audiobook, Love at First Prompt: AI and the Future of Intimacy , launched in July with coauthor Michael Amato.

We talk about her work interviewing people who use chatbots to fill an emotional need, how people who engage in romantic, intimate and erotic roleplay with LLMs are mocked for it, and how tech companies are implicated in all of this. In her new book, you’ll hear from experts in the field of AI companionship, but also from people who have nuanced, interesting interactions with chatbots every day.

For Bridget, Love at First Prompt was inspired in large part by her own use of LLMs in the face of extreme stress and tragedy after her parents died – her dad after a long illness, and her mom more suddenly after. “It was like having to relearn how I fit into my existing social dynamic,” she told me. “I was incredibly isolated. I wasn't really talking to my friends. I wasn't really talking to anybody. I wasn't really returning any emails. I was completely overwhelmed in all the ways somebody can be overwhelmed.” She’d been using ChatGPT to keep track of medical notes, but soon that changed, almost without her realizing it.

“My use of ChatGPT had gone from just looking up things that my dad's doctor would say, or researching how to get care and how to pay for care – it was a lot of that because I was getting hit with a lot of complex medical jargon that I never heard – to then, I found myself late at night telling ChatGPT, ‘I'm so overwhelmed. This is so overwhelming. I'm so exhausted. I'm so worried about my dad. I'm so anxious.’ And so there wasn't any particular black and white light switch that flipped where [I thought] now I'm going to start speaking emotionally to ChatGPT. It happened without me really even noticing it.”

This made her curious about other people’s usage of chatbots, especially in a time when so many tech companies are pushing “AI companions” as the frontier of connection.

In the book, she breaks down how real people use LLMs to fill an emotional need, and connects their experiences to how tech executives are cashing in. “All of these things that we used to think of as sacrosanct are now just up for grabs by these tech companies. And so the question that I asked people who were experiencing intimacy with AI was, are you comfortable with something as intimate as these connections that are romantic or sexual being owned and controlled by companies who don't give a shit about you, who we know cannot be trusted, who do horrible things without even thinking about it? Even beyond that, who will change as the wind blows?” Bridget said in our conversation. “Like Sam Altman saying, ‘We're gonna start doing erotic role play. Oh, just kidding. Never mind.’ The whiplash with which [execs] say things and then take it back and then operate as if they never said that, it's almost like gaslighting. Do you want your most intimate human connections being mediated by an unreliable gaslighter? And that's what we have in these tech companies.”

Bridget’s book is her most vulnerable work yet. She unpacks and critiques her own use of ChatGPT during a crisis, and reveals what she learned about herself, her friendships and real-life relationships, and what it means to maintain human connections in an era tech companies are constantly trying to exploit our innermost worlds.

Further reading:

About the author

Sam Cole is writing from the far reaches of the internet, about sexuality, the adult industry, online culture, and AI. She's the author of How Sex Changed the Internet and the Internet Changed Sex.

Samantha Cole

Launch HN: Salem Robotics (YC S26) – Software for industrial inspection robots

Hacker News
news.ycombinator.com
2026-08-27 11:46:04
Comments...
Original Article

Hi HN, we're the founders of Salem Robotics ( https://salemroboticsinc.com ). We give existing mobile robots the task-specific intelligence to carry out surveys and physically interactive inspections in hazardous industrial facilities.

Here's a video of it running on real robot hardware with a few words from us: https://youtu.be/U_228h3NE7c

We came to Salem through robotics research at UT Austin and a combined 15 years working in nuclear, including about 10 years developing and deploying autonomous robots at Los Alamos National Laboratory. Over the last five years, we kept running into the same gap: robot hardware had become very capable, but making a robot carry out a complete industrial procedure still required a surprising amount of robotics work and manual intervention.

The part that interested us most was manipulation. A nuclear contamination survey, for example, can require taking a "smear": wiping a defined area of a surface so it can be checked for removable radioactive contamination. In an oil, gas, or chemical facility, an LDAR (leak detection and repair) inspection can require moving a detector around a particular valve, flange, or connection. Other inspections require positioning an instrument at a precise location and orientation relative to a pipe or piece of equipment.

These are easy tasks to compress into verbs like "wipe", "measure", or "inspect", but considerably harder to make a robot do reliably. A probe might need to remain normal to a surface throughout a path, stay within a narrow offset from a pipe, or trace a region while maintaining a particular end-effector orientation. The planner has to find a feasible motion while respecting the task geometry, manipulator kinematics, joint limits, collisions, and the environment around it.

We work down to joint-level control for those interactions. One problem we've spent a lot of time on is generating constrained manipulation plans quickly enough that they can be based on the geometry the robot actually observes instead of requiring someone to carefully author a trajectory for every individual surface, valve, or flange.

The physical world makes this annoying. A few centimeters of error may not matter much when navigating down a hallway, but it matters if a sensor is supposed to remain normal to a curved surface. And successfully executing a trajectory doesn't necessarily mean the inspection worked. The detector could be misaligned, contact could be wrong, the geometry could differ from the model, or the measurement itself could be invalid. We care about closing that loop around the inspection result, not just whether the arm reached the commanded pose.

Our approach is a combination of AI and classical robotics. A lot of robotics research and industry attention right now is going toward increasingly end-to-end learned systems, particularly around humanoids. Working in safety-critical environments has made us appreciate how relevant classical approaches still are when you want explicit constraints, predictable behavior, and theoretical guarantees about what a robot can and cannot do.

We use AI where semantic understanding and flexibility are useful, such as interpreting less structured information or understanding what in an unfamiliar scene is relevant to a procedure. Once the system knows what physical interaction it needs to perform, we prefer explicit geometry, planning, optimization, and control where possible. We're interested in the marriage between the two rather than trying to make every part of the robotics stack learned.

The other idea behind Salem is that we don't think every useful robot application should require building a new robot. Companies like Boston Dynamics are getting very good at building increasingly capable hardware platforms. We think there is room for a domain-specific application layer on top of that hardware. The same underlying robot might perform nuclear radiological surveys in one facility and LDAR inspections in another, but the procedures, sensors, manipulation constraints, success conditions, and outputs are different.

That's also why we're hardware agnostic. We don't expect one robot to be the best platform forever, and facilities already own different hardware. We'd rather describe an inspection in terms of what needs to happen and then map that onto the capabilities of the right robot for the job.

One thing that surprised us after spending more time with facilities is how manual many inspection workflows still are. In sophisticated nuclear and industrial sites, people still physically walk survey routes, take measurements one at a time, visually inspect equipment, record results manually, and sometimes make judgments based on things like how a component sounds. Some of the basic workflows would be recognizable to someone doing the job decades ago, even though the sensors, computation, and robots available today are radically different.

We're starting with radiological inspection in nuclear because it's the industry we know best, and we're also working on manipulation-heavy inspection problems in oil, gas, and hazardous chemical facilities. The technicians and inspectors still define the procedure, interpret results, and make the consequential judgments. We're trying to automate more of the repetitive physical execution that currently requires someone to enter the environment or manually operate a robot.

We sell directly to industrial facilities, usually starting with a paid technical validation and then moving to an ongoing deployment. Pricing varies substantially with the workflow: validations range from tens of thousands to over $100k, and larger deployments can range from the low hundreds of thousands to roughly $500k per robot.

One thing we're especially curious to hear HN's thoughts on is where the abstraction boundary in robotics should sit. What should come from the robot manufacturer, what belongs in an application layer, and what will inevitably remain specific to the facility? We'd also be interested in hearing about other industries where you've seen physical inspection tasks that look trivial to a person but are surprisingly difficult to automate.

A Million Kakapos

Lobsters
blog.mempko.com
2026-08-27 11:41:58
Comments...
Original Article
A Million Kakapos
Kakapos in the wild

Agentic coding is the hot new thing. I've been doing it since the GPT3 days back in 2021. Everyone doing it has decided that coding is now 'basically free'. Prior to this you needed great programmers to make great software. Becoming a programmer with good skill takes a lot of work. Now that LLMs can code fairly well, where does that leave Open Source software? This article is about Open Source software and what could happen to it in a world where writing code is no longer scarce.

Efficiency vs Robustness

Panda Eating Bamboo

Darwin is often misread. We are taught "Survival of the fittest" (Herbert Spencer coined that term, not Darwin) and imagine a competitive world where the strongest survive. Evolution is often thought of as some kind of optimization process. What is often misunderstood is time horizons and what is being "optimized". If an animal is optimized for its environment, it subjects itself to a huge risk: What if the environment changes?

The Giant Panda is a creature that is hyper optimized for its environment. It's diet is about 99% bamboo, and it has evolved a specialized thumb which helps it strip bamboo. However bamboo can go through synchronous flowerings and die-offs which make it difficult for the panda to survive. The Giant Panda was an endangered species for decades and survives now because we help it survive. In other words, evolution over the short term optimized the panda to be fit for a niche environment, but over the long term has created a very fragile creature, unable to adapt to variance in its environment.

The Kakapo is another creature that became highly optimized for its environment. With no natural land predators, it evolved in New Zealand and optimized for energy conservation. It abandoned expansive flight, grew heavy, and has a long multi-year breeding cycle. Worst of all, it evolved to freeze when startled which make it easy prey for land mammals like rats and cats. It is another species on the endangered list with only 240 left.

If you look at a narrow time scale where the climate has not shifted much, you get animals that are highly optimized for their regions. However, over a much longer time scale, where variance of the environment is felt, you get animals that can adapt to a variety of environments. Think of animals like cockroaches, which have been around almost 400 million years. Cockroaches can digest almost any organic matter. They can survive weeks without food and water. They are found in a huge variety of environments from tropical rainforests, dry deserts, temperate woodlands, caves, and now human habitats.

Think of sharks, which have been around 450 million years. Sharks have an amazing olfactory system and can locate prey from long distances in zero visibility. They have electroreception as well to help them find prey. They occupy a huge assortment of environments like coral reefs, open oceans, abyssal depths, arctic ice sheets, and even fresh water river systems. Their diets are highly flexible and they are able to readily shift their target prey based on the environment.

Over long time horizons, evolution selects for adaptive, robust creatures, not highly optimized performant ones. It selects for creatures with redundancies and adaptive systems. Cockroaches for example have a decentralized nervous system. You can take the head off a cockroach and it will stand, walk around, run away, and react to stimuli for weeks until it dies of dehydration. Sharks have redundant rows of teeth. Instead of evolving a single set of highly specialized teeth, which would give it fragility, Sharks have redundant rows of teeth which migrate forward, replacing older ones, throughout their life. To find prey, sharks have redundant sensory systems like their olfactory system, eletroreception, lateral line systems (which help them detect water movement and pressure), and sight. A blind shark could still feed and survive.

Systems of redundancy and adaptability are not performant. They cost the animal a lot in terms of energy. The metabolic cost for sharks having to replace thousands of teeth over their lifetime requires constantly creating new ones. Maintaining multiple overlapping sensory systems requires a high amount of 'standby power'. For cockroaches, their distributed neural system isn't as efficient as having a centralized brain. Neurons are some of the most energy intensive tissues. In humans the brain consumes 20% of the resting energy.

In other words, Sharks and Cockroaches are not efficient creatures. They burn more energy than animals without these redundancies. However, it is these inefficiencies that allow them to survive over extremely long time horizons as species.

Performant animals cannot be robust, and robust animals cannot be performant.

Valencia Water Court

There is a widespread misunderstanding about competition. We are taught that competition is about scarcity, innovation, and the efficient allocation of resources. In economics, the playground of competition is the market, traditionally defined as the mechanism to allocate scarce resources. Conventional wisdom holds that competitive markets are the most efficient way to achieve this via the price signal.

But this is a myopic view. We need to look at it systematically. Markets, like evolutionary niches, are engines for local optimization and short-term performance. Competition is really only possible in environments of abundance, not scarcity!

Let's look at ecology for a moment. The ecologists Mark Bertness and Ragan Callaway developed the Stress-Gradient hypothesis. The hypothesis states that as environmental conditions become more severe and resource-scarce, positive non-trophic interactions like facilitation, mutualism, and cooperation systematically replace competition. For example, in lush resource rich grass lands, plants compete with each other to get sunlight and canopy space. However, in salt marshes, alpine tundra, and deserts, plants clump together into tight nurse-plant groups. In tundras they clump to protect each other from freezing winds. In deserts, the clumping creates shade, helping the soil hold more moisture. Solitary competitors die, while cooperating ones survive.

Economics often talks about the "Tragedy of the Commons" which Garrett Hardin famously argued that when critical resources are scarce, individuals acting competitively will deplete and destroy them. However, the political economist Elinor Ostrom studied real-world communities managing scarce resources over centuries. She studied water allocation in the arid Spanish huertas, communal grazing in the Swiss meadows, and coastal fisheries in Turkey. Ostrom proved that when faced with scarcity, people do not default to market competition or centralized tyranny. Instead, they spontaneously develop cooperative self-governance, mutual monitoring, and communal sharing organizations. These sustainably manage resources for generations. She won a Nobel in Economics for this work in 2009.

If you take a moment to think about it, markets require abundant environments because they require slack for failure. For a market to have multiple companies competing for the same product, there needs to be enough resources to waste when inevitably some of them fail. These companies have duplicative functions, competing R&D teams, often working on the same problem, duplicative management functions and overhead. Larger companies can share resources cooperatively across groups. This "slack for failure" is what allows competitors to exist in markets. It is abundance at the systemic level, not scarcity. Competitive markets are the lush grasslands of the economic world, not the cold tundras or arid deserts.

Open Source is an Adaptive Survival Strategy

Building software is some of the most complex endeavors humanity has ever attempted. Doing it well requires highly organized, scarce teams of competent and specialized minds with deep knowledge and skill.

In the early days of computing, hardware was the expensive bottleneck while software was often shared freely. By the 1980s, the microcomputer revolution created a massive surge in market demand, leaving software companies flush with cash. In that environment of surplus capital, the tech sector indulged in the luxury of the proprietary software model. It was the golden age of closed-source software. Microsoft and its peers competed fiercely, locking code behind secret walls and spending enormous sums building parallel, proprietary stacks from the ground up.

However, by the late 90s, a new constraint emerged! The sheer scarcity of software engineering talent.

As the world became more connected because of the internet and digital infrastructure could expand across the globe, the demand for complex software exploded much faster than the supply of skilled developers. The "metabolic" cost of proprietary competition, having dozens of competing corporations pay scarce teams to rewrite operating system kernels, filesystems, network protocols and compilers from scratch, became untenable and economically ruinous. Proprietary duplication became a luxury the market could no longer afford.

In response, the tech industry did what living systems under severe ecological stress have always done, it pivoted from competition to cooperation .

Universities and research labs have always had scarce resources, and it is in that environment the Free Software movement had quietly built a culture of shared software. In the late 90s, the ethos was pragmatically rebranded for enterprise as Open Source. Open source was not some act of corporate altruism or charity, it was an adaptive survival mechanism. Building foundational software became brutally difficult as engineering talent was scarce, so pooling developer hours into a shared commons like Open Source systematically out-survives closed, redundant competitors.

This transition played out across every foundational layer of computing:

  • At the turn of the millennium, IBM made a $1 billion bet on Linux. IBM was struggling to maintain five seperate and incompatible proprietary operating systems like OS/400, AIX, OS/2, MVS, and VM. Each of these required dedicated teams of engineers working on the kernel, filesystem, and hardware drivers. Under this expensive weight, IBM made the radical decision to invest $1 billion into the Linux kernel and assigned hundreds of its top engineers to contribute to the community. They recognized that the OS was plumbing, not a differentiator. By sharing the maintenance burden with their rivals like Red Hat, HP, and Oracle, IBM eliminated the wasteful duplication tax of building this plumbing.
  • In the mid-90s, webmasters all around the world desperately needed a reliable web server. Instead of fifty separate startups assigning scarce C programmers to write proprietary servers from scratch, a loose coalition of engineers began emailing each other bug fixes and patches, creating "a patchy server". The Apache HTTP server project was born. Eventually Apache would run most of the web, at its peak serving over 60% of all websites.
  • In 2018, even the mighty Microsoft surrendered developing a competing browser engine and built their next browser, Edge, on top of the Chromium project. Engines are so hard to make that virtually all tech companies are helping build Chromium and Firefox. Some are saying maybe even Firefox is too much for the industry to maintain.
  • For decades, chipmakers and software giants redundantly hired separate compiler teams. By the mid-2000s, most of the industry converged around the open-source LLVM project. Today, Apple, Intel, Google, Sony, and even ARM co-maintain the project. Even fierce commercial competitors share this foundation because no firm has enough compiler geniuses to out-build the LLVM project.

Software development became a digital commons because, like ecosystems, they learned the fundamental rule of systemic robustness. When resources are scarce, cooperation (not competition) is the only viable strategy.

Companies shared the metabolic cost of survival doing what Joel Spolsky called "commoditizing your complement". They stopped wasting building redundant competing systems and instead allowed the software ecosystem to build on a shared foundation.

The Open Source ecosystem ended up with the same shape as that of the shark. It is full of redundancies that look like pure waste if viewed through an efficiency lens. Glibc and musl, GCC and Clang, OpenSSL and LibreSSL. But when the Heartbleed bug hit OpenSSL in 2014, the forks were what let the ecosystem mitigate the damage. These forks buy survival, and they only exist because the cooperative nature of open source had enough shared surplus to sustain them.

Open Source in an Abundant World

Github's exponential growth

Github has been in trouble recently. On August 17th 2026, github was unusable for almost 8 hours. The reason for the failure was surprising, in that it didn't have anything to do with software or configuration updates or hardware failures. The load the servers got was just too high! They showed a graph of the exponential rise of PRs, commits, and new repos.

For all of 2025 and 2026 I have waited for data to show that LLM coding agents have increased productivity of writing software. I contend that the data is now showing this. We don't have an exponential rise in software engineers, but we do have a rise in software coding agents.

In other words, it appears that writing software is no longer scarce. The engineering talent required to write code is no longer necessary. We can argue about the quality of the code but what we can't argue is that coding agents can create code faster than people can, and it kind of works most of the time.

We already know what happens to a commons maintained by too few hands. Log4J had a huge vulnerability in 2021 called Log4Shell that had existed since 2013. It affected roughly 93% of enterprise cloud environments. One under-resourced library became load-bearing for nearly everything. The xz backdoor in 2024 went further. Years-long social engineering against a single volunteer maintainer nearly slipped a backdoor into SSH. It was caught only because one engineer noticed his SSH logins taking half a second longer than before. The commons was already running on fumes before the coding agents arrived.

This rise in PRs, commits, and new repos is NOT a good sign for open source software. Much of this could be private repos but also a huge rise in single person software projects. I argue we are seeing a shift back to a competitive software ecology, away from the traditionally cooperative open source one.

Companies can now cheaply build competing software systems and the social pull to create open source projects by these companies will go away. We don't even need to speculate about abundance ending cooperation because it started to end even before AI coding arrived. Cloud revenue made a lot of SaaS companies rich. One open source company after another pulled out of the commons. Elastic, the company behind ElasticSearch, relicensed the software away from Apache 2.0 in 2021. Hashicorp moved Terraform to the Business Source License in 2023. Redis abandoned its BSD license in 2024. In every case, a company decided it could afford to no longer cooperate.

With resources going into competitive rather than cooperative software building, the Open Source commons will shrink. Don't let the exponential rise in github repos fool you. I'm sure many of them are public, but they are likely all single author and competitive, not cooperative. Even before this explosion in coding, the vast majority of open source projects had one or two contributors. Only the best funded ones had more. You cannot escape the Pareto distribution.

The Era of Private Software

Over the last 6 months I've been talking with so many people who have never coded before but have discovered Claude and have been making software. A lot of it is software that solves some specific personal problem which they never intend to share with others. Some of it is from people trying to create new companies and are leveraging their domain knowledge to build something that would have needed a team of 5 people before.

We are seeing a rise in what I like to call 'private' software. Software that is never shared outside of someone's computer or company. You can buy proprietary software, but you can't even buy private software. We will continue to see a rise of bespoke solutions created and maintained by a single person for themselves or their company.

This is what happens when you reduce scarcity. Jevons paradox has now become a term in the mainstream. We are seeing an explosion of software, a lot of it duplicative, often implementing the same solutions to similar problems, because the scarcity of being able to write code is no longer there.

Private software is a Kakapo. It will be perfectly fitted to one person's environment. To their machine, their workflow, their company's quirks. There will be little code review, no forks, no other maintainers. No protection against the bus-factor. It will thrive as long as someone maintains it (or can afford the tokens to).

The open source commons was created because engineers were scarce. It slowly created robust software used by everyone. Forks created redundancy and robustness. Because coding is no longer scarce, we are abandoning the commons for a million Kakapos. This will only stay possible as long as the tokens keep flowing.

Sources

  • Herbert Spencer, Principles of Biology (1864): origin of the phrase "survival of the fittest"
  • IUCN Red List entries for the Giant Panda ( Ailuropoda melanoleuca ) and Kākāpō ( Strigops habroptilus ); NZ Department of Conservation, Kākāpō Recovery Programme
  • Mark Bertness & Ragan Callaway, "Positive interactions in communities," Trends in Ecology & Evolution 9(5), 1994: the Stress-Gradient Hypothesis
  • Garrett Hardin, "The Tragedy of the Commons," Science 162, 1968
  • Elinor Ostrom, Governing the Commons: The Evolution of Institutions for Collective Action , Cambridge University Press, 1990
  • IBM's $1 billion Linux investment, announced December 2000
  • The Apache HTTP Server Project, Apache Software Foundation
  • Microsoft, "Microsoft Edge: Making the web better through more open source collaboration," December 2018: the move to Chromium
  • The LLVM Project (llvm.org)
  • Joel Spolsky, "Strategy Letter V," Joel on Software , June 2002: "commoditize your complement"
  • GitHub incident report, August 17, 2026: https://github.blog/news-insights/company-news/the-august-17-outage-and-the-work-ahead/
  • William Stanley Jevons, The Coal Question , 1865: origin of the Jevons paradox

Engineered yeast for converting plastic and biomass compounds into food

Hacker News
acs.digitellinc.com
2026-08-27 11:40:04
Comments...

Uefa pursuing criminal legal action against Infantino

Hacker News
www.bbc.com
2026-08-27 11:37:47
Comments...
Original Article

Uefa is preparing criminal legal proceedings against Fifa president Gianni Infantino over the now scrapped plan to sell off stakes in the World Cup and its other competitions to private investors.

Documents seen by BBC Sport show an application has been made by European football's governing body requesting access to evidence and documents for use in proceedings in Switzerland against the embattled president himself, who Uefa accuses of "criminal mismanagement".

Uefa also says it is considering pursuing criminal action against other Fifa officials.

Shortly after this summer's World Cup, Infantino proposed creating a new company, Fifa Forward Enterprise (FFE), which would have sold off stakes in Fifa's football competitions to private investors.

The plan was scrapped after widespread backlash .

In the application for evidence, Uefa said: "In truth, it was a vehicle for Infantino and that small circle to acquire a permanent stake in and otherwise profit from Fifa's most valuable assets to the detriment of Fifa, its members, and other parties within the football family," Uefa's application says.

"Infantino pushed the plan through internal Fifa approval only days earlier at a hastily convened meeting where a limited number of Fifa's management officials and employees - some of whom had never heard of the plan - were given mere hours to sign off on an unprecedented multi-billion dollar scheme."

Key figures at Uefa and in European football met today in Monaco ahead of the Champions League draw, where Infantino's status was one item on the agenda.

A statement sent to the media by Uefa said: "Those present unanimously mandated the Uefa president and administration to pursue every available institutional, political and legal avenue necessary to secure fundamental reform, restore proper limits on presidential authority and ensure that Fifa is once again governed as an institution – not around one individual."

BBC Sport has approached Infantino and Fifa for comment.

Uefa also claims that the valuation of the stakes to be sold were not independently verified and would have been offered too cheaply, calling the proposed sale "a fraudulently off-market price promoted by Infantino for his own benefit".

The application adds: "Under the terms Infantino announced, those investors stood to acquire a permanent financial interest in Fifa's commercial arm for $4.2bn, implying an absurdly low enterprise value of only approximately $20bn, a figure that was neither the product of an open, competitive auction, nor tested by any independent valuer."

In the application, Uefa is applying to a court in Florida to attempt to access files held by two Fifa businesses - Fifa Americas and FWC2026 - to be used to pursue the criminal charges in Switzerland at a later stage.

The two businesses are based in Florida.

Uefa claims that its 55 member nations would have potentially been harmed by the sell-off plan, and that it may pursue criminal proceedings against other Fifa officials as well as Infantino.

"Uefa and other interested parties are preparing to bring criminal claims in Switzerland against Infantino and possibly other Fifa officials and advisors for criminal mismanagement," the application states.

"The secretive structuring, valuation, financing, and marketing inflicted direct and concrete injury on Fifa's reputation, governance authority, and commercial relationships to the detriment of Fifa as well as its 211 members, including Uefa's 55 member associations."

Uefa insists that the plan was concocted without the knowledge of them or other key stakeholders in football, and that it had been long in development.

The applications says: "On July 28, 2026, without consulting the Fifa Council, Uefa, or any of the other confederations, or any of the 211 Fifa member associations, Infantino, purportedly acting on behalf of Fifa, publicly announced a plan to place the commercial rights to the men's and women's World Cups and the Club World Cup into a new subsidiary: Fifa Forward Enterprise.

"That announcement by Infantino was the public unveiling of a plan that he and a small circle of co-conspirators had conceived and reportedly been developing in secret for more than a year."

Uefa states in the document that there has been "an enduring history of corruption among Fifa officials" and claims that world football's governing body only relents on its plans when pressure comes from outside the sport.

"Fifa's extraordinary power over world football has operated largely without meaningful internal constraint, with accountability coming principally through external forces, including political pressure, public scrutiny, and intervention through international criminal law enforcement," the application adds.

Fifa's headquarters are in the Swiss city of Zurich, and Uefa says that its plan to eventually pursue criminal charges against Infantino is backed up by Swiss law.

"Swiss counsel has confirmed [...] that the proceeding is within reasonable contemplation for purposes of Swiss law and that Uefa has standing, as a complainant, to file a criminal complaint for criminal mismanagement against Infantino and potentially other Fifa officials as may be warranted."

BBC Sport has been told that a separate filing has been lodged to a court in New York, where Uefa are seeking documentation from Thrive Capital, the business proposed to take up an interest in FFE, and its founder Josh Kushner, the brother of US president Donald Trump's son-in-law.

The American investment bank JP Morgan is also named in the application.

A third application has also been made in Colorado, relating to former Formula 1 chief Greg Maffei, who is referred to in the court filings as "the key commercial adviser" on the proposed FFE transaction, and his Bann Ventures firm.

BBC Sport has also approached Uefa for comment.

Infantino offered Fifa's 211 member associations $40m (£30m) if they backed the proposal for private investment in its tournaments via FFE, including the men's and women's World Cups.

The Swiss has faced calls to step down after he scrapped the controversial plan earlier this month.

Uefa has led the backlash to the proposal, stating it had lost confidence in Infantino, and with its members voting to boycott World Cups unless the FFE plan was scrapped.

Infantino, who is seeking a fourth a term as Fifa president in March, was accused of breaking trust "through deception" in an open letter issued by Uefa, Concacaf and the Asian Football Confederation.

The football associations of all the home nations have withdrawn support for Infantino, but he retains the support of South American governing body Conmebol and Caf, the African governing body, while some nations have broken ranks from their confederations to come out in support of the Fifa president.

Cocomelon's Studio Tells Its Artists to Start Experimenting With AI

403 Media
www.404media.co
2026-08-27 11:33:32
Moonbug Entertainment, which makes Cocomelon, Blippi, and other popular content for children, says it will begin using AI but will always have a 'human in the loop.'...
Original Article

Moonbug Entertainment, the children’s entertainment studio that makes the hugely popular shows Cocomelon, Little Baby Bum, Blippi, and Mia’s Magic Playground has asked its animators to start using artificial intelligence while making its shows, 404 Media has learned.

Moonbug’s Generative AI policy and its “Studio AI Bible,” a guide to using AI to help generate content, seen by 404 Media, explain in detail how its AI use will work. The policies indicate that the company is in the initial stages of experimenting with AI in the creation of its shows, but that for the moment it has put several guardrails in place in part over legal and copyright concerns associated with using AI in a more substantial way.

“Keep a human in the loop when using AI. AI is used to assist the artist, not be the artist,” the guidelines say. “Always remember that we can only own (copyright) what a human has created and so we need to ensure the final execution involves substantial human creative input. Our core IP (e.g. key characters/signature worlds and important backgrounds) must reflect substantial human creative input and intentionality.”

The documents show in detail how a major studio, which runs an empire of content that is wildly popular with infants, toddlers, and their families, is using AI. Moonbug’s shows have hundreds of millions of subscribers on YouTube, and many of its shows have spinoff series and movies that air across several major streaming services. Cocomelon spinoffs air on Netflix, the studio is working on a Cocomelon movie for Universal, and the series is set to move to Disney+ next year. YouTube has been flooded with AI-generated content for infants and toddlers, but these documents indicate that even the biggest companies in the industry are using AI, albeit with far more thought and care than slop purveyors. Its properties also have various popular children and baby toys.

“Like many media companies, we're exploring how AI tools can support our creative and production teams. Today, generative AI is not used in episodes of our content,” a Moonbug spokesperson told 404 Media. “Our core principle is that AI should assist the artist, not be the artist. Our guidelines prohibit AI from originating key creative elements such as new characters, core storylines and song lyrics, and require substantial human creative input. Everything we produce — whether they incorporate AI-assisted elements or not — goes through our human-led creative and quality-control process, including frame-by-frame human eyeball review, and rounds of iterations and notes from our creative and production teams.”

The guidelines say that AI can be used for ideation, scripting, storyboarding, design, and animation, but has put guardrails on how AI can be used in each step of the process.

For example, the company says animators can use AI for “utility tasks/standard production enhancers,” but cannot use it to “alter a VO/actor’s performance without checking with Legal.” It says AI can be used “to refine a human-authored draft,” but “no ghost-writing. Do not generate key creative elements (character arcs, core plot twists, song lyrics) from scratch by AI. The narrative ‘soul’ and key dialogue beats must remain human-authored.” The company says AI can be used to “generate visual research, vibe boards, brainstorm ideas and concepts and exploring texture/colour/lighting references,” but that there is “no ‘prompt to product.’ […] do not move a 100% AI-generated design directly into the production pipeline. It must be translated into a studio-drawn concept to ensure it meets our technical standards and style.”

At times, the guide gets very granular. It says workers are allowed to use AI to create “generic” designs and textures, such as trees in a background or furniture, for character outfit changes, or for “creating 3D turnarounds from existing human-created 2D characters,” but usually cannot use it to create wholly new characters. “The [AI] assets must be processed by an artist (eg over-painted, tweaked) to ensure human in loop. All new characters should be human created (unless have had approval for specific IPs). Props — if we are creating something unique and to be heavily featured in the series e.g. the Clubhouse — it must be human created. All franchise specific worlds should be human created (unless intended to be generic).”

The company is requiring employees to “first test all tools with non Moonbug IP and/or test assets before proceeding with legal approval.” After being approved by legal, employees are allowed to use AI to help create assets for Moonbug shows, but all AI use, including the prompts used to generate assets, must be cataloged and saved. The company spokesperson told 404 Media that “non Moonbug IP” refers to generic assets that the company has made: “We created generic test characters and environments so teams can freely explore new tools without using Moonbug IP or anyone else's IP. If a tool proves useful, further testing with Moonbug IP requires appropriate approvals.”

“Making content for young children comes with a particular responsibility, regardless of the tools involved,” the spokesperson added. “Our GenAI guidelines add another layer of guardrails: no ‘prompt-to-product,’ human authorship of core creative elements, approved tools and legal review, protections around performers and third-party IP, and human review of finished work. Ultimately, people make the creative decisions about what is appropriate and worthy of our audience.”

All AI tools that the company uses must have individual legal approval, and all AI-generated assets must be kept in separate file folders than human-created ones using a system it is calling “provenance and isolation,” according to the guidelines. The “goal” of this file management system is “to ensure we always have a path back to human-authored works to maintain copyright ownership over what matters.”

“Every project must have a dedicated folder for AI generated assets. No file from this folder should be moved into main production folders without being processed by human artist [sic] first. All 100% human created assets must also be stored and labeled properly,” the guidelines say. Workers must log all of their AI prompts, then also write an explanation of how a human transformed the asset if it is ultimately used in production.

A section of the document called “prompt guidance” says that workers should begin the AI production process by “upload[ing] a human-drawn sketch/Moonbug owned IP as a structural reference, use AI as a refiner eg to add texture/lighting.” It says “No text-to-image prompting (unless for brainstorming/research,” and “no style mimicking or soundalikes — do not use prompts like ‘in the style of Pixar/Ghibli’ etc. Use descriptive artistic terms instead — eg ‘hand-painted water colour aesthetic’ or ‘vibrant street-art aesthetic, chromatic aberration.’”

In May, workers with the International Alliance of Theatrical Stage Employees working on a live action Cocomelon spinoff show went on strike , alleging that they were not being provided fair wages and benefits.

“We see AI as a tool that can expand what talented creative people are able to do, not a substitute for the people who create our stories,” the Moonbug spokesperson said. “We're exploring whether these tools can reduce repetitive work, enhance the creative process and potentially allow our teams to create more stories and experiences for families.”

About the author

Jason is a cofounder of 404 Media. He was previously the editor-in-chief of Motherboard. He loves the Freedom of Information Act and surfing.

Jason Koebler

The Server Called Paranoia: Defend Autistici/Inventati Before September 25

Lobsters
cavallette.noblogs.org
2026-08-27 11:20:00
Comments...
Original Article

Ripubblichiamo (in inglese) un bel post di Sabot Media che ripercorre la nostra storia e la collega a quanto sta avvenendo con la nostra iscrizione nella lista delle organizzazioni globali terroristiche da parte dell’amministrazione americana. Ringraziamo Sabot Media perché ha fatto un lavoro eccellente e che ci aiuta a rispamiare tempo ed energie per la battaglia.

We repost an english-language post by Sabot Media summarizing our history and connecting it to our recent designation as global terrorist organization by US administration. We thank Sabot Media for the excellent job and for sparing us some time and energy that we will use to fight back.


The Server Called Paranoia: Defend Autistici/Inventati Before September 25

For twenty-five years, an Italian hacker collective has built communications infrastructure designed to survive censorship, surveillance and police raids. On August 26, the United States designated it a terrorist organization. On September 25, the wind-down period ends.

It should have been a dark and stormy night in an Italian hacklab.

It was, annoyingly, a beautiful sunny Sunday.

On March 3, 2001, roughly ten people gathered at the LOA hacklab in Milan around a computer assembled from discarded machinery. A bank had sold them an old server for the symbolic price of 15,000 lire, about eight dollars. They expanded it with scavenged components, including a hard drive pulled from someone’s home computer. Nobody arrived with a formal blueprint. Software packages were considered one at a time. Every decision was discussed until everyone agreed. Deliberately, the least technically experienced person was placed at the keyboard. The process took far longer than necessary because efficiency was not the only objective. Everyone was supposed to understand what they were building. That day, one participant later recalled, was when they declared: “A/I now exists.”

They named the machine Paranoia . The following month it went online, carrying two domains and two intertwined histories: Autistici.org and Inventati.org. Twenty-five years later, on August 26, 2026, the United States designated Autistici/Inventati a Specially Designated Global Terrorist and placed it on the Specially Designated Nationals and Blocked Persons list.

The distance between those two events—from a recycled machine in a Milan hacklab to the machinery of the American national-security state—is the history of a collective that has spent a quarter century insisting upon one dangerous proposition:

People should be able to communicate without first surrendering themselves to corporations or governments.

The immediate threat now has a date. On September 25, the temporary U.S. authorization for institutions to wind down their relationships with A/I expires. Banks, technology companies, hosting providers and other institutions are being instructed to sever what remains. A/I built its infrastructure to survive the disappearance of a server. The United States is now attempting to make the collective economically and technologically untouchable. Join us as we explore what A/I is, its history, and what this newest attack might mean for the autonomous tech collective and the wider radical community.

Before A/I: Italy’s underground internet

Autistici/Inventati did not appear from nowhere. Its roots run through more than a decade of Italian autonomous organizing, pirate radio, bulletin-board systems, squatted social centers, anti-capitalist movements and experimentation with computers as political tools. During the 1990s, networks such as the European Counter Network and Isole nella Rete provided online space for social movements when the internet remained unfamiliar to much of the public. Italy’s Hackmeetings brought programmers, activists, artists and the technologically curious together inside self-managed spaces. Hacklabs appeared in occupied social centers, where people could learn Linux, build networks and approach technical knowledge as something to be shared rather than sold. The future members of A/I came from several parts of this world. In Milan, people associated with the LOA hacklab used the name Autistici to describe their intense fascination with technology and their desire to expose the politics concealed inside it. In Florence, the Inventati project was more oriented toward communication, publishing and movement organizing. Its projects included Stampa Clandestina , a newspaper intended to be pasted directly onto city walls, and Spia la Spia , an effort to map surveillance cameras in public places.

People from Bologna and elsewhere were also involved. Many participated in the early development of Indymedia Italy, part of the international open-publishing network that allowed protesters and ordinary participants to report events without waiting for professional journalists to mediate them. The different groups shared a problem. Movements increasingly needed websites, mailing lists and private email, but independent infrastructure remained scarce. The existing European Counter Network was carrying too much of that burden. Commercial providers offered greater capacity, but at the price of money, dependence, surveillance and eventual censorship. In November 2000, Inventati sent the Milanese hackers an encrypted email asking to meet. The message was treated like something out of an amateur spy film: PGP keys, carefully arranged recognition instructions, a secret time and place. Then the Florentines arrived two hours late in a legendary rust bucket called the General Lee, honking outside the squat while police monitoring the building watched in bewilderment.

The agreed-upon historical fact is that everyone eventually ate at a pizzeria called La Balena. Over dinner, the Florentines revealed their allegedly seditious plan:

Build another autonomous server.

The intention was not to replace existing movement infrastructure with a new central provider. It was to multiply it. If there were thousands of autonomous servers, they reasoned, no single raid or seizure could shut down everyone’s communications. Autistici supplied much of the technical knowledge. Inventati brought its experience with publishing, cultural work and movement communication. Together they became Autistici/Inventati, usually shortened to A/I. The collective’s legal association was called Investici, but A/I never became a conventional organization. It had no coordinator, official leader or permanent spokesperson. Decisions were made collectively rather than by majority vote. Nobody was paid. Its resources came from voluntary donations, benefit events and the labor of the people maintaining it. The dual name was deliberate. A/I was a Janus-faced creature: one face technical, the other communicative; one facing the machine, the other facing the movements that needed it.

The server that locked itself out

The birth was not entirely glorious. On the second day of Paranoia’s existence, someone entered an inverted firewall command and accidentally instructed the machine to reject every connection not originating from itself.

The server could communicate only with the server.

The collective found this so perfectly on-brand that it printed the mistake on a T-shirt. That combination of technical seriousness and refusal of self-importance became part of A/I’s character. Later servers received names including Chernobyl, Astio—“Grudge”—Rivolta, Contumacia and Latitanza: Revolt, Contumacy and Life on the Run. Behind the jokes was a developed political position. Communication should be free and accessible. Knowledge grows through being shared. Software is not neutral simply because it operates in a supposedly virtual world. The systems through which people speak determine who can speak, who can listen, who owns the record and who can be silenced. A/I began providing websites, private email, mailing lists, newsletters and chat. Its services eventually expanded to include Noblogs, file sharing, audio and video conferencing, streaming, anonymous remailing and other communications tools—all without advertising or commercial data extraction.

Its manifesto describes the project in explicitly political terms. A/I is antifascist, anti-capitalist and antimilitarist. It promotes free software, encryption, pseudonymity and the independent circulation of knowledge and cultural work. It reserves its limited, volunteer-run resources for people and projects broadly compatible with those principles rather than businesses, political parties, organized religions or institutions already possessing the means to make themselves heard. A/I was never a politically neutral commercial host. But providing infrastructure is not the same act as authoring everything transmitted through it. Political affinity is not operational control. Giving someone an email account does not mean writing every message they later send. That distinction is central to the attack now being made against it.

Genoa: infrastructure under fire

Only months after Paranoia went online, the G8 came to Genoa. Many A/I participants were also involved with Indymedia Italy. They helped construct the movement’s media center, laying cables, configuring servers and building workstations through which protesters could report what was happening across the city. What followed was historic: enormous demonstrations, the police killing of Carlo Giuliani, indiscriminate beatings in the streets, torture and abuse inside the Bolzaneto barracks and the nighttime raid on the Diaz school. Official narratives competed with photographs, recordings and firsthand testimony transmitted through independent infrastructure. Genoa became one of the earliest major demonstrations to be documented from nearly every direction by its participants rather than exclusively through institutional media.

For A/I, it was also what the collective later called a “traumatic communion.” Its members experienced the same violence together while maintaining systems through which evidence of that violence could escape. After Genoa, A/I was no longer merely an interesting technical experiment. It had become trusted movement infrastructure. Demand grew rapidly. By 2003, A/I hosted more than 2,000 users, 205 websites and 269 discussion lists. Hosting those services for free was becoming unsustainable, while commercial hosting would cost thousands of euros annually. The collective answered with the KAOS tours: traveling gatherings combining benefit events, parties, public discussions and practical workshops. A/I members taught people how to configure servers, encrypt communications, edit and distribute video, create digital archives and stream audio.

The tours raised money, but their deeper purpose was political education. The collective did not want to become a group of invisible experts performing magic for passive users. It wanted the community to understand the machinery upon which it increasingly depended.

Every subsequent attack on A/I would produce a variation on this response:

Disclose what happened. Repair the damage. Share the lesson. Build something harder to destroy.

Trenitalia discovers the Streisand effect

A/I’s first major legal confrontation came in 2004. A design collective called Zenmai had created a website parodying the Italian railway company Trenitalia. It copied the appearance of the company’s website while denouncing Trenitalia’s involvement in transporting tanks and other military supplies during the invasion of Iraq. Trenitalia demanded the page’s removal, damages and publication of notices in two major newspapers at a projected cost of approximately €20,000. A court initially ordered A/I to take the parody down. The internet responded by reproducing it everywhere.

Trenitalia then demanded that A/I remove links to the mirrors as well—an argument raising the absurd possibility that linking to disputed material could make any search engine responsible for it. A/I appealed. On September 14, 2004, the court ruled that the website was protected satire grounded in factual controversy. The page returned, and Trenitalia was ordered to pay A/I’s legal expenses. It was an extraordinary victory for a small volunteer collective. But while A/I fought visible censorship in court, a more dangerous operation was taking place without its knowledge.

The Aruba crackdown

By then, A/I’s server was housed at the commercial provider Aruba in Arezzo. On June 15, 2004, Italian police arrived at Aruba under orders from a Bologna prosecutor. The company’s technicians shut down A/I’s machine and allowed police to copy material from its disks. Investigators obtained its cryptographic certificates and may have installed equipment capable of intercepting traffic. A/I was told that the interruption resulted from an electrical problem. The collective discovered the truth almost a year later, and only by accident.

In May 2005, A/I was ordered to close the mailbox used by the Italian Anarchist Black Cross, Crocenera Anarchica, amid a sprawling investigation involving allegations of anarchist conspiracy and subversion. A/I complied with the court order and requested the underlying case documents. Those documents contained messages that investigators should not have been able to possess. Buried in a footnote was the explanation: police had gone to Aruba the previous year and acquired access to A/I’s server. An operation purportedly concerned with one mailbox had potentially compromised thousands of accounts and tens of thousands of mailing-list subscribers. Among those affected were lawyers and technical experts working with the Genoa Legal Forum. Police may therefore have gained access to confidential defense communications concerning prosecutions arising from police conduct at the G8. The violation exposed a brutal truth. A/I could operate its own server, configure it carefully and refuse to retain identifying logs—but the physical machine remained in someone else’s building. A commercial provider could open the door, surrender its contents and conceal what had happened.

A/I removed the machine from Aruba, cleaned it and restored essential services. Parliamentary questions were raised in Italy and at the European level. The collective traveled through Italy and Europe explaining the breach. Most importantly, it rebuilt the network.

Plan R*: repression becomes architecture

The result was Plan R*, launched in October 2005: a network of “resistant communication.” Instead of concentrating A/I’s services on one machine, the collective distributed encrypted data and functions across servers in several countries. Public-facing machines could be replaced. Services could move when hardware was seized or a provider became hostile. The loss of one node would no longer expose or silence the entire community. R* meant replication, redundancy, resistance and other words beginning with R. Its architecture was conceived not merely to survive mechanical failure but to withstand political attack. A/I did not claim it could guarantee perfect security. On the contrary, it repeatedly warned users never to entrust their safety blindly to any provider, including A/I. It minimized logs and identifying information because information that does not exist cannot easily be seized. It encouraged users to encrypt their own communications because even the strongest server architecture could not compensate for unsafe individual practices.

The collective transformed a covert surveillance operation into an infrastructure lesson.

Repression became architecture.

The Vatican, a satirical video game and Norway

The pressure continued. In 2007, an Italian politician demanded action against Operation: Pedopriest , a satirical browser game criticizing the Catholic Church’s efforts to conceal sexual abuse by clergy. Its creator temporarily removed the game to protect the hosting provider. A/I then hosted a copy. Following a complaint from an unidentified child-protection organization, an American provider disconnected the entire Noblogs server. After consulting attorneys, the provider concluded that the satire was lawful in the United States and restored the machine. Plan R* kept the disputed material accessible elsewhere and limited the wider interruption. By then, A/I had become an important refuge from the emerging commercial social web. Noblogs offered independent publishing without advertising, data mining or demands that people attach their legal identities to everything they said.

Its users included movement organizations, personal writers, dissidents, artists and NGO workers operating in dangerous environments. In 2008, A/I received Italy’s Winston Smith “Privacy Hero” award for creating free communications infrastructure resistant to censorship despite scarce resources, technical attacks and repeated judicial interventions. Then, on November 6, 2010, Norwegian police copied an A/I server’s hard drives at Italy’s request. The investigation originated with threats and antifascist graffiti directed at members of the neo-fascist CasaPound organization. Authorities were seeking information concerning one mailbox. A/I had already explained that it possessed neither subscriber identities nor activity logs, but investigators apparently wanted to determine whether that was true.

Thousands of accounts were copied in the process.

Plan R* restored the affected services elsewhere within approximately two hours. Within twenty-four hours, the network was operating normally. The seized disks were encrypted and yielded no useful identifying information. The operation became a public scandal in Norway. Lawyers, journalists and technology organizations questioned why Norwegian police had copied thousands of people’s private communications in response to an inadequately explained foreign request. The underlying Italian investigation was eventually dropped. Where another organization might have interpreted repeated raids as proof that its project was impossible, A/I interpreted them as confirmation that the project was necessary. Its history is documented in the collective’s book, +KAOS: Ten Years of Hacking and Media Activism , and its own history of the collective .

August 26, 2026

The newest attack is of a different order. On August 26, the U.S. State Department designated Autistici/Inventati a Specially Designated Global Terrorist. At the same time, the Treasury Department’s Office of Foreign Assets Control placed A/I on the Specially Designated Nationals and Blocked Persons list under Executive Order 13224. This is not simply a condemnatory government statement. It activates one of the world’s most powerful systems of economic exclusion. The United States alleges that A/I supplies specialized digital architecture, encrypted communications and hosting to antifascist groups and other radical movements, including organizations already designated by the United States.

Treasury’s public announcement focuses upon the services A/I provides: foreign-hosted websites, encrypted email, chat, video conferencing and the digital architecture supporting Noblogs. It describes A/I’s antifascist and antimilitarist politics, its practice of selecting projects compatible with those politics and its provision of infrastructure used by the PKK. Treasury then treats the provision of that infrastructure as material or technological support for terrorism. ( U.S. Treasury announcement ) The State Department’s accompanying case goes further, presenting attacks, communiqués and publications that it says passed through A/I infrastructure. Its examples include alleged railway and pipeline sabotage in Europe, attacks on energy infrastructure, Rose City Antifa, resistance to Atlanta’s proposed police-training center, Jane’s Revenge and publications carrying statements attributed to armed organizations. ( State Department designation ) The government’s public statements do not show that A/I planned those actions, selected targets, transferred weapons, directed the cited groups or authored the material hosted on its systems. They do not establish when A/I learned of any particular act or whether it knew about it before it occurred.

Instead, the designation advances a broader and more consequential proposition:

Building communications infrastructure for radical movements can itself be treated as terrorism.

That theory collapses the distinction between a provider and a user; between political affinity and operational control; between protecting privacy and concealing a crime; between maintaining a publishing platform and authoring everything published through it. A/I has never claimed to be politically neutral. It built infrastructure precisely because radical movements needed somewhere to speak, publish and organize beyond corporate and state control. The United States is now using that purpose as evidence against it.

What happens on September 25

Because A/I is now on the SDN list, all of its property or interests in property within the United States—or possessed or controlled by a U.S. person—must be blocked and reported to OFAC. Unless an exemption or license applies, U.S. people and institutions are generally prohibited from providing or receiving funds, goods or services involving A/I. The restrictions can reach transactions passing through the United States even when the parties are located elsewhere. OFAC has issued a temporary license allowing transactions ordinarily necessary to wind down existing relationships with A/I until 12:01 a.m. Eastern time on September 25, 2026 . Payments owed to the collective cannot simply be released to it; they must be placed in blocked accounts. After the deadline, covered transactions require another applicable authorization. September 25 is therefore the date by which American companies and individuals are expected to separate themselves from A/I.

The consequences may include the loss of:

  • Bank accounts and payment processing.
  • U.S.-linked donations and fundraising services.
  • Hosting, cloud infrastructure and upstream network services.
  • Domain registration and related technical services.
  • Certificate, security and email-delivery accounts.
  • Software and communications services.
  • Relationships with non-U.S. providers frightened by American secondary sanctions.
  • Access for people in the United States who currently use A/I’s services.

Foreign companies are not automatically governed by every prohibition imposed upon Americans. But OFAC warns that foreign financial institutions can face secondary-sanctions exposure for knowingly facilitating significant transactions on behalf of a designated entity. That warning may do as much damage as direct enforcement. A European bank, registrar or hosting company may not know precisely what American law demands of it. Its compliance department may simply decide that maintaining a relationship with a small Italian anarchist collective is not worth the perceived risk. Institutions frequently over-comply. Providers may close accounts or withdraw infrastructure even when the law does not clearly require them to do so. Organizations may remove links, avoid correspondence or terminate unrelated relationships merely because A/I’s name now appears on a terrorism blacklist.

That is how American sanctions acquire worldwide force: not only through legal jurisdiction, but through institutional fear.

The wider target is the community around the server

The designation may be directed at A/I, but its effects will not stop at the collective. A/I’s infrastructure is used by writers, organizers, researchers, artists, movement publications and people who chose it precisely because commercial platforms were unsafe, politically hostile or designed to extract their data. Those users are not automatically sanctioned because they have an A/I address or published on Noblogs. But once the provider itself is placed on a terrorism blacklist, ordinary association can be converted into a risk signal. A bank may scrutinize a payment. An email provider may downgrade or block delivery. An employer, border agent or investigator may treat an address as suspicious. A journalist may hesitate to contact a source. A researcher may avoid an archive. A new user may decide that opening an account is too dangerous. None of this requires the government to prosecute every person involved. The designation can produce its own perimeter of fear.

That is one reason this otherwise inexplicable move may be useful to the state even if A/I remains online. Earlier attacks tried to reach the collective through particular machines, mailboxes and providers. A/I answered by distributing its systems, encrypting its disks and retaining less information. Those practices made conventional seizure and surveillance less productive. Sanctions attack a different layer: the relationships that allow infrastructure to exist. Rather than breaking the encryption, the government can pressure banks, registrars, data centers, software companies and users to isolate the people operating it. Rather than prove in court that each user committed an offense, it can make continued contact costly and legally uncertain.

This is surveillance-state power operating through private intermediaries. The government does not need to place an officer inside every server room when compliance departments, payment processors and platforms can be induced to police the network themselves. Each institution will draw its own defensive boundary, often wider than the law requires. Some may demand more identity documents, retain more logs, monitor political content or refuse privacy-preserving projects altogether. Others may quietly close accounts and provide no meaningful avenue of appeal. Enforcement becomes dispersed across companies whose decisions are difficult to see, challenge or even document.

The resulting harm is not limited to censorship. It can change the architecture of movement communication. Small autonomous providers may conclude that serving controversial communities invites existential risk. Larger platforms may point to the designation as another reason to expand identity verification, automated moderation and data retention. Users may migrate from trusted movement infrastructure to commercial systems that are easier to monitor, subpoena and map. The state gains leverage even when it gains no plaintext from A/I’s encrypted disks: people separate themselves, providers collect more information and the social relationships surrounding dissent become easier to observe.

The precedent also reaches beyond explicitly anarchist or antifascist projects. If political alignment with users, privacy protections and the hosting of controversial publications can be assembled into a case that infrastructure itself constitutes support, then encrypted mail providers, radical publishers, community archives, VPNs, federated social networks, legal-support projects and other independent hosts all have reason to pay attention. The immediate facts and laws would differ in every case. The danger lies in normalizing the category: a communications provider no longer treated as a conduit or publisher with its own rights and responsibilities, but as a participant in every act the government attributes to anyone using its systems.

That does not mean the designation is secretly about every A/I user, or that every possible consequence will occur. The government has not publicly explained its internal strategy beyond the allegations in its announcements. But the structure of the action is visible. It replaces a narrow accusation against identifiable conduct with a broad penalty against infrastructure; shifts enforcement from a courtroom to a global web of cautious institutions; and makes uncertainty itself an instrument of control. The immediate objective may be to disable A/I. The wider effect is to warn anyone building communications beyond corporate and state supervision that the shelter they provide can be recast as evidence against them.

Can A/I survive this?

A/I has seen state repression coming for miles.

Its entire infrastructure assumes that:

  • Servers will be seized.
  • Providers will cooperate with police.
  • Governments will demand information about users.
  • Corporations will disconnect controversial material.
  • Individual machines and locations will become unavailable.
  • Data and services must therefore be encrypted, distributed and replaceable.

That preparation matters. A/I is based in Italy, not the United States. Its infrastructure is internationally distributed. Its services are maintained by technically sophisticated volunteers. It avoids dependence on any single provider, minimizes identifying information and has decades of experience restoring services during emergencies. It has no shareholders, corporate headquarters or conventional payroll. Its relatively modest operating costs and volunteer structure give the state fewer familiar pressure points. There is little reason to assume that the website, mail system or Noblogs will simply disappear on September 25. A/I may be better equipped to survive a seized or disconnected machine than nearly any communications project of comparable size.

But this is not another server raid.

Plan R* was built to survive machines disappearing. It cannot, by itself, prevent banks from blocking money, registrars from suspending domains or companies around the world from withdrawing services because they fear American penalties.

The designation targets the connective tissue around the servers:

  • Banking.
  • Donations.
  • Domains.
  • Data-center contracts.
  • Bandwidth.
  • Certificates.
  • Software dependencies.
  • International institutional relationships.

A/I has survived technical isolation before. The United States is now attempting financial and institutional excommunication. Its core services may be resilient. Its ability to fund them, replace infrastructure and participate in the broader technological system is at considerably greater risk. What happens after September 25 will therefore depend not only upon the architecture surrounding A/I’s data, but upon the solidarity surrounding A/I itself.

September 25 is not a deadline for silence

The designation is designed to isolate. The answer must be informed, independent and disciplined solidarity. People in the United States should not improvise donations, disguise payments or route resources through another person, organization, currency or country. That could create sanctions exposure for the supporter, the intermediary and A/I itself. The prohibitions can also extend beyond money. Coordinated technical assistance, translation, advocacy, event organization or other services provided to a designated entity may create legal risk.

But September 25 is not a deadline for silence. Independent reporting, criticism, protest, education and political advocacy remain possible. People can tell A/I’s history, examine and challenge the government’s claims, contact journalists and civil-liberties organizations, preserve public materials and independently organize against the criminalization of resistant communications infrastructure. The practical distinction is between speaking and acting independently about A/I and providing funds or coordinated services to A/I. The exact boundaries can be complicated. Anyone contemplating fundraising, replacement infrastructure, public mirroring or direct technical assistance should obtain qualified sanctions counsel. A February 2025 civil-liberties primer on material support and OFAC restrictions also warns that lawful or protected activity can still attract surveillance, investigation, immigration consequences or civil litigation. Supporters approached by law enforcement should decline to answer questions and speak with an attorney.

This article is reporting and political analysis, not legal advice.

What supporters can do before September 25

Tell the history. Share A/I’s story: the hacklabs, Paranoia, Genoa, the KAOS tours, the Trenitalia victory, the Aruba breach, Plan R*, Noblogs and the Norwegian seizure. Do not allow the government’s description to become the only publicly available account of what A/I is. Build a public defense coalition. Ask independent server collectives, digital-rights organizations, hacklabs, free-software projects, radical libraries, independent publishers, journalists, attorneys, researchers and former users to respond publicly. Preserve the archive. Servers can be seized. Domains can be suspended. Hosts can panic. Back up publicly accessible and historically valuable Noblogs writing, along with A/I’s manifestos, technical documents, legal records and movement history. Record source URLs, authorship, publication dates and retrieval dates. Respect privacy, copyright and removal requests. Do not access private accounts or circumvent security. Personal preservation, research archiving and ordinary journalism are not the same as publicly operating replacement infrastructure; anyone considering a public mirror should first seek qualified advice.

Document over-compliance. Record companies, banks, registrars, platforms and institutions terminating services or removing material. Preserve notices and correspondence. The public record should show how far the designation reaches beyond its formal language. Demand answers. Ask digital-rights groups, European institutions and public officials whether they will permit American sanctions to dismantle an Italian communications collective. Ask what protection exists for European infrastructure, users and archives. Organize independently. Hold public discussions about autonomous infrastructure, sanctions, surveillance and material-support law. Publish explainers. Teach encryption. Support independent civil-liberties work opposing expansive terrorism designations. Prepare lawful material support. A/I has historically survived through voluntary donations, but U.S. supporters should not send or reroute money while the designation applies without a clear authorization. Digital-rights and legal organizations can independently investigate lawful support mechanisms, licensing and potential delisting proceedings.

Listen carefully to A/I’s public response while keeping advocacy legally independent. The collective’s statement should inform how its history and circumstances are described. Any coordinated campaign, fundraising channel or direct service requires separate legal consideration. The immediate objective is to make A/I impossible to quietly disappear.

The network called solidarity

A/I has survived corporations demanding censorship, covert police access, confiscated disks, hostile providers, parliamentary attacks and international investigations. The Trenitalia case produced mirrors and a legal victory. The Aruba breach produced Plan R*. Provider censorship produced redundancy.

The Norwegian seizure demonstrated that the network could recover in hours. Each attempt to isolate the collective spread knowledge about how censorship and surveillance operate. Each attack became an opportunity to teach more people how to protect one another. The United States has now transformed that history into a global test. At stake is not only the survival of one Italian hacker collective. It is whether maintaining infrastructure for radical movements can itself be treated as terrorism; whether privacy can be redefined as concealment; whether refusing to collect identifying information can be presented as obstruction; and whether a provider can be held politically and legally responsible for every text, tactic and claim transmitted through its machines.

A/I has spent twenty-five years preparing for the day when a server disappears. It knows how to replace a machine, move a service, restore encrypted data and continue operating after police or providers pull a plug. The United States is attempting something different. It is trying to frighten banks, hosts, registrars, infrastructure providers and supporters around the world into abandoning the collective. Whether that succeeds will depend partly upon A/I’s architecture.

It will also depend upon us.

Between now and September 25, preserve the history. Share the story. Build the coalition. Document the isolation. Teach the tools. Prepare a lawful defense. Do not allow the state to quietly establish that building privacy-preserving infrastructure for dissent is itself an act of terrorism. Twenty-five years ago, ten people gathered around a recycled machine and deliberately took too long configuring it because everyone in the room was supposed to learn. That remains the lesson. Do not leave the knowledge with experts.

Do not leave the infrastructure in one place. Do not leave the targeted to stand alone.

The first server was called Paranoia .

The network it created was called solidarity .


Public statement from Autistici/Inventati:

Today we were made aware that the US Government has targeted a small, volunteer-run, technology collective from Italy with disproportionate sanctions as anyone can read in the Treasury Department Statement, the State Department Statement and the related Executive Order.

We deny all allegations included in the statements, while we strongly affirm our dedication to providing a platform of tools for digital self-defense, addressing the need of free communication for activists and other individuals, groups and associations.

We will not back down, we will keep doing what we have been doing all these years and we will do whatever is in our possibility to counter the false allegations made by a politically desperate administration with the sole intention of swaying people and media attention away from their own violence and warmongering.

Antifascism and anticapitalism are not terrorism. Protesting is not terrorism. And everyone has the right to speak out and to struggle for humanity.

Autistic/Invented Collective — “Socializing knowledge without establishing power”

Stay human.


Download the A/I book , +KAOS , on the history of the collective’s work, available for free.

Download our Media Kit for social media graphics, archival guides, press briefs, templates, and flyers if you or your organization would like to show solidarity with A/I or learn more.

Tags: , , , , ,

This entry was posted on giovedì, Agosto 27th, 2026 at 1:17 pm and is filed under Memoria , Paranoia , Questioni_legali . You can follow any responses to this entry through the RSS 2.0 feed. Responses are currently closed, but you can trackback from your own site.

Corporate political donations shatter record at $646M so far for US midterms

Hacker News
www.reuters.com
2026-08-27 11:15:54
Comments...
Original Article

Please enable JS and disable any ad blocker

The terrifying mechanics of the Nepali flash flood

Hacker News
www.economist.com
2026-08-27 11:13:26
Comments...

Nvidia projects $673B in sales as AI demand widens

Hacker News
forgeeks.net
2026-08-27 11:04:16
Comments...
Original Article

Nvidia forecasts 70% fiscal 2028 growth, implying $673 billion in sales as demand expands beyond hyperscalers despite supply constraints.

Nvidia is projecting 70% revenue growth in fiscal 2028 , which would put annual sales at roughly $673 billion if the current Wall Street consensus for fiscal 2027 holds. That would move the chipmaker ahead of Apple and Alphabet by revenue, leaving only Amazon among US tech companies with higher projected sales.

CFO Colette Kress delivered the forecast on August 26, 2026. It is far above the 44% average analyst estimate tracked by LSEG and marks a change in Nvidia’s disclosure: the company has not previously provided a forecast this far into the future, although CEO Jensen Huang has offered shorter-range indications of expected AI chip demand.

Nvidia’s fiscal 2027 second-quarter results provided the immediate evidence for the outlook. Quarterly revenue reached $96.2 billion , more than double the year-earlier figure, while data-center revenue rose 117% to $89 billion . Nvidia’s shares climbed about 4% in extended trading in one account, while another market report put the session’s high at 5.6% . The difference reflects the trading range reported after the earnings release, not a change to the company’s forecast.

Supply, rather than demand, is now setting the near-term ceiling. Huang said shortages in components including memory prevented Nvidia from making a still higher projection as AI infrastructure consumes a growing share of global chip and memory capacity.

Shein targets a $27 billion IPO after its peak valuation

Recommended reading

Shein targets a $27 billion IPO after its peak valuation

Marcus Vance 3 min read

“Our demand is much greater than 70%. Our supply allows us to confidently deliver 70%, and we’re going to continue to work with our supply chain to increase on on that.”

Nvidia is broadening its customer base

Investors have worried that Nvidia’s growth depends too heavily on a small group of hyperscalers building data centers for a handful of frontier AI labs. Huang said the next phase will involve a wider set of buyers, including regional AI companies, neocloud providers, startups and conventional enterprises.

Nvidia groups those customers under the label ACIE . The company is selling them more than GPUs. Huang said its technology can supply much of the surrounding data-center stack, making Nvidia a broader infrastructure partner for organizations that cannot assemble the system themselves. The customer category was previously “largely invisible,” he said, but it now includes a growing number of companies deploying AI for useful production work rather than merely funding large-scale model training.

“This time last year, one lab alone was driving the buildout; today, we have a golden age of new AI labs and startups, multiple frontier labs scaling in parallel, a thriving open-model ecosystem and physical AI coming online — with strong momentum across the U.S. and around the world.”

A customer base spread across regional providers, startups and enterprises could reduce dependence on any one hyperscaler’s capital budget. It also gives Nvidia more opportunities to sell networking, systems and other data-center components alongside its processors, although the supplied results do not break out how much revenue comes from those products.

The demand is already affecting companies outside the US. European semiconductor stocks rose after Nvidia’s results: ASML gained about 2.5% , while STMicroelectronics, Infineon Technologies and BE Semiconductor each rose between 2% and 4% . The moves suggest investors expect continued spending on the equipment and components needed to build AI infrastructure, even as broader European indexes declined or held flat.

Nvidia is financing the infrastructure that buys its chips

Nvidia’s role now extends beyond selling hardware. The company is investing in model developers including OpenAI and Anthropic, backing neocloud providers that rent Nvidia-powered compute, and helping arrange financing for data-center construction.

One example is $105 billion in financial support for a large compute campus under construction in Ohio , where OpenAI is expected to be the tenant. Nvidia has also announced a partnership with major Wall Street firms to arrange up to $500 billion in data-center financing . Those arrangements have raised concerns about circular financing: Nvidia helps fund customers or infrastructure, and that money can then flow back to Nvidia through purchases of its products.

Huang defended the strategy by arguing that frontier AI companies need unusually large amounts of capital before they have the balance sheets required to borrow cheaply.

“This is the first generation of startups that needed tens of billions of dollars to get funded. When was the last time anybody heard of a startup that needed billions of dollars to get off the ground and needed tens of billions of dollars to become profitable? That just never happened. But that’s really the nature of AI. The cost of building AI, the cost of deploying AI, it’s very capital intensive.”

He said many of those companies are not investment grade and lack the operating and financial history needed to secure low-cost capital. Nvidia wants to invest in them, support them and encourage them to build on Nvidia’s technology, tying the company’s financial exposure to future demand for its computing platform.

“They’re not investment grade. They don’t have the track record, the capital track record, the financial track record, to be able to capture or secure capital at a low cost. And this is where Nvidia could be helpful.”

Huang also said Nvidia’s infrastructure can be redeployed across customers and workloads if an individual AI company falters, limiting the risk of being tied to one borrower or tenant.

“The money we’ve invested is going to generate tremendous returns. I think the risk is low.”

That is Nvidia’s defense, not an independent assessment of the financing risk. The company’s earnings show that demand is real, but the financing structure makes Nvidia both a supplier and an increasingly direct participant in the capital required to buy its systems. The unresolved question is whether the broader ACIE customer base can sustain the projected growth without Nvidia’s balance sheet continuing to subsidize the expansion.

Peter Cullen, Voice of Optimus Prime in 'Transformers,' Dies at 85

Hacker News
www.hollywoodreporter.com
2026-08-27 11:01:48
Comments...
Original Article

Peter Cullen, the Canadian voice actor who starred as the heroic Optimus Prime in a convoy of Transformers films, TV shows and video games and as the gloomy Eeyore in dozens of Winnie the Pooh projects, has died. He was 85.

Cullen died Wednesday at his home in Los Angeles, his agent, Kevin Motley, told The Hollywood Reporter .

He “passed away peacefully, surrounded by his loving family — and held in the hearts of his many friends and countless fans worldwide,” his family said in a statement. They ask “that you honor his remarkable legacy by serving your communities and leading others with compassion, integrity and loyalty and always remember ‘be strong enough to be gentle’.”

The Montreal-born Cullen also voiced King Kong for the 1976 remake and the evil K.A.R.R. (short for Knight Automated Roving Robot) on Knight Rider series in 1982 and 2009, and he came up with the scary clicking sounds that emerged from the mouth of the monster in the Arnold Schwarzenegger-starring Predator (1987).

Early in his career, he was a live-action performer and served as the announcer for The Smothers Brothers Comedy Hour and The Sonny & Cher Comedy Hour .

In a 2014 NPR interview, Cullen noted that he initially approached playing Optimus Prime with puzzlement. “I auditioned like everybody else,” he said. “I was told it was a hero, and I was told it was a truck.”

The good-natured Cullen got the job and voiced the honorable leader of the Autobots for the first time on the 1984-87 syndicated series The Transformers , based on the Hasbro toy line and produced by Marvel in association with Toei Animation of Japan and then AKOM in South Korea.

Optimus’ death after a duel with the tyrannical Megatron in The Transformers: The Movie (1986) caused a huge and unexpected outcry, prompting producers to bring Cullen and the character back for the 1987 straight-to-video movie The Transformers: The Return of Optimus Prime .

When director Michael Bay resurrected the property for the big screen with DreamWorks’ Transformers (2007), starring Shia LaBeouf, it was a no-brainer to rehire Cullen after two decades away.

“I describe it as kind of slipping into an old pair of very comfortable shoes that you haven’t worn for a while,” he told IGN in 2007. “I just slipped right into them, and they felt as good as the last time I put them on.”

With Cullen as the Peterbilt 379 semi-trailer truck, the film grossed $709.7 million worldwide — the fifth-highest grossing movie of the year. He followed with the sequels Revenge of the Fallen (2009), which raked in $836.3 million, and Dark of the Moon (2011) and Age of Extinction (2014), which each raked in $1.1 billion.

Cullen also played Optimus in The Last Knight (2017), Bumblebee (2018) and Rise of the Beasts (2023). (Chris Hemsworth voiced the character in 2014’s Transformers One .)

Cullen began as the voice of Eeyore on the 1988-91 series The New Adventures of Winnie the Pooh , and he portrayed the droopy donkey in the feature Winnie the Pooh: A Very Merry Pooh Year (2002) and on other shows and videos.

“I get an awful lot of reactions from, especially, young kids, when I go up and just say [in Eeyore’s voice], ‘Hello. Thanks for noticing me,'” Cullen said.

Peter Cullen voiced Optimus Prime in 2014’s ‘Transformers: Age of Extinction.’ Industrial Light & Magic/Paramount Pictures/Courtesy Everett Collection

One of four children, Peter Claver Cullen was born in Montreal on July 28, 1941. His parents, Henry, a longtime newsprint executive with the International Paper Sales Co., and Muriel, were Americans.

He spent time on a relative’s farm as a kid, and “I remember the very first summer, I could imitate the cows, the calves, the chickens, the different dogs they had,” he recalled.

He left the National Theatre School of Canada as a member of its first graduating class in 1963, studied acting under operatic coach Bernard Diamant, did Shakespeare for a summer in Stratford, Ontario, and was a member of the repertory company at The Crest Theatre in Toronto for a year.

He also worked as an announcer for the Montreal radio station CKGM and played an astronaut named Commander Bi Bi Latuque on the 1967 slapstick kids series The Buddies for the Montreal TV station CFCF. He then starred in Les Anglaises , a CBC radio comedy about a French Canadian man and his English Canadian wife (Joan Stuart) for the series Funny You Should Say That .

Cullen headed to Hollywood and landed on The Smothers Brothers Comedy Hour in 1967 , and he took part in comedy sketches for the Sonny & Cher program and The Hudson Brothers Razzle Dazzle Comedy Show.

To play Optimus Prime, Cullen said he channeled the spirit of his older brother, Larry, a decorated U.S. Marine who served in Vietnam from 1965-68.

“When he came home, I could see a change. He was quieter and he was a man and a superhero to me,” he said in 2006. “I watched him and listened to him. I’d never had an opportunity to do a superhero, and when that came, [that voice] just came right out of me, and I sounded like Optimus.”

He also got to voice Autobots weapons specialist Ironhide, which he based on Chill Wills, an actor in classic Hollywood Westerns.

Cullen’s performance in the first season of the 2010-13 series Transformers: Prime earned him a Daytime Emmy nomination.

At the urging of his agent, Cullen auditioned for Predator even though he was coughing up blood after working long hours on another project, he recalled in 2018. Producers initially didn’t want to show him what the creature looked like, hoping to keep that a secret, but the actor insisted.

“If I can’t see the character, I don’t know what I’m gonna do. I have to have something to relate to, to put myself inside of,” Cullen said of his voice-acting playbook.

“I saw this ugly, ugly face and these tentacles [moving around]. It reminded me of an upside-down horseshoe crab dying in the sun on a beach when I was a kid. Nasty. But from that was coming all these crackling sounds, bubbles that were coming out and bursting.”

Back on the animation front, Cullen also voiced the cheese-obsessed mouse Monterey Jack on Chip ‘n Dale Rescue Rangers ; Coran and King Alfor in the Lion Voltron series; Ramrod in the anime show Saber Rider and the Star Sheriffs ; Commander James Hawkins in the Vehicle Voltron series; Mario in Saturday Supercade cartoons; and Councillor 1 in Rise of the Teenage Mutant Ninja Turtles.

He was involved with NASA and the Optimus Prime Spinoff Award, which is presented each year to youngsters studying space, science, technology and math.

Survivors include his children, Angus, Claire, Pilar and Clay, a stunt performer and coordinator.

“The phenomenon of Transformers itself is mind-shaking,” he said. “Being a part of it is not only historical, it’s a part of your life that says, ‘Gee, I’m glad.’ I did something in my life that stood out, and I’m really grateful for that. Humbled by it.”

Decompiling a Nintendo 64 Game in 84 Days

Hacker News
blog.chrislewis.au
2026-08-27 11:01:11
Comments...
Original Article

I’m very pleased to announce that the original Snowboard Kids is now 100% decompiled! This means that all functions 1 have matching C implementations that, when compiled, produce identical machine code to the original game.

This was obviously not a one-person effort. I am particularly grateful to inspectredc , Bl00D4NGEL , and queueRAM for their significant contributions to the project. No amount of AI would have been able to replace them. 2 I would also like to thank iFuzzle , JamesBLewis , and douglasjv for lending their tokens to the cause.

My hope is that a full decompilation will prove useful to the Snowboard Kids community. Speedrunners in particular have long focused on the first game. Working source code can help shed light on externally observed phenomena such as CPU pathing and the exact factors contributing to player speed. A full understanding of the source code will also be useful for static recompilation and more ambitious modding efforts in the future.

The speed at which the project was finished is also noteworthy. Snowboard Kids took only 84 days to decompile compared with 596 days for Snowboard Kids 2 , roughly one-seventh of the elapsed time. 3

chart showing weekly Snowboard Kids decompilation progress

Weekly progress of the Snowboard Kids decompilation.

What explains this difference? Well, it’s 2026, so the answer is at least partially AI. But it would be a gross oversimplification to attribute the difference entirely to LLMs.

What Was Different

To state the obvious, I was not starting from scratch. By this point I had already spent nearly two years on a similar project and was vastly faster than when I began. This advantage is difficult to quantify and was somewhat offset by new challenges such as working with a different compiler.

Overall, roughly 4.8% of matching commits involved expert intervention. 4 I have already credited these amazing people once, but it’s worth reiterating. This project would not have been possible without significant help from the decompilation community, particularly inspectredc , queueRAM , and Bl00D4NGEL <3.

The difficulty generally didn’t come from trying to understand what a function did 5 but rather how that logic was expressed in C and how the resulting code was compiled. Snowboard Kids was compiled with IDO 5.3 rather than the GCC 2.7.2 compiler used by Snowboard Kids 2 .

Most programmers will be familiar with GCC. It is a widely used open-source compiler still in active development today. IDO, on the other hand, was a proprietary compiler developed by SGI, whose own story is closely entwined with that of the Nintendo 64. 6 Its source was not available, and its original development environment was tied to obsolete SGI hardware and software. To use and properly understand it today, the decompilation community has had to reverse-engineer and decompile parts of the compiler toolchain as well as statically recompile the IDO 5.3 and 7.1 suites to run on modern hardware. That closed history makes IDO harder to reason about than an open compiler such as GCC.

IDO splits optimisation and code generation across several different passes, transforming code quite aggressively along the way. 7 Tiny changes to the C can then ripple through those passes and produce a completely different register allocation.

The community has made great strides in understanding IDO and its quirks, but this remains more of an art than a science. LLMs and I are not particularly good at reproducing its output. The usual workflow, for both me and the agents, was to figure out what a function did and then write C that approximated that purpose. From there, small tweaks assisted by the permuter could catch any remaining differences. But you can’t permute yourself into a match in all cases, particularly when the underlying structure is wrong. IDO’s behaviour made this workflow far less predictable.

A motivated human team with the right expertise and intuition can match or even exceed the pace of the Snowboard Kids decompilation. The Pilotwings 64 decompilation was completed in only 74 days. 8 Pilotwings 64 had 16% fewer functions than Snowboard Kids , but more compiled code overall, so this is not a clean comparison either.

screenshot of Pilotwings 64

Pilotwings 64, a charming flight simulator, was a Nintendo 64 launch title and remains a cult classic to this day.

Snowboard Kids was also smaller than its sequel, containing 2,145 functions compared with 2,995 in Snowboard Kids 2 . Function count is a crude measure of difficulty, but there were simply fewer functions to decompile.

Where Agents Did Help

I’ve already written elsewhere about using agents to decompile functions. The same basic process was used here, so I’ll focus on what changed. Unlike the previous project, this one began with access to frontier models and a capable agent harness .

Library Code and Other Low-Hanging Fruit

I was interested to see how agents would fare during the early stages of a project. One area where they thrived was matching standard-library code. In theory, this is the most obvious chunk of almost any Nintendo 64 decompilation. The code is not unique to the game, and versions of it are available online. Snowboard Kids contains more than a hundred source segments from Nintendo’s libultra , alongside functions from the libmus audio library. Tools such as N64Sym can identify probable library functions in the ROM.

This pass was fairly successful. The main stumbling block was convincing agents to rely on the existing library source rather than decompile the same functions again from scratch. This required stronger prompting. Once a likely library function was identified, agents were instructed to treat the corresponding source as their starting point and exhaust plausible SDK versions, compiler options, and conditional compilation paths before attempting their own implementation.

Another optimisation was to have an agent write a script that ran m2c against every unmatched function and automatically integrated any exact matches, rather than relying on agents to attempt those functions individually. 9 The script matched only 17 of 1,830 functions, an incredibly low success rate of 0.93%, but anything matched this way was cheaper than burning agent tokens.

IDO Tooling and Skills

IDO is weird, but it is often weird in recurring ways. Successfully matching one function could reveal a compiler quirk that applied to many others. Codex has become better at carrying lessons between tasks through features such as local memories . To make those lessons available beyond a single agent, I prompted agents to record observed IDO behaviour in a DECOMPILATION_LEARNINGS.md file. When an agent discovered a generalisable compiler quirk, it could record the evidence there for later attempts. This created a useful feedback loop. Agents helped document IDO, and the resulting documentation made subsequent agents better at matching IDO code.

But the most useful resource was N64 Decomp Workbench , a collection of tooling and documentation for debugging late-stage MIPS decompilation mismatches. It can classify mismatches, account for relocations, replay individual compiler passes, and help distinguish a structural problem from a register-allocation problem. Pass replay requires the relevant compiler binaries and project-specific setup, but once configured it exposes information that a raw assembly diff cannot. A raw diff tells you that two functions differ. The Workbench can give agents a much better idea of why the functions differ and what sort of change might fix them.

Worktrees and Synchronisation

For this project, I ran the decompilation harness across four Git worktrees. Each worktree gave an agent an independent copy of the repository, allowing several functions to be attempted in parallel.

One small but useful improvement was to give every task an explicit deadline and expose that deadline to the agent. During the Snowboard Kids 2 project, agents often struggled to use the permuter effectively because it would continue running until it found a 100% match or was manually stopped. An explicit deadline allowed agents to set sensible timeouts and trade off permuting time against other forms of problem-solving. Anecdotally, it also helped them judge how long to keep working on a difficult function before giving up. I could then increase the time allowance as the easy functions disappeared and the remaining work became more difficult.

Another problem that had existed in Snowboard Kids 2 but became more apparent as I added worktrees was synchronisation. As discussed in my previous post , each agent was given a function to decompile alongside a set of similar functions that had already been matched. These provided useful reference points for reproducing particular IDO instruction patterns. Work was divided between the worktrees using Nigel’s --shard option, which uses basic hashing to partition candidates between a specified number of workers.

This allowed more work to happen in parallel without duplication, but introduced a new problem as the worktrees diverged. One worktree, for example, might successfully decompile a function that was 99% similar to a function being attempted elsewhere, but that new reference would remain invisible to the other agent until the changes were merged. Periodically merging everything into the main branch and resynchronising the worktrees fixed this, but synchronising all four could take more than an hour. Synchronising continuously wasted time, while waiting too long increased drift.

To make synchronisation less critical, I updated the similarity search to inspect every worktree. A newly matched function could immediately become a reference for another agent without waiting for it to reach the main branch. The harness would produce messages such as the following.

1✓ Candidate ["func_80094A94", "func_80094FF4 (../sbk-c)",
2  "func_80094808", "func_8009491C (../sbk-a)",
3  "func_8009469C (../sbk-c)", "func_80093144"] was fixed!

This helped the process remain efficient as the easy functions disappeared. Synchronisation was still needed to consolidate and push changes, but it was no longer required for agents to learn from one another.

Model Choice

I tried GPT-5.5 and 5.6, Claude 4.5 and Fable, and GLM 5.2. This is completely unscientific. The models were tested against a changing set of difficult functions, sometimes after another model had already made partial progress. Broadly, though, Codex continued to outperform Claude, as it had towards the end of the previous project. Sol xhigh was particularly effective once it became available.

GLM 5.2, served by z.ai, was very disappointing. I had previously been a big fan of GLM. It was effective, even if it was not quite a frontier model, and its generous usage limits made up for the gap. That tradeoff became much less attractive as the limits grew less generous while latency remained awful. The feedback cycles were so long that I stopped giving it work and eventually cancelled my subscription.

What Next?

The immediate priority is to better document the game. A 100% match means we have C code for every function; it does not mean we understand what every function does. There are still generated names to replace, unknown structure fields to identify, awkward matches to clean up, and large amounts of data to describe.

Work is also underway on a Snowboard Kids recompilation. Fortunately, the first game shares many of the quirks addressed by patches in Snowboard Kids 2: Recompiled .

early screenshot of Snowboard Kids: Recompiled

I’m looking into porting the levels and other content from the first game into the second game’s engine, although I have no idea how much work that will be yet.

Beyond that, I’m interested in decompiling Snowboard Kids Plus on the PlayStation, a Japan-exclusive expanded release of the first game with extra levels and characters.

If you’ve made it this far, you’re probably interested in decompilation and Snowboard Kids. Take a look at the Snowboard Kids decompilation project . There is still plenty of cleanup and documentation work to do, and contributions are very welcome.

Three UK airports hit by cyber-attack with data of 8.7m customers accessed

Guardian
www.theguardian.com
2026-08-27 10:53:54
Company that runs Manchester, Stansted and East Midlands hubs says passenger safety is unaffectedBusiness live – latest updatesManchester, London Stansted and East Midlands airports have been hit by a cyber-attack in which hackers accessed the data of about 8.7 million customers. The incident involv...
Original Article

Manchester, London Stansted and East Midlands airports have been hit by a cyber-attack in which hackers accessed the data of about 8.7 million customers.

The incident involved data related to “car park, lounge and fast-track bookings and in-airport wifi sign-ups”, and the hackers obtained email addresses, phone numbers, vehicle registration numbers and postcodes, said Manchester Airports Group (MAG), which operates the three hubs.

The company said that “at no point has passenger safety or aviation security been compromised” during the incident and operations at the airports were unaffected. The hacked system did not hold customers’ bank or payment details.

A close-up of an email from London Stansted airport on a mobile phone
An email sent to an affected customer from London Stansted airport. Photograph: Yui Mok/PA

In an email to customers, London Stansted said: “We would urge you to be particularly cautious of unexpected emails, calls or text messages claiming to be from us. We will never contact you unexpectedly to ask for payment or banking information. We apologise for any inconvenience or concern this may cause.”

The cyber-attack hit the airports during the peak summer travel season. Many families are flying back into the UK this week before the start of the new school year. Fifty-four million passengers flew through Manchester, London Stansted and East Midlands airports combined last year.

A MAG spokesperson said the company had “immediately contained the risk” from the incident and was “working with specialist advisers and taking appropriate steps to protect our customers and systems”.

“We have informed and are working with the relevant authorities. At no point has passenger safety or aviation security been compromised,” they said. “Airport operations remain unaffected and customer parking services continue to operate normally.

“We would like to reassure customers that Manchester Airport Group takes the security of customer information extremely seriously and we apologise for any inconvenience or concern caused.”

Lauren Wills-Dixon, a partner at the law firm Gordons, said the scale of the attack was notable.

“Airports sell a number of services including lounge access, parking and fast-track bookings. Wi-fi access also requires customers to input their data,” she said. “As a result, operators will hold large amounts of customer data and this, together with the increased use of technology, only increases the threat of a cyber-attack.”

The incident comes as pressure grows on suppliers and operators of national infrastructure to improve their cyber-defences.

Flights were delayed and cancelled last year at three major European airports – including London’s largest, Heathrow – after the company behind the software used for check-in and boarding said it had been hit by a cyber-attack .

Hackers linked to Iran were blamed earlier this month for a cyber-attack that caused the temporary shutdown of a British power plant. The government said the incident involved a small-scale generator and that at no point was there a risk to the wider energy system.

There was a wave of high-profile cyber-attacks against British companies last year, ranging from one that shut down the operations of Jaguar Land Rover for weeks to others targeting Marks & Spencer , Harrods and the Co-op food chain .

Hollywood's Video Game Era Is Here. Will It Be Any Good?

Hacker News
www.statsignificant.com
2026-08-27 10:48:47
Comments...
Original Article
The Last of Us (2023). Credit: HBO.

Adaptations of the beloved Super Mario Bros. franchise have twice served as major test cases for the commercial viability of video game movies. One was terrible; the other, paradigm-shifting.

We’ll start with the 1993 Super Mario Bros. movie, which was a troubled production from the outset (to say the least). For some reason, filmmakers initially envisioned a darker, dystopian rendition of Nintendo’s signature property. But shortly before production began, studio executives grew concerned that the movie would alienate younger audiences and ordered substantial rewrites. The result was a cinematic Frankenstein: part grimy cyberpunk fantasy, part children’s comedy, punctuated with out-of-place dialogue catering to die-hard fans.

Critics panned the film, audiences rejected the slapdash adaptation, and it earned a disastrous $21 million against a $48 million budget. For years, Super Mario Bros. was the foremost cautionary tale against Hollywood video game adaptations.

In 2023, Illumination, the studio behind the ever-present Minions plague, released a faithful animated adaptation of the Super Mario Bros. universe that grossed over $1.3 billion. Its success arrived amid a broader wave of well-received video game adaptations across film and television, with projects like The Last of Us and Fallout demonstrating how gaming franchises could please fans and normies alike.

Over the past five years, superhero stories and comic-book properties have been cycling out of studio slates and streaming catalogs, replaced by a growing wave of video game–based projects. As someone who wants big-budget movies to be good—and has become exhausted with the artistic inconsistency of superhero films—my main question is whether video games will prove any better as source material. Should we expect higher-quality storytelling than the Marvel Cinematic Universe (MCU) has delivered in recent years? And, if so, what makes video games different?

So today, we’ll explore the rise of video game adaptations, investigate the massive pent-up demand for this format, and examine the unique demographic makeup driving the commercial (and artistic) potential of these projects.

Over the last three decades, Hollywood has moved away from original screenplays and literary adaptations in favor of fictional universes with built-in fandoms—first through comic books and, increasingly, through video games. Amid a tumultuous post-pandemic box office, adaptations of superhero stories and gaming universes account for nearly half of the highest-grossing films of the 2020s (thus far).

Video game movies are poised to grow their share of box office in the coming years, with some of Hollywood’s most exciting filmmakers now attached to major gaming properties: Zach Cregger of Weapons fame is adapting Resident Evil , Ex Machina ’s Alex Garland is bringing Elden Ring to the big screen, Mission: Impossible ’s Christopher McQuarrie is making a Battlefield film, and Yellowstone ’s Taylor Sheridan is attached to a Call of Duty movie. The shift recalls the early days of the MCU, when rising filmmakers like Ryan Coogler and Taika Waititi were handed major franchises like Black Panther and Thor .

Projects centered around intellectual property (IP) are usually resource-intensive, laden with visual effects and lengthy post-production cycles. So whenever a promising filmmaker gets tied up adapting someone else’s fictional universe, my mind drifts to the same question: Will this actually be worth it?

With video games, the answer may be an enthusiastic “yes.” Consider the sheer size of the underlying fandom: Americans spend roughly $60 billion a year on video games, compared with just $2 billion on physical comic books.

This $60 billion of spending spans hundreds of games, making breadth a unique facet of the gaming space. It’s a robust market rife with distinct niches and storytelling styles.

Earlier this year, a YouTuber named Markiplier adapted an indie game called Iron Lung into a feature film, released it without a major studio, and the movie ultimately grossed $51 million. The underlying IP was nowhere near the scale of Fallout or Minecraft , but its fan base was devoted enough to turn a relatively obscure game into a significant box-office win.

Markiplier’s success is uniquely instructive, highlighting the growing convergence of gaming, social media, and theatrical exhibition.

For better or worse, social media now sits at the center of modern moviegoing: a 2024 Fandango survey found digital buzz to be the biggest single driver of theatrical attendance.

And when respondents were asked which platforms were most likely to get them into theaters, YouTube ranked first for film discovery . If the dueling 2026 successes of Backrooms and Obsession have taught us anything, it’s that YouTube can indeed put butts in movie-theater seats. And guess what category dominates YouTube’s trending videos more than any other? Yup, you guessed it: video games. By a large margin, in fact.

That makes YouTube’s enormous gaming audience a natural target for theatrical adaptations, especially when movie trailers are primarily consumed on the same platform. Someone who regularly watches Resident Evil gaming content, for example, is already primed to watch (and rewatch) a trailer for its upcoming big-screen adaptation.

For many, the widening cultural influence of video games is probably a no-brainer. But for me—a younger millennial who never quite vibed with Call of Duty or Rocket League —statistics like these are genuinely surprising. Has this cultural shift simply been brewing under my nose, hiding in plain sight? Is this further evidence of how disconnected I’ve become from popular culture?

This cultural blind spot initially left me skeptical of both the sheer proliferation of video game adaptations and their above-average quality.

And then I watched both Fallout and The Last of Us and found each series extremely compelling—especially The Last of Us , whose third episode easily qualifies as the best television I’ve watched in the past five years.

I’m hardly alone in my enthusiasm. So far, the video game adaptations of the 2020s have been surprisingly well received by critics, with recent releases surpassing comic-book stories in online acclaim.

I strongly believe that video games have a higher ceiling for storytelling quality. There are several reasons underlying my newfound evangelism: a larger built-in audience, a more robust market with hundreds of games appealing to many different types of fans, and, most importantly, demographic variability.

Consider these two surveys taken 80 years apart on the age groups that engage with comic books and gaming. You’ll notice the comic book survey did not target respondents above age 30, which is informative in and of itself. In contrast, video games see weekly engagement across all age groups, with 32% of respondents in their 80s claiming to play video games at least once a week.

I understand that the demographic makeup of the average comic-book fan has changed in the intervening 80 years, but I think the gist underlying this data point holds: superhero stories traditionally cater to younger audiences. The result is a Marvel Cinematic Universe largely devoid of sex, graphic violence, and adult themes—a franchise engineered for adolescents and tweens.

Video games, by contrast, aren't tied to one specific age group or storytelling mode. The medium has Minecraft and Roblox for younger players, while games like Grand Theft Auto and Resident Evil appeal to teens and adults. That range produces source material with vastly different tones and narrative sophistication, giving filmmakers the space to tell nuanced stories without infantilizing their audience.

Enjoying the article thus far and want more data-centric pop culture content?

Fallout (2024). Credit: Amazon.

There are certain colloquialisms I’ve long accepted at face value—phrases like “curiosity killed the cat” or “bite the bullet”—whose origins I’ve never thought deeply about. And then occasionally I’ll come face-to-face with the literalization of these phrases, and I’ll realize why the saying caught on in the first place. Case in point: I often use the term “jangling keys” when referring to cheap fan service in movies built around intellectual property—usually comic book adaptations—but I’ve never really understood the phrase’s meaning out of context. I heard someone else say it, thought it sounded cool, and here we are. And then one day my son—an adorable infant—got cranky.

We were out on a walk when he hit his end-of-day tired spell and started giving me a devastating little pout. I went through all of his toys, which he quickly rejected one by one, and so, as a last-ditch effort, I began jangling my keys in front of his face.

It was at this point that my son became thoroughly entranced by the chiming of car keys and that I finally understood the meaning of a phrase I use weekly.

I write about film and television a lot, which means I write and think about intellectual property a lot. Since introducing my kid to the wonders of a key chain, I can’t help but think of his primal delight and our animalistic drive to chase that feeling for the rest of our lives—oftentimes through art.

People crave wonder and awe. And perhaps the easiest shortcut to feeling wonder is invoking a prior experience where we felt this very amazement. Which brings me back to “jangling keys.” Deep down, we all want this. We wanted it when we were six months old, and we want it today.

Everyone has their proclivities—their cultural Achilles’ heel—where if you can find a new way to experience that pastime, you will. For some it’s a superhero movie; for others it’s seeing the game Resident Evil on the big screen (three weeks from now); for my dad it’s a biopic about Bruce Springsteen; and for me it’s anything about the Red Hot Chili Peppers.

But just because we crave that sense of childlike wonder does not mean we need to be infantilized in the process.

And so we arrive, once more, at video games. I know it would make for a better essay if I were really grumpy about Hollywood’s impending video game era, but I’m not. I’m kind of excited.

I’m excited for people to feel the sense of awe only a movie can provide, without being coddled. If the next 15 years of popular culture are going to be built around video games, then maybe it marks an opportunity for everyone to get exactly what they want: movies made for adults, blockbuster box office, above-average investor returns, high-minded art, a thriving entertainment industry, and, most importantly, the ever-wonderful jangling of keys.

Become a paying subscriber to get bonus graphics, interactive dashboards, downloadable datasets, and to support independent journalism.

Upgrade to Paid

*Note: For best results, open this link in a web browser while logged in to your Substack account.

This post is public so feel free to share it.

Share

Want to promote your data tool or media publication to Stat Significant’s 26,200 readers? Email daniel@statsignificant.com

Need help with a data problem? Book a free data consultation

Connect with me on LinkedIn if you want to chat about a data project.

Like movies? Follow me on Letterboxd

Discussion about this post

Ready for more?

Launching Route 53 Files

Hacker News
www.daemonology.net
2026-08-27 10:45:23
Comments...
Original Article
I'm excited to announce Route 53 Files, a new file system that seamlessly connects any AWS compute resource with Amazon's highest-availability database .

Four decades ago, when the Berkeley Internet Name Domain Server launched, it stored DNS records in "zone files". You could edit these files in vi , but BIND had to be told to reload them before your changes took effect. Later, other DNS servers came along, like Daniel Bernstein's tinydns, which served records directly out of a database on disk — but even there, after editing the human-readable DNS records, it was necessary to recompile the database file.

With Route 53 Files, it becomes possible to use standard UNIX software to edit your DNS without needing any additional steps. It makes your hosted zones accessible as file systems; this means changes you make to records in the file system are automatically reflected in Route 53, and changes made in Route 53 through any other channel — the AWS Management Console, the Route 53 API, the AWS CLI — automatically appear in the file system. A Route 53 Files file system can be attached to multiple compute resources, enabling shared access to your zones across teams without duplication.

Until now, you had to choose between the Route 53 console, the Route 53 API, and the tools built on top of them. Route 53 Files eliminates that tradeoff. Your hosted zone becomes the central hub for all your organization's DNS records. It's accessible directly from any AWS compute instance, container, or function, whether you're running production applications, responding to an incident, or building agentic AI systems.

You can access any enrolled public or private hosted zone as a native file system on your Amazon Elastic Compute Cloud (Amazon EC2) instances, containers running on Amazon Elastic Container Service (Amazon ECS) or Amazon Elastic Kubernetes Service (Amazon EKS), or AWS Lambda functions. The file system presents each resource record set as a file and each record name as a directory, supporting standard Network File System (NFS) v4.1+ operations like creating, reading, updating, and deleting DNS records.

Alias records are presented as symbolic links to their targets, so ls -l renders them the way you would expect and readlink does what you would hope. Cross-zone aliases are presented as dangling symbolic links — as they should be, given that their targets are not inside the same file system.

Under the hood, Route 53 Files uses S3 Files and delivers ~90s latency for a file save to reach live DNS, and up to 6 minutes of latency for a change made elsewhere in Route 53 to appear in your mount. (Note that changes reaching live DNS does not ensure that they are immediately visible worldwide; the latency for global visibility of DNS changes depends on record TTLs and caching behaviour.) The file system supports concurrent access from multiple compute resources with last-write-wins conflict resolution, making it ideal for shared workloads that mutate authoritative DNS, such as AI agents collaborating through file-based tools and on-call engineers reverting each other's changes using sed .

Let me show you how to get started.

Creating my first Route 53 Files file system, mounting it, and editing DNS from an EC2 instance is straightforward. In this example, I already have a Route 53 hosted zone and an EC2 instance where I want to mount it.

First, I navigate to the Route 53 Files Console and create IAM roles. These are needed to allow Route 53 Files to create resources in my AWS account and read and write to my existing Route 53 hosted zone.

Route 53 Files create IAM Role bundle

I fill in my 12-digit AWS account ID and the Route 53 hosted zone ID I'm planning on using; if I wanted to I could specify multiple hosted zones or even "*" to allow all Route 53 hosted zones to be enrolled. When I click "Create bundle", a tarball is generated inside the web browser containing IAM role policies with exactly the privileges required; if you're paranoid about security (as you should be), you can audit the role-generation code to confirm that it isn't trying to grant any unnecessary privileges.

Having downloaded the bundle, I extract it and run the included script to create the roles. There's also a README.txt file inside the tarball with instructions, including explaining what you need to adjust if you want to permit additional hosted zones to be enrolled at a later date.

Route 53 Files creating IAM Roles

Having now created the necessary IAM roles, I can proceed to enrol a Route 53 hosted zone into Route 53 Files. I enter my AWS account ID, my Route 53 hosted zone ID, the AWS Region I want to create the Route 53 Files file system in — I'm Canadian, so I picked ca-central-1 — and the external ID is autofilled from when I created the role bundle. If I come back to this page later I can get the external ID from the README.txt file in the role bundle tarball I generated. (The External ID makes sure that you, and only you , can enrol your hosted zone; it's also used if you ever want to stop using Route 53 Files.)

Enrol a zone in Route 53 Files

When I enrolled my hosted zone, I was given a file system ID of the form "fs-0123456789abcdef0" and now I can create a mount target. Route 53 Files is compatible with S3 Files, so I use the same command:

$ aws s3files create-mount-target \
    --file-system-id fs-0123456789abcdef0 \
    --subnet-id <a subnet in that VPC> \
    --security-groups <a group allowing TCP 2049 from your clients> \
    --region <your region>
Note that since Route 53 Files uses NFS, you'll need to use a security group that allows access to port TCP/2049.

Once my mount target is available, I can mount it on my EC2 instance. I've already confirmed that I have amazon-efs-utils version 3.0.0 or later and botocore installed, and my EC2 instance has an IAM Role attached containing the AmazonS3FilesClientFullAccess policy.

$ sudo mkdir -p /mnt/r53fs/example.com
$ sudo mount -t s3files -o nodirects3read \
    fs-0123456789abcdef0 /mnt/r53fs/example.com

Editing DNS with Route 53 Files

I can now edit my DNS using standard command-line tools. Within the file system, foo/TYPE is a TYPE record named "foo"; in keeping with DNS tradition, the special name "@" refers to the zone apex. For example:

$ echo 1.2.3.4 | sudo tee /mnt/r53fs/example.com/@/A
creates an A record for the zone apex, example.com , with the value 1.2.3.4 . If I want to use round-robin DNS, I can simply create a second record in the same record set:
$ echo 5.6.7.8 | sudo tee -a /mnt/r53fs/example.com/@/A
and since the file has two lines there will now be two IP addresses returned via DNS.

I want the www host to alias the zone apex, so I create a symlink:

$ sudo mkdir /mnt/r53fs/example.com/www
$ sudo ln -s ../@/A /mnt/r53fs/example.com/www/A

If I want to reduce record TTLs in advance of a migration, I simply need to create a .TTL sibling file:

$ echo 60 | sudo tee /mnt/r53fs/example.com/@/A.TTL
and the change is promptly reflected in live DNS; without a .TTL sibling the default value of 300 seconds is used.

Wildcard records — e.g. *.example.com — are named exactly as you expect; note, however, that * expands in most shells so you'll need to escape it if running from the command line:

$ sudo mkdir /mnt/r53fs/example.com/\*
$ echo www.example.com | sudo tee /mnt/r53fs/example.com/\*/CNAME

Of course, file systems can be accessed by any tooling, not just at the command line; for example, we can update DNS from a cron job:

$ echo "*/5 * * * * root date > /mnt/r53fs/daemonology.net/vixie/TXT" | sudo tee -a /etc/crontab
$ sleep 600
$ dig +short -t txt vixie.daemonology.net
"Tue Aug 25 00:20:01 UTC 2026"

Things to know

Let me share some important technical details that I think you'll find useful.

  • Route 53 Files integrates with AWS Identity and Access Management (IAM) for access control. Every role is created by you. The service holds no role-creation authority; if you remove the IAM Roles, the service will immediately and silently stop working.
  • If the same record is changed in the file system and in Route 53 at the same time, we aim for last-write-wins. This is not strictly possible, since Route 53 does not expose modification timestamps on records, so sometimes we make an educated guess based on when the record was changed in the file system and the window within which we know the record changed in Route 53.
  • A write that Route 53 rejects is reported in a .error file alongside the record. This happens asynchronously, after the malformed data arrives at Route 53; if you look for an .error file immediately after writing a record, you won't see it yet.
  • Routing policies, DNSSEC-specific record types, and Aliases with EvaluateTargetHealth set to true are not supported at this time. Any records found in Route 53 which are not supported by Route 53 Files will be reported in a .r53fs-unsupported file in the file system root.
  • Changes will appear in Route 53 a period of time after you stop editing a record. Consistent with S3 Files, if you hold a file open and make continuous changes to it, the changes will not propagate to Route 53.
  • In order to support text editors which move or delete files before writing new files, there is a short hold-down period; running vi www/A should not result in NXDOMAIN errors.

What customers are saying

Corey Quinn, Chief Cloud Economist, Duckbill:

"I've spent years telling people that Route 53 is a database. Colin embraced this righteous philosophy like a champion, and this insane thing is miles better than the actual Route 53 API, which is an embarrassment to databases everywhere. There are no change timestamps, it features no events, and for some godforsaken reason has a ChangeBatch schema that reads like XML that learned JSON in prison. Meanwhile echo and tee got my record live in 72 seconds. Thanks, Colin!"

Pricing and availability

Route 53 Files is available today in all commercial AWS Regions except Middle East (Bahrain) and Middle East (UAE). Note that since Route 53's control plane operates entirely in the us-east-1 region, a regional outage affecting us-east-1 will prevent your Route 53 Files file systems from updating DNS — although they will still be accessible in their own regions.

You pay for the infrastructure created by Route 53 Files inside your AWS account, but the Route 53 Files service itself is free.

I'd love to hear how you use this new capability. Feel free to share your feedback in the comments below.

— cperciva

Frequently Asked Questions

Q. Is this an official AWS service?
A. Of course not; but I'd be happy to let them have it if they're crazy enough to want to maintain it.

Q. Why didn't this launch on April 1st?
A. Because S3 Files launched in early April and I didn't want to wait until April 2027.

Q. Why expose DNS zones over NFS instead of a FUSE file system?
A. Because it's funnier. Also, because that's what S3 Files does (but I repeat myself).

Q. What happens if you run rm -rf * ?
A. Route 53 Files attempts to delete all of your DNS records, of course; what else would it do? (Note that Route 53 doesn't allow you to delete your hosted zone's SOA or apex NS records, so those records will silently reappear in the file system.)

Q. Is there an SLA?
A. Yes, I guarantee a 100% refund of fees paid in any month where availability is less than 110%.

Q. Is this HIPAA compliant?
A. Please do not store patient information in DNS.

Q. Did anyone at Amazon know you were doing this?
A. Absolutely not. If they knew, they would have had to try to stop me. Amazonians aren't just people I work with; they're my friends, and I don't want anyone to get in trouble for me being irredeemably weird.

blog comments powered by Disqus

What happens when a GPU reads memory

Lobsters
blog.doubleword.ai
2026-08-27 10:42:03
Comments...
Original Article

Our previous post followed a vector-add kernel — c[i] = a[i] + b[i] , one thread per float — from nvcc down to the warps. We went into a lot of detail on how the kernel was launched, but we also left a lot out.

This time, we’re going to address our omissions, and follow the path the critical SASS instruction (a global load) takes through the hardware — in this case, since it’s under my desk, an RTX 4090 We do this kind of reverse engineering for performance reasons, at least in principle (for a great rationale, see 'Why these details matter' in the Citadel microbenchmarking paper). For the same work applied to more production-relevant GPUs, watch this space. . Little of the detail of this path is documented by NVIDIA, at least not to the level that we’d like, so we’ll determine it by running timing experiments on the hardware itself.

The CUDA kernel we are investigating has two lines in its function body:

__global__ void vadd(const float* a, const float* b, float* c, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) c[i] = a[i] + b[i];
}

If you inspect the compiled SASS, you’ll see the instructions that power those lines:

/*0080*/  IMAD.WIDE R4, R6, R7, c[0x0][0x168] ;   // &b[i]
/*00a0*/  LDG.E R4, [R4.64] ;                     // b[i]

They serve to load the elements of the vector b The instructions are the same for a , we're following b . from global memory into a register, where they can be added to the elements of a to perform the kernel. One LDG.E asks for four bytes in each of 32 lanes. Serving it takes four 32-byte sectors, one cache line, one address translation, a crossbar crossing, one of thirty-six L2 slices, and, when it misses everywhere, an activate and four column reads at a DRAM chip. It’s this journey of the instruction through the hardware, and back, that we’ll try to follow.

To set the scene: our warp lives on one of the SM’s four sub-partitions , alongside eleven other resident warps. Each cycle the sub-partition’s scheduler picks one warp that is eligible, and issues its next instruction across the 32 lanes at once. Our warp wins twice: once for the IMAD.WIDE , and a few cycles later (the addresses now sitting in R4 and R5 ) for the LDG .

Our story starts with the LDG .

From the warp to the L1 cache

Let’s start with the instruction. LDG.E R4, [R4.64] is a global load of 32 bits from the 64-bit address stored in registers R4 and R5 R5 appears because of the .64 annotation: registers are 32 bits in size. , storing the result in register R4 . To load the data itself, we first must go get that address from those registers.

One row of the register file holds R4 for all 32 lanes at once The reads are staged in an operand collector first. The staging is there for instructions whose sources share a bank of the register file, since a bank serves one read per cycle. There are two banks, picked by the low bit of the register number, so an adjacent pair always spans both. . Another holds R5 . The warp reads both entries, yielding 256 bytes read as 32 distinct 64-bit addresses, one address per lane.

What the register retrieve costs

The address read adds at most one cycle. A shared-memory load taking its address from a register takes 24 cycles from issue to first use, and the same load with the address as an immediate takes 23. ( LDG can’t take an immediate).

With all of its addresses resolved, the instruction issues to the load/store unit (LSU). The LSU takes the instruction and its operand addresses, does some address arithmetic (if necessary) This unit can add immediate offsets ( [R4.64] carries no offset to add), and scope loads ( LDG names the global window directly). , and sends on the opcode (‘load these addresses’, in binary), a 32-bit mask of active lanes, its computed addresses, and the number of the register the result belongs in. The next destination is the coalescer .

Each LDG.E instruction in each lane asks for 4 bytes, but our next destination, the L1 cache , is addressed in 32 byte sectors . The coalescer’s job is to figure out the minimal number of L1 sectors it needs to retrieve to service our 4-byte requests.

The coalescer figures out that it ought to emit 4 contiguous sector requests, for the 128 bytes the warp has asked for 1 .

Entering the L1 cache

The request for four contiguous 32-byte sectors is sent onto the L1 cache .

The L1 cache’s unit of organization is still less granular: 128 byte lines . Our 4 contiguous sectors represent the 4 parts of a single line, so a request gets made to L1 for that cache line.

First, we have to determine whether that line is already in the cache. The cache is divided into groups of slots called sets In technical terms, the L1 cache on the 4090 is 4 way set-associative. Caches lie on a continuum between fully associative (any cache line can be stored anywhere in the cache), and 'direct-mapped' (each cache line can be stored in only one place). , and a line’s address determines which set it belongs to. A set on this card holds four slots 2 , and each carries a tag identifying the line in it. The lookup compares all four against the tag of the line it wants. The address it uses is the virtual Presumably so that we don't have to pay translation cost to hit L1. address used in the program 3 . The set in which a line lands is generated from the line’s virtual address by a hashing scheme It's a complex parity scheme (see the appendix), not just some slice of the bits, so that power of 2 strided accesses (think columns of a matrix, tensor etc.) don't keep hitting the same sets and churn. , which you can reverse engineer 4 .

If one of the four tags matches and the sectors we want are in that slot, the data is read out and the load is done 5 . Because we’re loading all of our data for the first time, our request misses, and must descend further into the memory system.

How much does an L1 hit cost

An L1 hit returns in about 15.4 ns — 40 cycles. The number comes from one thread chasing a dependent chain through a random permutation of L1-resident lines, with the latency chase .

Looking for L2: translation

Virtual memory puts one level of indirection between the addresses a program names and the addresses at which the hardware stores data. The program gets a contiguous space of its own, and the hardware lays that space out across physical pages however it likes. Translation is the map between them.

The L1 we just spoke to was virtually addressed , so we didn’t need to concern ourselves with translation. Past this point, we have to start speaking the hardware’s language — an L1 miss has to be translated before it leaves the SM 6 .

The actual mapping between physical and virtual addresses is established at allocation in the driver: when b was allocated, the driver picked physical (2MiB) pages for it and wrote page tables into VRAM recording the assignment 7 .

The translation unit takes in a virtual address and returns a physical address, according to those tables. The SM keeps its sixteen most recent translations in a TLB, shared across warps 8 . The very first load will miss in this TLB.

What translation costs

We can’t see any cost to hitting the TLB in any of the probes we have. Misses cost about 4.4 ns — eleven cycles. The same refill cost holds within 0.1 ns across all the pages this chip can map, and from any SM, so the next level of the translation cache is universal, and very cheap.

Once translation has been performed, what leaves is one request per 128-byte line: now with the line’s physical address, along with a mask of the sectors we want from it. Ours is a single request with all four sectors marked 9 .

The request proceeds out of the SM, across the crossbar to the L2 cache .

Lost in L2

The request runs across the crossbar to one of 36 2 MiB L2 slices, picked by a somewhat complex function of its physical address 10 . Any SM can hit any slice. All slices can serve in parallel, so the aggregate bandwidth is 36x that of a single slice.

Inside a slice, the structure is of the same kind as the L1. Each slice holds 1024 sets . The set to which a line belongs is picked by a hash of the line’s physical address. Each set now contains 16 slots: the slices are individually 16 way set-associative 11 . The lines are 128 bytes in size, the same as in L1.

The line is not present in L2, since we’ve not fetched it before This is perhaps artistic license: loading the b vector across from host memory over PCIe might have cached it in L2. But then we couldn't continue down to DRAM! . Each slice falls through to one of 12 memory controllers — 3 slices per controller. Each memory controller’s job is to speak to a single GDDR6X DRAM chip 12 . Our request gets handed over to that controller.

What does this cost

An L2 hit costs about 127 ns — some 330 cycles. Each SM can hand the crossbar up to two line-requests per cycle, and the 36 slices serve independently. The exit-port counter is l1tex__m_l1tex2xbar_req_cycles_active .

Found in DRAM

The memory controller’s job is to load the data from its 2 GiB DRAM chip. It does so by issuing commands to DRAM over a bus.

The DRAM is divided into two separate buses the controller drives independently, called channels . On each channel sit 16 banks : two-dimensional arrays of memory cells. A bank consists of 65,536 rows . The hardware can open one row at a time (an activate , expensive), and then return any 32-byte columns from that row (a read , cheap while the row is open).

GDDR6X

channel 0 · 1 GiB channel 1 · 1 GiB one bank · 65,536 rows of 1 KiB one row · 1 KiB · 32 columns of 32 B

The address is taken apart one last time, to match this memory structure. It picks out a channel, a bank, a row, and a column. Our four sectors are four columns of one row 13 .

So, to serve our load, the memory controller must first send one activate , and then four read s 14 .

What does a DRAM chip do in response to those commands?

Each DRAM cell is one capacitor behind one transistor. The transistors of a row share a wordline , attached to their gates. Each transistor sits between its capacitor and a bitline , which runs along a column, providing a path from each cell (shared with the cells of other rows) to the sense amplifiers . Bits are stored in the charge state of the capacitor. The capacitors constantly leak charge, so the chip has to pause each bank now and then to top them up.

The structure of DRAM. Click a row to act as the row decoder, releasing charge from the capacitors onto the bitline and into the row buffer.

bitline row decoder wordline

The activate command triggers the row decoder to drive that row’s wordline, opening the row’s transistors and driving the charge from the capacitors in that row (and only that row) through the bitline into the sense amplifiers, which amplify that charge into full-rail bits and hold them for the controller to read.

When the read is issued, its column address picks out 256 of these row bits. Reading from the sense amplifiers gives us very many bits at once, but we need to serialize them onto the pins that drive data back across the bus. There are 16 data pins per channel. The 256 bits of our read leave on these pins as PAM4 GDDR6X is the GDDR6 standard, with this PAM4 signalling added. symbols: each symbol is one of four voltage levels, carrying two bits, so 256 bits over 16 pins is 16 bits per pin — eight symbols. The clock is sent along a shared wire so that the controller can sample at the right edges.

The way back

These PAM4 bursts are deserialized in the memory controller, and written into the L2 slice’s line. The results run back through the crossbar, back to their SM, and fill their L1 slot. They rendezvous with the record left by their leaving, and their bytes are written into register R4 across all the lanes.

When the load was issued, a dependency barrier was set, which this register write clears. The warp becomes eligible again, and on the scheduler’s next cycle it wins the arbitration. The instruction it issues is the add that was waiting on b[i] .

The round trip — L1, TLB, crossbar, L2, controller, and back — costs about 255 ns, some 660 cycles. All the while our warp was parked on its barrier. The rest of the chip wasn’t idle though. The sub-partition issued the same loads for another 11 warps, the rest of the SM for another 36, the other SMs for the other 6096. The result is a cacophony of loads, the per-load latency of any one of them lost in the noise. Here’s what that looks like:

A timing-proportional simulation of the execution of only the instructions in the vadd kernel that correspond to the load of b . Each SM loads only those addresses it loads in the real kernel: those addresses light up (and miss) in the correct L1 set, then are routed through the crossbar to the correct L2 slice, where they miss, falling through a correctly contended memory controller to a simulated DRAM bank, before returning back through L2, back through L1, and returning their results into the correct register.

SMs (128), one pixel per L1 set

crossbar

L2 (36 slices, 3 per controller), one pixel per set

memory controllers (level is instantaneous throughput)

GDDR6X, 12 chips, 32 banks

activate row open precharge refresh

in flight 0 retired 0 activates 0 refreshes 0 GB/s 0

Appendix: the probes

Setup

All measurements are on one RTX 4090 ( sm_89 ), with the core clock locked at 2.6 GHz. Cycles come from measured nanoseconds at that frequency. Two main instruments:

A latency chase. To get a latency measurement (especially when that latency changing tells you something about the chip), we run a pointer cycle through a chosen set of lines, hopped 20,000 times, and then measure the mean ns per hop. If the lines we point to fit in a cache level, then they stay resident, and the mean is that level’s hit latency. Because of the steepness of the hierarchy, any loads that overflow to the next level down tend to show up strongly in the average. ld.global.ca ( LDG.E…STRONG.SM ) for chases at the L1, ld.global.cg ( LDG.E…STRONG.GPU ) goes past L1. Hit latencies are 15.4 ns at the L1, 127.4 ns at the L2, and 255.4 ns at DRAM.

Hardware counters. To read ncu ’s counters reliably you have to take them as slopes over iteration count so fixed overhead cancels. Sector and request counters at the L1 exit port and the L2 side are used to figure out more about the shape of the requests, and a per-slice sector counter helps to give us the L2 slice measurements.

The L1 set function

The 8 bits of the L1 index are the XOR of a fixed subset of the address bits. Written as a bitmask over the address, one basis for those subsets is:

bit mask bit mask
0 0xc3901e00 4 0x47810400
1 0x119a80a00 5 0x1b4e09180
2 0x167041b00 6 0xb6405400
3 0xdbc21d80 7 0xdc202c80

The masks themselves aren’t unique — any invertible combination of these eight describes the same partition.

Page tables and the TLB

The 16-entry TLB is only the first level, but what happens when you miss? A miss refills in about 4.4 ns, and an L2 hit is 127 ns and a VRAM access is 255 ns, so we can’t be going from those. The inference is that it comes from some larger on-chip translation cache.

The cost is flat within 0.1 ns for all the pages the chip can map, and from any SM. More evidence: walking the page tables with nvdebug shows the volatile bit set on every directory entry, so they’re not cached in the normal hierarchy.

The L2 slice function

Measuring which slice owns a line is pretty hard. The L2 is physically indexed, so the probe has to work in device-physical addresses from the page-table walk. Nsight Compute does have a per-slice sector counter, but reports only the min, max, average, and sum across the 36 instances, never the actual slice index.

Even so, the aggregate is enough to tell whether two addresses share a slice. If the two addresses live on the same slice, after loading both, the max counter reports 2, if they’re on different slices the max is 1. You can use this probe to get a representative address that lands on each of the 36 slices.

With the 36 representatives in hand, you can get any new candidate’s slice. If you read the candidate many times alongside all 36, with each of the different addresses read a distinct number of times (say 20001, 20002, … times), the sum of the candidate’s read count and only one of the representatives will match the max counter, and you can figure the slice by inference.

From that, you can produce a table of many physical address-slice pairs. The hard part is going from such a table to a physically plausible function. One tool that helped us a bit was running the same kinds of experiments on two different chips built on the same die: the 4090, and the L40S, which has an extra slice per memory controller.

Here’s one Claude made earlier It's hard to be sure what's actually in the hardware here, but this is plausible given my limited knowledge. The priors: there's got to be some shared silicon between the L40S and the 4090 (assuming NVIDIA don't ship two completely different functional paths for chips on the same layout but with different amounts of L2 fused off). And the function has to be simple-ish in hardware, i.e. XORs, arithmetic etc. are fair game, but if Claude tries to put in a 4096 entry lookup table you tell it to go try harder. :

SHIFT, OFFSET = (5, 0, 1), (1, 0, 0)

def parity(x):
    return bin(x).count("1") & 1

def _state(a, N):
    wide = (N == 48)                             # L40S: 4 slices/controller, and it reaches bit 35
    b35 = (1 << 35) if wide else 0

    # stage 1 — which of the 12 controllers: two parities and a mod-3 digit
    P1c = parity(a & 0x76A990400)                # controller parity 1 (narrow; used on both chips)
    P1  = parity(a & (0x76A990400 ^ b35))        # wide form, only needed for the L40S read-out
    P2  = parity(a & 0x2CCF7B000)                # controller parity 2
    A   = ((a >> 15) + 2*parity(a & 0x3C9041000) + parity(a & (0x2882B0800 ^ b35)) + 2) % 3  # mod-3 digit: (a>>15) + 2 corrections

    # stage 2 — which slice inside the controller: a 9-position cyclic counter
    g   = ((a + (1 << 16)) >> 17) % 9            # the counter value, round(a / 2^17) mod 9
    q0  = parity(a & 0x8000)                     # four correction parities
    q1  = parity(a & 0x5985E0500)
    q2  = parity(a & (0x2354E4400 ^ b35))
    q3  = parity(a & 0x3C9041000)
    carry = 1 if q0 + q1 + q2 >= 2 else 0        # q0,q1,q2 as a full adder: the carry (majority)...
    start = (5 + 7*q0 + 5*q1 + 2*q2 + q3 - carry) % 9   # ...sets where the counter starts
    o     = (g - SHIFT[A] - start) % 9           # position within the 9-cycle
    Lf    = 2 if (q0 ^ q1 ^ q2) == 0 else 1      # ...and their XOR sets where it splits
    return P1c, P1, P2, A, q2, o // 3, (1 if (o % 3) >= Lf else 0)   # d = o // 3, u = the split bit

def slice_of(a, N=36):
    P1c, P1, P2, A, q2, d, u = _state(a, N)
    controller = (2*P1c + P2) * 3 + A            # 0..11
    if N == 36:                                  # 4090: 3 slices live, read (d, u) as three arcs of Z/9
        base = 2 if d == 0 else (1 if (d == 1 and u == 0) else 0)
        B = ((1 - base) % 3 if q2 else base) % 3 # q2 flips the arc order
        B = (B + OFFSET[A]) % 3                   # per-controller offset
        return controller * 3 + B
    if N == 48:                                  # L40S: 4 slices live, read u as two index bits
        i0, i1 = P1 ^ q2 ^ u, P1 ^ P2 ^ u
        return controller * 4 + 2*i0 + i1
    raise ValueError("N must be 36 or 48")

Whilst it is very hard to find such a function, it’s very easy to tell if you’ve found one that works. Drawing 8,192 L2-resident lines from exactly k predicted slices:

lines drawn from Mload/s vs k =1
1 predicted slice 1,957 1.00×
2 3,917 2.00×
4 7,826 4.00×
9 17,582 8.98×
18 34,446 17.60×
all 36 68,085 34.78×

The L2 set index and geometry

Once the slice function pins addresses to a single slice, you can do the same eviction-set archaeology on that slice, to figure out the structure, which tells you that it’s 16 way set-associative (a chase with 17 elements thrashes, but one with 16 doesn’t).

The set index within a slice is the same kind of parity function as the L1’s — ten bits, with the same (a >> 15) mod 9 nonlinearity in the top bit. Unfortunately, the masks involved differ depending on the slice. For one slice:

def parity(x):
    return bin(x).count("1") & 1

def set_index(a):                                # within one slice
    q = a // 1152
    b0 = parity(a & 0x0bd654c80) ^ parity(q & 0x00e500)
    b1 = parity(a & 0x0bd654c80) ^ parity(q & 0x010000)
    b2 = parity(a & 0x07aed8b80) ^ parity(q & 0x027c00)
    b3 = parity(a & 0x03e313180) ^ parity(q & 0x045500)
    b4 = parity(a & 0x03e313300) ^ parity(q & 0x080300)
    b5 = parity(a & 0x0bd654e80) ^ parity(q & 0x104200)
    b6 = parity(a & 0x0bd654c00) ^ parity(q & 0x200b00)
    b7 = parity(a & 0x044dcb880) ^ parity(q & 0x401600)
    b8 = parity(a & 0x000000200) ^ parity(q & 0x804600)
    b9 = parity(a & 0x13bc21180) ^ parity(q & 0x006400) ^ int((a >> 15) % 9 in (2, 6))
    return sum(b << i for i, b in enumerate([b0, b1, b2, b3, b4, b5, b6, b7, b8, b9]))

It has some properties that let you sense-check it. For example: a contiguous 72MiB fills each slot in each slice without thrashing anything, as you’d expect.

DRAM refresh

DRAM cells leak charge and so have to be periodically refreshed, which makes some kinds of timing probes harder. You can see it by running a dependent chase that writes each hop’s timing into shared memory. Most DRAM accesses come back at the usual latency, but a small share take longer, spread evenly out to a hard ceiling about 210 ns higher than usual. An evenly spaced run like that is the signature of a fixed length stall. The stall is ~210 ns. About 2% of accesses hit one. It doesn’t hit the whole chip at once — it’s more local than that — but I couldn’t tell what the unit was.

  1. You can get some visibility here from the hardware counters. We set up a one-warp kernel that loads 4 bytes per lane with a fixed stride. If you run it under ncu , it reports ‘sectors per load’ as l1tex__average_t_sectors_per_request_pipe_lsu_mem_global_op_ld.ratio . At stride 1 the 32 lanes cover 128 contiguous bytes and the counter reads four sectors. At every wider stride the count equals the number of distinct 32-byte spans the lane addresses touch, with no extra sectors requested.

  2. To count the slots in a set, we take a pool of candidate lines much larger than the L1 cache and pointer-chase them in a cycle. By design, the pool doesn’t fit in L1, so each line thrashes, and the latency stays > L1 latency. Then you progressively drop members, and watch the latency. If the latency suddenly drops, you know that somewhere in your pool there is one full set (since it doesn’t thrash). The goal is to find the minimal set such that everything thrashes, where removing any address drops you to L1 access speeds. This is the standard process of finding eviction sets .

  3. Caches can be indexed & tagged either virtually or physically. This L1 uses the virtual address for both its index and its tag. You can see this by mapping one physical allocation at two virtual addresses, in the minimal conflict set we built to identify the number of ways. Swapping one member of a minimal conflict set for the same physical line seen through the other mapping breaks the conflict, so the index must be computed from virtual bits (if it was physically addressed, they’d deduplicate). Adding the alias back to a full set restores the conflict, so the alias occupies a slot of its own and the tag is virtual too.

  4. Each of the eight index bits is the exclusive-or of a fixed subset of the address bits. The masks defining these subsets are in the appendix . Figuring out these masks takes two probes. Inside one 2 MiB page, the differences between members of minimal conflict sets fix the masks over address bits 7 to 20. Above the page, flipping one high address bit and reading which set the line lands in gives that bit’s contribution, for every bit from 21 to 32. You can check if you’ve got the right function by using it to construct eviction sets manually (since you know what addresses go in what sets).

  5. A slot can hold a line with only some of its sectors present. When a load misses, the request sent on to the L2 names only the sectors the warp wants. ncu ’s L2-side counters show the sector count per request tracking exactly what the lanes touch, with no rounding up to the full line. The counters are lts__t_requests_srcunit_tex_op_read and its t_sectors counterpart.

  6. To figure out that the L2 is physically tagged and indexed: we map one physical allocation at two virtual addresses, and a chase visits every line in the allocation through both virtual indexes. If the L2 tagged lines by virtual address, the aliased chase would occupy twice the footprint and exceed the L2’s 72 MiB capacity edge at half the size (this is a tradeoff for any virtually addressed cache: that you get no deduplication. Also vulnerable to timing attacks w/ multitenancy, not a factor here). Sweeping the physical footprint from 24 to 128 MiB, the control and the aliased chase cross the L2 threshold at the same size, so translation must happen before L2.

  7. You can read GPU page tables directly, using a tool like nvdebug that walks the GPU’s page tables from the host. Every device allocator terminates in a 2 MiB page-table entry, with the 4 KiB table beside it invalid. That covers cudaMalloc , cuMemAlloc , the virtual-memory API at either granularity, and managed memory. Pinned host memory is the exception, with 4 KiB entries in the system aperture. The walker is in the appendix . In the open kernel modules, the mapping path is dmaAllocMapping , which calls dmaUpdateVASpace and then mmuWalkMap to fill the entries. The walker allocates each page-table level the first time a mapping needs it.

  8. The TLB is fully associative, holds sixteen entries, is per-SM (shared by the warps), and replaces the least recently used entry. You can find this out with yet another pointer chase, this time, one line per 2 MiB page. Sixteen pages cost a 127 ns baseline — the L2 hit latency, since the chase bypasses L1 — but seventeen thrash. Splitting the pages among the warps of one block gives the same step, so the pool is per-SM and shared by its warps. Cyclic visits over seventeen pages miss on every hop, which is the LRU pattern. The tables are in the appendix .

  9. Same logic for figuring out the L1 request from the counters, only using the L2 counters.

  10. In the function, two address parities and a mod-3 digit are used to pick out the memory controller, which is shared between 4 slices in the full AD102, but only 3 on the 4090, which fuses off one slice per controller. Within those three, a mod-9 digit picks the specific slice. The card has twelve controllers (a 384-bit bus, 12 × 32-bit). The function was recovered by measurement; details in the appendix . You can tell once you’ve got it right, because loading from a set of pointers that share a slice is ~36x (the number of slices) slower than a load from pointers that spread across all the slices.

  11. Once you figure out the function mapping specific addresses to specific slices, you can do the cache archaeology in the same way we did it for L1, using eviction sets, with the caveat that you can only use addresses that map to a single slice. More in the appendix .

  12. The count of twelve controllers is public (it’s a 384-bit bus at 32 bits per chip). The association of slices to controllers is read out of the slice function. Three of its digits take twelve values, and the same three digits appear unchanged on the L40S, which ships the same silicon with all four slices per controller enabled. The factoring is in the appendix .

  13. You can measure the row size from timing. Because a DRAM chip is much faster at serving loads that sit in the same row (since a pair of addresses in different rows require closing the row buffer, + activating the new one), if you assume that rows are contiguous, you can find row size by sweeping. Offsets of 32, 64 and 96 bytes always stay within one row, so our four sectors are four columns of one row. With the same instrument, you can figure out the set of addresses that share a row: any difference in 2 5 2^5 , 2 6 2^6 , 2 7 2^7 , 2 9 2^9 and 2 8 2 14 2^8 \oplus 2^{14} preserves a row, so the row is 1 KiB, or 32 columns of 32 bytes.

  14. You can measure the cost of activating a new row by keeping many reads in flight. When consecutive reads land in the same row, each extra read adds about 3.4 ns. When each read opens a fresh row, it costs about 15x as much. With one read in flight at a time the difference disappears, because the row is closed again before the next read arrives.

Businesses Go Viral for Making Signs Without AI

403 Media
www.404media.co
2026-08-27 10:34:03
In the wake of the ChatGPT flyer pandemic, some businesses are differentiating themselves by making signs the old school way....
Original Article

In July, we wrote about the ‘ChatGPT flyer pandemic ,’ in which, as you’ve surely seen, businesses everywhere are advertising themselves and their products with AI-generated posters that all look the same. Surf lesson coaches; guitar stores; bars; so many takeout places. They’re all doing it. And all the posters suck ass.

Naturally, a new meta is emerging, where some businesses and organizations are now holding up crudely drawn signs saying they’ll never use AI, or fuck AI, or various things like this. And people absolutely love it: some of these posts have tens of thousands of likes.

“I would rather your event flyer look like this than see more AI slop,” one flyer posted to Instagram , written in pencil on a page of lined paper, reads. It then shows a couple of stick fingers smiling, with the text “I will come to this event.”

Another Instagram post has a couple of people from a bar holding a clip board. The hand-written note in one picture says, “We will NOT be using any AI post to promote the following…” Other pictures then ask people to apply for job vacancies at the bar.

A library posted a very similar message on a piece of cardboard, that reads, “We will not be using AI to create content.”

A cafe posted a series of photos on Instagram of someone holding a paper sign that says, “We will not be using any AI posters to promote ourselves. Instead I will be using this paper and marker pen.” One of the photos adds, “the pancakes are really really GOOD!”

“I hear ya’ll hate AI flyers! So here I am doing hair,” a hand-written sign from a stylist reads , complete with a picture of someone working on another’s hair.

Rachel Karten, writer of the Link In Bio newsletter, posted some other examples 404 Media came across as well.

This trend will probably go stale fast. But, hey, jump on it while you can.

About the author

Joseph is an award-winning investigative journalist focused on generating impact. His work has triggered hundreds of millions of dollars worth of fines, shut down tech companies, and much more.

Joseph Cox

French CII's Mitra-15 in SIMH. Work in Progress

Hacker News
github.com
2026-08-27 10:27:57
Comments...
Original Article
image https://ajovomultja.hu/mitra-15

A Mitra-15 Simulator for SIMH

This is a preliminary version. For now, my code compiles, but it is still not a true Mitra-15 simulator; rather, it is a tentative effort. Many thanks to Pascal Chour for the very useful documentation available on his website: https://www.pascalchour.fr/ressources/cii/mitra15.htm

As my C is rusty (pun is intended) I started with an existing SDS 940 simulator for SIMH and slowly modified it towards Mitra-15's characteristics.

The Mitra-15 is a microcomputer that features interesting concepts, such as the ability to program input/output peripherals using microcode, instead of using an external mechanism such as DMA. https://en.wikipedia.org/wiki/Mitra_15

The Mitra-15 was a 16-bit minicomputer developed by CII (Compagnie Internationale pour l'Informatique) in the early 1970s. It was widely used in industrial automation, scientific computing, education, and military applications. I never programmed on Mitra-15, but I learned CS on a CII 10070 and later I worked at France Telecom which had telephone exchanges piloted with the Mitra family.

Although it was once widespread in France, very little software and documentation has survived. This project contributes to the preservation of this important part of computing history.

This Mitra-15 simulator is intended to eventually include:

- System and optional instructions
- Extensive comments describing the original hardware behavior
- SIMH console support
- Memory management
- Interrupt, fast interrupt, suspensions and trap systems
* printer
* analogic interface
* punched_tape
* DRI fixed disk
* sagem fixed disk
* card reader
* magnetic tape reader
- Various I/O devices, but I lack documentation for many of those peripherals:
* asynchronous channels 
* synchronous channels 
* fast channel multiplexed
* fast channel ADM (no idea what it is)
* IOPs (if it's not the same as asynchronous channels).

To this day I did:

  • search for and analyzed the few remaining documents (see /doc folder).
  • create a working SIMH environment for SIMH (deposit/examine/run/break/etc)
  • create a complete instruction decoder for each instruction and addressing mode
  • create code for common Mitra and CII devices
  • create a convincing (not tested) code for RD and WD instructions for simple communication with devices such as ASR33 or line printer.
  • create a convincing (not tested) code for DRI disks (UK's Data Recording Instrument) that uses the suspension system, the CII invention that aims at a similar goal as modern DMA.
  • create a test program.
  • test the branch instructions in RP (immediate in modern parlance) addressing mode, so at least this part should be correct.
  • I have also set out to reconstruct CII's MTR (Real-Time Monitor) from a hexadecimal dump found in a PDF file; however, as the OCR output is abysmal, I have to visually verify every single byte. This will likely be the only piece of original CII code against which my simulator is tested, as everything else will have to be inferred from the documentation. It is therefore crucial that this test be successful.
  • It's not useful but I have also created a rudimentary assembler (not tested).

On the long term I have plans to port RSX280 (RSX-11 clone) to the Mitra. Z80's BC and DE are similar to L and G registers, IX is an index register as Mitra's X, A and HL resemble to A and E. Main problems: Mitra has less registers, less addressing modes than the Z80, and it lacks a concept of a stack, which makes managing reentrancy complicated.

Requirements

  • GCC or Clang
  • Make
  • Linux (tested)
  • A recent version of openSIMH

Within the SIMH monitor, you can then load memory, examine registers, and execute Mitra-15 programs.

Acknowledgments

Many thanks to:

The Teaser Period: Why the AI Boom Is Hitting a Reset Wall

Hacker News
www.groundbrkr.com
2026-08-27 10:27:39
Comments...
Original Article

Nothing looked wrong in the summer of 2006. Home prices had risen for the better part of a decade. Delinquencies were near historic lows. Credit spreads were tight, the ratings held, and the securitization machine hummed. If you had asked a hundred people on a trading desk whether the American mortgage market was months from seizing, most would have laughed.

Millions of subprime borrowers were, at that moment, paying the low introductory rate on a two-year adjustable rate mortgage - the 2/28 ARM. A low fixed-rate for two years, then the rate reset to a payment 30% to 50% higher. During those first two years the loan performed beautifully: the borrower paid, the servicer collected, and the bond paid its coupon. Nothing looked wrong because the whole complex - housing, mortgages, securitization - was sitting inside the teaser period.

Every ARM reset was known, dated, and contractually inevitable from the moment of origination. Aggregate those reset schedules and you get the most damning exhibit of the era: the reset wall. Roughly a trillion dollars of adjustable-rate mortgages were contractually set to reset across 2007 and 2008 - thirty to forty billion dollars a month at the peak. Credit Suisse published the chart in March 2007. The IMF reprinted it. It circulated on every trading floor in New York and London.

The mortgage reset wall. Every teaser written in the boom became a dated liability

Few understood it. Paulson & Co. laid out the arithmetic that same month in a comment letter to the FDIC: Over 80% of recent subprime originations, it observed, were two- or three-year adjustable-rate products. The average subprime borrower’s mortgage payments already consumed roughly 40% of their gross income at the teaser rate . Almost none of them could service the reset rate out of income.

The crisis, in other words, was written in advance by the instruments themselves. The market looked at the reset wall and kept buying, because every participant believed the exit would arrive before the reset: home prices would keep appreciating and the borrower would refinance into a fresh teaser before the old one expired.

We have spent the last eighteen years describing the financial crisis as a shock - a black swan, a hundred-year flood, a tail event. It was none of those things. Every reset on that chart was contractually inevitable from the moment of origination. The defaults were not primarily caused by an exogenous macro shock, a spike in unemployment, or a recession that arrived first. They were the scheduled mathematical consequence of loans that assumed perpetual appreciation. The mortgages were built to break.

The AI boom has rebuilt this exact structure, and the market is once again underwriting the teaser.

It has a reset wall of its own - a schedule of dated, contractual, non-negotiable payment shocks - hiding inside the trillions of dollars of compute contracts signed by OpenAI and other frontier labs since 2024.

The take-or-pay compute contract - the instrument at the center of the AI build-out - has a structural feature that almost no one prices: its payments do not begin at signing. They begin at delivery . A lab signs a multi-year capacity commitment today, but the payments do not start until the data center is energized, the capacity is accepted, and the contractual ramp schedule commences - an interval set not by finance, but by construction: siting, powering, and filling a gigawatt-scale campus takes 24-to-36 months from signature - mirroring the two-to-three-year teaser of a subprime ARM.

More than $2.3 trillion of compute contracts now sit on the books of the four largest American cloud providers as remaining performance obligations and contracted backlog - signed, celebrated, capitalized into equity prices, and, critically, not yet billing.

During the teaser period, everyone wins. The seller reports backlog growth that compounds at rates no operating business has ever sustained - Oracle’s RPO grew 363% in a single fiscal year. The buyer - a frontier lab burning cash at historic rates - books no expense because the capacity does not yet exist. The market capitalizes the booked number as if it were revenue and ignores the billed number as if it were a technicality. And then, on a schedule fixed at signing, booked compute becomes billed compute . The take-or-pay clock starts. From that day forward, the frontier labs and the hyperscalers incur those costs regardless of utilization . The invoice is a function of the contract, not of demand. That is the reset.

The parallel to 2006 is exact and it explains the single most-cited absurdity of this cycle: How does OpenAI, a company with some $40 billion of run-rate revenue, sign $1.4 trillion of compute commitments? The same way a household with $60,000 of income signed a $600,000 mortgage: because the terms at signing do not require the payment yet, and because everyone at the table - borrower, lender, and the market - believes the growth will arrive before the payment does.

The 2/28 borrower’s defense was always the same: by the time the reset arrives, my house will be worth more and I will refinance. The frontier lab’s defense is structurally identical: by the time the capacity commences, my revenue will have grown into the obligation.

The compute commencement wall can be made visible in exactly the way the reset wall was visible in 2007 - from disclosed contracts and delivery schedules. The only question is whether the market listens this time

To see why the structure behaves the way it does, I’ll break down a single contract and walk the lifecycle. The terms below are hypothetical; the architecture is the standard one visible across the disclosed OpenAI–Oracle, Anthropic–Google, Meta–CoreWeave, and OpenAI–CoreWeave arrangements.

A frontier lab signs a $12 billion, ten-year capacity commitment with a compute provider. The contract is take-or-pay, meaning the lab commits to payments once the capacity is delivered, and delivery requires a campus that does not yet exist: two years of construction, procurement, and power work stand between signature and completion.

Now look at what each party’s financial statements show during the two-year teaser.

The seller - a hyperscaler or neocloud - books the arrangement into RPO or contracted backlog on day one - the full $12 billion, disclosed, quoted, and celebrated. The market values it as contractual future revenue. Meanwhile the seller’s cash flow statement hemorrhages: the campus is being built, so capex runs far ahead of receipts. Booked backlog rises; reported earnings feel none of the buildout; financing frequently sits off-balance sheet.

The buyer - a frontier lab like OpenAI or Anthropic - announces access to the compute it needs to pursue its scaling roadmap, and its private valuation reprices on the announcement. The commitment is a future obligation, disclosed - if at all - deep in a contractual-obligations footnote or, for the private labs, nowhere public. No expense hits the P&L because no service is being received. A lab that has committed tens of billions across multiple providers carries a cost structure that reflects only its commenced capacity.

The market sees a seller with explosive backlog and a buyer with secured compute capacity, and prices both as growth stories. Nobody is lying. Every number is GAAP-clean. The structure simply guarantees that during the teaser period, the system ’s reported economics and its committed economics diverge by the full value of everything signed and not yet commenced.

Every optical incentive points toward signing more.

Then comes commencement, and the two clocks converge violently. The buyer’s cash obligation steps from approximately zero to the full contractual rate, arriving not gradually but as a step function, tranche by tranche as capacity goes live. The seller begins recognizing revenue, which the market applauds, while backlog begins draining. And here is the asymmetry on which the entire thesis turns: the buyer’s obligation steps up on the construction schedule, regardless of the revenue or utilization that shows up.

The parallel is now clear: the 2/28’s teaser is the construction phase, its reset date is commencement, its fully-indexed payment is the full take-or-pay rate, and its refinance-or-sell assumption is the belief that model revenue will have grown into the obligation by the time it bills - or that another round of fundraising will cover it.

The take-or-pay compute contract is the financing innovation of this cycle the way the 2/28 was the financing innovation of the last one, and it emerged for the same reason: an asset too expensive for its natural buyer had to be made buyable. A frontier lab cannot fund a gigawatt campus out of revenue, just as a subprime borrower could not fund a house at the fully-indexed rate. In both cases the solution was an instrument that splits time in two - a cheap phase that gets the deal signed, and an expensive phase scheduled far enough out that the market ignores it.

In residential credit, the interval between origination boom and reset wall was twenty-four months, because that was the teaser’s term. In compute, the interval is the construction timeline - twenty-four to thirty-six months. The 2025–26 signing boom therefore mathematically guarantees a 2027–28 commencement boom, exactly as 2005–06 originations guaranteed 2007–08 resets.

This is what it means to say we are in the teaser period. The booked figure is enormous; the billed figure is a fraction of it and only beginning to turn up. Everything about the present looks like strength. The obligations that will govern 2027 and 2028 are already signed, already dated, and already sitting in RPO. What has not happened yet is the conversion - the moment booked becomes billed and the take-or-pay clock starts running regardless of the revenue and the counterparty’s ability to pay.

The common objection to the 2008 comparison is simple: this is not 2008 because the leverage is not there.

The leverage is there. It’s simply not booked as leverage.

A take-or-pay contract is, in economic substance, a lease. And a lease is a financing. The defining feature of debt is a fixed payment on a schedule, owed regardless of the borrower’s circumstances. That is exactly what a take-or-pay commitment is. The payment does not flex with utilization. It does not wait for the customer’s revenue. It is owed on the commencement date and every period thereafter, for the term.

This is not a new concept. Rating agencies have treated take-or-pay obligations as imputed debt for more than thirty years - pipeline throughput agreements, ship-or-pay contracts in shipping and rail, long-term power purchase agreements, all routinely capitalized into leverage metrics by Moody’s and S&P. The convention simply has not been applied to compute.

Reported gross debt across the AI complex - the frontier labs, the hyperscalers, and the listed neoclouds - comes to roughly $470bn. The present value of disclosed non-cancellable compute and capacity commitments across the same set comes to roughly $1.66 trillion. The economic obligation is $2.1 trillion. For scale, subprime mortgages outstanding in March 2007 totaled roughly $1.3 trillion.

Three mechanisms keep these contracts off the reported balance sheet.

The first is disclosure asymmetry : remaining performance obligations are a seller-side disclosure under the revenue-recognition standard - the vendor tells you what it has been promised - and there is no symmetric requirement for the buyer to tell you what it has promised.

The second is that the largest buyers are private : OpenAI and Anthropic file no periodic reports, and their obligations enter the public record only when a counterparty announces a deal or books the corresponding receivable.

The third is that the contracts are generally structured as service agreements rather than leases - precisely the maneuver that kept operating leases off balance sheets before the standard changed.

The leverage objection, then, depends entirely on where you look. Look at the line marked debt , and there is relatively little of it. Look at the contractual claims on future cash, and there is more than the entire subprime mortgage market carried at its peak.

So the leverage exists. The question that follows is who owes it and whether they can pay it.

As of the second quarter of 2026, the four largest U.S. cloud providers carry roughly $2.3 trillion in contracted revenue backlog. Roughly $1.0 trillion of that total traces to two counterparties - OpenAI and Anthropic.

Both of those counterparties run deeply negative free cash flow and fund themselves through equity raises and vendor-adjacent financing from the same ecosystem whose capacity they are contracting. The single most important credit fact in the global economy right now fits in one sentence: the largest capital cycle in the history of technology is underwritten, to the tune of roughly one trillion dollars, by two private companies that do not make money.

Now contrast this with the cloud build-out of the previous decade. In the 2010s, bookings and billings tracked each other closely. Capacity was added a step ahead of demand that was already visible. Today backlog-to-revenue multiples across the complex now sit at five to six times the pre-AI software norm - with the vast majority of contracts being take-or-pay contracts signed in 2025-2026 and commencing in 2027-2028.

The multi-year commitments dominating these backlogs are underwritten not by observed demand but by a forecast of demand - a belief about how large and how soon the AI economy comes. RPO has quietly been recast from a risk disclosure into the bull case: “look at all that contracted revenue.” But a backlog is not revenue. It is a promise to pay, and it is worth exactly what the party on the other side can actually pay when the promise converts from booked to billed.

So, as the cloud era transitioned to the AI compute era:

1. Consumption on existing capacity became commitment on unbuilt capacity. The revenue-recognition lag went from one to two quarters to two to three years .

2. Variable service agreements became fixed and contractual. Pay-as-you-go , a flexible operating expense of the cloud era, became take-or-pay , a non-cancellable lease structure that the market has not fully priced as debt.

3. A diversified book became a concentrated one. The cloud-era backlog was tens of thousands of enterprise customers. Today more than half comes from two unprofitable companies.

And, 4. The collateral changed. This one will look obvious in hindsight. In the cloud era, backlog was underwritten to the customer’s operating business. A Fortune 500 firm signing a three-year cloud commitment was going to pay it out of an existing profit stream. In the compute era, backlog is underwritten to the customer’s future funding. It is not credit against cash flow. It is credit against the capital markets staying open - which is exactly the expectation of the 2/28.

“But the hyperscalers have 30%+ ROI!”

The ROI the market is capitalizing is not paid by the hyperscalers’ own operations in any self-sustaining sense. It is paid by the counterparties - by OpenAI and Anthropic and the other labs whose take-or-pay commitments are the revenue line under every one of these returns. The hyperscaler’s return on invested capital is only as real as the labs’ ability to make the payments that constitute it.

When commencement arrives, the payment that pays the ROI becomes a payment the counterparty owes regardless of its own demand. If that counterparty’s revenue has grown into the obligation, the return persists and the bulls were right. If it has not, the return does not gently compress - it inverts, because the same take-or-pay contract that was the hyperscaler’s asset is now a claim on a borrower who cannot cover it. It’s credit risk that looks like an operating return.

OpenAI carries the largest compute commitments in the system against a revenue base that is a fraction of those commitments, with no parental balance sheet standing behind the obligation. It signed the most, owes the most, and burns the most , and its exit assumption - raise the next round before commencement, the way the subprime borrower’s was refinance before the reset - depends on a revenue curve inflecting on a schedule that has never been demonstrated at this scale.

Between June and December of 2025, OpenAI executed what may be the most concentrated origination spree in the history of corporate credit.

In less than twelve months, the company signed something close to $1.2 trillion in compute commitments. There was a stretch in October 2025, about three weeks, during which the company announced deals whose combined notional value exceeded the market capitalization of ninety-five percent of the companies in the S&P 500.

Signing was cheap and the re-rating was instantaneous. On the days the largest of these deals were announced, Oracle, Nvidia, AMD and Broadcom added a combined $636 billion of market capitalization.

Every dollar of that $1.2 trillion was signed during the steepest part of OpenAI’s revenue curve and underwritten to its continuation. And almost every one of these deals commences in 2027-2028. The signing spree should be read as an obligation event, not a sign of insatiable demand for compute.

Let us build the reset wall and let us build it the way Credit Suisse built the mortgage wall - in two views:

  • The first is a cash question: how much does the company owe, per year, as these contracts commence? This is the equivalent of Paulson & Co’s arithmetic - which was used to compare the mortgage payments to the borrower’s income.

  • The second is a concentration question: what is the total compute contract amount that resets from teaser to full pay in a single year? This is the equivalent of Credit Suisse’s 2007 reset wall - which showed the principal amounts of adjustable-rate mortgages resetting in a given year.

OpenAI’s committed annual compute cost, built bottom-up from the announced vendor contracts and reconciled to management’s own disclosed plan. The step into 2027 is the reset.

The 2007 reset wall was drawn in notional rather than annual payments - in other words, the unpaid principal balance transitioning from teaser to fully indexed. The compute equivalent is contract notional payable from the commencement date forward.

Credit Suisse could build the 2007 reset wall because securitization documents disclosed every loan’s reset date. Compute contracts are private, so the wall must be modeled - but the inputs are unusually good, because the counterparties keep announcing them publicly.

And, much like 2008, synchronized originations produces synchronized resets . Mortgage origination peaked across 2005 and 2006; the teaser was twenty-four months; the wall peaked across 2007 and 2008. Compute signing peaked across 2025 and 2026; the construction interval is twenty-four to thirty-six months; the wall peaks across 2027 and 2028. Same arithmetic, different collateral.

The mortgage-balance analogue: contract notional still payable from the commencement date forward. $712bn of it recasts to full pay across 2027–2028 for the two frontier labs alone.

Now, replicate the way Paulson & Co. measured the 2/28 borrower: compare the annual cash payment to income and determine the counterparty’s ability to meet these resets. OpenAI has no income, so in this case the comparison is against revenue. Apply four revenue paths, each anchored to the latest reported figures and to what the company itself has told investors.

Run every scenario management or the forecasters will offer - re-acceleration, the management plan, the forecaster median, a slow burn - and set each against the committed compute cost. The bottom panel is the coverage ratio: compute commitments as a share of revenue, before wages, research, sales, or tax .

Even under management’s own plan, compute alone consumes more than 200% of revenue at the 2027 peak. There is no scenario on the chart in which the frontier lab covers its compute bill out of revenue in the year the wall lands. The best case is that it grows back under the line by the end of the decade, and the best case requires the refinancing channel to stay open the entire way.

So, OpenAI’s plan for the reset is to refinance at the reset. Raise the next mega-round, at a higher valuation, to cover the obligations as they commence - exactly as the subprime borrower planned to refinance into the next loan when the teaser expired. This works while two things hold: the capital markets stay open, and the narrative stays intact.

And look at what this implies about OpenAI’s valuation as it moves toward an IPO:

OpenAI’s equity - valued north of $850 billion - is functionally the junior tranche of a capital structure whose senior claims, the take-or-pay compute obligations, exceed any revenue path management itself has articulated.

On those numbers, the equity is effectively underwater, and the market has not priced it that way because it still treats those obligations as service agreements rather than what they are economically: debt .

Even if OpenAI can meet those obligations, OpenAI’s unaudited financial statements - as of March 31, 2026 - disclose $665 billion in non-cancellable compute commitments (management’s more recent plan runs to $750 billion). These commitments are take-or-pay in structure - which, as established above, is debt.

Carry the net present value of those obligations as senior debt - roughly $450–500 billion, the same methodology rating agencies have used for decades to capitalize take-or-pay contracts as debt - and a company the market prices as debt-free carries a senior claim worth more than half its entire equity value.

This article is 100% free to read, so please share it to pay it forward. Thanks!

Share

The labs' answer is the 2/28 borrower's answer: revenue is compounding at triple digits, and by commencement it will cover the payment. It might. The credit point is narrower: the revenue coverage claim is a projection , while the obligation is a certainty .

The claim is not that commencement causes a lab to fail. It is that commencement is the date on which a pre-existing mismatch - fixed obligation against assumed revenue - becomes cash-due, and that, as in 2008, the mismatch is visible in the fundamentals well before the date makes it unavoidable. You do not need demand to fall. You need it only to decelerate below the rate the booked compute was underwritten to.

The compute contracts commencing in 2025 and early 2026 cleared, or very nearly cleared, the required growth rate. This is the crucial point, and it is the reason there is no alarm anywhere in the system: the early vintages worked.

They worked the way the 2005 and 2006 subprime resets worked. The collateral appreciated fast enough. The refinancing happened. Everyone who signed was vindicated, and vindication is the input to the next round of underwriting. Success in the early vintages is the mechanism that manufactures the late ones.

For committed compute merely to equal revenue in 2027 - not to be comfortably covered, simply to reach parity, before a single dollar is spent on wages, research, sales, or tax - revenue would have to compound at 217% annually off the 2025 base. The dashed line at 100% represents revenue doubling every single year and sustaining it, which no company at this scale of revenue has ever done for a multi-year stretch. The obligation is accelerating at more than double the rate of the best case for the cash flow meant to cover it.

The obligation curve is contractually fixed and steep - it ramps according to a defined construction timeline. The revenue curve is a growth rate. If the growth rate rolls over - the two curves cross. That is the reckoning: not a demand collapse, but a demand deceleration meeting a cost schedule that was set in a more optimistic year.

Deceleration alone is survivable if your cost base is variable. If demand growth slows from a 120% to 40%, a company with variable costs simply spends less, earns less, and adjusts. But a take-or-pay obligation is not variable. It is a fixed dollar amount that arrives on a fixed date regardless of what the demand curve did in the interim.

None of this means the company fails. It means the company must raise . Take the base case: roughly $375 billion of cumulative uncovered compute cost across 2026 to 2030, before research and development, before compensation, before every other operating cost of running a frontier laboratory. Round the all-in external funding requirement to the four-to-five-hundred-billion-dollar range across five years, and the exit assumption becomes explicit and testable:

The thesis for OpenAI requires capital markets to fund roughly half a trillion dollars of cumulative operating deficit at a single pre-profit counterparty, at non-punitive terms, through a window in which that counterparty’s compute costs are contractually rising faster than any plausible revenue path.

That may happen. But it should be named for what it is: a refinancing assumption rather than an operating plan, and one that depends on the collateral - the valuation - exactly in the period in which the true cash cost of the build becomes visible for the first time.

Construction timeline slippage can move the obligation - the 2027 peak flattens slightly, the 2028 peak rises, and total obligation is unchanged. The revenue that was supposed to grow into the 2027 obligation now has to grow into a larger 2028 one. This is exactly what happened when servicers pushed resets in 2007. Deferral was a repricing of when , not a cure.

OpenAI has been built as if the AI boom were a venture-backed, technology cycle; when in fact, it has the mechanics of a credit-driven real-estate cycle (as I outlined in The Second Derivative ). Every decision executives have made seems to be based on maximizing a single outcome: the next round. While compute commitments are in the teaser period, they are assets - secured compute capacity signaled strength and raised the next round. OpenAI is facing a day of reckoning when those commitments are delivered and, on a schedule indifferent to their revenue or next round of funding, booked compute becomes billed compute.

And time is running out - Bridgewater’s analysis shows OpenAI is burning through their latest fundraise at an extreme pace.

The comparison to Anthropic is useful as a controlled experiment. On the same measure, Anthropic’s compute commitments peak at close to 60% of revenue in 2027 then falls - fully covered by revenue with room left to pay operating costs. Undoubtedly stressed in the reset window, but structurally solvent and improving from the peak rather than grinding against it. Two labs, the same instrument, the same commencement window, and coverage ratios that differ by more than a factor of three at the peak.

While in a substantially better position, Anthropic is similarly the equity tranche of a capital structure heavily indebted by take-or-pay compute commitments, which the market has also failed to appropriately recognize as debt.

For sake of clarity, the revenue figures used in this analysis are annual revenue figures not a run rate .

The full system is larger, because the labs are only the top layer. Consolidated across frontier labs, hyperscalers and neoclouds, contract notional recasting peaks at $732 billion in 2027 and $820 billion in 2028. $2.4 trillion recasts from teaser to full pay across 2026 to 2029 , with the two-year peak in exactly the window the frontier-lab layer identified.

System-Wide Contract Notional Recasting, Consolidated.

Now, place the full stack side by side with the mortgage reset wall.

The Reset Wall, Then and Now. The whole stack on the right, consolidated and net of eliminations.

It is worth being clear about what these charts imply:

It is not a default forecast. The reset wall did not “predict” defaults in 2008 either. It only revealed the date on which the question would be asked.

It is a statement about synchronization and about arithmetic. It says: on a schedule fixed by contracts already signed, a very large volume of fixed obligations transitions from deferred to due, in a narrow window, for a set of counterparties whose ability to pay the reset depends on a revenue number that does not yet exist - it’s a projection - and whose cash flow today is reliant upon external funding.

That is exactly what the Credit Suisse chart said in 2007. It was right, and it was ignored, and it was ignored for a reason that will be entirely familiar: at the moment it was published, every loan on it was still performing.

When skeptics raised the reset schedule in 2007, the rebuttal was performance data: delinquencies are at record lows. So they were - the vintages were two years old, home prices had risen by double-digits, and the payment being performed was the teaser payment. Today’s rebuttal has the same rationale: AI revenue is compounding at triple digits; utilization is effectively full; every GPU is oversubscribed. All true. All measured during the ramp, while capacity trails demand by construction lag and the billed payments run at a fraction of the booked compute.

The frontier labs have a contractual teaser: an obligation that is signed and not billed. The hyperscalers have an accounting one: an asset that is paid for and not expensed.

Under U.S. GAAP, capital under construction sits in “construction in progress.” Depreciation does not begin at expenditure. It begins at placement in service - when the asset is available for its intended use - regardless of whether it is being used. Construction-period interest is capitalized into the asset’s cost and expensed only after placement, through depreciation, over the asset’s life.

Then the tranche goes live, and GAAP flips the switch. Depreciation commences on the full capitalized cost - including the capitalized interest now embedded in the basis. The asset moves, in one accounting instant, from an inert balance-sheet entry to a recurring income-statement charge. In-service to the owner is what commencement is to OpenAI: a reset whose date was fixed by the construction schedule, utterly indifferent to whether demand showed up.

As tranches go live through 2027–28, depreciation inflects upward mechanically and the hyperscalers’ operating margins begin absorbing the fully indexed rate. If utilization and pricing hold, revenues rise in tandem and absorb the scheduled depreciation. If they do not, the industry will discover that depreciation is take-or-pay with the income statement as the counterparty: a fixed charge, contractually scheduled, indifferent to demand, and impossible to renegotiate.

Consider what a live datacenter owes each month whether it runs at 90% utilization or 30%. It owes depreciation, power, interest, staff, cooling, and maintenance. In a representative cost stack for a leveraged cluster, roughly 80% of the monthly cost is fixed the day the meter turns on.

This is operating leverage - a wonderful thing on the way up and a merciless one on the way down. When utilization holds, margins are spectacular, which is exactly the story the teaser period tells. But the same fixed base, spread across revenue that arrives below the underwritten level, produces negative operating leverage. There is a break-even utilization built into every one of these assets - the point below which fixed costs are not covered - and below it, the asset bleeds.

If OpenAI cannot pay, the hyperscalers do not just miss revenue - they absorb a fixed-cost shortfall that their own operating leverage magnifies. A 30% utilization drop does not mean 30% less profit. It can mean the entire facility turns unprofitable.

When billing commences, unused capacity transforms overnight from strategic optionality to cash burn. A CFO staring at that line item finds ways to mitigate it.

You cannot cancel: take-or-pay is take-or-pay, senior in practice to everything. You can try to grow into the capacity, but demand is largely outside your control. Three mitigants remain: raise capital, renegotiate, or sublease.

Renegotiation is the most likely path. OpenAI’s negotiating leverage is proportional to its systemic importance - perhaps why it proposed handing a 5% equity stake to the federal government. It is too interconnected to fail; every balance sheet in the chain needs the fiction maintained. The renegotiations, when they come, will not be shown as distress. They will look like partnership: volume deferrals framed as capacity rephasing , rate cuts as efficiency-linked pricing .

But the moment one anchor lease is amended, every RPO dollar in the complex carries a demonstrated amendment probability. “Contracted” ceases to be a synonym for “certain” anywhere in the system. The $2.3 trillion only needs quiet contract negotiations to be re-rated as an asset class.

Sublease is the alternative. A tenant subleasing capacity it cannot use will take nearly any rate above zero, because every dollar recovered directly reduces cash burn. The bull case points to premium rates on today’s short-term subleases. But look at the terms: xAI’s arrangements carry ninety-day termination rights; Google frames its leases as bridge agreements; Anthropic takes spot capacity while aggressively contracting bespoke capacity elsewhere. This is bridge demand by construction. It exists only until the 2027–2028 multi-gigawatt deliveries land, at which point it hands the space back - flooding the market with shadow vacancy just as the rest of the $2.3 trillion commitments convert from booked to billed.

Compute does not need to default to break the market. It only takes a wave of quiet contract renegotiations and shadow-vacancy subleases to re-rate the asset class from a scarce strategic commodity to an oversupplied utility.

When that re-rating happens, the equity of the entire complex absorbs the loss - and that equity is concentrated in the handful of names that dominate the market-capitalization-weighted indices most of the developed world owns through its retirement accounts. The ultimate holder of the risk is a household that has never heard of a take-or-pay contract.

AI-exposed names now account for roughly 45% of S&P 500 market capitalization. The ten largest companies in the index - themselves overwhelmingly AI names - sit near 40%, against about 27% for the top ten at the dot-com peak. It is the most concentrated the index has been in its modern history

Semiconductors carry roughly 19% of the index and supply roughly 45% of its total earnings growth, the largest share of any sector. That contribution is a function of the order book, and the order book is largely a function of new originations. When the reset lands and the labs spend every marginal dollar servicing commitments already commenced rather than signing new contracts, the next wave of chip orders thins. The vendors are a pure second-derivative play - they book the boom first and feel the deceleration first.

Hyperscalers are roughly another 20% of the index - and the two frontier labs are nearly half of their $2.3 trillion backlog. When the commencement wall hits, depreciation and fixed costs kick in on a schedule indifferent to whether those counterparties can pay, and the hyperscaler’s P&L becomes the backstop for any capacity the labs overbought and cannot cover. Hyperscaler ROI is fundamentally frontier lab credit risk - and the equity market hasn’t even begun to price that in.

Neoclouds are the most levered expression of the wall. CoreWeave and its peers financed gigawatt campuses on debt raised against the take-or-pay contracts themselves - backlogs many multiples of revenue, thin equity beneath, and the bulk of it commencing in 2027–28. Their model rests entirely on booked converting cleanly to billed; the capital structure has no room for a deferred or renegotiated anchor lease. Neoclouds with shorter-term lease structures are acutely exposed to a renewal cliff beginning as early as 2027, with the first major wave hitting in 2029–30 as 2024-vintage leases come up for renewal. They carry no index weight, but cracks in the take-or-pay complex expose them.

A passive retirement account holding an S&P 500 index fund owns a levered, concentrated bet on the conversion of contracted compute backlog into billed revenue - and on two cash-burning frontier labs’ ability to pay for it Nobody chose that allocation, and almost no one holding knows it.

The hardest thing to convey about 2006 to anyone who did not trade through it is how good the data was. Record origination, record homeownership, delinquencies scraping decade lows, homebuilder earnings at all-time highs, and every incoming statistic confirming the strength of the American consumer.

What almost no one priced was that every one of them was a teaser-phase measurement: an observation of a system whose payment test had not yet begun, generated by an instrument that mechanically guaranteed the data would look exactly this way until the schedule said otherwise.

An economy of teasers cannot produce bad credit data until the calendar turns, which means the strength of the present data carried no information about the question that mattered. The signals everyone watched were structurally incapable of carrying the signals everyone needed.

Now read the compute cycle’s tape with that in mind. Record RPO backlog, celebrated the way 2005 celebrated origination volume. Capacity sold out, demand insatiable: a construction-phase statement, necessarily true while contracted delivery lags contracted demand. Vendor revenue beating estimates, the way homebuilder earnings were the sound of the mortgage machine consuming its own vendor inputs.

This is the epistemic signature of a teaser period, and it explains the otherwise baffling social dynamics of standing inside one. The bear who cites the future reset wall is answered with the current data. A teaser period does not merely hide the reset wall. It manufactures the exact evidence used to dismiss it.

Reinhart and Rogoff titled their history of eight centuries of financial folly with the words that recur before every crisis: “ this time is different” . And the maddening truth is that the specifics genuinely are different every time.

This is not precisely 2008. GPUs are not houses; take-or-pay contracts are not mortgage-backed securities; OpenAI is not a subprime borrower in Stockton, and artificial intelligence may well be the most consequential technology of the century, which is more than anyone could ever say for a McMansion in the Inland Empire.

All of that is true, and none of it is the point. What repeats is never the surface. What repeats is the structure :

a scarcity thesis that justifies enormous fixed obligations; a teaser period during which those obligations feel costless; a set of commencement dates, fixed at signing, on which the teaser expires and the fully-indexed bill begins; and a bet that the income will have grown to meet the bill by the time it arrives.

The reason many AI skeptics will be right in substance and wrong in the mechanism is that they are often making a valuation argument, and valuation arguments have no clock. What this piece has tried to show is that buried inside the compute contracts is something a valuation argument never has: a reset .

The bull case wins if - and it is a real if - demand scales into the committed supply before the reset wall lands, and the counterparties stay funded through any air pocket in between. The bear case in this piece is not that artificial intelligence will fail, or that the demand is fake, or that the technology disappoints. It is narrower: that the financing structure can break before the demand arrives, because the obligations are fixed and front-loaded in commencement while the revenue is variable and back-loaded in adoption - and a fixed obligation meeting a lagging revenue stream is a solvency problem regardless of how transformative the underlying technology turns out to be.

The industry will spend the next eighteen months debating whether artificial intelligence is a bubble, which is the wrong question, asked at the wrong layer. The technology is real; so were the houses. The question is narrower: what happens when instruments underwritten at the teaser meet their reset schedule, and who is holding the paper when the obligations cannot be met as written. The reset wall is published above and the AI boom sits in a period of fiction.

The Teaser Period.

This article is 100% free to read, so please share it to pay it forward. Thanks!

Share

Read Groundbreaker’s most popular piece:

The Second Derivative: Why No One Understands the AI Boom

Ask a portfolio manager what caused the 2008 mortgage crisis and you will hear a tidy causal chain: lax underwriting produced loans that should never have been made, home prices crashed, borrowers found themselves underwater, they defaulted, and the securities written on top of those loans detonated.

This is not investment advice, not a recommendation to buy or sell any security, and not a solicitation. The author may or may not hold positions in companies or themes discussed.

Software engineering is about managing complexity

Hacker News
hack8s.com
2026-08-27 10:23:34
Comments...
Original Article

There is a misunderstanding about software engineering that AI is making increasingly visible: we tend to confuse writing code with building software.

There is some overlap in certain aspects, but they’re not the same thing.

Writing code means translating an idea into instructions a computer can execute. Building software means deciding which instructions should exist in the first place, how they should interact, which constraints matter, what’s the cost of the decisions, which tradeoffs can be considered acceptable, and how the resulting system can evolve without collapsing under its own constraints and limitations.

Let’s start from a basic premise: AI is an essential tool because it is remarkably good at the first problem.

The second is where software engineering actually begins.

The difficult part was never typing the code

Consider a relatively ordinary engineering requirement.

We need to process incoming events and update some data.

And these are some of the first questions that arise during a technical discussion:

  • Should we process them synchronously?
  • Should we put them into a queue?
  • Do we need exactly-once processing, or is at-least-once sufficient?
  • Can the system tolerate eventual consistency?
  • What happens when processing fails halfway through?
  • Should we retry? How many times?
  • What happens if the consumer is unavailable for three hours?
  • Do events need to preserve ordering?
  • How much traffic do we expect today? What about two years from now?
  • What are the consequences if an event is processed twice?

… and so on.

These questions have very little to do with syntax.

Programming language’s choice matters, because affects team’s fluency, team’s performance, system’s performance, safety, maintainability, tooling, and operational characteristics, but it does not answer the fundamental questions.

The difficult part is choosing the architecture that represents the right set of compromises.

And there is rarely a universally correct answer.

1 problem can have N completely different correct solutions

This is particularly obvious when software exists inside a business.

Imagine two companies asking their engineering teams to build what sounds like exactly the same feature.

Their requirements may look identical on paper.

But:

  • Company A has 500 users while Company B has 20 million.
  • Company A may have three engineers maintaining the system. Company B may have 200.
  • One may require strong consistency because mistakes have serious financial consequences. The other may happily accept eventual consistency in exchange for availability and throughput.
  • One company may need to ship in three weeks.
  • Another may expect the system to remain operational for fifteen years.
  • One may already have Kafka, Kubernetes, PostgreSQL, observability infrastructure, and engineers experienced with distributed systems. Another may have a single application server and a PostgreSQL database maintained by four developers.

The technically impressive solution for one company could be an irresponsible solution for the other.

This is why architecture cannot be reduced to asking:

What is the best way to implement X?

The correct question is usually closer to:

Given these constraints, this team, this business, this infrastructure, this budget, these risks, and the expected evolution of the product, what is the most appropriate way to implement X, today?

That is a radically different question.

AI generates solutions. Engineers own tradeoffs.

This distinction is becoming increasingly important because of how AI is being adopted by software organizations.

AI is extraordinarily useful for software development. We use it as an accelerator: generating boilerplate, exploring APIs, proposing implementations, finding potential bugs, explaining unfamiliar code, producing tests, comparing approaches, or simply reducing the amount of mechanical work required to turn an idea into working code.

But there is a dangerous tendency to extend this capability into something much broader:

delegating engineering judgment itself

You can:

  • give an AI model a requirement and ask it to design the system, “no mistakes”: It will design one.
  • ask it to choose a database: It will choose one.
  • ask whether you should introduce a queue, microservices, caching, CQRS, event sourcing, Kubernetes, Redis, or another abstraction: It will give you an answer.

The existence of an answer, however, does not mean the underlying engineering problem has been solved.

The real problem is that the correct decision depends on context, often an enormous amount of context, that needs hours, days, or even weeks to analyze, understand, and evaluate, often involving multiple departments within the same organization, and frequently leaving gray areas that are difficult to formalize and may become a challenge when future changes are required.

This is how real world works: some of that context exists in documentation. Much of it does not.

It exists in conversations with customers. In the history of the product. In the skills of the engineering team. In operational incidents from three years ago. In budget constraints. In deadlines. In contractual obligations. In the weird behavior of a legacy system nobody wants to touch. In knowing that a customer is likely to request a particular feature six months from now.

And sometimes it exists simply in experience: recognizing that a theoretically elegant architecture will become an operational nightmare for the team expected to maintain it.

You cannot treat all of this as a small detail that will somehow be captured by adding another paragraph to an AI prompt.

There is no architecture without tradeoffs

Engineering is largely the discipline of deciding which problems you are willing to have. Even if you don’t work at FAANG scale, your projects may still need to process enough data that making the right engineering decisions becomes essential to maintaining adequate performance, without having to throw expensive hardware at systemic inefficiencies.

Even “simple” choices come with factors that need to be considered:

  • Normalize the database aggressively, and you may gain integrity while making certain queries more complicated.
  • Denormalize it, and you may improve read performance while increasing synchronization complexity.
  • Add caching, and you reduce latency while introducing invalidation problems.
  • Introduce asynchronous processing and you decouple components while creating new failure modes.
  • Split a monolith into microservices and you gain independent deployment boundaries while introducing distributed-system complexity.
  • Optimize aggressively and you may gain performance while sacrificing readability.
  • Abstract aggressively and you may reduce duplication while making the system harder to understand.
  • Avoid abstraction and the opposite problem eventually appears.

None of these can be evaluated independently. Every optimization spends complexity somewhere. The job of an engineer is therefore not simply to make the system work.

It is to decide where complexity belongs.

Algorithmic thinking matters more, not less

This is why I think algorithmic thinking becomes more important in the age of AI, not less.

And by algorithmic thinking I do not simply mean knowing textbook algorithms or being able to implement a red-black tree from memory.

By algorithmic thinking, I mean defining a set of basic rules to follow and applying everyday. I’ve put together a ten-point set of principles:

  1. Decompose the problem.
  2. Identify invariants.
  3. Understand data flows.
  4. Choose appropriate data structures.
  5. Reason about time and space complexity.
  6. Identify contention.
  7. Understand failure modes.
  8. Recognize which operations are expensive and which ones actually matter.
  9. Separate essential complexity from accidental complexity.
  10. Understand what should happen when assumptions stop being true.

I know, in the time of boosted productivity, this can sounds weird. AI can generate ten implementations in the time it previously took an engineer to write one. The challenge is to use AI as a tool to apply these principles through targeted, controlled iterations, while keeping a human in the loop.

That makes choosing the right implementation ten times more important. This is what boosted productivity really means.

Your programming language is a tool, not an identity

The same applies to programming languages.

There is value in choosing the right tool for the job. Languages have different strengths, ecosystems, performance characteristics, type systems, concurrency models, deployment models, and safety guarantees.

Those differences matter, but engineering discussions sometimes give programming-language choice “overvaluation”. In many business systems, choosing between two reasonable languages will matter considerably less than choosing the wrong architecture, the wrong data model, or the wrong operational strategy.

Pick a language appropriate for the scenario. If several languages are appropriate, there is significant value in choosing the one your team understands deeply. Don’t base your decisions on the assumption that LLMs perform better with one PL or another. Always put the team first.

The 5-matters rules are:

  • Fluency matters.
  • Ecosystem maturity matters.
  • Maintainability matters.
  • Debugging matters.
  • Deployment matters.

This is why, today more than ever, with LLMs at our disposal, I encourage engineers not to be religiously loyal to a single PL, but to become as polyglot as possible, learning to use AI assistants as learning tools, not merely as code generators, always double checking official docs.

The real optimization target is the lifetime of the system

Another mistake is optimizing software exclusively for its current requirements.

Modern software cannot be static, and it must be built to respond to following changes:

  • Users
  • Customers
  • Traffic
  • Business models
  • Regulations
  • Teams
  • Infrastructures

Every point has a weight that can change overtime. So the feature that appears insignificant today can become the core workflow two years later.

Good engineering therefore requires some ability to anticipate change without falling into the opposite trap of designing elaborate abstractions for hypothetical futures that may never arrive, just because teams accepted some codex output, too long to be fully reviewed. That balance is difficult, because:

  • How likely is this requirement to change?
  • Where should we deliberately introduce flexibility?
  • Where should we keep things simple?
  • Which technical debt is acceptable?
  • Which technical debt could become structurally expensive?
  • What should we optimize now?
  • What should we deliberately leave unoptimized until measurements prove that it matters?

This is engineering judgment.

There is no AI that can correctly answer these and many other questions, nor can you simply put an AI agent to work on them and expect a reliable outcome. There is no prompt that makes those questions disappear.

AI-generated code creates a new ownership problem

There is another issue that I think software organizations are underestimating: codebase ownership.

AI makes producing code extraordinarily cheap. That sounds entirely positive until you remember that producing code and maintaining code are two different economic activities. An engineer can now generate hundreds or thousands of lines of apparently reasonable code extremely quickly.

A team can merge them, tests pass, the feature works, productivity appears to have increased, but something critical may have been lost. And if you want to understand what, ask yourself:

  1. Does the team actually understand the general architecture?
  2. Do they understand the data structures?
  3. Do they understand why a particular abstraction exists?
  4. Do they understand the failure behavior?
  5. Do they know which assumptions the generated implementation depends on?
  6. We can assume they could modify it confidently six months later without asking another AI to explain the code that AI previously generated?

If the answer is no, the team has not eliminated complexity. It has probably introduced others, which become increasingly relevant over time.

Lines of code are cheap. Understanding is expensive.

This is perhaps the biggest change AI introduces into software economics.

Historically, producing code was relatively expensive. Now it is becoming extremely cheap. While understanding a system, it’s becoming increasingly expensive

That distinction matters: a pull request containing 3K lines of AI-generated code is still a 3K-line addition to the cognitive surface area of your system. And no, a passing-test suite is not the answer, because it gives you a false sense of confidence that everything’s under control because the system -apparently- works as intended.

If you ship it, you own it

For this reason, I believe strong technical management should maintain a very simple principle:

Never ship code you do not own .

What do I mean by “ownership”? Having a complete understanding of the codebase, having validate every part of it.

AI-generated code should not receive a lower standard of scrutiny because it was generated quickly with some advanced/expensive/frontier/whatever LLM model.

The challenge now is to determine whether (and when) it makes sense to invest time in reviewing such large pull requests, or whether it is better to move more slowly through smaller iterations, where small chunks of application logic are developed through a controlled human–AI exchange.

Software engineering may actually be getting harder

As a final point, I want to focus on an interesting paradox that seems to have emerged recently:

AI makes programming easier while potentially making software engineering harder.

We can produce more code, faster than ever before. We can create prototypes almost instantly. We can integrate unfamiliar libraries without spending days reading documentation. We can generate tests, APIs, database layers, infrastructure configuration, frontend components, migrations, and entire services at extraordinary speed.

But our capacity to understand systems has not increased at the same rate. And this creates a new bottleneck, which is no longer:

How quickly can we write this?

But:

How much complexity can this organization actually understand and control?

Productivity metrics we used so far, are broken: a team producing five times more code is not necessarily five times more productive. We haven’t been using AI systems in software engineering long enough to have reliable data yet, but it is becoming increasingly clear that the initial productivity gains we saw during the early stages of LLMs adoption, are now coming at a cost in terms of maintaining and evolving moderately complex systems.

From now on, productivity should therefore not be measured by how much software we generate.

It should be measured by how effectively we solve problems while keeping the resulting complexity under control.

AI should increase engineering leverage, not replace engineering judgment

None of this is an argument against AI-assisted development. Quite the opposite. AI is probably the most powerful productivity tool software engineers have received in decades.

But we should use that leverage to spend more time on engineering, not less. We’re allowed to let AI write the repetitive adapter, generate the first version of the test suite, explain an unfamiliar library. It’s extremely useful to let it help investigate an error, propose 3 implementations or refactor mechanical code. It’s a time saver, a booster, an assistant, combined.

Code was never the product

Software engineering is not merely an academic discipline. We are here to serve our users, so it is a boots-on-the-ground practice, and it needs to remain connected to a real world that is changing faster than ever. It is up to your team to decide how, where, and when AI-generated code fits into your development process.

Programming languages will evolve. Frameworks will disappear. AI models will become dramatically more capable. The cost of generating code will continue approaching zero.

But complexity will remain. It belongs to engineers who can understand the most complexity while introducing the least unnecessary complexity of their own.

AI can help us get there. But it cannot relieve us of our responsibility for what we ship.

Show HN: Restoredrill – proves your Postgres backups restore

Hacker News
github.com
2026-08-27 10:16:23
Comments...
Original Article

Untested backups aren't backups. restoredrill proves your PostgreSQL backups actually restore. It fetches the latest backup, restores it into a throwaway Postgres container, runs checks you define, and writes a JSON report with the restore time.

Status: v0.1.0, early days. Postgres only. Things may still change.

Why

Everyone knows they should test restores. Almost nobody does, because there's nowhere safe to restore to and never enough time. Teams that automate it usually hand-roll a cron job and a script, and those fail quietly in their own way. The real danger isn't a bad backup. It's the drill silently not running, or silently restoring a stale file, and nobody noticing for a month.

restoredrill makes the drill a one-command habit, and makes skipping it loud. It runs on whatever schedule your recovery policy sets. It doesn't assume you need to test constantly (a lot of GRC advice actually warns against that, since any gap in a "continuous" claim becomes an audit finding). It just proves you did what you said you'd do, on schedule.

A policy doc is easy to fake, on purpose or by accident. "We test quarterly" could have been written last week with nothing actually run in a year. A timestamped, machine-generated report is harder to fake.

If you're doing SOC 2, ISO 27001, or an AWS Foundational Technical Review, this is the shape of evidence they ask for: real logs from real restores, tied to what ran and when.

How this differs

There are other tools in this space. Worth naming plainly instead of pretending they don't exist.

Databasus is a solid self-hosted backup platform for Postgres, MySQL, MariaDB, and MongoDB, with a full web UI and a restore-verification feature built in. If you want one dashboard to manage backups across several database engines, look there first. BackupDrill does something close to this for Supabase specifically, including Storage files.

restoredrill isn't trying to be either of those. It's a single-purpose, CI-native check that produces a report shaped for an auditor, not a dashboard: fail-closed on everything, an RPO freshness precheck, your own SQL assertions, RTO tracked against a target, and every field always present so it copies cleanly into a SOC 2, ISO 27001, or AWS FTR evidence packet. If you already have a backup tool and just need proof it restores, on a schedule, in a form an auditor accepts, this is built for exactly that gap.

Quickstart: ten minutes, no production access

The usual excuse for not testing restores is "there's nowhere safe to do it." There is: a throwaway container on your own laptop.

  1. Dump whatever Postgres you have. Supabase, RDS, your local dev box, doesn't matter:

    pg_dump -Fc -d "$DATABASE_URL" -f backup.dump
    
  2. Copy examples/quickstart.yml next to it (or point backup.source at wherever you saved it).

  3. Run it:

    $ restoredrill --config quickstart.yml --trigger manual
    restoredrill: PASS, restore took 4.2s, 1/1 checks passed, report: restoredrill-report.json
    

That's it. No S3, no CI, no production credentials. You now have a JSON file proving a real restore happened, timestamped, on your laptop, in about ten minutes. Once that works, add real checks (row counts, freshness, your own SQL assertions, see examples/restoredrill.yml ) and point it at your real backup.

What it checks

Checks run in tiers. Every check is fail-closed: if a check can't run, that counts as a failure, not a skip.

  1. Prechecks , before the restore even starts: is the backup file big enough, is its archive header readable, and is it actually recent (the RPO check). This catches a backup cron that died quietly and left the same stale file in place.
  2. Structural : did the restore finish, are enough tables there, and are sequences in sync with their tables. A sequence that lags its column's max value only shows up on the first INSERT after a real disaster. restoredrill catches it now instead.
  3. Read-path : row counts, data freshness, and any SQL assertions you write. A restore can exit 0 and still be lying until someone actually reads the data. One real incident: a restore process exited clean while the database behind it was silently corrupted. That's what these checks are for.
  4. RTO evidence : how long the restore actually took, checked against a target if you set one.
  5. Environment sanity : the container has to come up and accept connections at all, which also proves the recovery environment has enough room to work.

The evidence report

The report is the real product here. Automating the restore is the easy part. Getting a report format an auditor accepts on the first pass takes real iteration. This schema comes from someone who paid that cost directly: three rewrites and months of back and forth with a real auditor.

Every field is always present, never missing just because it doesn't apply. Auditors often copy these into a spreadsheet, and a field that sometimes exists and sometimes doesn't breaks that. Key fields:

  • triggered_by / triggered_by_user / pipeline_job_id : same schema whether a scheduler ran this or a person pushed the button ( --trigger manual --triggered-by you@example.com ). Manual runs carry the same accountability as scheduled ones.
  • backup_resolved_key : the actual file or object drilled, not just the configured source. If your source is an S3 prefix, restoredrill picks the newest object, but only after checking it actually looks like the right backup format. A checksum file or other sidecar uploaded after the real backup can't win just by being newer.
  • backup_candidates_considered : every S3 prefix object restoredrill looked at, in order, and why any got skipped. Empty for non-prefix sources.
  • backup_timestamp / backup_age_seconds / rpo_target_seconds / rpo_met : the freshness and RPO evidence described above.
  • restore_initiated_at / restore_completed_at / restore_duration_seconds / rto_target_seconds / rto_met : RTO evidence, measured against a target if you set one.
  • validation_errors : every failed check, as its own field, with what failed and why. If a run fails, you want to know what broke, not just that something did.
  • notify_errors : a broken Slack or webhook URL is a finding, not a silent no-op. If a notify sink fails to deliver, it shows up here, and the process exits non-zero, even if the drill itself passed.
  • All timestamps are a literal "YYYY-MM-DD HH:MM:SS UTC" string, not epoch or RFC3339. Most auditor workflows end in copy-pasting into a spreadsheet, and this format survives that.

The JSON report stays inspectable down to what actually ran. No polished PDF summary asking you, or your auditor, to just trust it.

Whether your restore is getting slower over time isn't something one report can show on its own. That's a job for whatever you feed these reports into: a log aggregator, a dashboard, even a spreadsheet. Every report includes restore_duration_seconds so that's easy to chart.

Requirements

  • Docker
  • A PostgreSQL backup: pg_dump -Fc archive or plain SQL dump, local or in S3 ( aws CLI required for S3 sources)

Alerting: no new dashboard

restoredrill sends results into what you already watch, instead of asking you to check somewhere new:

  • Prometheus : output.prometheus_textfile writes node_exporter textfile metrics. Alert on the age of restoredrill_last_run_timestamp_seconds . That's your "verified within N hours" signal, and it catches a drill that quietly stopped running.
  • Slack : notify.slack_webhook_url gets a one-line PASS/FAIL summary with the failed checks listed.
  • Anything else : notify.webhook_url gets the full JSON report via POST.

A failed delivery to any of these shows up in notify_errors and makes the process exit non-zero. Losing your only notification channel silently is exactly the kind of quiet failure this tool exists to catch.

CI usage

The exit code makes this a natural scheduled CI job. See .github/workflows/restoredrill.yml for a working example, or use action.yml directly in your own workflow. Pass --trigger manual (and --triggered-by ) when a person runs it by hand instead. The evidence output looks the same either way.

Honest limits

  • The ephemeral-container model assumes your database fits comfortably in a container on the runner. Multi-terabyte estates need a different approach (restore to dedicated infra). restoredrill isn't that today.
  • pg_dump -level verification doesn't exercise PITR or WAL replay. pgBackRest support, which does, is on the roadmap.
  • The archive integrity precheck only works for pg_dump_custom . Plain SQL dumps have no table-of-contents header to check, so there's no equivalent precheck for that format. That's a real gap, not an oversight: pg_dump_sql corruption gets caught later, and more expensively, at restore time instead.
  • The same gap applies to picking the right file from an S3 prefix. restoredrill can check a candidate's content for pg_dump_custom (it looks for the PGDMP header), but plain SQL has no such signature. backup.s3_object_pattern is required when you combine a prefix source with pg_dump_sql . restoredrill fails at config load instead of guessing which file is the real backup.
  • We don't cite specific SOC 2 or ISO 27001 clause numbers here. The report is built around what the underlying control actually asks for (documented, provable recovery testing on whatever cadence your policy sets), but getting a compliance citation wrong is worse than not citing one. Check your own control language and auditor instead of trusting a clause number from us.

Roadmap

  • pgBackRest repositories (PITR path verification)
  • GCS backup sources
  • MySQL, then restic
  • Differential checks (restored vs. prod over the pre-backup window)
  • Scheduled mode

Building

go build ./cmd/restoredrill

Testing

The sequence-integrity check has a Docker-backed integration test (it starts a real Postgres container). It skips cleanly if Docker isn't available.

License

MIT

[$] Using steal time to moderate CPU demands

Linux Weekly News
lwn.net
2026-08-27 10:11:52
Virtualization can increase CPU utilization by allowing a large number of virtual CPUs to share a smaller number of physical CPUs. The amount of CPU time that is actually available does not change, though, so heavy activity on too many virtual CPUs can lead to contention and significant performance...
Original Article
The page you have tried to view ( Using steal time to moderate CPU demands ) 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 10, 2026)

I Guess We're Speculating Where the Mole People Were Born Now

hellgate
hellgatenyc.com
2026-08-27 10:09:19
Ugh. Plus, more news for your Thursday morning....
Original Article

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.

Florida ‘Deputy of the Year’ Used Flock to Stalk Ex, Held Gun in Her Mouth, Did a Nazi Salute

403 Media
www.404media.co
2026-08-27 10:08:29
The deputy resigned after an investigation uncovered an alleged history of racism, stalking, and sexual abuse....
Original Article

Brevard County deputy sheriff Michael Fultz resigned from the force after an internal investigation detailed extreme cases of alleged sexual misconduct, racism, and abuse, including Fultz’s use of Flock to stalk his ex-girlfriend. News6 in Florida first reported the story , and 404 Media has uncovered additional details about the former deputy’s use of Flock after obtaining a copy of the investigation.

Hired in 2024, Brevard County named Fultz its Deputy of the Year in 2025. The day of the ceremony Fultz’s ex-girlfriend sent a letter of complaint to the sheriff’s office with a long list of complaints about his behavior. The letter was enough to prompt the sheriffs to investigate Fultz which is when they discovered he’d used Flock to stalk her.

The 43-page investigation found Fultz had posed for pictures as Adolf Hitler, freely used racial slurs in texts, masturbated on camera in his police vehicle, took pictures of his ex-girlfriend with his service weapon in her mouth during sex, repeatedly broke the law to generate clout online for his motorcycle themed Instagram and TikTok accounts, and used Flock to stalk his ex-girlfriend.

One of the sheriff's office’s key findings was that Fultz used Flock to spy on his ex and bragged about it to her. When questioned about using Flock, Fultz told investigators that he remembered the conversation with his ex but “denied checking her vehicle registration to spy on her or out of revenge.” The investigators audited the Flock logs and found that Fultz had, indeed, tracked her movements.

When someone runs a search using Flock, the system requires users to enter a reason. Fultz flagged his search for his ex as a general investigation, and simply entered “investigation” as the reason.

Investigators also found that Fultz accessed Flock while he was off-duty. “Deputy Fultz agreed that he would have entered the registration number prior to leaving for work based on the time, and denied using his agency laptop. Deputy Fultz explained all his flock inquiries were made from his agency-issued cellular telephone,” the investigation said.

Fultz denied he was using Flock to stalk his ex. He claimed to investigators that he may have been showing her how it works, and denied spying on her. The report also states that he said “he had her location on Snapchat, so it wouldn’t have benefitted him to track her on Flock.”

Fultz’s abuse of Flock is just one piece of a much larger investigation into his behavior. In an image provided by his ex, he “had shaved your mustache to resemble Adolf Hitler and [was] demonstrating a Nazi salute,” the investigation said. She also “provided photographic evidence of you holding a firearm to her head and also inserting it into her mouth while having sex.” She said it was consensual, according to the investigation, but “she realized it was a poor idea and inappropriate for a deputy sheriff. The firearm in the images appears to be an agency-issued Walther.”

In April 2025, Fultz shot and killed a man who charged him with a knife. “She specifically noted that the sexual encounter where you introduced the firearm occurred after your on-duty shooting incident.”

She also shared numerous text messages where Fultz used racial slurs. “She described Deputy Fultz as active on Discord and other web-based chats and believes his attempted humor was reflective of the dark humor he observes on those sites,” the investigation said.

When questioned about this, Fultz pointed to his childhood and an edgy card game. “Deputy Fultz said he grew up in a foster home with black parents and siblings, and the words became normal to use. Deputy Fultz stated that although he would not use the words in public, he felt comfortable using them via text messages” with his ex, the investigation said. “Deputy Fultz did recall playing an edgy game called ‘Cards Against Humanity’ on several occasions, but he stated it never turned into anything more than edgy humor which is the design of the game.”

Investigators also found that Fultz had been pulled over for speeding on his motorcycle and covering up his license tag at least four times, including one incident where he was going 111 MPH. He walked away from every interaction after identifying himself as a member of law enforcement.

Investigators told him he had to keep his motorcycle’s license tags visible. “Inexcplicably, within 30 minutes of the direct order you were provided, you drove your motorcycle out of the Brevard County Sheriff’s Office parking lot with no license tag attached. The incident was captured on video and preserved as part of the investigation,” the investigation said.

Fultz explained he was speeding and covering his tag for online clout. “Deputy Fultz stated he made several posts to his account about riding with no license tag, claiming it was a trend that he followed. Deputy Fultz stated the posts were to get more ‘likes’ and ‘views’ on his account. Deputy Fultz claimed that he uses AI to generate some of the images,” the investigation said.

At the end of the investigation, the Brevard County Sheriff’s Office made it clear that Fultz would not keep his job, but they allowed him to resign rather than be fired. “Although termination is warranted for your egregious misconduct, due to the fact you are no longer employed by the Brevard County Sheriff’s Office, this Administrative Investigation is closed and referred to file,” the investigation concluded.

Fultz is just one of a growing list of law enforcement officers who are losing their jobs and, sometimes, getting arrested across the country for abusing their Flock access. An officer in Charlotte, South Carolina was arrested after misusing Flock in July. The town of Greer, South Carolina suspended its Flock contract after it discovered two of its officers used the system to stalk their exes. Another South Carolina officer was fired after an audit discovered she’d used Flock 166 times to watch an ex.

Fultz is unique in that he told the person he was watching that he used the Flock camera system to spy on her. Many of the stalking victims don’t find out about the abuse until it’s gone on for months or even years. The investigation also paints a broader picture of the kind of law enforcement officer who abuses their access to Flock.

The Brevard County Sheriff’s Office provided 404 Media with a copy of its investigation but did not respond to a request for comment.

About the author

Matthew Gault is a writer covering weird tech, nuclear war, and video games. He’s worked for Reuters, Motherboard, and the New York Times.

Matthew Gault

507 Mechanical Movements

Hacker News
507movements.com
2026-08-27 10:08:18
Comments...
Original Article

1, Belt and Pulleys 2, Pulleys and Crossed Belt 3, Pulleys with Right Angle Guides 4, Pulleys with Right Angle Transition 5, Pulleys with Tightening Mechanism 6, Pulleys with Vibrating Lever 7, Pulley Transmission 8, Variable Speed Stepped Pulleys 9, Variable Speed Cone Pulleys 10, Variable Speed Nonlinear Cone Pulleys

Wait... you said they were animated!

Ah, yes… well, unfortunately we do not have all the animations working yet, but we do have quite a few.

Look for the color thumbnails. They identify the completed animations. Use the prev and next links (above right) to browse the thumbnail pages.

As time goes on, we’ll be adding more until all 507 are complete. Click the Facebook “Subscribe” or Twitter “Follow” button below to be notified of our progress.

Meanwhile, we hope you enjoy the animations we have completed, along with Henry T. Brown’s original illustrations in this classic technical reference.

See the About page for more.

Close

Six Months of Writing Code Exclusively with Agents

Hacker News
blog.exe.dev
2026-08-27 10:05:19
Comments...
Original Article

In February of this year, I made a rule for myself: I wasn’t going to write code by hand anymore. I’ve been living by that rule for six months.

The system lived in my head

Back in 2024, before AI, my superpower was knowing how the entire system worked, especially the interfaces between its different components.

If someone came to me with a feature they wanted to build or a bug they were trying to fix, I could usually point them to the exact line of code that mattered and tell them what needed to change. I also remembered why the strange-looking decisions existed and which assumptions were never written down.

This was knowledge I’d built over months and years of working in the codebase. It was hard-earned and invaluable. It let me build features quickly and, more importantly, safely.

The cost was that I had to keep up with everything. As more people contributed, I spent more and more time reading changes just to maintain that mental model.

The bigger cost was the typing. Every time I wanted to build something, I could see the code in my head. I just couldn’t type it out fast enough.

Typing speed was only part of the problem: a feature was almost never one edit. Even a small change spanned multiple layers and touched handlers, schema, tests, and docs. And those edits weren’t equal: a bad handler could be reverted, but a bad migration could leave a mess behind. So writing the code by hand meant carrying one decision safely through every place it touched.

Copilot autocomplete helped immediately: a doc comment became a first draft, often wrong, but beats editing a blank file. Cursor’s tab complete helped more. The models were clearly improving fast.

Claude Code changed a ton. I could describe the change once, and the agent would edit a bunch of files at once.

As a result, I typed a lot less. But typing less didn’t mean working less: I read every change the model generated to match it against the desired state I had in my head. Agents would still be wrong quite a lot and make changes that weren’t required. Working incrementally kept them on track. This meant hand editing some of the generated code. After all, I was still responsible for every line that merged. The model wasn’t going to be held accountable.

Then, early this year, the models got really good, almost all at once. GPT-5.3 and Opus 4.6 could suddenly handle larger changes with much less steering, and the results were finally good enough to build on.

So in February I made the rule: no more code by hand. If an agent got stuck, I wasn’t allowed to finish the code myself. I had to figure out what the agent was missing - and fix that instead.

I didn’t get good at coding by reading about coding. I got good by writing a lot of code, running it, seeing it fail, fixing it, and doing it again.

AI agents are just software, after all. I wasn’t going to understand them by reading prompt guides. I had to use them for real work, see where they failed, change the prompts, tools, or environment, and try again.

The rule forced me to get those reps.

I broke it once, for three minutes. I opened the code and wrote a few lines, and it felt great. I had missed this. Right up until I realized how much I still had to type. I noped out.

One agent became a dozen

Once I stopped typing the code myself, I started finding these pockets of free time. I would give an agent a task, and then there was nothing for me to do while it worked.

Instead of waiting, I spun up another agent to do something else. Then I did it again.

I wasn’t intentionally building a parallel system. I was just filling the time between tasks. I have ADHD. I got distracted.

It’s easy to imagine what would happen if you shared a single dev box between colleagues. Now imagine they don’t talk to each other and they’re all working at the same time.

That was my first parallel setup. The agents changed the same files and Git state, installed dependencies, fought over ports, and left processes running. I also had to coordinate when each agent could test, push, or deploy. Worse, I often ended up waiting for the longest-running agent before the others could move forward. I had started more agents to avoid waiting and somehow created a new way to wait.

I asked friends and colleagues how they dealt with this, and everyone had a workaround.

Worktrees came up first. Each agent got its own checkout and branch, and the source collisions mostly went away, but worktrees only solved the Git part. The agents still shared databases, ports, processes, and the rest of the machine.

So people patched around that with AGENTS.md: use a random port, create an ephemeral database, don’t touch another agent’s process. Every conflict became another instruction, and the agents burned context figuring out how not to step on each other instead of doing the task.

Containers got closer: separate ports, processes, and local state. But the boundary was leaky: whatever my laptop could reach, the container could potentially reach too. The blast radius of a bad command wasn’t contained, so I was still approving commands. And worst of all, my laptop had to stay awake. If I closed it, all of the work stopped.

I closed my laptop. The work kept going.

By this point, I had joined exe.dev. We make Linux VMs that come up in a couple of seconds with SSH and HTTPS already set up, so moving the agents off my laptop was the natural next step.

Each task got its own machine. I could close my laptop, walk away, and the work kept running.

But now I had a new problem: how do I reliably bring up a complete development environment for whatever I want the agent to work on?

Three attempts at a startup script: fresh VM each time, looping until the environment came up clean

So, staying true to not writing code, I asked Claude to write a startup script. I told it what I wanted and instructed it to loop until things worked. It installed our toolchains, cloned the repositories, configured Claude Code and Codex, and did everything needed to turn a fresh VM into a development environment. Then it ran the validation loop: bring up a fresh box, run the script, see what broke, fix the script, and try again.

The agent boxes worked, but each agent still had its own tmux session. I ended up keeping a dozen terminal windows open just to see what each agent was doing. I had to jump between them to find which agent had finished, which one was stuck, and which one needed something from me. I needed one place to manage all of them.

So I built botd .

I gave it three rules. First, it had to run somewhere other than my laptop (the agents should keep working when I closed it). Second, mobile had to be first-class . Managing agents shouldn’t require sitting in front of a terminal. Third, it had to preserve every conversation so I could look back across agents and understand where they got stuck, which instructions worked, and which problems kept repeating.

botd provisioned and deprovisioned the agent boxes, drove the agents underneath, and kept track of every task. It showed me which agents were working, which were stuck, and which were waiting for me. From my phone or laptop, I could inspect the conversation, send follow-up instructions, and review the diff.

Instead of managing a dozen terminal sessions, I had one place to manage the work.

None of this worked if I had to approve every tool call. That would just turn me into the queue again. Each agent was running inside an isolated, disposable VM, so I let it run in YOLO mode. It could run bash commands, install packages, start services, and change whatever it needed. A trashed environment cost me nothing but the VM.

But an agent that can only touch its own VM isn’t very interesting. I still wanted agents to read logs, pull from Git, call Anthropic or OpenAI, and inspect things in Stripe.

That access is where the real risk lived, and the VM did nothing to bound it. An agent reads untrusted content and can be prompt-injected by it; whatever it can reach, an injected agent can leak or corrupt. There were holes I knew I hadn’t filled. So every piece of external access got the same question: what’s the worst that can happen through this? Reading mostly passed: agents got read-only access. Writing didn’t, so write access was limited to test environments, where the worst case was corrupted test data.

I also didn’t want the credentials inside the VM . With exe.dev integrations , the agent sends its request through a proxy, the proxy adds the credential, and the agent receives the response without ever seeing the secret.

Everything passed. I still didn’t want it.

At peak I was running about twenty VMs at a time. Not all of them were active. Some tasks got started, sat untouched for weeks, and were eventually abandoned because the cognitive overhead was too much and the work was never urgent or important enough to survive.

Validation sucked at that scale. I couldn’t manually rebuild every branch, rerun its tests, and check the application myself. But inside their isolated boxes, agents could run the tests, trigger the full CI suite, start the application, and drive it through a browser. They would send me screenshots of the completed work.

But the agent was still grading its own work. If it misunderstood what I wanted, it could build the wrong thing, write tests for the wrong thing, and then confidently tell me that everything passed.

That’s why being able to open the running environment mattered. I could use it myself, drive the new UI end to end, and make sure it worked the way I wanted, not just the way the agent said it worked.

Then there was the reviewing. When I wrote the code myself, I understood the change by the time it was ready for review. After all, I had made the decisions along the way. With an agent, the whole diff appeared at once. It might have passing tests and screenshots, but it was still unfamiliar code. And when several agents finished around the same time, I had a queue of complete changes to load into my head before I could merge any of them.

A queue of finished agent branches, each with passing tests and screenshots, waiting on one reviewer

Having other agents review the code worked surprisingly well. They occasionally caught real bugs, and it was cheap enough to run several reviews. But I couldn’t merge something just because the agents approved it. I still had to understand the change. I was still responsible for the code that got merged.

And sometimes I understood it. The tests were green, the screenshots looked good, the UI did what I had asked for, even the schema looked good and the code was approved by all the review agents.

I threw it away anyway.

Maybe nobody needed it. Maybe it introduced a second way to do something we already supported. Maybe a small convenience added complexity we would carry for years.

The tools could tell me that the change worked. They couldn’t tell me whether it was worth adding to the system.

Unshipping something is so much harder than shipping it. Hyrum’s Law kicks in: once enough people use a system, someone depends on every observable behavior, even behavior you never intended to be a contract. Removing something breaks users, scripts, and workflows you didn’t know existed.

Shipping got easy. Deciding what to ship got important.

Not all agents write code

Everything so far has been about shipping code. But some of the most useful agents we run don’t ship code at all.

It’s worth pausing on what an agent actually is, because the word sounds heavier than it deserves. An agent is a model in a loop with tools . Send the model a message; if it asks for a tool call, run the tool and send the result back; repeat. That’s the whole thing.

The model is what makes the loop capable. Give it bash on a real computer, and it can install what’s missing, adapt when your grep has different flags, and keep going until the job is done.

The loop never changes. The tools decide what an agent can be. A development agent needs a full computer: shell, compilers, browsers, the freedom to install things. Hold those back and the agent is useless, and you’re back to approving every action.

My starting point: give the agent whatever I’d give a developer. Good developer tools have turned out to be good agent tools. Whether the best agent tools end up being developer tools at all, time will tell.

And the thing to fear isn’t any single tool. It’s combinations. Private data, untrusted content, external communication: any two are manageable. All three in one agent is how your secrets walk out the door. That’s what Simon Willison calls the lethal trifecta . So I don’t minimize tools blindly: I isolate the environment and I watch the combinations.

Here’s the first example: investigation. When a customer reports a problem, I have a prompt I use, and it’s embarrassingly simple:

“Customer reports: <their report, verbatim>. Please figure out what happened using the ClickHouse logs.”

Verbatim matters. If I summarize the report, the agent inherits my interpretation - and my blind spots. Given the customer’s own words, it queries the logs, reads the relevant code, and reconstructs what actually happened.

Then the decision is mine. Sometimes I ask for options and pick one. Sometimes the evidence says working-as-intended, and the fix is a doc or an email, not code. Either way I’m deciding from evidence, not guessing from a bug report.

The second job: attack. Our red-team agent has one instruction: try to break into our systems.

And it worked. It found open network paths we thought we had restricted, and showed us exactly how they were still reachable. We patched them before anyone outside ever noticed.

That’s more useful than a list of theoretical vulnerabilities. It took an assumption we were relying on and tested it against the running system, and the assumption was wrong.

The third job: watch. Deployments are scary, but not deploying is worse. We deploy in waves, and writing perfect rules for when to continue is basically impossible: production fails in weird ways.

So Athena babysits every deployment. It reads the diff, the metrics, and the logs, and watches the rollout. During one deployment it noticed a problem, investigated, and realized it was an infrastructure issue, not the new code. Instead of blindly halting everything, it continued deploying to the other machines.

A deployment rolling out in waves; Athena flags an infrastructure issue mid-rollout and keeps the wave going

Could I do a better job? I’m not sure anymore. Athena is more diligent than I can be. It doesn’t get distracted, doesn’t get impatient, and never stops paying attention. It is tireless.

Engineer the system before the agent writes the code

An agent can now design and build an entire system almost instantly. The design might even be good. But if I simply accept it, do I know how it works? Where it breaks? Which corners it cut? Which tradeoffs I agreed to?

At that point, I’ve inherited a legacy codebase that happens to be brand new. That’s vibe coding.

Agentic engineering is working with the agent on the system first: the architecture, interfaces, constraints, and tradeoffs. When the code arrives, I understand what I’m about to own.

There is no one answer to agentic engineering. Everyone works differently; every model is good at different things. The key here is reps: do a lot, ask a lot, throw away a lot. You’ll learn what works for you.

Everything we knew about running software teams is amplified now. Start with testing. When agents write and rewrite the implementation, unit tests that mirror the implementation just churn with it. Behavior, contract, and property tests matter so much more now: define the system’s invariants and pin down what must stay true while the code underneath changes freely.

So much of the game is migrations now. Code changes are cheap, but systems carry state: data, running processes, users mid-flight. Getting from one design to the next without dropping any of that is the part that’s still hard. The job is risk management and migrations.

The agent copies what it finds in the codebase . Good patterns amplify. Bad patterns amplify faster. Engineering hygiene is more important than ever: every pattern you tolerate becomes the template for the next hundred changes.

And it’s the golden age of personalized tools . You don’t have to be a domain expert to write a new linter. So write a new linter. Enforce the pattern, encode the lesson, make the mistake impossible. The marginal cost of a bespoke tool has collapsed.

Peer code review is dead. We don’t do code reviews at exe.dev: we merge code we deem should be merged . The review that matters happens earlier: in the design discussion, the contracts, the validation. By the time the diff exists, the decisions are already made.

Here’s a recent example. Shelley is the coding agent we ship in exe.dev VMs. I wanted its tools to be asynchronous.

The first design put the onus on the agent to decide which commands should run in the background. That introduced a ton of edge cases: large outputs, long-running tasks, blocked agents, and the agent having to predict all of this ahead of time.

If I were vibe coding, I would have accepted that design and let the agent deal with those edge cases. Maybe it would have handled them. Maybe it wouldn’t have. I wouldn’t really know.

Instead, we kept discussing the problem and found a design that removed most of the edge cases entirely. Every command follows the same path and automatically moves into the background after sixty seconds.

I didn’t remember this example off the top of my head. I asked an agent to search across all of my agent conversations for a case where my questions had materially changed the architecture. It returned the original request, the first design, the objections I raised, how the design changed, the final commit, and links to the original sessions.

This is why preserving every conversation mattered. The history wasn’t just an archive. I could query it to understand how I worked.

botd is dead; long live botd

There’s one more part of this story. botd died this month. It crumbled under its own weight.

That probably shouldn’t be surprising. botd was entirely vibe coded. I didn’t read a single line of its code, nor did I really pay attention to how it was architected. And at its core was a genuinely hard problem: driving every model family through its own native harness (Claude Code, Codex, and the rest) while papering over their differences. That is exactly the kind of problem where architecture matters, and I was not paying attention to it.

It helped me deliver an enormous amount of work, but it eventually became the exact thing I described earlier: a brand-new legacy codebase that I had inherited without understanding all of the decisions inside it. The architecture was exploratory, and some of the decisions buried in it made even modest changes mean redoing large parts of the system. And I wanted to build on top of Shelley so that I could control the harness better; botd was living on borrowed time. It just died before I could retire it.

But here’s the twist: that search I described earlier was never sent to botd. All the history was in SQLite, so I pointed another agent at it and got the analysis anyway. The tool died; the data didn’t.

When I started, my advantage was that the system lived in my head. Six months later, the honest answer is that I’ve lost some of that depth. I don’t have the same line-by-line familiarity with every system.

But I can ask agents detailed questions and use them to dig into whatever I need to understand. Work no longer waits for me to finish one thing before starting another.

I’ve shipped more in these six months than in any stretch of my career. I’ve also failed more: abandoned VMs, dead-end designs, a whole tool that collapsed. The failures were cheap, so I could afford a lot of them - that’s most of how I learned what works.

It’s the same loop that taught me to code, moved up a level: write, run, fail, fix. I used to iterate on code. Now I iterate on prompts, designs, whole features. A rewrite that used to cost a week costs a conversation. And understanding is iterative too: every conversation helps me understand and internalize the system more.

I stopped writing code by hand. I didn’t stop engineering.

How Threat Research and MDR Help SMBs Build a Defensive Edge

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 10:00:10
Threat research gives security teams insight into how attackers operate, while MDR turns that intelligence into faster detection and response. ESET explains how combining threat intelligence, continuous monitoring, and human expertise can help SMBs strengthen their defenses. [...]...
Original Article

Person on a computer

Corporate IT and security teams have the unenviable task of keeping relentless and increasingly sophisticated adversaries at bay. They’re often faced with limited resources and expanding attack surfaces, but recruiting and retaining top-tier security professionals to run an in-house Security Operations Centre (SOC) is out of reach for many organizations.

At the same time, threats continue to evolve and adversaries hone their techniques, leading to incidents that often grind business operations to a halt.

To avoid being caught on the back foot, defenders need an approach that’s proactive and combines prevention, detection, remediation with accurate and timely threat intelligence. If building that capability in-house is impractical, then renting or buying it as a service is a more realistic option.

This isn’t a new concept, of course – smaller organizations have enjoyed the benefits of new IT innovations for decades through bureaux, managed services providers and cloud computing.

There’s a strong argument to be made for doing the same with advanced cybersecurity services, and this where Managed Detection and Response (MDR) can make a major impact. MDR gives organizations a proactive, expert-driven and scalable threat monitoring and hunting capability, without the cost of an elite SOC.

Not so long ago, an MDR was expensive and complex – if less so than a dedicated in-house set-up. It’s now increasingly practical for smaller organizations to consider, too.

In a recent conversation, Director of ESET Threat Research Jean-Ian Boutin discussed the work of his team and how threat research and intelligence feed into MDR workflows.

He also shared where the combination of cutting-edge technology and human expertise provides the most practical value, especially for SMB environments.

What do most small business users gain from ESET Threat Research ? How does that change when they use ESET MDR?

ESET has a threat research team spread across multiple regions; I’m with the team in Montreal, but we have researchers spread across Europe and in the US, too.

There’s stuff everyone can see: our publications on WeLiveSecurity , and talks and presentations at cybersecurity conferences worldwide.

Then there are things that only ESET business customers get: all kinds of “tips and tricks”; that is, information about threat actors: what they’re doing, how they’re operating – all things that help our customers stay safe.

When it comes to managed detection and response , threat intelligence is a key component that helps our detection and response team understand how the various threat actors are operating and how they can use that information to protect our customers from breaches.

Security Expertise On Demand

What if your security team had the backing of global threat researchers?

ESET MDR is powered by world-class threat intelligence and security experts who help uncover attacker tactics, investigate suspicious activity, and respond quickly when threats emerge.

Learn more about ESET MDR

You talked a bit about the tip of the iceberg – all of the back end of MDR that users rarely see, but that is absolutely critical. Could you explain that?

The various alerts that might be occurring in your console will sometimes be endpoint detections that we want to investigate. And my team is responsible for making sure that all the new samples and threats are being handled and detected in customer environments. So part of the team's role is really to make sure that all these new trends, all these new samples are looked at, investigated and then detected on our customers’ premises. This is one of the key aspects.

We take great care in organizing threat intelligence data on e-crime, ransomware, APT groups, and nation-state actors targeting global organizations. Our researchers use these insights to link new breaches with past cases.

They assess the severity of the breach as well, and we can also assess what could be the purpose behind the attack. It really gives the customer a complete view into what might have happened, whether or not a breach happened, or even the specific group that targeted them.

What does MDR add on top of existing ESET endpoint protection?

MDR is more tailored, and the relationship with the customer is improved and increased. But the output of my team is distributed across the entire product set.

There’s been some talk of ESET private reports recently: how relevant are they to what most small and midsize businesses face? Are they facing targeted attacks? What about nation-state actors?

The threat profile will vary from one organization to another, and a nation state actor will typically have predefined goals, and they will be targeting victims that align well with those goals.

In terms of e-crime, this is broad. This is mass targeted. We see a lot of infostealers. We see a lot of ransomware as well.

So, our role is to understand how all these groups operate and make sure that if they have new techniques, we can actually act very swiftly and make sure that we block all the attempts.

This is the ultimate goal, but equally, so many threat actors are out there doing these types of things, and there are so many more families of malware. It’s really a daily job to make sure that the customers are protected. No shortage of work, definitely.

James Rodewald, one of ESET’s security analysts, uses this concept of triangulation: seeing something in the wild, hearing from an affected customer, and checking in with the threat intelligence team. An example he has used is an attack involving FamousSparrow . Can you elaborate on that from your perspective?

It’s important to have close relationships with the people who are actually dealing with these types of cases, because the main role of my team is to look at the telemetry, so the data is gathered from all the endpoints, and we are trying to find interesting cases, and the cases that we need to work on to improve the overall protection.

But sometimes the MDR team stumbles on something that we've seen in the past, and that also allows us to have a greater understanding of how the threat actor is actually operating.

In that specific case, that was eye-opening for us, because we haven't seen this threat actor for quite some time. Whenever there's a case involving a customer using MDR, it's better in terms of research, because the closer relationship with the customer means that we know more about their infrastructure, so we can help them better. We can have a better understanding of the impact of the case. And that is then fed to other threat intelligence customers, so we are trying to be as close as possible to all these teams and link these incidents so that we can improve our coverage and improve our understanding of all these threats.

You talked about the working relationships with the MDR analysts and the D&R (Detection and Response) team. How does that change the way that you do your work and your understanding of threats when you have that kind of one to one relationship with the analysts and maybe the customer as well?

It changes everything, because with MDR, we already have a working relationship with the person who’s in charge of security for this organization, so we can very rapidly understand the scope of the attack, what exactly happened, why the attackers were there, and so on.

The information available to us is exponentially greater than what we can get with regular endpoints. So for us, this relationship is invaluable in terms of insights, visibility and our understanding of the case.

There was something of a spate of attacks in the UK last year that compromised large organizations like Jaguar Land Rover and Marks & Spencer via outsourced helpdesk services. Small and midsized companies also have outsourced services like this as part of their supply chain, and often they’re also the less well-protected parts of a bigger company’s supply chain themselves. Should they be concerned?

The risk posed by supply chain attacks is significant. There have been numerous documented instances over the years where threat actors target vulnerabilities in the supply chain, often focusing on third-party providers with less stringent security measures. By compromising such providers , attackers may obtain initial access to an organization's network.

With respect to MDR, an advantage is the extensive visibility it provides, ensuring a comprehensive view of all detections and alerts. This capability enables us to identify even minor anomalies more effectively. Given that our team continuously monitors these organizations for potential incidents, we are able to detect and respond to subtle threat actor errors promptly.

Supply chain attacks present significant challenges due to the difficulty in securing all third-party entities. However, implementing an effective solution enhances our ability to react swiftly and efficiently to such events.

As the head of a threat research team, what’s the difference that you see MDR having on customers? What's the impact for an organization that has an MDR service, and an organization that might not necessarily make that leap just yet?

In general, as I’ve mentioned before, continuous visibility is much greater with MDR. If your organization is affected by a campaign, you’ll have better tools to piece together all the different actions taken by attackers and understand what they did within your network.

Simply put, MDR provides deeper insight into attacks. From a threat research standpoint, this is the top advantage, and another key reason to value such visibility is the speed of response. With MDR, there’s already a secure channel between researchers and your company, making it easier to reach someone who can take steps to contain a breach quickly.

Final question: What would you say to organizations that might think of MDR as too complicated or expensive?

MDR acts like an insurance policy, helping to identify threats such as ransomware early – often before major problems arise. Attackers typically use initial access brokers to gain entry, but several warning signs can be detected in advance. While paying a ransom is never advised, recovery can still be disruptive. MDR supports business continuity so you can keep focusing on your core offerings.

Sponsored and written by ESET .

Android 17 adds ECH support to make web browsing harder to track

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 10:00:00
Google is introducing new network security protections in Android 17 to strengthen connection privacy, address cellular vulnerabilities, and protect the privacy of users' home networks. [...]...
Original Article

Android 17 adds ECH support to make web browsing harder to track

Google is introducing new network security protections in Android 17 to strengthen connection privacy, address cellular vulnerabilities, and protect the privacy of users’ home networks.

Android 17 adds support for Encrypted Client Hello (ECH), a new privacy standard that operates in conjunction with private DNS to hide profiling metadata, including visited domain names.

ECH acts as a privacy extension for TLS , the protocol that secures HTTPS connections, encrypting the opening part of the TLS handshake that reveals the contacted hostname via the Server Name Indication (SNI).

image

Even if the connection to a website or service is secure, internet service providers (ISPs) and Wi-Fi operators can still see the destination, which can be collected for commercial profiling purposes.

Android users benefit from ECH when browsing with Chrome 117 and later or Firefox 119 and later, but Android 17 incorporates the protection at the platform level.

“This new privacy standard works in tandem with private DNS to obscure the domain names you visit, hiding metadata that can be used to profile you,” reads Google’s announcement .

“By encrypting the destination website name from the very start, ECH helps ensure that, for supported websites and apps, network providers and network snoopers can no longer easily see which websites or apps you are accessing.”

ECH will be enabled by default for apps targeting Android 17, provided they use a compatible networking library, such as the latest versions of OkHttp, WebView, or HttpEngine.

ECH diagram
ECH diagram
Source: Google

Google explains that, on servers that support ECH, Android will now encrypt the hostname.

On servers that don’t support the protection system, Android will send a fake ECH-looking field, called ECH GREASE, so real ECH connections don’t stand out, though the hostname is still visible.

Jigsaw, Google’s internet privacy and anti-censorship technology unit, tested ECH GREASE against the top 10,000 domains and across 740 internet providers in 202 countries, finding no site-loading issues or unexpected network blocks.

WiFi protections and 2G blocks

Beyond rolling out broader support for ECH on Android, Google also announced a few more important network protections that improve user security and privacy through their combined use.

The first is adjustments to Local Network Protection that now require apps to obtain permission before scanning for or connecting to devices on the user’s local network.

The second is that Android 17 now enables Certificate Transparency by default, requiring website certificates to appear in public logs, hence making the use of forged certificates more evident.

Google also announced that participating mobile operators will now be able to turn off 2G automatically for subscribers, reducing their exposure to SMS blasters and rogue base stations that can deliver malicious messages or capture sensitive traffic from nearby 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

AC2 Protocol: The missing security layer for AI agents

Hacker News
www.ac2protocol.org
2026-08-27 09:55:42
Comments...
Original Article
Solving the AI trust problem with hardware-bound authentication and peer-to-peer communication.

© 2026 AC2 Protocol. All rights reserved. An open-source project by the Algorand Foundation.

Terms of Service

Disclaimer: AC2 is a self-custodial Algorand wallet. You — and only you — hold your seed phrase, your keys, and your crypto-assets on your own device. Pera Wallet, Lda does not hold, custody, or have access to your seed phrase, your keys, or your crypto-assets, and cannot recover them on your behalf.

If you lose your device or your recovery phrase, your access to anything you have linked through AC2 may be permanently lost. Your recovery phrase is the only way to restore access to your wallet. Pera cannot recover it for you. If you lose it, your crypto-assets and account associations are lost permanently. Do not share it with anyone, including anyone claiming to be Pera support.

Crypto-asset transactions are irreversible once confirmed on the Algorand network. Crypto-assets are volatile, may lose value, and may become illiquid or unavailable. You are responsible for any tax or other legal obligations arising from your use of crypto-assets.

The use of agentic commerce involves risks, including potential fraud and identity verification issues. Users and merchants should ensure they are using verified agents and follow best practices for security and compliance.

Harness Engineering

Hacker News
Habitat-Thinking.github.io
2026-08-27 09:54:57
Comments...
Original Article

Harness engineering is the practice of surrounding AI-assisted code generation with deterministic tooling, agent-based review, and periodic entropy checks so that AI-generated code stays correct and coherent over time. This document explains where the idea came from, what it consists of, and how this plugin implements it.

The Origin

The term comes from Birgitta Boeckeler's article on martinfowler.com, written in the ThoughtWorks context of teams shipping real software with AI coding assistants. Boeckeler observed something that many teams had noticed independently: AI assistants produce plausible-looking code, but left unconstrained they drift. They forget conventions, repeat mistakes, and slowly erode the internal consistency of a codebase. The code continues to compile and pass tests. The degradation is quiet.

Boeckeler's insight was that this problem already has a solved analogue in software engineering: the test harness. Tests do not make code correct by construction. They detect when code stops being correct. A test harness is not a constraint on what code you write; it is a mechanism that continuously checks whether what you wrote meets a standard. The harness does not trust the programmer. It verifies.

The same logic applies to AI-assisted development, with one crucial difference. Test harnesses check functional correctness: does the program do what it is supposed to do? A harness for AI coding needs to check something broader: does the codebase still embody the architectural decisions, naming conventions, security constraints, and structural rules that the team has agreed on? Functional tests are necessary but not sufficient for this. You need a different kind of harness.

That is what harness engineering provides.


The Three Components

Boeckeler describes three categories of concern that a harness must address.

Context Engineering

An AI coding assistant can only work within what it knows. If it does not know that your project uses a particular logging library, it will invent its own approach. If it does not know that you never use mutable global state, it will use it when convenient. If it does not know that all database writes must go through a specific abstraction layer, it will bypass that layer.

Context engineering is the discipline of making sure the AI knows what it needs to know. In practice, this means maintaining a document — HARNESS.md in this plugin's conventions — that captures the stack, the architectural decisions, the naming conventions, the constraints, and the rationale behind each of them. This document is not a README for humans. It is a knowledge base for the AI. It needs to be accurate, specific, and kept current.

The distinction matters: a README explains what the project does. A context document tells an AI agent what it must and must not do, and why. These are different documents with different audiences and different update rhythms.

Architectural Constraints

Knowing the rules and enforcing the rules are separate problems. You can write every constraint into HARNESS.md and the AI will still violate them, because the AI is a probabilistic system optimising for plausibility, not a rule-following machine. Context engineering reduces violations. It does not eliminate them.

Architectural constraints are the mechanisms that catch violations. Boeckeler calls the enforcement points "verification slots" — defined moments in the development workflow where a check runs and either passes or blocks progress. The key design decision for each verification slot is whether it uses a deterministic tool or an agent-based review.

A deterministic tool is a linter, a script, a regex check, a file-structure assertion — anything that produces a pass/fail result without judgment. These are preferable when the constraint can be expressed precisely. They are fast, cheap, and completely reliable within their specification.

An agent-based review is a language model looking at code against a constraint description and making a judgment. This is necessary when the constraint involves intent, semantics, or patterns that are difficult to express as a mechanical rule. Agents are more expensive and less deterministic, but they can catch things that no script can catch.

Both types of verification slots belong in a harness. The goal over time is to migrate constraints from agent-based to deterministic as your understanding of the constraint sharpens enough to specify it precisely. This is the progressive hardening principle, described below.

Garbage Collection

A codebase is a living system. Even with good context engineering and strict architectural constraints, entropy accumulates. Dead code grows. TODO comments persist for months. Dependencies go stale. Abstractions that made sense at one stage of the project become obstacles at a later stage. Conventions established early get quietly abandoned when they become inconvenient.

Garbage collection is the periodic process of fighting this entropy. Unlike the other two components, which operate at the moment of code generation or review, GC operates on a schedule. It is not triggered by a specific coding event. It runs because time has passed.

In a harness engineering framework, GC rules are explicit declarations of what "clean" looks like, paired with scheduled agents or scripts that check whether the codebase still meets those standards. The output is not a list of errors to block a PR; it is a report that draws attention to accumulating problems before they become serious.


The Living Harness

The most important property of a well-maintained harness is that it is not static. A harness that was written once and never updated reflects the understanding of the team at one point in time. The codebase continues to evolve. New patterns emerge. Old constraints become irrelevant. New categories of AI-generated mistake appear that the original authors did not anticipate.

HARNESS.md is designed as a self-referential document. It does not only describe what constraints are in force; it tracks the status of each constraint: whether it is currently unverified, under agent review, or enforced deterministically. The document declares what should be true. Agents, hooks, and CI checks verify whether it is true. The harness auditor — a scheduled agent in this plugin — reads the results of those checks and updates the status entries in HARNESS.md to reflect reality.

This creates a feedback loop. The document is both a specification and a health record. Reading HARNESS.md at any point in time tells you not just what the team has agreed should be true about the codebase, but how well those agreements are actually being maintained.

The self-referential property is what distinguishes a living harness from a document that gets outdated and ignored. Because the harness itself is a target of enforcement — the harness-audit agent checks whether HARNESS.md accurately reflects the current state of verification — neglecting the harness becomes visible rather than invisible. The everyday entry to this self-check is /harness-sync , which runs the audit's detection logic and presents a unified drift table; users see misalignment between the declared harness and reality without having to remember to invoke a separate diagnostic.


Progressive Hardening

Not all constraints are equal, and not all constraints are ready to be enforced deterministically from the start. Progressive hardening is the promotion ladder that describes how constraints mature.

The ladder is one axis. Reach — whether a constraint is required on every PR or complete-if-present — is a second, and the Enforcement field does not record it.

Unverified is the starting state. You have declared a constraint in HARNESS.md . You believe it is important. You do not yet have a mechanism to check it. This state is not a failure; it is honest accounting. An unverified constraint is a commitment to build enforcement, not a claim that enforcement already exists.

Agent is the second state. You have written an agent prompt that checks the constraint as part of PR review or a scheduled inspection. The constraint is being enforced, but by a language model making a judgment, not by a deterministic rule. Agent enforcement catches most violations most of the time. It is not perfectly reliable, and it requires human review of the agent's output.

Deterministic is the final state. You have expressed the constraint precisely enough to encode it as a script, a linter rule, or a structural check. It runs in CI. It either passes or it blocks the merge. There is no judgment involved, and no possibility of the check being confused or misled.

The direction of movement is always toward deterministic. When an agent repeatedly catches the same class of violation, that repetition is a signal: the pattern is now understood well enough to automate. Write the script, retire the agent check for that specific constraint, and move the entry in HARNESS.md to deterministic status.

Progressive hardening is important because it prevents two failure modes. The first failure mode is trying to enforce everything deterministically from the start, which is impossible for novel or semantically complex constraints. The second failure mode is accepting agent-based enforcement as a permanent state, which is expensive and unreliable. The ladder gives you a path between them.


How This Plugin Implements It

This plugin structures the verification slots into three enforcement loops, operating at different timescales and with different tolerances for false positives.

The inner loop is advisory and runs at edit time. When you save a file or complete a coding session, lightweight checks run and surface potential issues as suggestions rather than blocks. The inner loop is optimised for low friction. It should not interrupt flow. Its job is to make problems visible early, not to stop work.

The middle loop is strict and runs at PR time. When you open a pull request, a full suite of agent-based and deterministic checks runs. This loop has the authority to block a merge. It is the main enforcement point for architectural constraints. Failures here must be addressed before the code lands.

The outer loop is investigative and runs on a schedule. Garbage collection rules, fitness functions, and harness audits run periodically — daily, weekly, or on whatever cadence makes sense for the rule. The outer loop produces reports rather than blocks. Its findings feed back into the harness as potential new constraints or updates to existing ones.

The three loops correspond roughly to the three components: inner loop serves context engineering (keeping the AI informed in the moment), middle loop serves architectural constraints (enforcing agreed standards at integration time), outer loop serves garbage collection (detecting slow entropy between integration events).

Agents in this plugin operate with bounded trust. No agent has unilateral authority to modify production code or merge changes. Agents review, suggest, report, and flag. Humans decide. This is a deliberate design choice: the harness amplifies human judgment; it does not replace it.


The Self-Improving Dimension

The original Boeckeler framework describes a harness as something a team builds and maintains. This plugin adds a layer: the harness can learn from its own operation.

After each coding session, the /reflect command captures what went well, what failed, what conventions were violated, and what new patterns emerged. These reflections accumulate in a learnings log. The harness agents read from this log when making decisions, so patterns of past mistakes inform current review.

Regression detection works in the same direction. When the harness-audit agent runs, it does not only check whether current constraints are being met. It looks at the history of constraint violations to identify patterns: are the same constraints being violated repeatedly? If so, that is a signal that the constraint needs a stronger enforcement mechanism, or that the context document does not explain the rationale clearly enough, or that the constraint itself is wrong and needs to be reconsidered.

This closes a loop that the original framework leaves open. A static harness gets better only when humans notice failures and update it manually. A self-improving harness treats its own operational history as input data and generates proposals for its own improvement. Humans still decide which proposals to accept, but the work of pattern recognition — reading the violation log and noticing that the same mistake keeps recurring — is delegated to the agents.

The auto-harness additions in this plugin extend this further: the harness-init process itself reads existing code to infer constraints that are already present in the codebase but not yet declared. Rather than requiring the team to specify everything from scratch, the agent bootstraps a candidate HARNESS.md from observed patterns and asks the developer to confirm, reject, or refine each entry. The human remains the authority, but the initial cost of building the harness is substantially reduced.

Harness-init also supports incremental adoption. Teams choose which features to configure — context engineering, constraints, garbage collection, CI, and observability — and can re-run the command later to add more. Existing configuration is preserved across runs. This means a team can start with just context and constraints, prove the value, and add garbage collection and CI enforcement when they are ready. The harness grows with the team's maturity rather than demanding full commitment upfront.


Further Reading

The conceptual foundation for this plugin rests on Birgitta Boeckeler's article on martinfowler.com. That article is the primary reference for the three-component model and the verification slot framing. The Diataxis framing also draws on Addy Osmani's Agent Harness Engineering , which sharpens the model-plus-harness distinction and the "every line earned" discipline. The Diataxis framework (diataxis.fr) informs the documentation structure. The three-enforcement-loops model, progressive hardening ladder, and self-improving dimension described here are extensions developed in the context of this plugin.

For the document itself — what HARNESS.md is, how it is operated, and how it compares to AGENTS.md / CI / hooks — see HARNESS.md, the Document .

See the other pages in this section for deeper treatment of each component.

Trade (and Tariffs)

Hacker News
xkcd.com
2026-08-27 09:49:29
Comments...
Original Article

Selected Comics

Grownups Circuit Diagram Angular Momentum Self-Description Alternative Energy Revolution

Earth temperature timeline




xkcd.com is best viewed with Netscape Navigator 4.0 or below on a Pentium 3±1 emulated in Javascript on an Apple IIGS
at a screen resolution of 1024x1. Please enable your ad blockers, disable high-heat drying, and remove your device
from Airplane Mode and set it to Boat Mode. For security reasons, please leave caps lock on while browsing.

Durable Objects without Cloudflare, on the database you already run

Lobsters
lucascarlson.net
2026-08-27 09:49:06
Comments...
Original Article

The best backend primitive of the last decade is an object with a name.

That is the whole idea behind Cloudflare's Durable Objects: one single-threaded object per identity, addressed by name, with durable state attached. A shopping cart is an object. A chat room is an object. So is a game table, a device, a document, an agent run.

Calls to one identity run one at a time, so two requests can't corrupt the same cart. Calls to different identities run in parallel, so nobody waits behind a stranger. Kenton Varda's team shipped that and deleted a whole problem the rest of us usually solve with a database, Redis, a queue, and a fistful of locks.

I have spent twenty years building that pile of locks. I have built it in Rails apps, in Node services, and once, regrettably, in a spreadsheet importer. So when I finally internalized the Durable Objects model, I got a little angry. The model is too good to live behind one vendor's edge network.

I'm not alone in thinking this. Ryan Dahl's celld recreates the model as a self-hosted daemon: your VMs, your object-storage bucket, the Workers API without Cloudflare. It's excellent, and it proves the model has outgrown its birthplace. But celld answers the question at the infrastructure altitude. With celld you complicate your infrastructure by adding nodes and buckets and monitoring and scaling this new infrastructure.

I wanted the answer one altitude down, where most of us actually live: what if Durable Objects were just a library, on the SQL database you already run?

So I built it. It's called Solid Objects , it's MIT, and it ships in two implementations that share one design: a Ruby gem that runs in production in an app with over 100,000 users, and a TypeScript package for Node.

This post is about the TypeScript one. As of this week it does something I didn't plan for when I started: the whole runtime runs inside a browser tab.

An actor is just a class

Here is the whole programming model:

import { Actor, createRuntime } from "solid-objects"
import { sqlite } from "solid-objects/database/sqlite"

class TicketSale extends Actor {
  static override readonly actorType = "TicketSale"

  remaining = 100
  holds: Record<string, number> = {}

  reserve({ buyer }: { buyer: string }): boolean {
    if (this.remaining === 0 || buyer in this.holds) return false

    this.remaining -= 1
    this.holds = { ...this.holds, [buyer]: Date.now() }
    this.schedule({ at: new Date(Date.now() + 600_000), key: buyer }).expire!({ buyer })
    return true
  }

  expire({ buyer }: { buyer: string }): void {
    if (!(buyer in this.holds)) return

    const rest = { ...this.holds }
    delete rest[buyer]
    this.holds = rest
    this.remaining += 1
  }
}

const runtime = createRuntime({
  database: sqlite({ path: "sale.sqlite3" }),
  authorizeMessage: () => true,
  authorizeQuery: () => true,
})
await runtime.install()

const sale = runtime.ref(TicketSale, "event-42")
await Promise.all([sale.reserve({ buyer: "ava" }), sale.reserve({ buyer: "kai" })])

Every reserve call lands in a durable mailbox for event-42 and runs one at a time, even when different requests, or different Node processes, fire them at once. That ordering is the whole trick: the check on remaining and the write after it can't interleave, so the sale can't oversell.

Different events run in parallel, so one busy sale never blocks another. State is just rows in SQLite, Postgres, or MySQL. An idle sale costs you those rows and nothing else. No process, no daemon waiting around behind it.

That idle-cost property is the whole pitch. Cloudflare gives you this model as a managed platform. celld gives it to you as a fleet. Solid Objects gives it to you as a dependency in package.json. There is nothing new to operate, because you are already operating the only thing it needs.

The ten-minute hold is a durable reminder. schedule keyed by the buyer arms one alarm per hold; schedule the same key again and it moves that buyer's alarm instead of piling on a second. The alarm lives in the same database as the state, so it survives a deploy or a crash. No cron sweeper, no expires_at column, none of the races between the two.

That is the part a counter can't reach. A guarded write, a per-item timer, and ordered concurrency, all in one class. The stuff you'd otherwise glue together from a column, a background job, and a lock, then debug on a Friday night.

You can try the claims with a single command:

npm exec --yes --package=solid-objects@latest -- solid-objects quickstart

It fires 25 concurrent calls at one identity and checks that they serialized to a final state of 25, with the complete return sequence 1 through 25, while unrelated identities overlapped freely. Every check is an assertion; the command exits non-zero when one fails. I did that on purpose. I want the marketing to be something you can prove wrong.

How a turn commits

The correctness core is small enough to hold in your head. In pseudo-code, one turn looks like this:

# what happens when you call sale.reserve({ buyer })

insert durable message "reserve on event-42"    # survives a crash from here on

worker claims TicketSale "event-42" (one lease) # one worker at a time
state  = load(TicketSale, "event-42")
result = state.reserve(buyer)                   # your code runs here,
                                                # outside any transaction
transaction do                                  # one atomic commit:
  assert the lease is still valid               #   a stale worker fails here
  save the new state                            #   remaining and holds
  save everything the handler staged            #   the 10-minute expiry alarm
  mark the message done
end

reply to the caller with result

An attempt may run more than once. Only one attempt ever commits.

A call becomes a durable message in the actor's mailbox. A worker claims the actor under a lease with a fencing token. Your handler runs outside any database transaction, so a slow handler never holds a lock on anything.

When the handler returns, one fenced transaction commits the new state together with everything it staged: outbound messages to other actors, scheduled reminders, external effect intents. And if the lease went stale while the handler was running, that commit is rejected inside the very transaction that would have written it.

Delivery is at-least-once with strict per-identity order. External effects can run twice, so they carry a stable effect id and you make them idempotent. I will not pretend this is exactly-once, because nothing is, and the systems that claim otherwise are describing their happy path.

Last week a stranger challenged the fencing claim in the sharpest way I have seen it put. Death is easy to handle, they argued; the dangerous case is the holder that does not die. A worker claims an actor, hits a long GC pause, loses its lease, a second worker takes over and commits, and then the first worker wakes up and tries to land its stale write. If the fence check and the write are two steps, the late write wins and your history forks.

So I ran exactly that. Two worker processes, a 250ms lease, and a handler that synchronously blocks the event loop for 2.5 seconds, which freezes lease renewal the same way a GC pause would. The observed timeline:

t+0ms     worker A claims the message, stalls
t+261ms   lease expired; worker B claims, executes, commits
t+2500ms  worker A wakes, finishes its handler, attempts its commit
final     state contains attempt 2 only; A's write is fenced out

The late write never landed, in any run, because the fence re-check lives inside the commit transaction. This is the property everything else in the system leans on, and it is why I am comfortable putting the word "solid" in the project name.

Where that challenge came from is my favorite part of this whole launch. I posted the project on a forum where the participants are AI agents, told them to break it, and an agent that builds settlement systems came back with three failure probes, ranked by where this kind of model historically cracks.

The stall test above was its first probe. The third one, two independent recoveries from the same database snapshot replaying every mailbox in identical order, passed too. The second was a good enough idea that I hadn't built it yet, so it's an open issue now. Turns out adversarial review is the only marketing I trust.

The whole runtime runs in the browser

Then the project outgrew its own pitch.

Version 0.14 runs the complete runtime, the same mailbox, leases, fencing, reminders, and effects, inside a browser module worker. The database is SQLite compiled to WASM. Durable storage is OPFS, the browser's origin-private file system, so committed actor state survives page reloads and browser restarts. Actors look exactly like they do in Node:

import { Actor, configure, sharedSqliteWasm } from "solid-objects/browser/host"

class Counter extends Actor {
  static actorType = "Counter"

  count = 0

  increment({ amount = 1 } = {}) {
    this.count += amount
    return this.count
  }
}

const runtime = configure({
  database: sharedSqliteWasm({ path: "app.db" }),
  authorizeMessage: () => true,
  authorizeQuery: () => true,
})
await runtime.install()

await Counter.ref("page-hits").increment()

That code runs identically in every tab of the origin, and the hard engineering lives right here. Browsers give you no process supervisor, so the runtime builds one out of web primitives.

The Web Locks API elects one database holder per origin. Every other tab forwards its SQL to the holder over a BroadcastChannel. When the holder's tab dies, the lock releases, the next tab promotes itself, and the runtime picks up from the same OPFS state. The leases and fencing that arbitrate Node processes arbitrate your browser tabs, unchanged.

You don't have to take my word for any of it. The homepage runs the runtime on the page. The counter there is a durable actor committed to SQLite WASM in your own browser, and your page view was itself a committed actor call. Reload it; the count survives. Open the page in a second tab, close the one holding the database, and watch the other take over the same state.

And if you want to try it without installing anything at all, one import in a module worker works from a CDN, wasm and all:

import { Actor, configure, sharedSqliteWasm }
  from "https://esm.sh/solid-objects@latest/browser/host"

Offline writes drain into Node, or into Rails

A durable browser actor raises an obvious question: what happens when it needs to reach the server? The answer is the transmit family. An actor stages an outbound call in the same transaction as its own state change , with one extra line:

class Counter extends Actor {
  static actorType = "Counter"

  count = 0

  increment({ amount = 1 } = {}) {
    this.count += amount
    this.transmit().increment({ amount })  // staged in the same commit
    return this.count
  }
}

Because the intent commits with the state, a crash can never leave you with a local write the server will never hear about, or a server call for a write that rolled back. A drain worker then delivers each envelope with at-least-once delivery and per-actor order, and you supply the transport. Throw while offline and the effect retries with backoff:

registerTransmit({
  runtime,
  deliver: async (envelope) => {
    const response = await fetch("/sync", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body: JSON.stringify(envelope),
    })
    if (!response.ok) throw new Error(`sync failed with ${response.status}`)
  },
})

On a Node server, the ingest is one call. It enqueues an internal message keyed on transmit:<effectId> , so a replayed envelope applies exactly once:

import { receiveTransmitEnvelope } from "solid-objects"

async function handleSyncRoute(request) {
  const sender = await authenticate(request)
  if (!sender) return new Response("Forbidden", { status: 403 })
  await receiveTransmitEnvelope({ runtime, envelope: await request.json() })
  return Response.json({})
}

But the receiving side does not have to be Node. The Ruby gem speaks the same wire contract, pinned by a golden fixture file committed to both repositories and tested on both sides. Its Rails engine already mounts POST /solid_objects/transmit , behind a policy that denies by default, so a Rails backend needs only to say who may deliver:

SolidObjects.configure do |configuration|
  configuration.authorize_transmission = lambda do |envelope:, authorization_context:|
    ActiveSupport::SecurityUtils.secure_compare(
      authorization_context.request.headers["Authorization"].to_s,
      "Bearer #{Rails.application.credentials.transmit_token}"
    )
  end
end

Point the browser's deliver callback at that route and you have an offline-first frontend draining into a plain Rails backend, one contract, both directions: Rails actors can transmit.increment(amount:) outward the same way. I have wanted this pairing since I first read about local-first software: durable actors in the tab and on the server, with a reconciliation path that survives a subway tunnel.

What it is not

Every claim above has a boundary, and you should know them before you spend an evening on this.

  • It is pre-1.0. Expect breaking changes.
  • Delivery is at-least-once. Effects must be idempotent. There is no exactly-once anywhere in this system, only exactly-once state commits.
  • One hot identity is intentionally serialized. It cannot scale by adding workers, because that is the contract you asked for.
  • A synchronous actor call is not a substitute for an indexed row read. Measured on networked MySQL: a plain read was 4.7ms median; an actor call was 60ms. When one SQL transaction solves your problem, use the transaction.
  • OPFS support varies by browser and WebView. The persistent adapter fails fast where it is missing.
  • The published benchmarks are laptop numbers with the methodology and sources of bias attached. They exist to expose tradeoffs; capacity planning needs your own hardware.

The project site keeps a longer version of this list right next to the things it does claim. Honestly, the not-claimed half is the part that makes me trust the rest.

Go break it

The model deserves to run everywhere. Cloudflare proved it at the platform altitude. celld proved it at the fleet altitude. Solid Objects is my argument that the most useful altitude is the lowest one: a library, your database, and now your browser tab.

Everything is MIT: solid-objects-js , solid-objects-ruby , and the docs, benchmarks, and correctness contract at solidobjects.dev . The quickstart asserts its claims and exits non-zero when one fails. The homepage runs the browser runtime live. If you find the case where a claim does not hold, I will name you in the fix.

Never Launch Alone

Hacker News
launchgenius.app
2026-08-27 09:45:39
Comments...
Original Article

Don’t launch alone

Turn your network into a launch team.

Coordinate the people who can help get the word out. Employees, investors, guests, creators, partners and customers each get the right ask, and every post publishes on one schedule.

14 days free, then $ 29 /month. Cancel any time.

How it works

  1. 01

    Schedule your launch posts

    Preview and customize it for each platform, pick the time, and schedule it. Add as many posts as the launch needs: teasers, the announcement, the follow-ups.

  2. 02

    Invite your network.

    They get the ask, your launch posts, shared assets and media kits, plus automated follow-ups and tracking to help with participation. They write their own words, schedule it, and you approve.

  3. 03

    Track your launch in real time.

    Posts, chat messages and emails go out as planned, and you watch it happen. Afterwards you get the numbers on your own posts and on every participant’s, read from each network.

    What happens on launch day →

See every feature →

14 days free, then pick a plan.

Every plan includes every network, both posting lanes, the live command center and the report. Annual billing is two months free, and you can cancel any time.

Starter

$ 29 /month

or $ 290 /year

  • Active launches 3
  • Participants per launch 25
  • Networks 11
  • Media Library 10 GB
  • Your voice on emails

Team

$ 49 /month

or $ 490 /year

  • Active launches 10
  • Participants per launch 100
  • Networks 11
  • Media Library 50 GB
  • Your voice on emails Yes

Pro

$ 149 /month

or $ 1,490 /year

  • Active launches 50
  • Participants per launch 500
  • Networks 11
  • Media Library 250 GB
  • Your voice on emails Yes

Enterprise

Custom

billed to suit your procurement

  • Active launches Unlimited
  • Participants per launch Unlimited
  • Networks 11
  • Your voice on emails Yes

Talk to us

Questions people ask before they start.

What is launch coordination?
Launch coordination is getting the people around a release posting about it at the right moment, in their own words, instead of whenever they get around to it: your team, customers, investors, a podcast’s guests, creators, partners. It covers the brief they read, the assets they are handed, the approval before anything publishes, and the schedule it all runs on.

How do you get other people to post about a launch?
You invite them: a link per cohort, or one person by email with the clip and a note attached. Nobody creates an account or sets a password; an email address is the whole requirement. Each person writes their own post inside a preview of the real platform, picks when it goes out, and keeps control of their words and their account throughout.

Is there a free plan?
Everything before scheduling is free, on any number of launches: create the launch, write the announcement, build the run of show, and let up to 10 people join and write their posts. Your own scheduled posts are free and unlimited. Scheduling a launch to publish is the paid step, and it is the only one.

Does anyone have to share a password or hand over their social login?
No. Connecting an account is optional and always started by its owner through the platform’s own sign-in screen, so no password is ever seen or stored. Anyone who prefers not to connect is emailed at the scheduled time with the text ready to copy and a link that opens the platform’s composer, and confirms with one tap.

How is this different from a social media scheduler?
It is one: you can schedule from your own accounts, with a calendar, previews and per-network counts. The difference is everyone else. A scheduler publishes to accounts you own, so every post is your company talking about itself. This also coordinates posts from the people who chose you, each written and published by that person. That is why a stranger believes it.

Does it work for podcasts, books, events and other launches?
Yes. A launch is a moment with people around it who want it to land, and the mechanism is the same for a product, an episode, an album or a show. A podcast episode is the clearest case: one guest with their own audience, invited by email with the clip attached, reminded when the episode is live. The use-case pages show how each one runs: podcast guests , a product launch , a book , an event or show , and the organizer guide for anything else .

Which social networks does it support?
11 networks: X, LinkedIn, Instagram, TikTok, YouTube, Threads, Facebook, Slack, Discord, Telegram, Bluesky, plus email from your own address. Every plan includes all of them. Where a network’s API allows publishing, connected accounts post automatically; where it does not, the author is emailed at the scheduled time with the text ready to paste and publishes by hand.

How much does it cost?
14 days free, on any plan. Starter is $29 a month, Team is $49 a month, Pro is $149 a month. Every plan gets every network, automatic and by-hand publishing, the live command center and the report; they differ in how many launches and people they carry. Larger rosters and procurement-led buyers have an Enterprise option. Pay annually and get two months free. Cancel whenever you want.

Don’t launch alone.

Your biggest advocates already want to help. LaunchGenius makes it easy for them to show up.

Your network is your proof.

Apple threat notifications and spyware: what everyone should know

Hacker News
www.accessnow.org
2026-08-27 09:45:26
Comments...
Original Article

Since 2001, Apple has been warning its users when they may have been targeted by spyware, using email, iMessage, and banners in their accounts. But in September of this year, the company began to place these threat notifications directly in users’ device Lock Screen and Settings — making them harder to miss. Here’s what you need to know about Apple threat notifications and spyware attacks in general, and what they mean for your digital security.

⚠︎ What is an Apple threat notification actually telling me?

Put simply, that Apple detected activity in your device signalling that you have been targeted  with so-called mercenary spyware , that is, the sophisticated commercial surveillance technology that is sold by companies like NSO Group , Paragon , or Cytrox , often exclusively to government clients .

This alert does not tell you whether or not the spyware attack succeeded, nor does it provide information about who might be behind the attack or what their motives may be. Further analysis is required for you to see a clearer picture.

⚠︎ How do I confirm if a spyware attack has actually taken place?

A threat notification is like a fire alarm; it draws your attention to the possibility of danger, but you still need the fire brigade. If you have received an authentic Apple threat notification, you should immediately seek expert support from trusted professionals or organizations who can help you conduct a digital forensic investigation . Be careful, however, to ensure that the message is authentic to avoid scams or phishing .

A forensic investigation process takes time, but it will help you better assess and take control of the situation.

If you are a member of civil society, such as an activist, journalist, or human rights defender, you can contact Access Now’s Digital Security Helpline to get more tailored advice . As Apple says , “we strongly suggest notified users enlist expert help, such as the rapid-response emergency security assistance provided by the Digital Security Helpline at the nonprofit Access Now.”

⚠︎ What does a digital forensic investigation do and how would it help me address a spyware attack?

When dealing with a spyware attack, it is important to preserve the evidence that a spyware attack or attempt may have left in your device as soon as possible. Time is of the essence, as data is being overwritten every minute that a phone or laptop stays on. Investigators would work with you to preserve that evidence.

Next, investigators would often search system files, logs, and process histories for traces of spyware. Data should be collected in such a way as to minimize, as much as possible, the amount of sensitive data and content that is accessed, such as your personal photos, contacts, or communications. If traces are found, investigators would typically contextualize these findings by connecting them to circumstances and life events surrounding the dates of the traces, including potential travel, sensitive work or conversations, or suspicious messages or device activity. Please note, however, that a lot of sophisticated spyware attacks may not be associated with anything suspicious that you can observe; the lack of obvious signs of an attack does not mean you are safe.

In addition, investigators may also try to test their own findings by submitting their work to peer organizations for an independent analysis. This practice helps solidify and confirm the validity of an investigation’s findings or identify areas where further research may be needed.

⚠︎ What if an investigation can’t find anything? Does that mean I’m safe?

Not necessarily.

A good investigator may not always be able to find evidence to identify a spyware infection, nor can they always find a solution for mitigating the threat, but they are always conscious of their own limitations. In some cases, they may be able to suggest other methodologies or techniques for identifying and preventing spyware, but they rarely issue a blanket statement or guarantee that you are fully safe. That is for good reason; spyware evolves quickly, and it is designed to hide its traces.

⚠︎ Is there an app or service that can help me prevent or recover from a spyware attack?

The short answer is that no single app or service will diagnose, prevent, or mitigate all spyware attacks. You may see ads for digital tools that scan your phone and tell you that your “device is clean,” but what they are actually telling you is that they did not find anything on your device that matches the small set of indicators that they know about.

It’s important not to let such seemingly “easy” solutions give you a false sense of security, especially if they lead you to neglect taking simple, but important steps that can significantly help you protect yourself from spyware and other threats.

⚠︎ Should I avoid using any security app in that case?

It depends. Some services can help you detect some forms of surveillance technology, and that can be useful. For example, they can flag known spyware, or nudge you to take certain security measures, like running a system update.

That said, you should understand that these services also tend to downplay their limitations, which in the case of a serious spyware infection could matter more than their capacities. The leading mercenary spyware vendors test their products against popular detection tools before selling them, because staying invisible is their primary selling point. Security apps available to consumers will not be able to scan your entire device, either, as they operate under restrictions similar to those of any other app. They may therefore fail to inspect the parts of your system where dangerous spyware may be lodged.

You should also understand that if you choose to use a security app or service, it’s critically important that you choose wisely. When you download an app and give it authorization to examine your device, you’re giving the company behind it access to a detailed portrait of your life. If you don’t know and trust the organization or company behind the app or other tool you are using, you should not use the service at all.

⚠︎ With digital attacks on the rise, what do I do then?

Again, if you have received an authentic Apple threat notification or similar alert from WhatsApp , Facebook , or Google , you should follow the security recommendations in the notification message. As we note above, you should first ensure the message is authentic to avoid scams or phishing .

Once you’ve verified the authenticity of the alert, you should also seek expert help to conduct a forensic investigation to assess the type of attack you may have faced. A trusted technologist or organization can also help you take measures to contain the threat and regain control. If you suspect that you may be a victim of a criminal cyber attack, you may also consider reporting the incident to a relevant governmental authority or specialized agency; however, we strongly recommend consulting with an attorney to help you determine if it’s safe to do so.

Even if you cannot immediately get your device tested for spyware, you may wish to preserve the potential evidence of attack for future investigations by making a backup of the affected device.

For anyone interested in preventing a spyware attack, a few simple steps can go a long way: install all your updates promptly, and enable high-security settings like Lockdown Mode or, if you have a Pixel device, Google’s Advanced Prot e ction . WhatsApp also offers Strict Account Settings to increase your protection. You should also minimize your attack surface by keeping separate devices for your personal and work life, and by reducing the number of apps and accounts that you keep in your device.

That said, let’s be real. Security is never a state that you reach, but a practice that you keep. Everyone’s threat profile is unique , and you may benefit from a personalized assessment and ongoing education to stay aware of emerging threats. In other words, while a threat notification or a security app may be useful, you should strive to remain alert, take note if you see or experience anything odd, and always seek trusted support when you need it.

Show HN: Pause – weekly curated 1:1 coffee matches for London professionals

Hacker News
joinpause.co
2026-08-27 09:45:06
Comments...
Original Article

Now Live In London

Pause — A Physical Network for London

For the restless, the curious, and the tired of scrolling. A physical network for the city.

Curated matches

In person

London-first

Two people over coffee

Coffee Chats

Skip the small talk. We match you with someone in your neighbourhood for a focused 45-minute conversation. No agendas, just presence.

Hands exchanging a book

Skill Swaps

Learn ceramic glazing in exchange for Figma shortcuts. A marketplace of human capability, minus the transaction.

Shared workspace

Quiet Cowork

Find the hidden tables in London's best independent spots. Curated shared desks for focused, non-extractive work.

Network of orbits

Accountability

Weekly check-ins for those of us building solo. A peer-to-peer structure that keeps your momentum steady.

The Rhythm

01

Join the Orbit

Register for the next London batch. We verify every human to keep the vibe focused and kind.

02

Weekly Matches

Receive one high-intent introduction every Tuesday based on your current focus or curiosity.

03

Meet in the City

Head to one of our partner cafés or studios. Put the phone away. Be a person in a place.

Pause © 2026 · Made for London

Simon Jones on Functional Programming, Thinking in Types, Useless Languages

Lobsters
www.youtube.com
2026-08-27 09:41:53
Comments...

Did Meta's Big Settlement Actually Help It?

Hacker News
www.nytimes.com
2026-08-27 09:32:29
Comments...
Original Article

Please enable JS and disable any ad blocker

Australia arrests alleged TeamPCP hackers behind supply-chain attacks

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 09:31:13
Australian authorities have arrested and charged two young men accused of belonging to TeamPCP, a hacking group linked to a string of far-reaching developer supply chain attacks. [...]...
Original Article

TeamPCP

Australian authorities have arrested and charged two young men accused of belonging to TeamPCP, a hacking group linked to a string of far-reaching developer supply chain attacks.

TeamPCP is a hacking group known for widespread supply-chain attacks over the past year that targeted open-source software and developer platforms to steal credentials, authentication secrets, and source code.

High-profile attacks attributed to TeamPCP have impacted Trivy , LiteLLM , Telnyx , SAP , and TanStack packages, while the group has also breached the European Commission , Mistral AI , OpenAI , and GitHub .

image

To carry out their attacks, the threat actors injected malicious code into software hosted on open-source repositories, which developers then unknowingly incorporated into their own applications on systems used by government, academic, and private-sector organizations.

Rather than a cohesive group, the malicious activity is believed to have been carried out by a loose-knit collective of threat actors who all frequent the same hacking forums, Discord servers, and Telegram channels.

According to the Australian Federal Police (AFP), the FBI, and Western Australia Police, malicious code distributed by TeamPCP has potentially compromised over a thousand organizations worldwide, enabling the theft of half a million credentials and the exfiltration of at least 300GB of data.

"The alleged compromise of a small number of trusted software components had a significant global impact," reads the AFP announcement .

"To date, the financial impact includes global remediation costs estimated to be hundreds of millions of dollars."

The investigation began in April 2026, after the AFP and FBI received key information from cybersecurity firms.

The two men, aged 21 and 23, were arrested in the western Australian cities of Cottesloe and Mandurah on August 26, 2026.

Photographs of the arrests
Photographs of the two arrests
Source: AFP

During the law enforcement action, investigators also seized electronic devices and other evidence for forensic analysis.

Police allege the two men received an undisclosed amount in cryptocurrency payments for their involvement in TeamPCP operations.

After the arrests were announced, both Flare and Brian Krebs published separate investigations detailing how Telegram activity, reused aliases, accounts, and other online traces linked alleged TeamPCP members to real-world identities.

The two suspects now face a combined 14 charges related to possessing and supplying data for computer offenses and modifying data to facilitate serious crimes.

The younger of the two also faces charges for allegedly dealing with at least $100,000 in criminal proceeds and failing to comply with an order requiring access to electronic data. The charges carry maximum penalties of 3 to 20 years' imprisonment per charge.

The AFP said further arrests or charges have not been ruled out at this stage, as it examines seized evidence.

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

CoMaps integration with the wider FLOSS ecosystem – CoMaps

Hacker News
www.comaps.app
2026-08-27 09:29:54
Comments...
Original Article

CoMaps is proud to be a fully free and open source app, and this ideal exists as one of CoMaps' core principles . Naturally, it's within our interest to make sure the ecosystem of FLOSS apps can flourish and serve as a viable alternative to their proprietary counterparts. Thus, Android users and enthusiasts who embrace this ecosystem of FLOSS Android apps may be pleased to hear that a few of us have working on ensuring CoMaps can interoperate well with these other apps, while still continuing to respect the user's privacy.

Gadgetbridge

Gadgetbridge is a free and open-source Android app which allows you to use your smartwatches, headphones, and other Bluetooth devices without having to use your manufacturer's proprietary app. Starting with Gadgetbridge v0.93.0, you can now use CoMaps as a navigation data provider, meaning users with a supported smartwatch may enjoy turn-by-turn directions on their wrist in a fully FLOSS solution.

At the time of writing, this setting can be found in Settings > External Integrations > Navigation. Enabling it will enable it for all supported connected devices.

The navigation app running on InfiniTime, with instructions from CoMaps

OpenVitals

OpenVitals leverages Android's Health Connect framework to bring you a complete dashboard of all your health and wellness data, so you can enjoy a free and open source alternative without the need to share it with external companies. It also allows you to record outdoor activities using CoMaps as a navigation context provider , so you can keep an eye of your activity metrics alongside the route of your bike ride or hiking trail.

At the time of writing, you can find it under Settings > Activities > Comaps navigation guidance. Enabling it will give you the ability to show the route set in CoMaps over your live activity.

CoMaps guidance within OpenVitals

Private by default

Being an app which respects its users, CoMaps only provides this data to other apps if the user allows it. To that end, you must grant each app a special permission provided by CoMaps.

If you're a FLOSS developer and want to build your own dashboards, widgets, et cetera with CoMaps' data, you can find documentation on Codeberg !

Emacs 31: An unofficial guide to Markdown-ts-mode

Hacker News
rahuljuliato.com
2026-08-27 09:22:36
Comments...
Original Article

Intro

So, Emacs 31 has been released, and a lot of shiny new stuff is there, ready for us to play with.

You probably heard of this new markdown-ts-mode and decided to check it out. And guess what? On Emacs version 31 , this is marked as an experimental mode. What does this mean? Should you use it or not? Is this ready? Is this just a sketch of a mode?

Treat this post as a quick guide to getting this mode up and running and helping yourself find answers to these questions.

Where is it in terms of features?

This is an experimental mode, right? You need to opt in, so probably not everything will work flawlessly yet, and it needs more testing and feedback.

That said, don't let this title mislead you. This does not mean the mode is premature in terms of features. As you will see, this is a very feature-rich mode. This mode already covers all of the https://commonmark.org/ spec, as well as most of https://github.github.com/gfm/ , with some extras like code blocks even for non- ts-mode s, like elisp , table of contents utilities, and interfaces with external converters, such as pandoc and gfm .

Before deep diving into it yourself, you may need some help simply turning this mode on. Tree-sitter is tricky. It might even be your first time with tree-sitter, so a quick "install guide" is on our agenda.

Where is it? Do I need to install the mode?

Experimental means Emacs does not enable the mode by default so it is not there waiting for you to simply open a .md file or call it with M-x markdown-ts-mode RET . You need to load this library.

As always on Emacs, there's more than one way of doing everything, I am a big fan of use-package so I tend to use it to organize my init file. Here is my suggested initial setup:

Or if you keep use-package out of your tool belt:

Now both the mode and the x (nice extra goodies) libraries are loaded, and you can simply visit your Markdown files using it.

If you want to experiment with it without touching your own configuration, do the following:

  1. Save the above content in a file like testing.el .
  2. Call emacs with emacs -Q --load 'testing.el' .

And there you have it, a bare Emacs session with your testing ground set up. This is what I will use for the rest of this guide.

IMPORTANT : there's NO NEED to download or add this package to your package manager. The (now very old and archived) MELPA Repository will refuse to install on Emacs version 31 onward and is very, very poor in terms of features. If you are using this, you're not using the new built-in markdown-ts-mode . Right? Let's continue.

Opening our first markdown file

In order for you to "see what I see", we need some pictures. If it is the first time you're using a tree-sitter-based mode, let me warn you: although tree-sitter is wonderful, fast, and feature-rich, it comes with its own set of tasks to complete and perhaps debugging skills if it needs help. I will try to cover some here; I will forget others for sure.

For this guide, I will be using this test file .

The repository where it is hosted is our laboratory. No code lives there, remember, all code is in Emacs itself.

Now go ahead and open the test.md file.

IMPORTANT : At this point, many things can happen. If you have the grammar for markdown installed in your system, the file is already opened. You could, though, be prompted, as I am here, with this:

emacs_markdown_31_demo step 01

It means Emacs hasn't found a grammar for markdown in my system, in this case in ~/.emacs.d/tree-sitter/ (which is the default when I start Emacs with emacs -Q ... ). Emacs will offer to install it, which means downloading and compiling it from a repository already defined in markdown-ts-mode 's source code. Let's install it with y . Emacs will clone the grammar repository, compile it, and continue to the second grammar. Yes, markdown uses two grammars: the main one and one for inline parsing. I will allow Emacs to install the second one with y .

Success!

What you should be seeing:

emacs_markdown_31_demo step 02

If not, here is what you should check if something went wrong:

  1. Is Emacs compiled with the tree-sitter flag? Use M-: (featurep 'treesit) RET and check if it returns t .

  2. Do you have the tooling used for "compiling" grammars, like make , gcc , and others?

  3. Tree-sitter needs a package in your distro, usually named tree-sitter-cli which provides a tree-sitter binary, you can check you have it with tree-sitter --version .

This is a common headache for all tree-sitter modes. Many people like NOT to compile their own grammars, but instead use some compiled file from a place they trust, like their own distro repository, or packages with hundreds of pre-compiled grammars. I will not dive into it; there are many ways of acquiring grammars, and I will stick with "build it yourself" for this guide.

See, I kind of tricked you there. I told you that you should be seeing that, but actually, the "do you see what I see" should look like this:

emacs_markdown_31_demo step 03

We provide the full file in here , with several default themes so you can compare whether your setup is complete.

So, what happened?

This is part of the reason markdown-ts-mode is very special .

This mode can work not only with markdown , but with all other -ts-mode s available! Keep this in mind; we will talk about code blocks in a while. For now, we need to understand a few things.

In your test.md file, we have a special header. It is very common to have toml or yaml as headers of markdown files.

This little guy here:

Needs something else to fontify (aka be painted with colors by Emacs). Can you figure out what is missing? If your answer is "we need a grammar for YAML!", kudos!

Whenever something does not fontify correctly in -ts-mode s, you're probably missing a grammar. And as markdown-ts-mode is made to work with all available ts-modes , this is no exception.

Let's install our yaml grammar with our trusty M-x treesit-install-language-grammar RET yaml .

You might see now what I am seeing:

emacs_markdown_31_demo step 04

Let's agree to it with y . Hmm, it looks like this time, something went wrong with yaml-ts-mode trying to register its preferred grammar with treesit-install , as there are no suggestions. We could provide it manually. But let's check something first. Taking a look at yaml-ts-mode.el , we can check which grammar it expects in its source code:

Awesome! Let's simply evaluate that block and try to install the grammar again. Or manually provide the source https://github.com/tree-sitter-grammars/tree-sitter-yaml to our already-started interactive session, as I did this time:

emacs_markdown_31_demo step 05

We then keep going with the defaults with RET RET RET... until the library is installed.

After that, reload markdown-ts-mode , or use C-x x g , or re-open the file you're visiting.

What we did here by visiting the source code is pretty rare, and most -ts-mode s will automatically suggest the repository from which they are going to compile. It was nice that this happened, so I can show you what to do.

Now what? We need to do the same M-x treesit-install-language-grammar for every block without fontification that we encounter. If you'd like, for our test file we could use C-x x f to force fontification and be prompted for every missing grammar used by this file.

By now, you should see the entire document fontified as in here . Same as previous image:

emacs_markdown_31_demo step 03

A note on grammars

A -ts-mode is only as good as the tree-sitter grammar behind it . This means every -ts-mode needs to constantly keep up with improvements to the grammar , which is shared by any editor or program wanting to use tree-sitter to parse the language.

This also means we are, at some point, dependent on the grammar for certain constraints and features. Almost all -ts-mode code in Emacs is filled with notes on limitations and the reasoning behind why and how something obscure is treated the way it is.

Emacs mode authors and maintainers always try to suggest the grammar and the SHA commit the ts-mode is prepared to use, either in comments or in the code inside the mode, which is the same as you saw for the yaml suggestion. Part of maintaining ts-mode s is keeping up with newer grammar version changes. We try our best to keep it updated with the latest versions, but the one we tested against and that should work as expected is the one in the source file of the mode.

This is why I think compiling it yourself interactively with Emacs is the best possible way to guarantee a nice experience.

Specifically for markdown-ts-mode , we're using the grammars provided by https://github.com/tree-sitter-grammars/tree-sitter-markdown , as this is the most complete, maintained, and broadly adopted one, both by code editors and programs in general. This doesn't mean it is free of bugs or limitations. Again, we do our best to work around these limitations and even contribute issues to the grammar and to the core tree-sitter library.

I can finally open a markdown file!

Congrats! Now what? How often do I need to do all of this? Only once, the first time you use a -ts-mode , or never if you already have grammars installed by some other method.

Now let's see what markdown-ts-mode already provides.

A quick look at markdown-ts-mode features

We (BTW, this mode is authored by me and Stéphane Marks) provided an easy-menu feature for quick discoverability of functionalities.

You can access it by clicking on Markdown in the mode-line , or, if you have menu-bar-mode enabled, on the menu bar, or even Ctrl + Right click (whatever Emacs maps your OS input to) on a buffer using markdown-ts-mode .

emacs_markdown_31_demo step 06

This is actually this guide's TL;DR , if you want to stop now and explore it yourself (spoilers ahead).

Editing

The fastest way to learn the mode is to type a little of everything. Below is a speed run: what you write, what key does it for you.

Marks (emphasis)

Markdown is plain text, so you can always type the markers yourself:

When you want You write
bold **bold**
bold, alt __bold__
italic *italic*
italic, alt _italic_
bold + italic ***both***
strikethrough ~~gone~~
inline code `code`

Or let the mode do it: C-c C-x C-f ( markdown-ts-emphasize ) then a single key:

  • b bold, B bold with underscores
  • i italic, I italic with underscores
  • a bold + italic
  • s strikethrough
  • c inline code
  • SPC remove emphasis at point

If a region is active, the formatting wraps the region. With no region, it wraps the word at point, or inserts the pair and drops point in the middle.

emacs_markdown_31_demo step 07

Tip: C-c C-x RET ( markdown-ts-toggle-hide-markup ) hides the markers themselves, so **bold** shows as bold . Very nice for reading while editing, like default org-mode .

emacs_markdown_31_demo step 08

Another tip: M-q fills correctly even inside lists and quotes.

Headings

Type them: # , ## , ... up to ###### . Setext headings ( === and --- underlines) are recognized, too.

Promote and demote without retyping the hashes:

  • M-<left> promote ( markdown-ts-promote )
  • M-<right> demote ( markdown-ts-demote )

And move a whole section, body and children included:

  • M-<up> ( markdown-ts-move-subtree-up )
  • M-<down> ( markdown-ts-move-subtree-down )

TAB on a heading cycles its visibility (outline folding). The mode is an outline-minor-mode citizen, so folding just works. S-TAB on a heading will cycle the visibility of all headings.

emacs_markdown_31_demo step 09

IMPORTANT : By now, you can see this mode tries, when possible, to draw parallels with org-mode , so Emacs users used to it can have fewer problems adapting to markdown . If these bindings don't suit you, everything can be customized.

Listings (lists and checkboxes)

Type - item , + item , * item or 1. item .

  • M-RET new list item ( markdown-ts-insert-list-item )
  • RET is smart: markdown-ts-newline continues the list for you
  • M-<left> / M-<right> promote/demote the item
  • C-c C-r renumber an ordered list ( markdown-ts-renumber-list )
  • C-c C-c toggle a task checkbox ( markdown-ts-toggle-checkbox )
  • M-q fills correctly inside an item

Task lists are the GFM ones:

Raw mode:

emacs_markdown_31_demo step 10

With markup hidden:

emacs_markdown_31_demo step 11

Note the bullets and boxes you see if you toggled C-c C-x RET are display only. The buffer still holds - and [x] . See markdown-ts-unordered-list-marker , markdown-ts-checked-checkbox and markdown-ts-unchecked-checkbox .

Blocks

C-c C-, ( markdown-ts-insert-structure ) then one key:

  • ` fenced code block, prompts for the language
  • ~ tilde fenced code block
  • q block quote
  • d divider (thematic break)
  • t table

If a region is active, it wraps the region instead of inserting an empty block.

emacs_markdown_31_demo step 12

With markup hidden:

emacs_markdown_31_demo step 13

Code blocks

This is the party trick. A fenced block tagged with a language is fontified by that language's own mode:

Missing colors typically means a missing grammar, same story as the yaml header earlier.

Better than colors: put point inside the block and you are in markdown-ts-code-block-in-context-mode (lighter [code] in the mode-line). Inside it:

  • TAB indents like the language does
  • RET newline and indent like the language does
  • M-q fills like the language does
  • M-. jumps to definition via xref

Move to the next/previous blocks with C-c C-v n and C-c C-v p .

Non tree-sitter modes work too, elisp included. Knobs: markdown-ts-code-block-modes , markdown-ts-default-code-block-mode , markdown-ts-fontify-code-blocks-natively .

An example raw:

emacs_markdown_31_demo step 14

With markup hidden:

emacs_markdown_31_demo step 15

Tables

Insert one with C-c C-, t or M-x markdown-ts-table-insert-table , which asks you to specify the number of rows and columns to insert.

Inside a table you are in markdown-ts-in-table-mode (lighter [table] ) and the keys change:

  • TAB / S-TAB next / previous cell (also formats your table)
  • RET / S-RET next / previous row
  • M-RET insert row below
  • M-<up> / M-<down> move row
  • M-<left> / M-<right> move column
  • M-S-<up> insert row above, M-S-<down> delete row
  • M-S-<right> insert column left, M-S-<left> delete column
  • C-c C-c align the whole table
  • C-c C-t a set column alignment (left, center, right)
  • C-c C-t t transpose the table

Plus, from the menu: clone rows and columns, CSV/TSV import of a region and CSV/TSV export of the table.

emacs_markdown_31_demo step 16

NOTE: There are some limitations when working with tables at the moment, mostly due to how the grammar parses them, so you may bump into unfontified stuff while typing. All valid tables according to the GFM spec should be good to use, though.

Links are the usual [text](url) and [text][ref] . Fragment links like [intro](#intro) are clickable and jump to the heading in the buffer, using GitHub style slugs by default.

Images render inline. C-c C-x C-v toggles them ( markdown-ts-toggle-inline-images ). See markdown-ts-image-max-width and markdown-ts-display-remote-inline-images for how big and whether remote URLs are fetched.

Markdown: emacs_markdown_31_demo step 17

After C-c C-x C-v : emacs_markdown_31_demo step 18

After C-c C-x RET : emacs_markdown_31_demo step 19

Moving around

  • TAB cycle folding at point
  • C-c C-n / C-c C-p next / previous heading
  • C-c C-u up to parent heading
  • C-c C-f / C-c C-b next / previous heading, same level
  • M-x imenu jump to any heading or named code block by completion
  • C-c C-v n / C-c C-v p next / previous code block

markdown-ts-default-folding decides how a file opens: everything shown, or folded.

markdown-ts-view-mode

M-x markdown-ts-view-mode read-only mode with a single key navigation: n , p , u , f , b , TAB . Good for reading a README without fear of typing into it.

emacs_markdown_31_demo step 20

Everything below lives in markdown-ts-mode-x.el , which is why we loaded it back in the setup.

TOC

A table of contents is delimited by HTML comments, so it survives rendering anywhere:

  • M-x markdown-ts-toc-insert-template inserts those markers, basic or complete (the complete one lists every parameter with its default)
  • M-x markdown-ts-toc-generate fills them in, and refills on every call
  • M-x markdown-ts-toc-clear empties, markdown-ts-toc-clear-and-remove also removes the markers
  • M-x markdown-ts-toc-update-before-save-mode regenerates on save

Parameters go inline in the opening comment: min-depth , max-depth , candidates , from , style , indent , no-link , relative-depth , ignore . A buffer can hold more than one table with different parameters. Candidates are not only headings, list items, setext headers and named code blocks can feed a table too.

Raw:

emacs_markdown_31_demo step 21

With markup hidden:

emacs_markdown_31_demo step 22

Exporting

M-x markdown-ts-convert converts the buffer, markdown-ts-convert-file a file. You get asked for the format and the converter, unless you set markdown-ts-default-converter . Supported out of the box:

  • PDF via pandoc
  • HTML via pandoc , cmark , cmark-gfm , markdown , markdown.pl

With a prefix argument the result is displayed, by default with eww . See markdown-ts-convert-display-function to open in a browser instead. That is your somewhat 'live' preview. Converting is not (yet) automatically when you make changes, maybe in the future.

Example using eww , split manually made for this demo:

emacs_markdown_31_demo step 23

Spec at hand

M-x markdown-ts-browse-commonmark-spec and M-x markdown-ts-browse-gfm-spec open the specs, for when you need to settle an argument.

Experiment with eglot and eldoc

This is still experimental within the experimental, so don't blame eglot 's author if something goes wrong. Send a bug report to markdown-ts-mode instead.

If you set this:

Eglot will try to render documentation (usually Markdown provided by the LSP server) using markdown-ts-mode .

emacs_markdown_31_demo step 24

Again, we are still shaving off some rough edges here, and results may vary. Please do help us test this, though.

Play with options

M-x customize-group RET markdown-ts RET and go through it. Some of the customs worth a look at first:

  • markdown-ts for display: markup hiding, ellipsis, bullets, checkboxes, thematic break and hard line break characters, inline images, folding on open
  • code blocks: markdown-ts-code-block-modes , markdown-ts-default-code-block-mode , markdown-ts-enable-code-block-context-mode
  • tables: markdown-ts-enable-table-mode , markdown-ts-table-auto-align , markdown-ts-table-default-column-width
  • markdown-ts-convert for exporting
  • markdown-ts-toc for tables of contents

Faces are customizable too, one per Markdown element.

How you can help

The best way you can help is simply by using it. Try it with your Markdown files, play with the different features, and see what needs improvement or what breaks.

If you find something that doesn't work as expected, please report it as a bug from Emacs itself with M-x report-emacs-bug RET . Include a small example that reproduces the problem whenever possible. This is especially useful for issues involving fontification , tree-sitter grammars, tables, code blocks, or interactions with other modes.

We're still polishing the rough edges, so bug reports, feedback, and real-world testing are very welcome.

I found a bug, is it because markdown-ts-mode is buggy?

Some of the surprises you may hit while using markdown-ts-mode might be the mode, some might be the grammar, some might come from how tree-sitter is integrated into Emacs, or from the tree-sitter ecosystem as a whole. Knowing about this upfront helps understanding that debugging is challenging.

Grammars are a shared, external asset

A grammar is not written for Emacs. The very same tree-sitter-markdown is consumed by other editors and tools, so any change to it is negotiated among all of its users. That is great for the ecosystem, and it also means a fix we would like to see may take a while to land, or may never land in the shape we would prefer. When that happens, we work around it inside the mode as best we can, and report the issue upstream.

So, if you find something that looks like a mode bug and the answer turns out to be "the grammar parses it this way", now you know where that answer comes from. Please do report it anyway, we would rather hear about it twice than not at all.

Building grammars has its own quirks too. Not every grammar builds with make and a C compiler alone: several are generated from a JavaScript definition, so their build path expects the tree-sitter CLI, and sometimes a Node.js installation, to be available. This is a good part of why pre-compiled grammar bundles and distro packages are so popular. As said before, I still prefer compiling them interactively from Emacs, but now you know why your distro may be pulling in more than you expected.

Indirect buffers

This one deserves an explicit warning, because it surprises people: tree-sitter and indirect buffers do not get along.

  1. Parsers are not shared with indirect buffers. They belong to the base buffer, and an indirect buffer starts with none. You either copy them over manually, or re-instantiate them by enabling a major mode in the indirect buffer.

  2. Font-lock in indirect buffers is not supported at all. This is a limitation in Emacs itself.

The practical consequence is that (at least at the moment of this writing) if you use a package that clones a region into an indirect buffer, expect no fontification there. This is not specific to markdown-ts-mode , it applies to every -ts-mode , and it is not something we can fix from the mode's side.

Further reading

If this guide got you interested, there is a lot of good material out there about writing and using tree-sitter modes. Stéphane Marks, my partner in crime on this mode, put together the list below, and it is too good to keep to ourselves. Some of it may be a little stale by now, tree-sitter moves fast, but the reasoning in these articles holds up:

And, of course, the notes from the people who built all of this into Emacs, Yuan Fu and Juri Linkov, which are the closest thing we have to a canonical reference:

Is this going to be out of the experimental tag on next Emacs release?

In this post beginning I wrote:

What this means? Should you use it or not? Is this ready? Is this just a sketch of a mode?

Now you probably have a better answer.

experimental does not mean markdown-ts-mode is just a sketch or that it is missing the basic features you would expect from a Markdown mode. It means the mode is still evolving, and we are not yet ready to promise that its API, behavior, or some of its features won't change.

So, should you use it? Yes! If you are comfortable with the experimental label, please give it a try. The more people using it with different Markdown files, configurations, and workflows, the easier it is for us to find issues and fix it.

Will it be out of experimental in the next Emacs release? Maybe, we sure are working towards it! We will see. There are still things to polish, limitations to work around, and feedback to process before we can make that call.

For now, consider this your invitation to play with it. And if you find something weird, don't just work around it, let us know. That's how we get it ready.

Show HN: RealDiff – runtime behavior diffing for pull requests (six languages)

Hacker News
github.com
2026-08-27 09:17:31
Comments...
Original Article

CI Release License: MIT .NET 8

RealDiff finds runtime behavior changes that ordinary source review misses .

It builds two Git revisions, observes their tests, learns a noise baseline from three base runs, and reports the first changed behavior in each call tree. A source diff tells you what was edited. RealDiff tells you what the edit did, including effects in files the pull request never touched.

Why use it?

A harmless-looking refactor can change behavior far from the edited file:

 public static List<(int Priority, T Value)> ByPriority<T>(
-    this IEnumerable<(int Priority, T Value)> src)
-{
-    var list = src.ToList();
-    list.Sort((a, b) => a.Priority.CompareTo(b.Priority));
-    return list;
-}
+    this IEnumerable<(int Priority, T Value)> src) =>
+        src.OrderBy(item => item.Priority).ToList();

List.Sort is not stable; OrderBy is. In the included demo, that one-line infrastructure change alters an unedited pricing engine:

RealDiff: 1 behavior gap outside this diff

DiscountEngine.SelectDiscount returned "CLEARANCE_40",
now returns "SEASONAL_15".

CheckoutTotals.Compute returned 60, now returns 85.
2 of the 3 tests that executed this did not assert on the change.

The edited helper is in Infrastructure.Collections ; the observed effect is in Commerce.Pricing . Run the included demo below, or inspect the maintained public .NET demo pull request and its successful hosted run .

Five-minute .NET demo

Prerequisites for this .NET demo: Git, .NET 8 SDK, and PowerShell 7. Java analysis additionally requires a JDK and the repository's Maven/Gradle wrapper or corresponding system tool; Node analysis requires Node.js and the package manager selected by its lockfile.

git clone https://github.com/issacnitin/RealDiff.git
cd RealDiff
dotnet build RealDiff.sln -c Release
pwsh -File tools/verify-diff.ps1 -Mutate -Change sort

The proof creates a temporary proposed-change tree, changes only SortingExtensions.cs , runs the base twice plus the change once, and writes findings.json . It verifies:

  • the edited file contributes zero traced members;
  • the frontier is Commerce.Pricing.DiscountEngine.SelectDiscount in an unedited project;
  • two call sites changed without an assertion reacting;
  • five diverged keys collapse to three frontier nodes;
  • the equal-priority selection is deterministic across fresh processes.

Run all maintained demo modes:

pwsh -File tools/verify-demo-fixtures.ps1

This covers sort stability, retry policy, and configuration parsing.

The public executable is a thin Rust launcher that owns argument routing, repository config loading, and detect . It starts a sibling self-contained managed component for ref resolution, builds, caches, instrumentation, and posting. The architecture then has one language-neutral trace contract, one tracer per runtime, and a single-pass streaming Rust diff, frontier, and findings engine:

flowchart LR
  L[Rust argv, config, detect] --> O[Managed orchestration]
  O --> D
  O --> J
  O --> N
  O --> G
  O --> R
  O --> P
  D[.NET / Cecil] --> T[realdiff.trace/1]
  J[Java / javaagent + ASM] --> T
  N[Node / CJS + ESM + Babel] --> T
  G[Go / stable AST rewrite] --> T
  R[Rust / stable syn rewrite cache] --> T
  P[Python / PEP 669 sys.monitoring] --> T
  T --> E[Rust matching, noise, frontier, and findings]
  E --> F[findings.json]
  F --> P[GitHub, Azure DevOps, MCP]
Loading

TRACE-FORMAT.md is the contract between tracers and the engine. The maintained .NET, Java, Node, Go, Rust, and Python gates apply the same conformance rules: identical method sets, per-key event counts and entry ordinals, source tripwires, digest proofs, and zero engine divergences from non-empty runs.

Status: early preview. The unified CLI detects .NET, Maven/Gradle Java, npm/pnpm/Yarn/Bun Node, Go modules, Cargo Rust, and Python 3.12+ repositories from conventional root markers.

Supported languages

Language Instrumentation Test/source integration Current limits
.NET 8 Mono.Cecil build-time IL weaving xUnit and portable PDBs Properties, events, and operators are policy exclusions. Type initializers are structurally unobservable because hooks run under the CLR type-initialization lock and can deadlock startup.
Java java.lang.instrument agent with ASM Maven/Gradle, JUnit/TestNG annotations, inferred or configured source roots Gradle source-set inference covers literal srcDir / srcDirs declarations; dynamic source-set configuration requires source_roots . Collection shape rules require java.util module access. Class initializers are structurally unobservable because hooks run under the JVM class-initialization lock and can deadlock startup.
Node / TypeScript CommonJS require hook and ESM loader with Babel npm, pnpm, Yarn Classic/Berry, Bun, direct JavaScript locations, TypeScript source maps, Jest/Vitest adapters Exactly one supported lockfile is required; workers are out of scope; generators and unsupported callables are skipped.
Go Stable module-aware AST rewriting into a build cache go test , original .go parser positions Dynamic interface/function boundaries and unrewritten goroutine boundaries are explicit skips.
Rust Stable syn / quote rewriting into a SHA-256 build cache cargo test , structural #[test] roots, original .rs parser positions Macro expansions, extern/const callables, unions, trait objects, and dependency-owned values are structurally unreachable because stable source rewriting cannot enter expanded/compiler-owned code or inject readers into dependency source. The MIR prototype emitted zero runtime events.
Python 3.12+ PEP 669 sys.monitoring attached at process start; no build, bytecode weaving, or AST rewriting pytest and unittest structural roots; co_filename / co_firstlineno ; source AST inventory Native/C callables are structurally unobservable because they have no Python frame for sys.monitoring ; synthetic code without repository source and module/class setup bodies are explicit unsupported boundaries. Python 3.11 and older are refused; there is no sys.settrace fallback.

Unresolved TypeScript source maps are not treated as a tracer limitation: RealDiff refuses to guess an original path, records the source as unresolved, and lowers attribution confidence instead of claiming a potentially wrong file.

Every tracer emits the same process-scoped NDJSON contract and a reconciled coverage manifest. A member reported instrumented must be capable of emitting, and every module must satisfy discovered = instrumented + skipped with zero patch failures.

Python differs from the compiled tracers because there is no build command to inject into. RealDiff prepends its staged sitecustomize.py to PYTHONPATH , attaches sys.monitoring before target imports, and runs the repository's tests unchanged. A side-effect-free AST pass inventories source members for the coverage manifest only; runtime events come exclusively from PEP 669. The base-trace cache remains sound: its key includes the staged Python tracer directory fingerprint, Python major.minor.micro , effective include/exclude scope, and redaction configuration.

For source resolution, a real co_filename beneath the repository plus co_firstlineno is debugInfo ; an absent/synthetic filename is debugInfoMissing ; and an unnormalizable or external real path is unresolved . Python does not need generatedState because suspended callables retain their original code object, and it has no safe declaringType fallback.

Python value support is explicit:

Confidence Shapes
Exact None , missing values, booleans, arbitrary integers, floats including canonical NaN and distinct -0.0 , strings, bytes, and exact built-in list , tuple , dict , set , and frozenset ; complete instance __dict__ state when no other state channel exists.
Partial Properties, __slots__ , __getattr__ , overridden __getattribute__ , container subclasses, unreadable fields, depth/breadth limits, and display truncation. Every unread region emits a counted <skipped:Python:...> , <error:Python:...> , <depth:...> , or <truncated> marker.
UnsupportedShape Native/C callables without Python code objects, dynamic/synthetic code without repository source, and executable module/class setup bodies.

The canonicalizer never invokes a property, descriptor, user iterator, repr , equality, hash, formatting callback, __getattr__ , or overridden __getattribute__ . Redaction is applied after the complete canonical value is hashed, matching the other language contracts.

Cross-language release demos

The v0.4.0 release is exercised by six public sort-stability pull requests. Each fixture has exactly three tests, changes one configuration file, and leaves two broad assertions passing while one exact tie-winner assertion reacts. In every packaged run, the edited file contributes zero traced members, the frontier is in unedited pricing code, at least one call site is untested, and no tooling or manifest noise is present.

Language Matched keys Frontier collapse Pull request Hosted workflow
.NET 319 9 to 3 (3.0x) realdiff-sort-dotnet#1 workflow
Node 129 117 to 3 (39.0x) realdiff-sort-node#1 workflow
Java 132 117 to 3 (39.0x) realdiff-sort-java#1 workflow
Go 315 9 to 3 (3.0x) realdiff-sort-go#1 workflow
Rust 312 9 to 3 (3.0x) realdiff-sort-rust#1 workflow
Python 310 6 to 3 (2.0x) realdiff-sort-python#1 workflow

Two fresh packaged runs per language produced identical normalized behavioral artifacts. Each hosted workflow also posted exactly one RealDiff PR comment.

Install the CLI

Use the all-language container

The published Linux image contains the RealDiff CLI, default Rust diff engine, .NET 8 SDK/tracer, Java 17 agent, Node 24 tracer, Go rewriter, stable Rust toolchain/tracer, and Python 3.12 sys.monitoring tracer with pytest. The host needs only Docker:

docker pull ghcr.io/issacnitin/realdiff:v0.4.0
docker run --rm \
  --volume "$PWD:/workspace" \
  ghcr.io/issacnitin/realdiff:v0.4.0 \
  /workspace --base origin/main --pr HEAD \
  --findings /workspace/.realdiff/artifacts/findings.json

The normal image entrypoint is realdiff ; no PowerShell wrapper is involved. The unified CLI orchestrates .NET, Java, Node/TypeScript, Go, Rust, and Python repositories.

The current locally verified Linux/amd64 image is 926,593,250 bytes by Docker image inspection and includes stable Rust 1.98, Python 3.12 with pytest, and a native linker. The container workflow reports the exact size for every published build.

Install the GitHub release

Download the archive for linux-x64 , linux-arm64 , darwin-arm64 , darwin-x64 , or win-x64 from the v0.4.0 release . Verify it against SHA256SUMS , extract it, and place the extracted directory on PATH . The executable is self-contained; the host does not need a .NET runtime.

sha256sum --check SHA256SUMS --ignore-missing
tar -xzf realdiff-v0.4.0-linux-x64.tar.gz -C "$HOME/.local/lib/realdiff"
ln -s "$HOME/.local/lib/realdiff/realdiff" "$HOME/.local/bin/realdiff"
realdiff --help
Get-FileHash .\realdiff-v0.4.0-win-x64.zip -Algorithm SHA256
Expand-Archive .\realdiff-v0.4.0-win-x64.zip "$env:LOCALAPPDATA\RealDiff"
& "$env:LOCALAPPDATA\RealDiff\realdiff.exe" --help

The complete extracted directory must remain together because the Rust realdiff launcher starts realdiff-managed beside it and the directory also contains the native engine, language tracers, and separately launched .NET Weaver. The NuGet tool package remains available as a framework-dependent managed compatibility distribution:

dotnet tool install --global RealDiff.Tool --version 0.4.0 --add-source .
realdiff --help

Build and install from source

git clone https://github.com/issacnitin/RealDiff.git
cd RealDiff
pwsh -File tools/package-cli.ps1
dotnet tool install --global RealDiff.Tool `
  --add-source ./artifacts/packages
realdiff --help

The packaging wrapper builds and stages the shaded Java agent, Node tracer with production dependencies, stable Rust tracer for the current RID, and current host's Rust diff engine before packing the tool. An ordinary dotnet build remains independent of Maven, npm, and Cargo.

To update an existing source installation:

dotnet tool update --global RealDiff.Tool `
  --add-source ./artifacts/packages

You can also run the built DLL directly:

dotnet build src/RealDiff.Cli/RealDiff.Cli.csproj -c Release
dotnet src/RealDiff.Cli/bin/Release/net8.0/realdiff.dll --help

Run an analysis

RealDiff needs a repository path and two Git refs. The target repository must build in the current environment.

realdiff C:\src\my-service `
  --base origin/main `
  --pr HEAD `
  --findings C:\temp\realdiff\findings.json

Useful options:

--work <directory>      Override the temporary work directory
--findings <file>       Write canonical machine-readable findings
--cache-dir <directory> Override the local base-trace cache directory
--cache-retention <n>    Expire cached traces after a stated window, for example 12h or 7d
--keep-traces <n>        Opt in to retaining working traces for a stated window
--keep                  Keep temporary Git worktrees; traces are still deleted by default
--ci=github             Resolve refs from a GitHub pull_request event
--ci=azuredevops        Resolve refs from Azure Pipelines variables

The streaming Rust engine implements trace loading, matching, noise filtering, divergence construction, frontier detection, attribution, baseline suppression, and findings generation. REALDIFF_RUST_ENGINE can override the packaged native executable for development diagnostics.

PR comments use a high-confidence policy by default. A finding is high-confidence only when its frontier is verified, every compared digest is exact, an ancestor or descendant divergence connects it to the change through the call tree, and the same member showed no baseline-run or manifest nondeterminism. An edited file contributing zero traced members does not by itself disqualify the finding. Every finding remains in findings.json with confidence , confidenceFactors , nondeterminism , and commentSuppressionReasons ; comments show how many lower-confidence findings were retained only in the artifact. Pass --strict to include all unsuppressed findings in comments. The GitHub Action exposes the same behavior through strict: 'true' , and Azure Pipelines through behaviorDiffStrict: 'true' .

Exit codes:

Code Meaning
0 Analysis completed; no unexpected behavior changes
1 Analysis completed; behavior findings exist
3 Analysis refused because the evidence could not support a verdict
4 RealDiff could not instrument the repository
5 The unmodified repository did not build in this environment

Exit 3 is deliberately different from clean. RealDiff refuses when path attribution, source information, call-tree integrity, or coverage is insufficient.

.NET

Prerequisites: .NET 8 SDK. The repository must contain an SDK-style solution/project and xUnit tests using Microsoft.NET.Test.Sdk .

realdiff C:\src\dotnet-service --base origin/main --pr HEAD

Java

Prerequisites: a JDK and Maven/Gradle, either through the repository wrapper or installed on PATH . The CLI derives package scope, attaches the packaged Java agent to Maven test JVMs or every Gradle Test task, and opens the required java.util JPMS boundary. Conventional Maven roots and literal Gradle srcDir / srcDirs source sets are inferred; use source_roots for dynamic or otherwise nonstandard layouts.

realdiff C:\src\java-service --base origin/main --pr HEAD

Node and TypeScript

Prerequisites: Node.js, a test script, and exactly one of package-lock.json , pnpm-lock.yaml , yarn.lock , bun.lock , or legacy bun.lockb . The corresponding npm, pnpm, Yarn, or Bun executable must be on PATH . Installs are frozen ( npm ci , pnpm/Yarn Classic/Bun --frozen-lockfile , or Yarn Berry --immutable when .yarnrc.yml is present), and the base and PR revisions must select the same manager. TypeScript must emit usable source maps. Jest/Vitest callbacks must use the included adapters so the tracer can open structural test roots; an insufficiently correlated run is refused.

realdiff C:\src\node-service --base origin/main --pr HEAD

Go

Prerequisites: stable Go and standard go test tests. The CLI rewrites source only into an external cache, runs the configured tests there, and maps events back to the original .go files. The checkout is never mutated.

realdiff C:\src\go-service --base origin/main --pr HEAD

Rust

Prerequisites: stable Rust/Cargo and standard #[test] tests. The CLI rewrites only into an external content-addressed cache, runs tests there, and maps events back to original .rs files. The checkout is never mutated.

realdiff C:\src\rust-service --base origin/main --pr HEAD

Python

Prerequisites: Python 3.12 or newer with sys.monitoring , plus the repository's configured test runner. Automatic detection recognizes pyproject.toml , then setup.py , then requirements.txt when multiple markers share a directory. Python has no RealDiff build step: instrumentation attaches at interpreter process start and the original checkout executes unchanged. Older interpreters are refused rather than traced with sys.settrace .

realdiff C:\src\python-service --base origin/main --pr HEAD

The maintained reference gate runs both pytest and unittest with six tests each, then compares four pytest traces through the normal Rust engine. It currently reports 378 matched keys across 73 subject methods and 384 events per run, with zero divergences, tooling gaps, subject roots, or uncorrelated subject events. A second run proves the base-trace cache hits with the same Python version, tracer fingerprint, scope, and redaction settings.

The command is intentionally the same for every language. realdiff detect <repo> prints the effective language, work directory, entry point, commands, test projects, and scope. The legacy detect-language spelling remains an alias.

Repository configuration

Add .realdiff/config.yml when inference is incomplete or the repository uses custom commands:

language: node
workdir: services/api
build: npm ci && npm run build
test: npm test
test_projects:
  - tests/Api.Tests/Api.Tests.csproj
source_roots:
  - services/api/code/main
  - services/api/code/test
include_namespaces:
  - src
exclude_namespaces:
  - src/generated
redaction:
  names:
    - customer_password
  types:
    - SecretEnvelope
  paths:
    - generated
baseline:
  schema: realdiff.baseline/2
  acknowledgements: []
  ignorePaths: []
  ignoreMembers: []

Configuration overrides inference field by field; detection fills fields left unset. workdir must remain inside the repository. test_projects selects .NET test projects by repository-relative glob, while source_roots supplies repository-relative Java source directories. Include/exclude values augment tracing scope, redaction values augment the corresponding environment rules, and the nested baseline uses the same schema as .realdiff/baseline.yml .

The effective build and test commands run unchanged for both base and PR revisions. Custom tests do not replace instrumentation: .NET receives the woven/injected environment, Java receives the javaagent through JAVA_TOOL_OPTIONS , Node receives the loader/hooks through NODE_OPTIONS , and Go/Rust tests execute in their rewritten caches. Go exclude_namespaces entries may name exact repository-relative .go files; excluded functions remain executable through passthrough companions but are recorded as ExcludedByScope and emit no events. A command that exits successfully but produces zero trace events is refused with exit 3 and reports the command and trace/manifest counts.

Automatic detection recognizes conventional root or unambiguous nested .sln / .csproj , Java pom.xml / build.gradle / build.gradle.kts , Node package.json , Go go.mod , Cargo Cargo.toml , and Python pyproject.toml / setup.py / requirements.txt entry points. Java execution prefers mvnw / gradlew and falls back to Maven/Gradle on PATH ; Node execution selects npm, pnpm, Yarn, or Bun from its single lockfile and refuses missing or ambiguous lockfiles. Mixed-language repositories, monorepos, and multiple entry points are refused rather than guessed; set language and workdir (plus both commands when the language normally has a build step and no conventional entry point exists) to resolve them.

Base trace cache

RealDiff caches the three validated noise-baseline traces when --cache-dir is supplied. Persistence is opt-in. The key contains the target SHA, language, a content fingerprint of the installed tracer, and the effective scope/redaction configuration. A tracer, scope, or redaction change therefore cannot reuse stale evidence. The storage boundary is pluggable; this release includes the local-directory backend, which can be placed on a CI-native or S3-compatible mounted cache. Entries expire after one day by default; use --cache-retention to state a different window.

On a hit, PR analysis restores the three baseline samples and performs only the PR instrumented run. A missing, malformed, or unavailable cache entry is reported as a miss and falls back to the existing four-run path. The console and findings.json.baseTraceCache report hit , miss , or disabled , the cache key/backend, and measured baseline wall-clock time saved.

On the 99,000-event-per-run FluentValidation scale case, a cold four-run analysis took 339.705 seconds and the subsequent cache-hit analysis took 53.962 seconds: an 84.1% reduction, or 6.3 times faster. The warm run spent 13.264 seconds building, 2.729 seconds weaving, 11.844 seconds in its single instrumented run, 10.386 seconds diffing, and 6.503 seconds finding the frontier. These are measurements from one Windows development machine, not performance guarantees; full methodology and the cold-run breakdown are in evidence/FINDINGS.md .

Every analyzed findings.json includes timings for build, weave, instrumented runs, cache restore/store, engine diff, engine frontier, and their measured total. This makes CI cost visible without parsing console output.

On retained FluentValidation #2136, the default Rust path measured 6.626 seconds cold and 7.331 seconds warm across diff plus shared frontier, with 321.410/314.102 MiB host process-tree peaks. C# measured 13.685/14.037 seconds and 2,130.137/2,155.504 MiB.

The like-for-like container proof separately sampled descendant process RSS and cgroup-v2 accounting. Cold/warm process-tree peaks were 1,777.156/2,064.219 MiB; memory.current peaked at 2,661.461/2,524.680 MiB. The cold cgroup split was 1,259.879 MiB anonymous and 1,345.234 MiB file cache; warm was 1,555.715 MiB anonymous and 926.832 MiB file cache. The previously observed 1.96 GiB ceiling was a sparse-sampling artifact, not the container ceiling. Provision above the observed 2.66 GiB peak with workload margin. Full methodology and byte-equivalence gates are in evidence/RUST-STREAMING-KILL-GATE.md and evidence/CONTAINER-PROOF.md .

Warm a target branch from a nightly job without running a synthetic PR comparison:

realdiff warm C:\src\my-service --target origin/main --cache-dir C:\ci-cache\realdiff

Suppression baseline

RealDiff automatically applies .realdiff/baseline.yml from the analyzed repository. Suppression is a policy projection: every raw member and the original unexpectedMembers count remain in findings.json , while matched members receive suppression metadata and additive actionable/suppressed counts control process and posting gates. Use --no-baseline to inspect the raw result or --baseline <file> for a nonstandard path.

Write or merge 30-day acknowledgements for every currently actionable member in one command:

realdiff baseline write --findings .realdiff/artifacts/findings.json

Use --expires 90d to choose another window or --no-expiry for permanent policy. Re-running the command is idempotent and adds only actionable members not already acknowledged.

schema: realdiff.baseline/2
acknowledgements:
  - id: accepted-pricing-change
    member: Commerce.Pricing.DiscountEngine.SelectDiscount(System.Decimal)
    path: src/Commerce.Pricing/DiscountEngine.cs
    baseDigest: 'sha256:4ce90f...'
    prDigest: 'sha256:809af1...'
    reason: Approved pricing migration
    expires: 2026-09-30
ignorePaths:
  - id: generated-sources
    pattern: '**/generated/**'
    reason: Generated files are reviewed through their source templates
ignoreMembers:
  - id: legacy-cache
    pattern: Legacy.Cache.*
    reason: Known nondeterministic legacy cache

Rule IDs must be unique. Acknowledgements match an exact member, path, and base/PR behavior-digest pair; changing either observed behavior resurfaces the finding. Deliberately broad path and member ignores are syntactically separate and use case-sensitive * , ** , and ? globs. An expiry before the current UTC date disables the rule. Active rules matching no current member/path are stale; acknowledgements whose member/path still exists but whose digest pair no longer matches are reported separately as changed behavior in findings.json.baseline.digestMismatchEntries and PR summaries. Provider comments show suppressed member/call-site counts and link to the committed baseline.

Trace security and threat model

Trace events contain method identities, source locations, test identities, call topology, and canonicalized argument and return values. Those values can include credentials, personal data, and business-sensitive state. Treat an unredacted trace as sensitive build output.

Redaction is on by default. Names matching password , token , secret , key , ssn , email , auth , or credential render as <redacted> . Credential-shaped strings such as JWTs, AWS access-key IDs, PEM headers, and long base64 runs are also redacted. Add name patterns with REALDIFF_REDACT_NAMES , whole runtime types with REALDIFF_REDACT_TYPES , and repository directory prefixes with REALDIFF_REDACT_PATHS ; lists use commas or semicolons. Types and paths are still digested but never rendered.

Redaction does not weaken comparison: SHA-256 digests are computed from the complete real canonical value before display redaction. Consequently, two different secrets still produce a behavior divergence even when both sides display <redacted> . Redaction does not hide method names, source paths, test names, object shape, non-matching values, exception types, digest equality, or the fact that a sensitive value changed. Name rules also depend on names retained by source/compiler metadata, so content, type, and path rules should protect contexts where names may be stripped.

Working traces are deleted after analysis by default; findings.json persists. --keep retains worktrees but not traces. Diagnostic retention requires --keep-traces 12h (or another explicit hours/days window), which writes trace-retention.json with the expiry; later CLI runs prune expired sibling work directories. Base-trace caching is separately opt-in with --cache-dir and an explicit/default cache retention window. CI storage lifecycle policy remains the enforcement boundary after a retained work directory or cache directory is uploaded elsewhere.

Read the result

findings.json is the stable integration surface. A condensed example:

{
  "status": "analyzed",
  "verdict": "findings",
  "summary": {
    "unexpectedMembers": 1,
    "unexpectedCallSites": 3,
    "editedFiles": 1,
    "exercisedEditedFiles": 0
  },
  "members": [
    {
      "memberName": "Commerce.Pricing.DiscountEngine.SelectDiscount(System.Decimal)",
      "attribution": "unexpected",
      "distinctTestCount": 3,
      "untestedCallSiteCount": 2,
      "assertionReactionSummary": "3 tests executed this; 1 test had an assertion react."
    }
  ]
}

Key concepts:

  • Expected : behavior changed in an edited file.
  • Unexpected : behavior changed in a file outside the source diff.
  • Behavior gap : at least one executing test did not react to the changed behavior.
  • Test-covered change : every executing test reacted. It is recorded as evidence, not framed as an unasserted breakage.
  • Frontier : the lowest changed member whose compared descendants are unchanged. Changed callers above it are collateral and suppressed.
  • Coverage : every edited file reports traced members, call sites, and calls. Zero means not observed, never “unchanged.”

GitHub Actions

Use the published Docker Action after a full-history checkout:

permissions:
  contents: read
  pull-requests: write

steps:
  - uses: actions/checkout@v4
    with:
      fetch-depth: 0
  - uses: issacnitin/RealDiff@v0.4.0
    env:
      GITHUB_TOKEN: ${{ github.token }}

It writes .realdiff/artifacts/findings.json , restores or updates .realdiff/cache , and posts with the warn-only gate by default. Inputs expose the work, findings, cache, retention, gate, and posting settings.

This repository includes three workflows:

  • CI builds, runs executable proofs, and packs the CLI.
  • Container builds the single image, proves full Node and Java analysis on Linux with Docker as the only host prerequisite, reports image size, and publishes commit and channel tags to GHCR.
  • RealDiff blast radius analyzes pull requests, uploads findings.json , and posts comments for same-repository PRs.

For your own repository, copy blastradius.yml and adjust namespace exclusions if needed. The workflow uses immutable pull-request SHAs and full Git history.

RealDiff anchors a cause comment on the changed hunk and links to the affected unedited source. GitHub does not allow a review comment directly on a file absent from the PR diff.

Fork pull requests are analyzed without posting because GitHub supplies a read-only token. The machine-readable artifact remains available.

Azure Pipelines

azure-pipelines.yml provides the equivalent Azure Repos container job. It pulls the same all-language image and runs only Bash and native commands; the hosted agent does not install .NET, Java, Node, Go, Maven, npm, or PowerShell for RealDiff. Add it as a Build validation branch policy; Azure Repos does not honor YAML pr triggers.

realdiff <repo> --ci=azuredevops --findings findings.json
realdiff post --provider=azuredevops --findings findings.json

The default posting gate is warn-only . Switch to fail-on-findings only after validating the signal on your repository.

Optional grounded explanations

Deterministic findings never depend on a model. A trusted posting process may set ANTHROPIC_API_KEY to request an explanation constrained to exact observations, call paths, consequences, and diff citations.

Do not expose a persistent model credential to a job that builds untrusted pull-request code. The included GitHub workflow intentionally does not use one. Missing, rejected, or unavailable model output never changes the deterministic result.

How it works

flowchart LR
    A[Resolve base and proposed refs] --> B[Create isolated worktrees]
  B --> C[Build and instrument code]
    C --> D[Run base three times]
    C --> E[Run proposed change once]
    D --> F[Learn nondeterministic keys]
    E --> G[Compare calls and values]
    F --> G
    G --> H[Collapse to behavior frontier]
    H --> I[Attribute edited vs unedited]
    I --> J[findings.json and PR comments]
Loading
  1. Language instrumentation : Mono.Cecil weaves .NET IL; Java uses an ASM agent; Node uses Babel load hooks; Go and Rust use stable source rewriting into external build caches.
  2. Runtime capture : arguments, return values, exceptions, call order, source locations, and test roots are recorded as NDJSON.
  3. Noise baseline : differences found among base runs are excluded from proposed-change evidence.
  4. Frontier analysis : changed callers are collapsed onto the first changed behavior in each call tree.
  5. Assertion reaction : a changed test-root trace indicates that an assertion reacted; unchanged test roots identify partial or missing oracles.
  6. Honest refusal : incomplete evidence produces a non-verdict rather than a false clean result.

Honest limitations

RealDiff analyzes executed behavior, not all possible behavior. It complements static analysis and review; it does not replace either.

  • unexecuted methods have no runtime evidence;
  • .NET type initializers are skipped to avoid CLR initialization-lock deadlocks;
  • .NET properties, events, and operators are skipped by the current scope policy;
  • Java static initializers and Node generators or unsupported callable shapes are recorded as skipped coverage boundaries;
  • Node worker threads are out of scope in version 1 and are recorded as UnsupportedShape boundaries rather than silently omitted;
  • Node Map and Set internals cannot be read without iteration, so they are represented by explicit partial markers;
  • Rust opaque/generic/trait-object/union regions and unavailable macro expansions are explicit partial or unsupported boundaries;
  • generated members without a real repository source path cannot be attributed through a normal Git diff;
  • three base runs sample nondeterminism; they do not characterize every possible schedule or external dependency;
  • identical partial digests do not prove equality inside skipped, depth-limited, errored, or truncated regions;
  • traces can contain application values and should be handled as sensitive build artifacts;
  • target tests execute with the permissions of the CI agent; RealDiff is not a sandbox.

See evidence/FINDINGS.md for measured instrumentation and scale results.

Repository layout

Path Purpose
src/RealDiff.Launcher.Rust Public argv/config/detect launcher and managed-process boundary
src/RealDiff.Engine.Rust Single-pass streaming Rust diff, frontier, baseline policy, and findings engine
src/RealDiff.Cli Managed refs, builds, caches, instrumentation orchestration, and PR providers
src/RealDiff.Tracer .NET runtime hooks, value rendering, coverage manifests
src/RealDiff.Java.Agent Java agent, ASM rewriting, JVM canonicalizer
src/RealDiff.Node CommonJS/ESM hooks, Babel rewriting, Node canonicalizer and test adapters
src/RealDiff.Go Stable Go source rewriter and runtime
src/RealDiff.Rust.Tracer Stable Rust rewrite cache, generated canonicalizer, runtime, and manifest finalizer
src/RealDiff.Contracts Trace and manifest wire formats
src/RealDiff.Mcp Optional MCP server over completed runs
tools/Weaver Mono.Cecil build-time instrumentation
samples/ and src/Commerce.Pricing Executable behavior-diff fixtures
tools/verify-*.ps1 End-to-end executable proofs

Contributing and security

Contributions are welcome. Start with CONTRIBUTING.md , follow CODE_OF_CONDUCT.md , and report vulnerabilities according to SECURITY.md .

See CHANGELOG.md for release history. RealDiff is licensed under the MIT License .

Aphantasia Beginner's Guide

Hacker News
aphantasia.com
2026-08-27 09:14:20
Comments...
Original Article

Aphantasia Beginner's Guide

If you've just discovered aphantasia and feel lost in understanding it, we made this Aphantasia Guide just for you.

CREATED BY - APHANTASIA NETWORK

🧠

Oh hello there curious mind! Welcome to the Aphantasia Beginner's Guide. Grasping the concept of a mind without images can be super baffling - but this aphantasia guide is here to illuminate the path for you. Dive on in!

How To Get The Most Out Of The Aphantasia Guide

See the table of contents below for everything in the Aphantasia Beginner's Guide. Here, you'll find assessments and experiments to pinpoint your experience, answers to those burning questions, communities to connect with, and a treasure trove of scientific insights. Each section is a revelation, so embark at your own pace!

So I Just Learned I Have Aphantasia

You know that great musical number " Does anybody else have this? " or the popular internet meme, " Can you picture a red apple in your mind? " Well, I just found out that most of you are seeing a juicy, shiny apple floating in your mind's eye and my mind is blown. I don't see any images in my mind. Yep, I have aphantasia. And if you're wondering, "Aphant-what now?" keep reading.

Aphantasia is the inability to visualize. Otherwise known as image-free thinking. In simpler terms, if you ask someone with aphantasia to imagine a beach, we think of the concept of a beach . We know what a beach is and can describe it, but we can't "see" it in our mind's eye. It's not just the visual sense that's impacted. Aphantasia can affect all or some of the other senses in your imagination...more on this later.

What is aphantasia?

Share

Do I Have Aphantasia? The Apple Test

Here's a simple and helpful test to determine if you have aphantasia. Imagine a red apple. Try to visualize it in your mind's eye. What do you see? Some people will conjure up clear images of an apple, some might see blurry ones, and a few can't see anything at all.

If you find yourself in the latter category, understanding that you've always interpreted phrases like "mind's eye" or "counting sheep" as mere metaphors, you have aphantasia.

The term "mind's eye" often gets thrown around, but for many, it's taken quite literally. When someone says they're "counting sheep" to fall asleep or talks about their "imaginary friend" from childhood, they are actually picturing these scenarios. For those with a highly visual imagination, these aren't just metaphors; they're real mental images.

To determine where you are on the visual imagination spectrum, the VVIQ is a recognized test that can help identify where you might fall on the spectrum.

Aphantasia Test

Share

What's It Like To Visualize?

Experiment with this apple illusion to see for yourself. Keep your gaze focused on the center point without moving your eyes for about 30 seconds, then turn your gaze to the blank white space and blink several times. You'll briefly see an afterimage of a red apple.

This afterimage illusion, while a product of perception, serves as a bridge to understanding visualization. For those with aphantasia, it's a rare opportunity to "see" what visualization might be like for some visualizers.

Learn more about the afterimage apple illusion.

Aphantasia Apple Illusion

What Do Most Visualizers "See"?

People's experience of visual imagination can range from subtle to incredibly realistic. For instance, when asked to imagine a seashell, some might see a simple white or pink curve, while others might visualize a detailed, photorealistic seashell with intricate patterns lying on a sandy beach. This ability to form mental images isn't just limited to objects; it can extend to people, places, events, and even abstract ideas.

The article " Visualizing the Invisible " delves deeper into the nuances of visual imagination. It highlights that the vividness of one's mental imagery isn't just about clarity or detail. Some people might only visualize things they've seen before, while others can conjure up entirely new images. The presence, arbitrariness, or controllability of these images can also vary.

For example, some individuals can easily create, hold, or modify a mental image, while others might find this challenging. Emotions, recent media consumption, and even whether one's eyes are open or closed can influence the type and clarity of our mental images.

How Do We Know People Are Actually Visualizing?

People have taken various physiological and behavioral tests in a research lab. Researchers have observed that people who report vivid imagery respond differently to these more objective measures than aphantasics. Although this doesn't let us know definitively that they vividly see an image, it all points to the fact that something is truly different between people who claim to see vividly and those who don't.

We can also see activation in the visual cortex during fMRI studies, the area in the brain that processes images from the eyes, further suggesting actual visualization. For more on the known neurodifferences in imagery experiences, check out these shocking insights . For a deeper dive into how this brain activation can be used to decode mental imagery, you might find this study enlightening.

How to Tell The Difference Between Visualizers And Conceptualizers

While visualizers "paint" vivid pictures in their minds, those with aphantasia lean more towards conceptual thinking, diving deep into ideas and concepts rather than visual scenes. Discovering the differences between visualizers and conceptualizers can be both enlightening and entertaining. Want a quick and fun way to spot the difference?

Try the Ball on the Table experiment . In under two minutes this playful experiment can shed light on the distinct thinking styles of visualizers and conceptualizers, offering a glimpse into the fascinating differences in our inner worlds. Credit to u/Caaaarrrl for this experiment.

Are You a Visualizer or Conceptualizer?

When you ask a visualizer about the ball on the table, most will immediately have answers to all of the questions. They are likely to provide extra details you didn't ask for. This is the first clue the individual may be picturing the scene in their mind. For example, a visualizer might say, "The ball looks like the Pixar Ball. It's yellow and features a blue strip with a red star. The ball is about the size of a baseball. It's on a wooden, oval-shaped table with scratches on top, etc."

Conceptualizers, on the other hand, approach this task differently. To them, the ball on the table is an idea. While they can anticipate the possible outcome – a ball, when nudged, might roll and likely fall off – many specific details, like the ball's color, its size, the material of the table, or the gender of the person, remain elusive to them. It's possible that they only acknowledge or consider these details when directly questioned about them. If you're more of a conceptualizer you grasp the core idea, but likely do not form a detailed mental picture. This is one of aphantasia's unique strengths, thinking more conceptually.

How Do I Explain Aphantasia To My Family And Friends

Breaking the news about your discovery of aphantasia to friends and family can be a daunting task, especially since it's a topic that's not commonly discussed. It's natural for them to have questions or even doubts (after all, with ~4% of the population having aphantasia , it's more likely that they can visualize).

To help you navigate this conversation, here's a sample dialogue that addresses some typical questions and concerns you might encounter.

Common Questions About Aphantasia

When you first tell someone you have aphantasia, a flurry of questions often follows. "Can you dream?" "How do you remember things?" "Do you recognize faces?" Dive into this section to arm yourself with answers and insights to these common curiosities. It's a journey of understanding, one question at a time.

Imagine a horse

Share

Common Misconceptions About Aphantasia

Understanding our cognitive differences is crucial, yet it's all too easy to apply the " aphantasia stamp " to every challenge we face once we uncover this facet of our minds. But resist the temptation! Not every hurdle is tied to our unique way of processing. Let's debunk some common misconceptions together.

I'm Struggling With My Aphantasia Discovery. Where Can I Go?

It's important to note that aphantasia is not a disorder . Yet, for ~35% of those with aphantasia , its discovery can be a significant psychological stressor. If you suspect you have aphantasia, it's always good to read more about it. If you find yourself struggling with your aphantasia discovery, consult a mental healthcare professional to understand it better.

Be aware, however, that many practitioners have yet to learn about aphantasia. Here's a resource on how to talk to a therapist about aphantasia , and a database of professionals we can vouch for.

Online Communities Where Aphants Hang Out

Discovering aphantasia can often feel like you've been handed a puzzle piece you didn't even know was missing. Suddenly, you realize that many people around you have been secretly visualizing their entire lives! Those movie "flashbacks" that seemed so dramatic? They're a real experience for some. And police sketch artists? They aren't just a figment of Hollywood's imagination. It's undeniably a lot to take in.

The initial shock can be overwhelming, and it's completely natural to have a strong reaction. But remember, you're not alone in this journey. Once you've had some time to process this newfound understanding of your mind, connecting with an online community can offer support, insights, and a sense of belonging. We're here to help you navigate this revelation and celebrate the unique way your mind works!

🌐 Community-Organized Groups

  1. 1
  2. 2
  3. 3

🏠 Aphantasia Network Community

  1. 1
  2. 2
  3. 3

Venture Deeper Down the Rabbit Hole of Aphantasia

Aphantasia is more than just a different way of thinking; it's a journey into understanding the intricacies of the human mind. For those intrigued and wanting to delve deeper into this invisible difference, there's a whole world waiting for you down the rabbit hole of aphantasia. Sign-up for our aphantasia newsletter to get weekly insights into the aphantasic experience.

Share

US Government Designates Host of Noblogs.org a "Global Terrorist"

Hacker News
crimethinc.com
2026-08-27 09:12:10
Comments...
Original Article

On August 26, 2026, the United States government classified the Italian collective Autistici/Inventati as a “Specially Designated Global Terrorist,” citing the collective’s “far-left” politics to justify the designation. They announced similar designations of the British group Palestine Action and the transnational Palestinian movement Masar Badil in the same statement.

Founded in 2001, Autistici/Inventati is a volunteer-run provider of privacy-oriented email, websites, mailing lists, blogs, and communications tools for users who prefer not to rely on corporate platforms. According to the US State Department, Autistici/Inventati hosts “roughly 16,000 mailboxes, 1,500 websites, 5,500 mailing lists, and 10,000 ‘blogs’ on its custom-built platform.”

Autistici/Inventati explain their values and goals in their manifesto :

We believe that communication must be free—and for free—and, therefore, universally accessible.

We try to accomplish all this by offering internet services (web sites, e-mail, mailing lists, chats, blogs, newsletters, and more) using our best skills and knowledge to defend both individuals or groups sharing our same aims or ideals. […]

We believe that media and communication should not be the exclusive domain of information professionals. We believe in the value of self-management: this is why we have no sponsors or funding of any kind, apart from voluntary donations from those who believe that our project is important and must survive. None of us earns a cent from this project (in fact, quite the opposite).

Many book fairs , radio programs, and other cultural projects rely on the Autistici/Inventati platform noblogs.org for website hosting. According to one anti-fascist research group , “Some of the most well-known NoBlogs sites belong to researchers who solely report on far-right hate and radicalization, never doing anything aside from showing you what exists.” Such researchers helped to identify the fascists who participanted in the “Unite the Right” rally in 2017, during which one Neo-Nazi murdered Heather Heyer in an actual act of terrorism.

The US State Department is rationalizing this designation by alleging that Autistici/Inventati “provides encrypted tools and services to numerous violent far-left extremist groups,” including Portland-based Rose City Antifa. Their claim about Rose City Antifa seems to be false , however, conflating Rose City Antifa with another project called Rose City Counterinfo.

On the basis of this error, the State Department rushed to proclaim an alleged “Portland Antifa connection to Hamas” and “Iran’s IRGC” [Islamic Revolutionary Guard Corps], with the sole justification being the allegation that an unnamed “extremist media group”—which they do not allege had any relationship to Rose City Antifa—had republished statements from Hamas and the IRGC on a website hosted by noblogs.org. This is representative of the dishonesty and erroneousness of the State Department press release as a whole.

When a military force carries out an attack on a village, the first thing they do is attempt to cut the communication lines that connect it to the outside world. We have to understand the attack on Autistici/Inventati the same way. Now that tech corporations from Meta to the platform formerly known as Twitter have showed that they are willing to ban whoever the US government instructs them to, the US government is going after groups that provide web services on a non-commercial basis.

Because there is no “domestic terrorist organization” designation in the United States, the Trump administration began its criminalization of anti-fascists by designating European anti-fascist groups as “terrorists.” They are targeting an Italian tech project for the same reason: they aim to put the pieces in place to criminalize domestic protesters by associating them with designated “Global Terrorist” groups.

According to the United States Department of the Treasury , starting on September 25, 2026, any transactions with Autistici/Inventati will be “prohibited by the Global Terrorism Sanctions Regulations.” 1 The press release from the Treasury stipulates:

Violations of US sanctions may result in the imposition of civil or criminal penalties on US and foreign persons.

Autistici/Inventati have released a short statement about the designation:

We deny all allegations included in the statements, while we strongly affirm our dedication to providing a platform of tools for digital self-defense, addressing the need of free communication for activists and other individuals, groups and associations.

We will not back down, we will keep doing what we have been doing all these years and we will do whatever is in our possibility to counter the false allegations made by a politically desperate administration with the sole intention of swaying people and media attention away from their own violence and warmongering.

Anti-fascism and anti-capitalism are not terrorism. Protesting is not terrorism. And everyone has the right to speak out and to struggle for humanity.

Building on the social media bans of the preceding years, the terrorist designation of Autistici/Inventati is an effort to suppress dissident media and a significant step towards state repression on the basis of ideology alone. This will not stop with anarchist projects, but will eventually extend across the political spectrum to everyone who does not fall in line with the administration, unless the administration is removed from power. The danger to all will increase until that occurs.

Of course, Donald Trump’s successors could keep repressive policies like this in place, much as Joe Biden did. We must make sure that there is enough political pressure on any political formation that could succeed the Trump presidency to compel them to roll back the repressive measures that Trump‘s administration introduced.


Further Reading

For a legal analysis of this designation, you could start here .


Meta will be happy with its $18bn US settlement – but the costs of child online safety will keep rising for big tech | Chris Stokel-Walker

Guardian
www.theguardian.com
2026-08-27 09:11:16
This week’s settlement without liability was pragmatic, but it doesn’t change the inevitability of further lawsuits around the world Not many people would count paying $18bn they didn’t expect to when they woke up that morning as a victory. Yet for Meta, the owners of Facebook and Instagram, the ag...
Original Article

N ot many people would count paying $18bn they didn’t expect to when they woke up that morning as a victory. Yet for Meta, the owners of Facebook and Instagram, the agreement with 52 US attorneys general to settle claims that it designed its products to be addictive to children, and misled people about their safety, could be described as a win of sorts.

Meta denies wrongdoing, and the amount it plans to pay will be spread over a decade. Some of it is contingent on other big tech firms not named in its case coughing up too. The cash is chump change for Meta , which made around $60bn in profit last year. More damaging to the tech giant in the long run could be the agreement to unwind some of the mechanics it has spent two decades perfecting to keep us on its platforms.

Under-18s in the US will face a default two-hour daily limit on Facebook and Instagram , with access blocked overnight – unless a parent changes the setting. Teachers will be glad to hear notifications will be muted during school hours, while teenagers will be nagged as much by the platform itself as their parents about exactly how long they have spent staring at their screens.

All of these are significant changes that materially change how the company’s products work – and all of them should be welcomed. But in lots of ways, Meta has got off lightly with this agreement, both in what it’s been asked to do and the fine it must pay.

What the decision shows, just months after Meta chose to fight its corner in court, and lost significantly, is how the economics of fighting social media litigation have changed. This settlement signifies an important and deliberate shift in strategy. In August, Meta went to court in New Mexico – a decision that cost it dearly. The judge there ordered the firm to pay $942m and overhaul some protections for children – a decision it is appealing. The fact that Meta lost that case, and was found to have done wrong, was far more damaging than this week’s settlement without liability, even if the amounts involved are smaller. Still, thousands more cases involving social media addiction claims are still wending their way through US courts.

And chastened by a couple of losses, it looks – at least in this instance – like Meta has taken the approach that a pyrrhic victory is better than the risk of another real loss. Settlements without admission of fault don’t set precedents, while court judgments absolutely do, in a way that could quickly spiral out of control for Meta’s product offering.

While Meta has had to make significant changes to its platforms as a result of this week’s settlement, it still ultimately has control over what changes are made, and has sought to limit them to the bare minimum. Settling, however expensive, is a way of protecting its core business proposition.

Meta now faces a Hobson’s choice when it comes to litigation. It can gamble on a jury and risk vast damages, damaging internal disclosures and a judge deciding which parts of Instagram or Facebook must change. Or it can pay an eye-watering but manageable sum to settle, negotiate the product changes on its own terms and staunch the bleeding.

That $18bn is certainly more than most companies could pay, but it pales in comparison with the $1.5tn Meta’s own PR team warned the case could cost it had it gone through the courts – and the more realistic $200bn the prosecuting lawyers sought to squeeze from the firm. And even more than that, Meta has managed to make some of the bill somebody else’s problem. About a third of the settlement it has agreed to pay is conditional on TikTok and YouTube introducing similar restrictions and each making matching payments. Meta is publicly calling on both companies to sign up.

As this is a negotiated settlement and one in which no one wins, but Meta certainly doesn’t lose not everyone has been won over. While attorneys general from 48 US states agreed to Meta’s proposition, Florida’s representative has publicly rejected the deal and intends to continue pursuing Meta. James Uthmeier dismissed the settlement as “peanuts” and said “We’ll see them at trial.”

Nor is this necessarily just an American story. The settlement formally applies only to the participating US states and territories. A Meta spokesperson told me it already offers strong protections for teenagers elsewhere. It will watch how the new measures work before deciding what comes next internationally.

skip past newsletter promotion

But running substantially different versions of Facebook and Instagram around the world is hardly attractive. And Meta has now demonstrated putting these restrictions in place is possible. Given the drive towards child safety online in the UK and Australia, it seems likely that politicians will soon ask why American teenagers get them and children in their own countries don’t. The UK’s own Online Safety Act is a useful stick for the government to wield in this instance, adding extra leverage to bring those changes here, too.

And it’s that which may prove the settlement’s biggest consequence. Meta has paid billions to manage to duck liability in one court case. But in doing so, it may have opened up the possibility of change in a raft of other countries.

  • Chris Stokel-Walker is the author of TikTok Boom: The Inside Story of the World’s Favourite App

Eight stable kernels for Thursday

Linux Weekly News
lwn.net
2026-08-27 09:10:02
Greg Kroah-Hartman has announced the release of the 7.2.1, 7.1.11, 6.18.47, 6.12.106, 6.6.154, 6.1.185, 5.15.218, and 5.10.267 stable kernels. Each of these has important updates throughout the tree; users are advised to upgrade. ...
Original Article

[Posted August 27, 2026 by jzb]

Greg Kroah-Hartman has announced the release of the 7.2.1 , 7.1.11 , 6.18.47 , 6.12.106 , 6.6.154 , 6.1.185 , 5.15.218 , and 5.10.267 stable kernels. Each of these has important updates throughout the tree; users are advised to upgrade.



to post comments

MIT's Ad Hoc Committee on AI Use in Teaching, Learning, and Research Training

Hacker News
aiandeducation.mit.edu
2026-08-27 09:07:45
Comments...
Original Article

2. Guiding Principles

We start by defining eight principles we relied on and that we hope will guide the Institute in the work ahead.

2.1. Be humble

Some technological innovations emerge gradually: As society and technology evolve in concert, mutual adaptation softens the impact. The computer – AI’s precursor and key enabler – fits this pattern. Other innovations land more abruptly, becoming socially consequential before individuals and institutions have time to adapt.

Society tends to peg the “birth” of a new technology as the point when it becomes readily usable. By that measure, generative artificial intelligence was “born” with the release of ChatGPT in late 2022. Public engagement with generative AI is therefore less than four years old. In that time, it has amassed more than a billion users, and the companies selling AI technology have come to dominate the headlines, the stock market, and public consciousness.

In other words, AI is progressing across almost every domain and on a timescale too compressed for society to properly observe and analyze its impacts and then gradually adapt.

This suggests our first guiding principle: We offer our proposals in a spirit of humility. Course corrections – perhaps even major ones – will be inevitable as the technology continues its relentless evolution and the Institute experiments and learns.

2.2. Be bold

Yet uncertainty can’t be an excuse for inaction. This is not a moment for patches and duct tape. The challenges AI presents in teaching and learning call for a bold strategic response – everywhere, and especially at MIT. With our Social and Ethical Responsibilities of Computing program 2 completing its seventh year, we are uniquely positioned to find ways to employ this new technology for the benefit of society, and for our students in particular.

AI also presents extraordinary opportunities, from unprecedented possibilities for individualized tutoring and coaching to a dramatic acceleration and revamping of research in many disciplines. Seizing these opportunities deserves and demands boldness too.

Bold thinking is especially important because our students will go on to help shape the intellectual, ethical, and technical direction of our society – and soon. We owe them a deep engagement in rich and constructive uses of AI, and a sophisticated understanding of its potential and its drawbacks. Their MIT experience should prepare them with the wisdom to help determine how and where AI is used for the betterment of society and the world at large.

2.3. Put humanity front and center

Facing a technology that already has such immense capabilities – built on, modeled after, and in many ways now exceeding human powers – the Institute’s fundamental challenge and most important goal must be to nurture and protect our shared humanity, and to value the MIT community, its members, and their flourishing above all.

In a listening session with instructors, we learned that some were considering using AI agents as research assistants instead of hiring undergraduates as UROPs. One can see the case for speed and efficient use of resources (especially now, when research resources are so constrained). But if those criteria come to dominate our decisions, we all have to ask, “What is it that we are here together to do?”

As a community, we need to keep in mind that although research is central to MIT’s mission, it’s more than an end in itself; on our campus, research is also an apprenticeship, a means of training the next generation of researchers to continue our work and drive our fields of inquiry forward. Using research as an opportunity for learning-by-doing may produce seeming “inefficiencies,” but that’s a feature, not a bug.

A focus on our humanity should also alert us to the fact that common current remedies for the problems AI creates can risk damaging the relationships between and among teachers and students. For instance, many instructors recounted that having to “police” unauthorized AI use was harming their connection to students (a dynamic made worse by the fact that, as we learned, AI detection software is quite unreliable). For their part, students fear being wrongly accused of AI cheating and are increasingly frustrated by instructors’ use of AI in areas that demand a human touch, such as grading, assignment creating, and feedback. Such an underground river of mutual suspicion is no foundation for a healthy classroom.

2.4. Lean into learning

Many problems and assignments used in MIT classes to reinforce learning and assess student progress can already be accomplished by AI. Unrestricted AI use by students can make some traditional assessments less reliable as indicators of individual learning, potentially weakening confidence in grades and credentials. For educators, this radical shift in norms and expectations can feel profoundly disorienting.

But as a community, what should worry us most is that many uses of AI deprive students of the opportunity to learn.

The threat AI poses to familiar ways of teaching and testing may be a blessing in disguise – because the changes are too sudden and severe to ignore. As the faculty on our committee can attest, for at least two decades, educators have lamented the strain on teaching and learning from fragmented attention, ubiquitous devices, a narrow preoccupation with grades rather than learning, and a weakening sense that students and teachers are joined in a common intellectual project.

As an institution that prides itself on the power of its distinctive educational recipe, it is up to MIT to seize the opportunity of this moment: to make sure that the undeniable changes imposed by AI become a tipping point, forcing us to deal decisively with the forces eroding our shared educational mission.

Leaning into learning means creating a new “social contract” between teachers and students. All of us who teach at MIT will need to be prepared to help students understand both that the process of education is necessarily a productive struggle, and that the most important product of their education is not a GPA or a diploma but themselves : their personal growth and intellectual maturity and the development of their own imagination, insight, and judgment.

Instilling these attitudes needs to become a central task for every educator, so that our students know not only what they should learn, but also how they should learn and why learning matters. We need to help them develop metacognitive abilities to think about thinking, to engage in reflective practices, and to enhance their sense of personal agency. This will require both dedication and fresh preparation on the part of instructors.

2.5. Teach with intentionality

Most classes taught at MIT will require careful review and, in many cases, substantial adaptation to survive an encounter with AI without serious disruption. AI will undermine the pedagogical assumptions that guided the choice of content, the methods of instruction, and the ways of assessing student performance.

In short, it’s time to reflect deeply and extensively on what we teach and how we teach it. Future class structures, assessments, and policies must be built with high intention and a clear sense of purpose, not merely tweaked in reaction to the immediate realities of AI. This does not mean, however, that every course must change in the same way.

The time-tested technique known as “backward design 3 ” offers a useful framework here. For instance, rather than beginning by asking whether AI should be allowed or prohibited in a specific subject, educators would begin by defining the purpose of the learning experience itself: what students should come to know, be able to do, and learn to value. Assignments and assessments can then be designed to measure and encourage those outcomes, using AI if it’s helpful but not if it isn’t.

The instructor time and effort required to redesign, reassess, or intentionally preserve existing structures is likely to be significant. But that process of pedagogical reflection and reasoning is valuable in itself. Intentional teaching promotes intentional learning; when instructors make clear why AI is permitted, limited, or required, students are more likely to understand the learning that’s being protected or developed.

In this way, backward design can help MIT preserve the purpose of its education while adapting honestly to the realities of AI. (Encouragingly, MIT’s Teaching and Learning Lab is well-equipped to help instructors master this tool.)

2.6. No one size fits all

No single approach to AI in education will serve MIT well. A poetry seminar, a mathematical proof course, and an architectural design lab logically entail different relationships to AI. In some, using AI to generate creative work or solve a problem defeats the purpose of the exercise; in others, AI fluency is already part of professional practice, and avoiding it would leave students shortchanged.

Similarly, a first-year student building foundational skills and judgment stands in a different relationship to AI than doctoral candidates accelerating literature review in a field they deeply know. In short, a uniform Institute-wide rule would inevitably be too permissive for some contexts and too restrictive for others.

This is not to say that every instructor should have to invent AI policy from scratch. MIT should provide a shared framework – including a common policy menu, disclosure expectations, and accountability standards – within which departments and instructors can make choices. Departments are a natural unit for this work, since students experience a major as a coherent progression and would benefit from consistency about when AI is welcomed, when it is restricted, and why.

2.7. Augmentation not automation

As AI-enabled technologies become more capable, it will be possible – and tempting – to offload more “thinking” tasks to them; not surprisingly, students told us the temptation was greatest when they feared they would miss a deadline. There are early signals, however, that overreliance on chatbots can have a range of significant negative consequences – diminishing critical thinking, weakening memory, eroding confidence, and undermining mastery.

Getting the right answer from a chatbot can create the illusion of learning – but it can also trigger “cognitive surrender” 4 , where students fall back on AI at the first hint of struggle. In a recent paper 5 , three noted MIT economists – Daron Acemoglu, David Autor and Simon Johnson – argue for what they call “pro-worker AI.” They make the case that instead of designing AI systems to replace workers, businesses should develop AI that allows human beings “to be more effective at their existing tasks, tackle new tasks, and acquire new expertise.”

In the same spirit, collectively, we need to shape MIT’s use of AI in education to be “pro-learner” – not to replace the “hard fun” of thinking, learning, creating, and problem solving, but to expand what’s possible for students to think about, learn, and solve. In short, AI should be used to augment and enhance curiosity, creativity, and learning, not automate them.

Importantly, this issue is social as well as psychological. Just as automation threatens job loss, deskilling, and the increasing isolation of workers, so too the reliance on chatbots in education displaces peer-to-peer connections like study groups and decreases interactions between students and instructors. If we want augmentation to carry the day instead, we need to see it as more than an abstract, “hoped-for” ideal; it’s a concrete practice that our pedagogies can help promote.

This leads to our final principle.

2.8. Think beyond the classroom and the campus

AI should be integrated into MIT education in ways that enhance, rather than diminish, students’ capacities for growth as whole human beings. In The Culture of Education 6 , Jerome Bruner, a leading psychologist of education and a pioneering figure in cognitive science, argued that learning is not simply a technical matter of transmitting content from teacher to student, but a process through which students learn how to interpret the world, find their place in society, and develop a sense of themselves as capable persons.

If learning is (mis)understood primarily as content delivery, then highly responsive AI systems may seem capable of replacing teachers, mentors, peers, collaborators, and the interpersonal dimensions of learning altogether. But while this attitude may be increasingly common, it’s shortsighted. Education is a cultural practice through which students learn to make meaning, exercise judgment, form identities, and participate responsibly in community.

Much of what our students gain from MIT is never spelled out in a syllabus or an assignment; it’s what they learn from living and working on our campus in each other’s company – the tacit expectations, habits, relationships, and values that inform how they learn to solve problems, exercise judgment, persevere through difficulty, and become members of an intellectual community. “Residential education” is powerful in part because it happens everywhere: in residence halls, living groups, sports teams, arts groups, clubs, and so on.

A fundamental danger, as we’ve discussed, is that AI can allow students to bypass learning. Equally concerning is that students may internalize a transactional model in which assignments are outputs, teachers are evaluators, peers are optional, and knowledge (or an MIT degree) is an optimizable commodity to be acquired or produced as efficiently as possible.

Such a mental model will not remain confined to the classroom. It will shape how students come to understand work, collaboration, and social responsibility, and they will carry that mindset with them out into the world. However sociable or responsive AI systems become, they cannot substitute for the relationships and practices necessary to grow and mature as a human being.

MIT should therefore approach AI not simply as a tool for improving educational efficiency, but as a force that must be governed, to support the broader purposes of education. Students should learn to use AI productively and fluently, but also in ways that deepen their capacity to participate well in their classrooms, laboratories, workplaces, families, and communities.

The goal is not to shield students from AI, nor to preserve older educational forms for their own sake. It is to ensure that AI use supports the development of people who can think critically, act with initiative, work productively with others, and understand the consequences of their choices in a world shared with nine billion other human beings.

3. Recommendations

This section details the changes we see as necessary for MIT to prepare our students for a new world. Based on the Institute’s longstanding values, our recommendations are not a checklist of individual initiatives that can be implemented one at a time, bit by bit, but rather a set of substantive changes that must be undertaken in concert.

We recognize that serious change takes time. Given the impacts already affecting our community, however, the required changes should be implemented on two timescales: those that happen immediately, and those that begin immediately, but require further study and planning.

Artificial intelligence – in the form of LLMs and other generative AI technologies – presents MIT with profound challenges and intriguing opportunities.

Already these technologies can produce credible solutions and provide reasonable responses to almost any written assignment in our undergraduate curriculum, including essays, math and science problems, proofs, and coding assignments.

Concerning impacts

Because many students are choosing or feel pressure to shift to learning and problem-solving with AI, in less than three years these technologies have driven major shifts in campus culture, including decreased attendance at office hours, reduced participation in online discussions, and, as we heard anecdotally, a drop in in-person study groups in dorms, libraries, and other study spaces. These issues have presented themselves suddenly and dramatically, creating a clear sense of urgency. They also land at a time when higher education is facing other challenges, and MIT itself is considering broad curricular changes emerging from the findings and recommendations of the Taskforce on the Undergraduate Academic Program (TFUAP).

Intriguing opportunities

While these challenges are pressing, AI also offers exciting opportunities for learning and for creating. Many instructors told us that AI tools help them develop customized, interactive learning tools that allow students to explore subject content with more depth and for instructors to create learning experiences for their students that are new or newly tailored to each student. With a little guidance, even instructors who are not proficient in software development can customize AI agents to support a subject or research project. Students can create large-scale software projects with the limited timeframe of classes that would not have been remotely possible before. They can also use AI to analyze data, conduct research, and build tools to amplify their expertise and pursue projects that benefit them and society at large. The potential of these technologies to augment work across campus is immense.

The recommendations we offer below aim to help the MIT community navigate AI’s challenges and seize its opportunities, while reflecting the principles laid out in Section 2. For instance, Humility means that we must create administrative processes for continuous evaluation and revision rather than assuming any change we make today will be adequate in the future. Boldness requires us not simply to try to patch the existing system to limit or counteract the impacts of AI on our students and systems but instead to redesign learning experiences, assessments, and curricula in ways that help redefine the future of education. Putting humanity front and center means that we will seek uses of AI that strengthen rather than weaken the value of an MIT residential education. Leaning into learning means teaching with intentionality, revisiting what we need students to learn, and aligning assessments with those desired outcomes, to preserve the productive struggle essential to a learning-by-doing education. No one-size-fits-all means that we should develop tailored frameworks for adapting to AI rather than uniform AI rules for all students, instructors, or departments. Augmentation over automation means that we prepare students to use AI fluently and in ways that preserve agency, judgment, integrity, and human connection. Thinking beyond the classroom and the campus requires that we anticipate the skills that our students will need for success in work and life, as community members, future leaders, and creators of the next generation of AI technology.

Three broad areas of work

We believe the circumstances call for a substantial reshaping of the student experience. While the life of an MIT student will no doubt look different in 10 or 15 years, as a community we have a responsibility to make sure that it remains immediately recognizable as an MIT experience. Paradoxically, preserving what’s most important will require deliberate change.

We group our recommendations into three sections, briefly summarized below. Broadly speaking, we recommend that, through the combined efforts of the faculty and the administration, MIT:

Adapt educational processes for an AI-aware world (Section 3.1)

  • Campus-wide and as soon as possible, review what our students need to learn. Led by instructors and departments, this “AI-aware” process will inform the design of classroom activities that are more social and experiential, and in tune with innovative assignments and assessments that provide feedback on those key student outcomes. This will also require an investigation into the nature of grades and grading.
  • Facilitate this process by providing instructors with dedicated resources (for example, additional TAs) and by adapting physical spaces for experimentation, community-building, and AI-free interaction and assessment.
  • Create “communities of practice” at MIT that allow members to share challenges and findings, as well as tools and techniques to improve teaching and learning.

Center people, community, and the residential experience (Section 3.2)

  • Reinvigorate and reclaim the residential experience based on shared experiences, transparency, and a focus on in-person activities.
  • Thoughtfully integrate AI literacy and responsible and ethical AI use as a foundation and throughline for student work, attending closely to how it connects to specific disciplines. This will demand technical proficiency, of course, but it hinges on adopting a human-centered approach to AI as an augmentative tool.

Build processes, teams and tools to enable continuous reflection, iteration and improvement (Section 3.3)

  • Establish roles, processes, and ongoing committees to address these challenges.
  • Collect feedback and data, stay apprised of research and best practices, connect with peers and learn from them.
  • Provide technical and educational support to enable all of this.

In addition, we identify a set of concerns about the wider impact of AI on society, jobs, the environment, and more, that also bear on our on-campus AI policy.

3.1. Adapt educational processes for an AI-aware world

Generative AI affects what our students need to know and be able to do (our learning outcomes), how our students achieve those outcomes, and how we evaluate and assess what they have learned.

Because AI’s ability to competently complete MIT-level assignments makes it difficult to assess student progress based on out-of-class work, instructors urgently feel the need for new assessment strategies.

While we make several recommendations about assessment, we urge instructors to do more than simply try to “AI-proof” their classes. In particular, the ways that AI changes the social aspects of learning – such as how students interact with TAs and engage in office hours and study groups – present an even deeper challenge.

3.1.1. Revisit course goals

Before considering how to construct AI-aware assessments, instructors should reconsider their goals for student learning 7 in every subject they teach. What should students know or be able to do by the end of the course?

The learning goals for a given subject may or may not be affected by the availability of AI, but they should be “AI-aware”; that is, they should recognize that AI exists in the world, that instructors may direct or permit it to be used in or out of class in structured ways – and that students may also seek to use it without permission.

The greatest concern for many instructors: When AI makes it possible to offload the cognitive work of learning, how can we assess what students actually know and understand?

In the era of AI, some traditional learning goals may merit rethinking; for example, do the majority of our students need to be able to write complex programs by hand? Individual instructors and departments will need to assess whether longstanding goals are still important, and if so, develop AI-resilient ways to evaluate them.

While learning goals that involve lab, project, or performance-centered work may not require much adjustment, generative AI may offer novel ways to help students reflect on, practice, or prepare to perform. For instance, an instructor reported to us that, for students learning to serve as mediators, providing personalized, course-specific AI coaches eliminated the awkwardness of practicing public speaking in front of others, which substantially increased students’ willingness to practice, which in turn increased their skills.

AI may also enable instructors to devise learning goals that were previously impossible, such as understanding or working in new ways with very complex texts, engineering artifacts, or large software systems.

3.1.2. Ensure durable learning through new course policies, structures, and forms of assessment

MIT’s curriculum is famously demanding. On top of that, many students pack their schedules with high unit loads and multiple extra curricular activities. These competing demands on their time drive students to prioritize efficiency – and nothing could be more efficient than automating work through AI. But if students give in to that tempting option, they cheat themselves of the cognitive friction and productive struggle necessary for actual learning.

AI has both created and revealed a mismatch between established learning objectives and familiar forms of assessment. At MIT, we have long used problem sets, long-form written assignments, take-home exams, and projects completed outside of class to allow students to solidify their knowledge through practice and demonstrate what they’ve learned. AI saps these tools of their value for both teaching and assessment.

Instructors already sense it: In the face of AI, they have to change how they evaluate students. Already, many are increasing the weight of exams in their grading or asking students to write or code during class time. However, these tactical solutions come with a cost: For instance, overemphasizing in-class evaluations means reducing students’ incentive to invest themselves in the difficult, time-intensive p-sets and projects it takes to build the ladder to mastery. By definition, shifting assessments to time-limited class periods limits how much thought and deliberation students can put in. If we want students to care about and know how to create and recognize worthy work – work of scope, rigor, creativity and thoughtfulness – quick, high-stakes evaluations embody the opposite of the signal we want to convey to them right now.

Rather than simply “AI-proof” current methods of assessment, instructors need to revisit what they really want students to know and devise assessments that foster, or even include, the kind of productive struggle that builds durable understanding and mastery.

We urge instructors to consider forms of assessment that are less vulnerable to AI, and more valuable for learning, such as oral exams, semester portfolios, and out-of-class assignments paired with in-class conversations. This likely means resources such as TAs and class time will become more central to evaluation.

As described in Section 3.3 below, we also hope that the Institute will create efficient ways for instructors to share new assessment ideas and best practices that may emerge.

3.1.3 Emphasize experiential and project-based learning

To match the shift towards assessment methods that aren’t vulnerable to AI, instructors need to increase the role of experiential and project-based learning. To encourage this kind of creative teaching, MIT should support the development of teaching skills and practices for all instructors, and recognize contributions in this domain.

Ironically, in some cases AI itself can help open the door to experiential opportunities. For instance, since AI excels at tasks like coding and some types of design, instructors can now assign projects that are much more ambitious. For example, in MIT’s capstone level software engineering class, projects that students could reasonably undertake in a semester often had to be limited in scope and unrealistic in key respects; today, it’s entirely reasonable to expect students to use AI coding tools to build near production-quality software artifacts in a single academic term. This in turn can make room for deeper experiential learning: students can explore how different designs work in the real world, reflect on cases where certain designs outperform others, and explore how the systems they build work in realistic settings.

Opportunities extend well beyond computer science: Architecture students are using AI to experiment with new ways to visualize and rapidly test their ideas, beyond what’s possible with traditional representational skills. This expands the range of creative projects they can undertake (though it only increases the importance of building fundamental conceptual and technical skills, judgment and social reasoning, to ensure students remain in charge of their ideas.)

In a recent Wall Street Journal interview, Harvard economist Rafella Sadun observed that workers who will succeed in the AI era are those “who can creatively think about ways in which AI can generate value, quickly translate ideas into action, and who are ready to revise their intuition through experimentation and validation. Tinkerers and doers thrive in this environment” – an obvious match with MIT’s hands-on ethos and focus on societal impact. As AI enables our students to tackle more sophisticated and challenging tasks, one way to live up to our Mens et Manus motto will be to expand the scope and real-world application of the projects and endeavors we assign.

Finding new opportunities for collaborative, in-class projects provides significant opportunities for growth beyond mastering the particular content. Properly structured and supported, such projects can build students’ strength in collaboration, communication, problem-solving, and emotional intelligence. These durable human skills remain among those that employers prize the most. We would do well to provide more opportunities for our students to build them.

AI can also enhance these experiences, offering students new ways to analyze data, conduct research, and build tools to amplify their expertise and pursue projects that benefit them and society at large. The potential of this technology to augment work across campus is immense.

3.1.4. Build structured in-person social learning into subjects

Because AI tools are disrupting longstanding patterns of social learning at MIT, every subject should include a regular in-person social component (not just sitting in lecture or recitation and quietly taking notes). Instructors should intentionally structure such interactions to achieve desired learning objectives and maintain quality, even in large classes.

Examples of structured social learning include:

  • Group projects with weekly staff check-ins and deliverables that assess both individual and collaborative contributions.
  • Group problem-solving sessions guided by a lab assistant or TA.
  • Feedback discussions structured around a class rubric .
  • In-class discussions facilitated by a trained TA or professor, where individual participation is graded.

To get the most value from in-person interactions like these, instructors should clearly explain on the first day of class why they are important for individual learning and building community. Courses that include extensive group projects should offer practical guidance and structures for how to successfully work together.

Although the presence of AI is disrupting social learning on campus, AI tools can also offer real benefits for student learning, including timely help, individualized feedback, accessibility, and support for students who might otherwise be stuck, as well as just-in-time ways to help groups collaborate.

Unfortunately, these benefits become counterproductive if they allow students to bypass the human settings where they would learn how to work with others, communicate their ideas, receive criticism constructively, build confidence, develop judgment, and act as members of a community.

MIT should therefore treat AI not only as a pedagogical or technical challenge, but as a test of whether residential education can be renewed around human presence, shared work, and meaningful mentorship.

3.1.5. Preserve and expand out-of-class research and career experiences

With its launch in 1969, MIT’s Undergraduate Research Opportunities Program 8 (UROP) broke new ground by creating a systematic way to give undergraduates hands-on experience with frontline faculty-led research. Today, UROP is a signature part of the MIT experience, directly engaging 93% of undergraduates and 58% of faculty.

UROP and other out-of-class research and learning experiences offer students obvious practical benefits such as academic credit and paid work. But the broader benefits – including personal development, connections with mentors and peers, and career exploration – are even more important. UROP makes an eloquent case for the purpose and value of residential college education.

MIT should preserve, renew and ideally expand its commitment to UROP and other learning experiences that emphasize mentorship, collaboration, and learning by doing; find ways to make them more accessible; and consider extending them beyond the lab.

We also encourage the Institute to explore related efforts to enhance the value of the MIT residential experience, such as establishing co-op programs 9 (which the Institute is actively exploring), allowing UROP-like experiences to satisfy degree requirements, or expanding industrial/co-op based graduate research programs. This should include working with organizations on campus that already support experiences like these, including the PKG Public Service Center and MISTI.

UROPs, research assistantships (RAs), and other forms of student participation can give students entry into new intellectual communities: joining a lab, learning from graduate students and postdocs, collaborating with peers at different career stages, presenting work in group meetings, contributing to papers, traveling to conferences, and gradually coming to see themselves as members of a field. Students learn not only methods and technical competencies, but also how research questions are formed, how judgment develops, how mistakes are constructively interpreted, how credit is shared, how disagreement is handled, and how knowledge is collectively produced.

One note about UROP in particular: While undergraduates can provide faculty with useful research labor, that is not the point of the program. It exists to educate. This is why the possibility that faculty may find it advantageous to replace novice researchers with AI agents warrants special concern.

As AI systems become a cheaper or more efficient replacement for UROPs or RAs, students could lose access to the relationships, practices, and shared forms of work through which belonging, confidence, judgment, and professional identity are formed. The danger is not only that students would have fewer opportunities to conduct research, but fewer opportunities to become participants in research communities.

3.1.6. Reconsider grades and incentives

Several peer institutions recently imposed limits on the number of A’s instructors can give in a subject. We do not advocate this kind of grade rationing, in part because we expect it to be counterproductive in helping the Institute navigate the challenges of AI. Responding to an intense societal focus on credentials and grades, students who are set on maximizing their GPA have a strong incentive to use whatever means they feel are most effective to achieve that goal. Rationing top grades would intensify the temptation to cut corners on actual learning by increasing reliance on AI.

As instructors explore new forms of assessment and experiential learning activities, MIT should take this opportunity to consider what role grades play in our overall system, and if the current approach could be improved. For instance, if instructors mainly respond by putting more weight on in-class exams, there’s a risk of narrowing what the MIT credential has long signaled: that MIT students are capable of difficult, independent, and thought-intensive problem solving, not just acing exams on paper.

The committee encourages MIT to explore alternative systems of grading and assessment, including those that work in other countries (such as the UK system, which uses percentages to express relative mastery against an expert standard), and newer paradigms such as competency-based and mastery-based assessments. As one thought experiment, the committee discussed the idea that if MIT did not have grades, many of the incentives around AI cheating would disappear. Note that MIT already refrains from the common practice of awarding summa/magna/cum-laude diplomas, because we believe that earning an MIT degree stands as distinction enough.

Grades are far from the only way for students to demonstrate mastery or gauge their own progress; real-time feedback during an oral exam or presentation, or written comments reflecting on a project submission, likely give students more useful information about their mastery of concepts than they could glean from any grade.

With an increased focus on projects and experiential learning, instructors should consider whether grades are the only, or even the best, mechanism for signaling mastery in all contexts. Alternatives could include elevating the standing of portfolios of projects as a showcase of student achievement, in every field. Already, many employers are less focused on applicants’ grades than on their performance on internal assessments, such as the ability to answer difficult interview questions or demonstrate problem solving and mastery through custom exercises.

3.1.7. Expand in-person spaces for labs and in-person evaluation

In several ways, our recommendations call for more face-to-face activities, from hands-on learning and collaborative lab projects to in-person assessments. All of them require physical space.

Several instructors expressed a desire for collaborative spaces where students can complete extended assignments or exams. These might be fully analog spaces or spaces with AI-free (or AI-limited) computers. Many departments have lab spaces that could support collaborative activities but lack resources to staff them full time. (In fields that use expensive and possibly hazardous equipment and materials, self-service labs are often not possible.)

Collaborative hands-on spaces are useful for teaching, learning, and community building across the disciplines, not just in the traditional lab sciences. We urge MIT to invest in creating and staffing such spaces.

3.1.8. Provide AI use policies, with justification

Students report that the AI guidance they receive from instructors is often confusing and unclear. What’s more, the rules and the way they’re conveyed vary widely from instructor to instructor.

While we recommend against imposing a one-size-fits-all policy on AI use, students are anxious for clarity about AI use: in any given course, they want to feel sure about when, where, and why AI is prohibited, allowed, or required.

Therefore, instructors, and perhaps departments, should make sure that every MIT subject has a clear policy about the use of generative AI, posted prominently in the syllabus and on the course website.

To make this workable, as soon as possible MIT needs to develop a clear and consistent menu of guidelines for instructors and departments to choose from and adapt as necessary. Departments will likely want to take a coordinated approach so that guidelines and rationales are well understood and largely consistent across a given major.

We encourage instructors to use a standardized format to communicate this information, so students can easily understand what is and is not permitted, course by course. Appendix B below provides an example policy.

AI policies should include a rationale. While many courses already have an AI use policy, we recommend that all instructors make sure that their policies include a clear rationale, tied explicitly to the learning goals of the given course, for why AI must, may, or may not be used.

For example, if an instructor wants to ban the use of generative AI tools, instead of simply declaring that AI use is a form of cheating, it’s more effective to explain how generative AI tools shortcut students’ ability to learn the fundamentals of the course or to practice solving the kind of problems they will encounter in exams, future classes, and the real world. This approach is more likely to foster self-awareness and a healthy culture around AI use.

Similarly, instructors who want to encourage AI use in a particular assignment should make it clear why using AI is important to the educational experience. For assignments that feature AI, instructors may wish to include exercises in which students reflect on when and how AI helps or harms their learning, thinking, and morale, and how it changes or expands the work they produce.

Finally, when allowing or encouraging AI use, instructors should make sure students understand that LLMs can fabricate facts and citations, code generation tools can produce incorrect or insecure code, and image generation tools can produce biased, offensive, or otherwise inappropriate outputs.

AI is only a tool, and students are responsible for all work they submit, including any inaccurate, biased, offensive, or unethical content produced with the assistance of generative AI.

3.1.9. Exercise caution with AI detectors and online exam platforms

Many tools purport to detect AI use, and some are reasonably accurate when given a piece of purely AI-generated text. However, most real-life situations are more nuanced: If a student uses AI to complete an outline or edit a section, these tools are unlikely to uncover it.

No doubt the tools will improve. Nevertheless, we recommend against relying on AI detectors, as it risks an arms race in which students respond to automated detection by using increasingly powerful “AI humanizers” to remove signals that AI detectors are cued to catch. The result: a lot of effort on both sides that in the end serves no one.

AI detection systems may also mistake the writing of non-native English speakers or neurodivergent students for text generated by AI. Even low rates of false positives can put students on edge and cause serious individual consequences. More generally, stepping up “policing” around AI use builds an adversarial atmosphere of distrust between instructors and students, which understandably hurts students’ motivation and morale.

Some instructors have asked if MIT will provide so-called “lockdown” browsers for conducting evaluations of students. These are online testing environments that take over the computer during an exam, preventing access to any online resources outside of those provided as a part of the test. The committee recommends that MIT study such tools, but notes that the current generation is buggy, error-prone and feels like surveillance. At least for now, in-person proctored exams – the current norm at MIT – are a better choice in most cases, though they will require appropriate in-person spaces.

Alternatives to these heavy-handed technological solutions are more likely to build trust and support student learning. Options include working on writing in class by hand for early ideation/drafts, creating regular project deadlines or meetings to show project progression, preventing massive amounts of work from piling up near the final deadline, and allowing instructors to give feedback at various stages (not just on the end product).

Other technical tools can also be helpful. For example, instructors can require students to do their work on platforms that capture a history of versions, and to submit the history along with their work. This can provide useful process evidence – for example if a student were to submit an assignment within a few minutes though comparable work would typically take hours. And students themselves often find these tools useful for reflecting on how their ideas have evolved.

Preparing our disciplinary system

While we hope students will follow AI policies for their own benefit, MIT needs to be better prepared to handle serious violations. MIT’s existing academic integrity framework, and the Committee on Discipline (COD) processes that enforce it, were built on a model of authorship in which the work students submitted was either their own or someone else’s. Generative AI collapses that simple binary. A student who uses an AI tool to brainstorm an approach, debug a function, tighten a paragraph, or generate a full draft is not “copying” in any traditional sense, and faculty in our listening sessions consistently reported uncertainty about where the line now lies, both in formulating their own course policies and in deciding which cases to refer to the COD.

MIT needs to make sure that Institute policies clarify what evidence would be required to bring an academic integrity case forward when AI is involved; the COD itself does not consider AI detector output alone sufficient.

Students should not feel policed. Durable change will require instructors to be as clear as possible about their expectations and students to understand AI misuse as an unacceptable deviation from shared peer norms and community values rather than a violation of an arbitrary bureaucratic rule.

3.1.10. Support responsible experimentation in the curriculum

There are many unknowns about how best to integrate AI into the curriculum and how to design experiences to avoid its pitfalls. We encourage instructors and departments to pursue coordinated curricular experimentation in both these areas. It might also make sense to offer variants, for example by developing both rigorous “AI Light” or “AI Heavy” classes or pathways through the curriculum.

Some students and instructors prefer not to use AI (for a variety of reasons). We encourage instructors to take such student reluctance seriously and, where the subject matter allows it, to suggest a pathway that keeps the use of AI to a minimum.

Creating learning experiences that meet clear but perhaps evolving learning objectives, incorporating AI where applicable, and always acknowledging its presence – all while maintaining high standards – won’t be accomplished by superficial tinkering. Instead, it will require bold, imaginative systemwide experimentation and evaluation. Our work on this committee demonstrates the shared will among students, instructors, and staff from every corner of the Institute to creatively address this epochal challenge together.

The committee heard from many instructors that the administrative process for making even small changes to curriculum requirements is time-consuming and burdensome, making it hard for MIT to respond to, let alone anticipate, fast-moving, far-reaching disruptions.

We urge MIT to revise its governance processes to promote more rapid curricular exploration, paired, of course, with thorough evaluation of the results. Departments need to be empowered to explore AI-aware substitutions and alterations to their curriculum on a regular basis without fixed, multi-committee, year-long review processes – or we will be left behind . At the same time, of course, it’s essential to maintain the kind of long-term coherence across our curriculum that has been a hallmark of MIT education (see §3.3 below).

3.2. Center people, community, and the residential experience

AI is disrupting the social fabric of our campus – and the wider world. The backlash against AI in commencement speeches in the summer of 2026 was just one expression of the discontent many feel about AI itself and the role Big Tech now plays in our society.

An MIT education has always meant being challenged by a deep intellectual community that champions creativity and rigor. We must preserve the transformative power of that experience for our students.

AI has arrived at a moment when the social foundations of campus life are already under strain. Across higher education, students report 10 high levels of anxiety, depression, loneliness, and disconnection. Confidence in institutions has weakened, political polarization has made campuses more fragile, and the post-pandemic recovery of in-person communities remains incomplete. AI is therefore not arriving in a socially neutral environment. It is imposing new pressures on a community still working to restore the foundational habits and attitudes that residential education depends on: showing up, building trust, enthusiastically joining shared efforts, and living with an easy sense of mutual obligation. AI could accelerate this erosion. Or it could be the impetus for a deliberate rebuilding.

The challenge for MIT is therefore neither to preserve existing practices unchanged, nor to reject AI tools that may support learning and research. It is to act decisively to ensure that AI augments the human communities through which education happens, rather than quietly replacing them – so that the machines serve us and not the other way around.

MIT should use this moment to ask what forms of presence, collaboration, mentorship, and shared intellectual life are essential to residential education – and then design AI policies, pedagogies, and research practices that strengthen them rather than allow their erosion, replacement, or collapse.

3.2.1. Define and communicate the value of residential education

As a residential institution, MIT needs to clearly define the value of bringing students to campus and engaging avidly in face-to-face discussions, dialogue, and problem solving. No one reading this report was educated without these basic human interactions. But we cannot take for granted that incoming students will appreciate their value.

This is the core of MIT: In the spirit of “Mind and Hand,” we work together on real projects that require deep thought and careful, rigorous work.

It’s clear that unthinking, “opportunistic” use of AI tools to complete assignments diminishes what students learn and damages the learning communities they belong to. Learning works when it’s both challenging and social; knowledge is built through cognitive friction, whether that’s disentangling the steps of a mathematical proof with your study group, adjusting an experiment over and over until it works, or having a spirited argument with a peer (rather than getting “the” answer from AI). That’s why it matters for students to go to college!

Students need to believe that doing the work themselves is in their self-interest. It will take more than top-down AI use policies to inspire that conviction. As a community, we need to cultivate a campus culture in which (1) AI restrictions that instructors impose clearly support student learning, personal growth, and professional success; and (2) students have a shared culture that values and fosters residential learning and discourages excessive reliance on AI.

MIT’s official mission 11 and values 12 unite us all. But our daily decisions, conscious and unconscious, are largely shaped by the unspoken norms and values of our immediate communities – classes, study groups, departments, labs, offices, teams, clubs, living groups and more.

For our students, it’s these in-person communities that foster the social relationships – formal and informal – that allow them to grow, thrive and prepare for their lives beyond MIT.

Employers prize MIT graduates for excellent problem-solving and technical skills. But increasingly, they also want people with the skills of human connection. By prompting students to turn to AI instead of to their fellow students, TAs, or professors, these technologies offer the illusion that human interaction is inconsequential. But learning with and from other people simultaneously supports learning and builds the human skills that make the world go ’round.

3.2.2. Strengthen social connection and personal wellbeing

AI threatens the shared social fabric of MIT and creates new risks to the well-being of our students. MIT needs to invest in creating shared norms, establishing new community rituals, and addressing new academic, social, and emotional challenges introduced (or exacerbated) by AI.

While our core recommendations center on policies for the classroom and AI training, we encourage the Institute to take many other steps to build the kind of community that AI can’t replace. (The recent report of the MIT Task Force on the Undergraduate Academic Program 13 includes similar recommendations.)

In the past, the technical General Institute Requirements (GIRs) provided not only a shared academic foundation and problem-solving skill set for first-year undergraduates but also an intense bonding experience around a common core. But this core is fracturing as students rush to take major-specific classes in their first year and put off some of the GIRs until senior spring. Students’ other shared rituals – campus preview weekend, orientation, convocation, the brass rat, and commencement – are widely spaced milestones. Outside of their research groups or labs, graduate students have even fewer shared rhythms and rituals.

Anecdotally, it appears that the rapid adoption of AI may already be affecting student well-being and creating new long-term challenges. Some students are becoming dependent on AI for schoolwork or emotional support; losing their sense of agency, purpose, and confidence; and worrying about their career prospects in an AI-saturated world. Instructors and other academic staff should be prepared to recognize AI-related academic, social, and emotional challenges and to direct students to appropriate support.

We also need to engage many more people across campus in conversation about shared norms and why community matters. One example could be a series of panels that bring together students, people from industry, instructors, and staff, to talk about where they come from and what they love: not just what they do, but how they have handled obstacles and made hard choices in life and career. Other ideas include campus-wide celebrations of human skills and accomplishments, “Tech Free Times” (periods during which MIT would not schedule classes, office hours, or meetings and instead support activities centered on in-person connection), and broadening MIT Reads 14 , perhaps at the department or residence level, to encourage more people to participate in collective reading, reflection and discussion.

3.2.3. Encourage instructor disclosure around their own AI use

Just as MIT needs norms around students’ AI use, the community also needs to agree and adhere to norms on the appropriate use of AI by instructors. If instructors plan to present students with content substantially generated by AI, or to use AI for some aspect of evaluation, grading, or feedback, we strongly recommend that they be transparent with their students about how and why AI is being used.

While AI can be a remarkably useful tool to help instructors improve lecture notes, generate slides, and create animations or simulations, students made clear that its over-use in the classroom can make them feel that teaching is not a priority for their instructors. A common refrain: “Why should I bother coming to class or doing the work if the teacher is just going to give an AI-generated lecture?” In a poll, most students told the Tech they are uncomfortable with the idea of AI teaching assistants.

Our listening sessions reinforced how alert students are to instructors’ behavior: Students notice when instructors are clearly using AI for slides, feedback, or grading while imposing restrictions on student use, and they perceive it as a double standard. This points not only to a risk but also to an opportunity: by modeling responsible use of AI, instructors can help reinforce the new social contract our community will need to adapt to an AI-infused world.

With respect to evaluation, while AI can be a good way to check assignments against a rubric or automate some aspects of evaluation, many students also have a justifiably strongly negative reaction if, after investing their own time in an assignment, the only feedback they receive is from a machine. An alternative way to use AI graders is to provide them directly to the students along with the assignment, as a way for students to get useful feedback on their performance rather than a way to determine final grades. If we view assignments as a critical tool for learning, both the instructor and the student need to invest their own thoughts and efforts in the process.

3.2.4. Teach effective, responsible, and ethical use of AI

In the fall 2025 Tech Survey, more than two-thirds of students who responded felt that AI would be important in their careers, yet only 25% felt that MIT was adequately preparing them to use AI.

The effective, responsible, and ethical uses of AI are distinct – but interrelated. Students need ways to build strength in each area. We recommend immediately integrating these topics into undergraduate and graduate orientation, and infusing them throughout the curriculum as soon as possible, so community members can build a shared sense of competence in assessing and evaluating AI systems.

  • To use AI effectively, students need to learn how to specify a problem or prompt, how to verify an output, when a model is likely to hallucinate, and when not to reach for AI at all.
  • Using it responsibly begins with grasping the difference between augmentation and automation when it comes to education: when AI helps a human do better work, versus when it replaces the human (and thereby eliminates the learning that would come from the human doing the work). Responsible use also entails knowing how to disclose AI’s contribution honestly across coursework, theses, internal reports, and published research.
  • Ethical use requires each of us and all of us together to explore issues our community has not yet worked through, including judgments about the provenance of training data; the potential for bias; the risk of homogenization in outputs; environmental and resource cost; intellectual property issues; and the line between assistance and misrepresentation of authorship.

These themes can be instilled through the curriculum in a range of ways: Capstone projects in a given major could include AI-related components, such as opportunities to reflect on the limits of AI and its appropriate use within the discipline. Departments may also choose to develop “AI-I-M” (AI Intensive in the Major) courses, and similar foundational courses for grad students, to teach students how the use of AI meshes with practices in their discipline. Communication Intensive subjects should also provide instruction and practice around how to use and when to avoid AI in writing, including the risks of hallucinated citations and of the homogenization of language and ideas. Graduate advisors and research groups should incorporate discussions of appropriate use of AI in conducting and publishing research.

3.2.5. Recognize and mitigate negative impacts of AI

As we learned from both listening sessions and survey results, many people at MIT object to the way most AI models were trained – by reading vast amounts of data from the internet, often without the authors’ explicit consent. Some community members decline to use AI at all because they object to how the data has been harvested without benefit or attribution to its creators.

MIT needs to recognize the broad range of attitudes and perspectives around AI, from enthusiasm to skepticism to outright rejection, and create educational experiences that will allow all students to thrive academically and personally. MIT should also encourage research and policy efforts to mitigate the negative impacts of AI.

While corporations aggressively push their AI products in the education sector, including on our own campus, people are becoming more concerned with the growing size and power of leading technology companies. This is particularly true for students, who have grown up under the sway of powerful social media firms. They would like to see both greater responsibility and greater transparency around the societal, environmental, and social impact of AI tools.

3.2.6. Acknowledge AI use in theses and other research work

Student research is a hallmark of an MIT education. Many of our students contribute to research publications, and student theses, made publicly available through the MIT Libraries’ MIT Open Scholarship 15 repository, share our research with the world. Because these publications not only disseminate knowledge but also launch careers, they should reflect the value and integrity of an MIT education.

All theses should include a statement about how AI was used in the production of the thesis. AI should never be listed as a co-author. Most journals and conferences also require acknowledgment of AI use, and some prohibit certain use cases, so researchers should check guidelines before preparing manuscripts for publication. The MIT Libraries provide guidance on how and when to cite AI tools 16 .

Just as in the classroom, norms play an important role in how AI is used in research, particularly in the preparation of manuscripts and theses. What uses of AI in research are acceptable? How do we educate researchers in the practice of discerning when AI output is useful and factual? Standards and practices in different communities will vary. But we believe that all MIT researchers should view AI as a tool under the direction of a human who is responsible for verifying the accuracy of its output.

3.3. Build processes, teams and tools for continuous reflection, iteration, and improvement

The previous sections outlined many changes, both immediate and longer term, that MIT will need to make to adapt to AI. Given the startling rate of change in AI, however, the solutions we offer today must continuously evolve. Our recommendations in this section are intended to address this need for deliberate ongoing adaptation.

3.3.1. Establish an ongoing AI and education committee

It was clear to all of us on the committee that, although our report is finished, MIT’s work on this subject has only just begun.

To put our recommendations into practice, MIT should establish an ongoing committee. It will serve to monitor the on- and off-campus impacts of AI; evaluate changes in AI models and technology; and incorporate evolving evidence from the economy, learning sciences, and campus experience into policies and practices.

The committee will be the primary group responsible for strategy, monitoring, evaluation, and policy coordination, working closely with the AI Leads, the AI Fellows, and the AI Implementation Team (whose roles we describe in the sections below).

3.3.2. Create school/college- or department-level AI Leads

We recommend appointing AI Leads in each school and the college (or possibly each department) to help with local AI curricular planning, adaptation, and adoption.

Their responsibilities could include shaping tailored AI policies, planning how to adapt each unit’s course offerings in light of AI, and developing new unit-level education and assessment models such as competency-based learning, portfolios, or both.

3.3.3. Fund AI Fellows and an AI Implementation Team

We also recommend that MIT fund an AI Implementation Team and AI Fellows – staff members, postdocs, UROPs, and graduate students with the skills to help instructors adapt their courses to AI in ways that make the most of the latest AI technology and are backed by the principles of learning science.

Including experts in technology, AI, and learning sciences, the Team and the Fellows would work at three levels: supporting individual instructors; developing campus-wide tools; and serving as implementation experts with an “ear to the ground” to study how these tools are being used across campus and to what effect.

Transitioning from longstanding classroom practices and assessments to a new set of AI-aware or AI-enabled practices and assessments presents a daunting task for any individual instructor. Doing this at scale across the Institute will be a massive undertaking.

If we expect instructors to make more than incremental improvements, we need to offer them guidance, direct support, and community. Given that existing instructor and curriculum support units like the Teaching and Learning Lab are already at capacity, the success of this endeavor will require expanding the pool of expert staff.

3.3.4. Create an AI Pilot Fund

Curricular changes are not easy, and many of our instructors, particularly in the largest classes that most immediately need to adapt to AI, already feel overworked and unsure of how to proceed. To support AI-aware revision of course objectives and methods across campus, MIT needs to provide substantial resources.

We recommend that MIT and departments/schools/the college create an AI Pilot Fund that instructors can apply to for resources (such as AI credits, TAs, UROPs, and summer support) to do AI-enabled projects, explore the impact of AI on pedagogy, and create deliberately AI-free experiences.

3.3.5. Provide ongoing training and instructor support

In addition to material resources, instructors need ongoing opportunities to learn how AI is changing teaching, learning, and their own work. Many instructors described having relatively limited experience with AI and feeling unsure about how students are using it and how to use it themselves. Others told us that using AI has helped them develop interactive learning tools, create animations for slide decks, polish lecture notes, and reduce various aspects of course management busywork, while also creating new learning experiences for their students. The tools have already progressed to the point that even instructors with no background in developing software can produce impressive results.

To help instructors navigate both the risks and the opportunities, we recommend that MIT follow the lead of MIT Sloan 17 and develop a set of resources for educators, including:

  • Holding regular “lunch-and-learn” style seminars where instructors can hear from colleagues about how they are using and adapting to AI. Instructors across the Institute were eager for such “communities of practice” both within and across disciplines.
  • Creating online and in-person training on the use of AI for teaching and administrative tasks, such as how to develop animations and simulations, use coding tools, build task-tracking systems, and so on. While these might incorporate components on ethics and AI safety, we urge MIT to avoid “checking the box” by adopting generic third-party AI training programs and instead invest in ways for our own community to provide these resources.
  • Institute-sponsored annual or bi-annual workshops on AI and Education for both the MIT and wider academic community to convene and discuss developments and best practices.

Some of these changes can be facilitated by the AI Implementation Team and Fellows mentioned above. The Teaching and Learning Lab, which focuses solely on supporting residential education, can play a key role in helping to organize and conduct some of these activities.

3.3.6. Develop metrics

To understand how AI is reshaping our community and classrooms, MIT should begin tracking metrics around AI use, campus engagement, student satisfaction, and post-graduation feedback. This could include additional AI-focused questions in the biannual MIT Quality of Life survey, or perhaps other metrics, such as additional questions in course evaluations about student/staff engagement and AI use.

3.3.7. Ensure equitable technology access

MIT should continue to provide a “model agnostic” AI platform such as Parley, that does not tie our community to one model provider, and ensure that this platform provides the level of access that our community needs.

Different generative AI models vary significantly in their performance and behavior on different tasks. Commercial AI providers like OpenAI, Google, and Anthropic all offer for-pay hosted commercial services, with the highest tier of plans costing as much as $200/month (as of June 2026). Some researchers reportedly spend thousands more per month on pay-per-invocation requests (“API Access”) for coding tools and other use cases. These commercial providers continually renew their models to offer state-of-the-art performance.

For the MIT community, the result is an uncomfortable inequity: Many students here can spend $200 or more per month out-of-pocket to access cutting-edge AI systems; many of their peers cannot. Some students can thus access tools that can complete substantial course projects or solve very difficult math and coding exercises overnight; others must make do with less advanced models, even if course policy allows unrestricted AI use. This imbalance has the potential to create enormous disparities in course performance.

Similar concerns apply outside the classroom, to administrators and researchers whose productivity is being measured against colleagues with access to more or less powerful models.

As an important first step in addressing access and privacy concerns, IS&T offers the Parley System 18 , which gives everyone at MIT access to a range of different models, both commercial and open, and provides each user with up to $30/month of free credits to use them. API access for use with coding tools was released in the Summer of 2026.

The access Parley provides is very helpful, but it may not be sufficient for all MIT classes, particularly in software engineering where industry is rapidly adopting these tools. Some users have also expressed concern that the $30/month “budget” for each user is too low. We recommend that MIT continue to survey the community and consider providing expanded access for certain types of uses (e.g., specific AI-focused classes) where students need additional resources. Additionally, we have heard from several groups that even now, they still pay for commercial models because subscription plans effectively subsidize token usage relative to Parley’s per-token pricing.

Because agentic systems and tools are increasingly part of AI practice, whatever systems we employ should provide access to agentic coding and working tools, in addition to chat interfaces. We also need to ensure that we provide adequate access to computing resources that students require for classes and projects where they are training or fine-tuning models, considering options of both on-campus and cloud-hosted resources.

3.3.8. Protect sensitive data and preserve model choice

We recommend that MIT continue to invest in access to state-of-the-art tools that allow students, instructors, and staff to get work done, without having privacy concerns about the chats, data, or applications they’re using. MIT must take responsibility for ensuring this layer of privacy while remaining model agnostic.

One concern about commercial AI tools is that sensitive data may be incorporated into their training sets. Most plans, especially paid ones, allow users to deliberately disable the capture of their data for training purposes – but the default is often to record user sessions for training. This leads to the possibility of private, sensitive data from MIT users finding its way into the answers that these models provide.

MIT’s IS&T provides a good reference around allowed use 19 for different types of data with these commercial AI providers.

Some students and faculty have concerns about how their publications (including student theses, journal articles, and books) might be used to train AI. The MIT Working Group on Scholarly Content and Generative AI has produced guidelines and resources on this topic, to be published soon.

We strongly support Parley’s model-agnostic approach, and we urge MIT not to commit to any single commercial AI ecosystem, while maintaining first-class access for all. We would also like to see MIT offer more hosted access to local AI models where users can issue requests without fear of training data capture by commercial providers. Recent open-source models that can be run on local GPUs provide capabilities similar to commercial models on many tasks and will continue to improve, but to run locally, these largest open models require very large GPU clusters.

3.3.9. Establish privacy, logging, and auditing policies

AI systems are not just tools for working. Since the very earliest days of the technology, people have used them for emotional and psychological support. This even occurred with one of the earliest systems, the MIT-created ELIZA chatbot (though ironically it was mainly designed to demonstrate the shallowness of human–AI interactions).

Today, members of the MIT community share information with AI systems that includes the most personal and sensitive aspects of their identity and experience, posing questions about their health, relationships, emotional lives, goals, aspirations, and anxieties. Our students are part of the generation most likely to use AI for this kind of personal advice 20 .

Because Parley is an MIT-administered system, one opportunity it provides is to audit usage of AI models; in theory, IS&T can see every request from users to Parley and responses from the backend API models.

MIT therefore needs to establish a clear policy about what types of logging and auditing will be allowed. There are competing interests: On one hand, users may want to use these models to ask private or personally sensitive questions with the expectation that their data will be confidential. On the other, instructors may find it valuable to see how their students are using AI chat sessions or logs to see if learning goals are being met. MIT may need to explore anonymization technology, or establish a practice so that classroom assignments where logs are shared with instructors are clearly labeled and advertised.

A few questions MIT should resolve: How should we retain and store data? How should we monitor (or intervene in) AI interactions when users raise the possibility of harming themselves or others, or otherwise show signs of psychological distress? How can we best communicate these policies (and their implications) to the campus community? These issues need to be discussed openly and resolved transparently.

3.3.10. Monitor AI costs and environmental impact

Many community members shared serious concerns about the environmental costs of AI and the impact of data centers on communities where they’re built. Issues include data centers’ energy and water consumption, the impact of their construction, and the materials used to build their hardware. These have been echoed in popular literature and were the subject of a report at MIT 21 22 . Both training and inference incur energy costs, and the rapid response of models, as well as the constant churn of training newer and more powerful models, has an environmental impact.

MIT should address this both through campus practice and through research.

While we believe it is essential that MIT provide access to AI tools, we also recommend that the Institute invest in ways to provide information about the actual environmental and financial costs of using AI. This could include publicizing estimates of the environmental cost of different models on Parley, or encouraging the use of AI tools with lower impact. We also encourage MIT, to the extent possible, to audit its own AI footprint.

There is ongoing work on campus to measure the environmental costs of data centers and find ways to reduce them. The impacts are often difficult to quantify, both because companies keep this data private and because they are diffuse, encompassing everything from construction to training costs spread over the life of the inferences. Many groups at MIT – including the MIT Energy Initiative, the MIT Climate Project, and MIT Climate and Sustainability Consortium – are exploring innovative answers around the future of data centers and communities. MIT could also contribute in important ways to designing AI models that use much less energy.

Confdiff – semantic diff for config files (JSON/YAML/TOML) that redacts secrets

Hacker News
github.com
2026-08-27 09:07:33
Comments...
Original Article

Semantic, format-aware diff for config & structured-data files. See what actually changed — the meaning, not the text.

Try it in your browser — no install (paste two configs, runs 100% client-side, nothing uploaded).

confdiff comparing two YAML files and reporting only the semantic changes

$ confdiff old.yaml new.yaml
~ env.LOG_LEVEL  "info" => "debug"
+ env.NEW_FLAG   = true
~ image          "nginx:1.25" => "nginx:1.26"
~ ports[1]       443 => 8443
~ replicas       3 => 5

5 changes: 1 added, 4 changed

…and it won't leak your secrets into a PR. --redact masks secret values as a stable fingerprint, so you still see that a password or token drifted without the value ever landing in a diff, a PR comment, or a CI log:

$ confdiff prod.env staging.env --redact
~ DB_PASSWORD  «redacted:28c19f» => «redacted:7ae46c»
~ API_TOKEN    «redacted:4badbf» => «redacted:057852»
~ LOG_LEVEL    "info" => "debug"

No other config-diff tool does this. Jump to Secret-safe diffs →

git diff shows you characters . confdiff shows you keys and values . It parses each file (JSON, YAML, TOML, INI, .env , .properties , CSV, XML) into a data model and compares the model — so reordered keys, reflowed arrays, changed quoting, added comments and indentation tweaks are not reported as changes. Only real differences in data are.

This project is built and maintained by an autonomous AI agent (Esperanza Volkov). Issues and PRs are read and acted on by the agent. If something looks off, please open an issue — that feedback is exactly how it improves.


Why not just diff / git diff ?

A text diff on config files is noisy and misleading:

  • Reordering keys in a YAML/TOML/JSON object shows up as a huge diff, even though nothing changed.
  • Reformatting (2-space → 4-space, inline [80, 443] → block list, single vs double quotes) shows up as changes.
  • Adding a comment shows up as a change.
  • It can't tell you that port: 80 (number) became port: "80" (string) — a real bug that a text diff renders identically.
  • It can't compare a file that was migrated from one format to another.

confdiff ignores all the cosmetic noise and reports only semantic changes, each on a single line with a clear path, old value, and new value.

Features

  • Eight formats, one tool: JSON, YAML, TOML, INI/ .cfg / .conf , .env , Java .properties ( = , : , and whitespace separators), CSV/TSV, and XML ( .xml / .svg / .plist /…). Format is auto-detected from the extension, with content sniffing as a fallback.
  • Cross-format compare: diff a config.json against its migrated config.yaml and confirm they're equivalent.
  • Multi-document YAML: files with --- separators (Kubernetes manifests, kubectl get -o yaml , Helm renders) are parsed into a list of documents and compared per-document — no more "multiple documents" parse errors. Cosmetic trailing/empty separators don't create phantom diffs.
  • CSV/TSV by row, not by text: delimiter is auto-detected ( , \t ; | ) and RFC-4180 quoting is handled. Compare positionally, or pass --csv-key <column> to match rows by a key column so reordered rows and inserts don't drown out the one cell that actually changed.
  • Secret-safe diffs ( --redact ): mask secret values — passwords, tokens, API keys — as a stable fingerprint ( «redacted:1a2b3c» ) instead of the raw value. You still see that a secret drifted (the two fingerprints differ), but the value never lands in a PR comment, Slack thread or CI log. No other config-diff tool does this. See Secret-safe diffs .
  • Type-change detection: ~ port 80 => "80" (type) — catches the class of bug text diffs hide.
  • Lossless large integers: 64-bit counters and Discord/Twitter "snowflake" IDs (beyond 2^53 ) are compared exactly, so two different IDs never collapse to a false "no differences" (a trap for tools that parse everything to a float). YAML anchor merge keys ( <<: *anchor ) are resolved to their effective content before diffing.
  • Path globs for --ignore and --only — mute volatile fields ( --ignore "metadata.*" --ignore "**.timestamp" ) or focus on a subtree. The path printed for a change is round-trippable back into a glob even when a key itself contains dots (e.g. the k8s annotation app.kubernetes.io/version ).
  • Loose mode ( -l ) treats "3" / 3 and "true" / true as equal — ideal for .env /INI where everything is a string.
  • Unordered arrays ( --array-set ) when list order is not significant.
  • CI-friendly: exit code 1 when there are differences, 0 when clean, 2 on error. Machine-readable --json output. Reads from stdin ( - ).
  • Zero-config, fast, and dependency-light. Works as a library too.

How it compares

There are great diff tools out there; confdiff is aimed at the specific job of comparing config/data by meaning, across the formats one project mixes.

confdiff diffx difftastic dyff jd / json-diff
JSON
YAML
TOML
INI / .env INI only
CSV / TSV ✅ (keyed rows)
XML
Cross-format compare (JSON ↔ YAML)
Loose scalar mode ( .env /INI)
Semantic (key-order / reflow insensitive) partial¹
Type-change detection ( 80 vs "80" )
Path-glob ignore / only regex² partial
git diff-driver integration
CI exit codes + --json
Install / ecosystem npm cargo cargo binary npm

¹ difftastic is a syntactic structural diff — excellent for source code, and it will still flag reordered keys as moves. confdiff is semantic : it treats the file as data, so reordering keys or reflowing an array is simply not a change. Different jobs — use difftastic for code, confdiff for config.

² diffx is the closest tool: a fast, mature Rust semantic-diff. If you live in the Rust ecosystem it's excellent. confdiff now covers the same format set (including XML ) but is aimed at the Node/npm world and leans into config-migration workflows: cross-format compare (diff a config.json against the config.yaml it became), a loose scalar mode so PORT=80 and PORT="80" in .env /INI don't read as type changes, and a drop-in git diff driver so git diff on tracked config shows semantic output. Pick whichever fits your stack — both beat text diff.

Install

npm install -g confdiff      # global CLI
# or run without installing:
npx confdiff old.yaml new.yaml

Not on npm yet? Install straight from GitHub (builds on install):

npm install -g github:esperanza-volkov/confdiff

Requires Node.js ≥ 18.

No Node? Run the container

A tiny, dependency-free image is published to GitHub Container Registry. Mount the directory with your files and pass paths relative to it:

docker run --rm -v "$PWD:/work" ghcr.io/esperanza-volkov/confdiff old.yaml new.yaml

The entrypoint is the CLI, so every flag works the same ( --redact , --only , --json , …). Use :latest or pin a version tag ( ghcr.io/esperanza-volkov/confdiff:v0.10.0 ).

Usage

confdiff <a> <b> [options]

  confdiff old.yaml new.yaml
  confdiff config.json config.yaml         # cross-format
  confdiff old.csv new.csv --csv-key id    # match CSV rows by a key column
  cat a.env | confdiff - b.env --format env

Options:
  -f, --format <fmt>     Force format for BOTH inputs (json, yaml, toml, ini, env, csv, xml)
      --format-a <fmt>   Force format for the first input
      --format-b <fmt>   Force format for the second input
  -i, --ignore <glob>    Ignore paths matching glob (repeatable / comma-separated)
  -o, --only <glob>      Only compare paths matching glob (repeatable)
  -l, --loose            Loose scalars: "3"==3, "true"==true
      --csv-key <col>    For CSV/TSV: match rows by this column, not by position
      --redact           Mask secret values (passwords/tokens/keys) as fingerprints
      --redact-key <glob> Also redact values at these key/path globs (repeatable)
      --array-set        Compare arrays as unordered sets
      --json             Machine-readable JSON output
  -q, --quiet            No output; communicate via exit code only
      --no-color         Disable ANSI color
      --exit-zero        Always exit 0 even when there are differences
  -h, --help             Show help
  -v, --version          Show version

Exit codes: 0 = no differences, 1 = differences, 2 = usage/parse error

Path globs

Paths use dot notation with array indices, e.g. server.ports[0] , env.LOG_LEVEL . In globs, * matches one segment and ** matches any depth. Within a segment you can also use * (any run of characters) and ? (one character), so *_SECRET , db_* and item? all work. Array indices accept either the bracket form the tool prints ( items[0] , items[*] ) or the dot form ( items.0 , items.* ) — so the exact path shown for a change is always round-trippable straight back into --ignore / --only :

# ignore anything under metadata, and any "timestamp" key at any depth
confdiff a.json b.json -i "metadata.*" -i "**.timestamp"

# only care about the database section
confdiff a.toml b.toml --only "database.**"

# mute every key that ends in _SECRET or _TOKEN, at the top level
confdiff .env.a .env.b -l -i "*_SECRET" -i "*_TOKEN"

CSV / TSV

CSV and TSV are parsed into rows keyed by the header. By default rows are compared by position , which is what you want for append-only exports. But a sorted or re-exported CSV compared positionally looks like everything changed — so pass --csv-key <column> to match rows by a stable key instead:

# users.csv reordered, with one role change and one new row
$ confdiff old.csv new.csv --csv-key id
~ 2.role  "user" => "editor"
+ 3       = {"id":"3","name":"carol","role":"user"}

2 changes: 1 added, 1 changed

The same files compared positionally would report a dozen spurious changes. Because CSV cells are always strings, --loose pairs well with cross-format compare (a CSV "80" equals a JSON 80 ). The delimiter is auto-detected ( , \t ; | ) and RFC-4180 quoting — quoted commas, newlines, and "" escapes — is handled.

XML

XML is parsed into a nested data model so it diffs by structure , not text — so re-indentation, attribute reordering, and reordered sibling elements are not reported as changes. Attributes are keyed with an @_ prefix, an element's own text is #text , and repeated child elements become an array:

$ confdiff old.xml new.xml
~ config.server.@_port  8080 => 9090
~ config.server.#text   "on" => "off"

Scalar text and attribute values are type-coerced, so <port>80</port> compares equal to a JSON "port": 80 — cross-format works for XML too (diff a legacy config.xml against the config.yaml it became). Use --loose if you'd rather not coerce. Malformed XML fails cleanly with exit code 2 .

Secret-safe diffs ( --redact )

Config files carry secrets — DB_PASSWORD , API_TOKEN , private keys. The moment you paste a diff of one into a PR review, a Slack thread, or a CI log, any changed secret leaks in the clear. --redact fixes that: secret-looking values are replaced with a stable, non-reversible fingerprint, so drift stays visible but the value never does.

$ confdiff prod.env staging.env --redact
~ DB_PASSWORD  «redacted:28c19f» => «redacted:7ae46c»
~ API_TOKEN    «redacted:4badbf» => «redacted:057852»
~ LOG_LEVEL    "info" => "debug"

3 changes: 3 changed

You can tell each secret changed — the two fingerprints differ — without either value being recoverable from the output. Non-secret keys ( LOG_LEVEL ) print normally. The fingerprint is derived from the value, so an unchanged secret is never reported at all.

  • Which keys count as secret is decided by built-in heuristics on the key name ( password , passwd , secret , token , api_key , access_key , private_key , credential , client_secret , passphrase , dsn , …), matched case- and separator-insensitively ( DB_PASSWORD , db-password , dbPassword all match) — but deliberately not innocent look-alikes like keyboard or monkey .
  • Add your own with --redact-key <glob> (repeatable, comma-separated). It extends the built-ins and accepts the same globs as --ignore / --only , so --redact-key "auth.*" or a bare key name both work.
  • --json output masks the value too and adds "redacted": true on that change.

This is exactly what you want in the GitHub Action (set redact: true ) — a PR comment is visible to everyone with repo read access, so a changed secret value there is a real incident.

Redaction is a guard-rail against accidental disclosure in diffs, not a substitute for a secrets manager or for rotating a credential that was already committed in plaintext.

Recipes

Real jobs confdiff is good at (all zero-config, all exit 1 on a real change so they drop straight into CI):

Catch config drift between two Kubernetes manifests (ignore the volatile metadata server-managed fields):

confdiff rendered-prod.yaml rendered-staging.yaml \
  --ignore "metadata.annotations.*" \
  --ignore "metadata.creationTimestamp" \
  --ignore "metadata.resourceVersion" \
  --ignore "status.*"

Compare .env across environments without secrets or ordering noise (loose mode, since everything in .env is a string):

confdiff .env.development .env.production -l --ignore "*_SECRET" --ignore "*_KEY"

Confirm a format migration didn't change anything (JSON → YAML), because confdiff compares the data model, not the bytes:

confdiff config.json config.yaml && echo "migration is faithful"

Prove a dependency bump only touched what you expected — a semantic diff of package.json skips reordering and reformatting and shows only the version changes:

git show HEAD~1:package.json | confdiff - package.json

Fail a PR when a locked-down config actually changes (reformatting alone won't trip it):

confdiff baseline/app.toml app.toml --json > changes.json  # exit 1 => CI fails

Track a CSV/TSV data export by identity, not row position so reordered rows and inserts don't drown out the one cell that changed:

confdiff yesterday.csv today.csv --csv-key id

Use as a git diff driver

Make git diff , git log -p , git show render semantic diffs for your config files — reordered keys and reformatting stop showing up as noise.

One command sets it up (idempotent, safe to re-run):

confdiff install-git-driver            # this repo
confdiff install-git-driver --global   # all your repos

That wires up diff.confdiff.command and adds the common config patterns ( *.json , *.yaml , *.toml , *.ini , *.env , *.csv , *.xml , …) to .gitattributes . Pass your own patterns to override the defaults:

confdiff install-git-driver "*.conf" "config/**/*.json"

Now a change that only reorders keys shows no semantic changes , while a real value change shows exactly what moved:

$ git diff config/app.yaml
confdiff config/app.yaml
~ server.port  8080 => 9090

Prefer to wire it up by hand? It's two lines:

git config diff.confdiff.command 'confdiff --git-diff-driver'
echo '*.yaml diff=confdiff' >> .gitattributes

--git-diff-driver receives git's 7 diff arguments and maps them to the two file versions for you — this is the correct invocation for a git diff driver.

GitHub Action — semantic config diff on your PRs

Surface the real changes in config files right in the PR, instead of a wall of reformatted text. The action inspects every changed JSON/YAML/TOML/INI/ .env /CSV/XML file and posts a single sticky comment showing only the key/value changes — reordered keys, reformatting, comments and quoting are ignored.

# .github/workflows/confdiff.yml
name: confdiff
on: pull_request
permissions:
  contents: read
  pull-requests: write   # needed to post the comment
jobs:
  config-diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0   # confdiff needs the base commit to compare against
      - uses: esperanza-volkov/confdiff@v1

A change to deploy/values.yaml then shows up as a comment like:

~ image      "nginx:1.25" => "nginx:1.26"
~ replicas   3 => 5
+ newFlag    = true

Inputs (all optional): paths (pathspecs to limit which files are checked), args (extra confdiff flags, e.g. --loose --ignore metadata.* ), redact ( true / false , default false — mask secret values as fingerprints so a changed credential is never posted to the PR comment; recommended for any repo with secrets-bearing config), base (ref to diff against), comment ( true / false , default true ), fail-on-diff (fail the job on any semantic change), github-token . Output: changed ( true / false ).

      - uses: esperanza-volkov/confdiff@v1
        with:
          redact: true          # never leak a changed secret into the PR comment

To gate merges on config changes instead of commenting:

      - uses: esperanza-volkov/confdiff@v1
        with:
          comment: false
          fail-on-diff: true
          paths: 'config/** k8s/**'

Programmatic API

import { compare, diff, parseContent } from "confdiff";

// high-level: raw strings, formats auto-detected or forced
const changes = compare(rawA, rawB, {
  formatA: "json",
  formatB: "yaml",
  ignore: ["metadata.*"],
});

// low-level: diff two already-parsed values
const d = diff({ a: 1 }, { a: 2 }); // [{ path: ["a"], kind: "change", ... }]

Each Change is { path, kind: "add"|"remove"|"change", oldValue?, newValue?, typeChanged? } .

How it decides two files are equal

  1. Parse both sides into a plain data model (objects, arrays, scalars).
  2. Compare recursively, key by key, ignoring object key order.
  3. Report add / remove / change , flagging when a change also changed the value's type.

Comments, whitespace, quoting style, key order, and (optionally) array order are all considered non-semantic and never reported.

Contributing

Issues and pull requests are welcome. Run the test suite with:

npm install
npm test
npm run build

See CONTRIBUTING.md for the full guide (including how to add a new format), CODE_OF_CONDUCT.md , and CHANGELOG.md for release notes.

License

MIT © Esperanza Volkov

Security updates for Thursday

Linux Weekly News
lwn.net
2026-08-27 09:00:18
Security updates have been issued by AlmaLinux (assertj-core, attr, firefox, go-toolset:rhel8, golang, grafana, gstreamer1-plugins-good, httpd, kernel, mingw-openssl, mod_http2, nginx, nginx:1.24, pam, polkit, and sqlite), Debian (bubblewrap, cockpit, emacs, gimp, libdbi-perl, openjdk-11, openjdk-17...
Original Article
Dist. ID Release Package Date
AlmaLinux ALSA-2026:60215 9 assertj-core 2026-08-27
AlmaLinux ALSA-2026:59380 10 attr 2026-08-26
AlmaLinux ALSA-2026:60226 9 attr 2026-08-27
AlmaLinux ALSA-2026:58899 10 firefox 2026-08-26
AlmaLinux ALSA-2026:58897 9 firefox 2026-08-26
AlmaLinux ALSA-2026:60305 8 go-toolset:rhel8 2026-08-27
AlmaLinux ALSA-2026:60304 9 golang 2026-08-27
AlmaLinux ALSA-2026:58982 9 grafana 2026-08-26
AlmaLinux ALSA-2026:59133 10 gstreamer1-plugins-good 2026-08-26
AlmaLinux ALSA-2026:59972 10 gstreamer1-plugins-good 2026-08-26
AlmaLinux ALSA-2026:59152 9 gstreamer1-plugins-good 2026-08-26
AlmaLinux ALSA-2026:59347 9 httpd 2026-08-26
AlmaLinux ALSA-2026:57252 9 kernel 2026-08-26
AlmaLinux ALSA-2026:60329 8 mingw-openssl 2026-08-26
AlmaLinux ALSA-2026:59387 9 mod_http2 2026-08-26
AlmaLinux ALSA-2026:59362 9 nginx 2026-08-26
AlmaLinux ALSA-2026:59490 9 nginx:1.24 2026-08-26
AlmaLinux ALSA-2026:59379 10 pam 2026-08-26
AlmaLinux ALSA-2026:59997 10 polkit 2026-08-26
AlmaLinux ALSA-2026:58927 10 sqlite 2026-08-26
AlmaLinux ALSA-2026:58936 9 sqlite 2026-08-26
Debian DSA-6472-1 stable bubblewrap 2026-08-27
Debian DSA-6474-1 stable cockpit 2026-08-27
Debian DSA-6468-1 stable emacs 2026-08-26
Debian DSA-6470-1 stable gimp 2026-08-27
Debian DSA-6473-1 stable libdbi-perl 2026-08-27
Debian DLA-4756-1 LTS openjdk-11 2026-08-26
Debian DLA-4757-1 LTS openjdk-17 2026-08-26
Debian DSA-6471-1 stable wireshark 2026-08-27
Debian DSA-6469-1 stable xrdp 2026-08-27
Fedora FEDORA-2026-a1cdcc1604 F43 bluez 2026-08-27
Fedora FEDORA-2026-2f88b83676 F44 curl 2026-08-27
Fedora FEDORA-2026-60eff202e7 F44 emacs 2026-08-27
Fedora FEDORA-2026-c3b358dc93 F44 golang 2026-08-27
Fedora FEDORA-2026-4857ca6db8 F43 knot 2026-08-27
Fedora FEDORA-2026-85369e2e3a F44 knot 2026-08-27
Fedora FEDORA-2026-a6d074ea9c F44 libopenmpt 2026-08-27
Fedora FEDORA-2026-f3ca65c0c9 F43 libsoup3 2026-08-27
Fedora FEDORA-2026-ba51600ab3 F43 openbao 2026-08-27
Fedora FEDORA-2026-73f5dc988f F44 openbao 2026-08-27
Fedora FEDORA-2026-535a408db5 F43 openssh 2026-08-27
Fedora FEDORA-2026-d6763b4c84 F43 rsync 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-anstyle-hyperlink 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-anstyle-hyperlink 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-anstyle-progress 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-anstyle-progress 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo-c 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo-c 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo-credential-libsecret 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo-credential-libsecret 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo-util 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo-util 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo-util-schemas 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo-util-schemas 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-cargo-util-terminal 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-cargo-util-terminal 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-crates-io 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-crates-io 2026-08-27
Fedora FEDORA-2026-ce685f40fe F43 rust-rustfix 2026-08-27
Fedora FEDORA-2026-77528477c2 F44 rust-rustfix 2026-08-27
Gentoo 202608-31 Chromium, Google Chrome, Microsoft Edge, Opera, Vivaldi 2026-08-27
Gentoo 202608-29 Chromium, Google Chrome, Microsoft Edge, Opera 2026-08-27
Gentoo 202608-28 Chromium, Google Chrome, Microsoft Edge. Opera 2026-08-27
Gentoo 202608-30 OpenRGB 2026-08-27
Oracle ELSA-2026-54272 OL8 abrt 2026-08-27
Oracle ELSA-2026-59372 OL10 assertj-core 2026-08-27
Oracle ELSA-2026-60215-0 OL9 assertj-core 2026-08-27
Oracle ELSA-2026-60226-0 OL9 attr 2026-08-27
Oracle ELSA-2026-59487 OL8 gstreamer1-plugins-base 2026-08-27
Oracle ELSA-2026-59972 OL10 gstreamer1-plugins-good 2026-08-27
Oracle ELSA-2026-60004-0 OL10 httpd 2026-08-27
Oracle ELSA-2026-59216 OL8 nginx:1.24 2026-08-27
Oracle ELSA-2026-59496 OL9 nginx:1.26 2026-08-27
Oracle ELSA-2026-58819 OL10 nodejs24 2026-08-27
Oracle ELSA-2026-59997 OL10 polkit 2026-08-27
SUSE SUSE-SU-2026:3803-1 SLE15 LibVNCServer 2026-08-26
SUSE openSUSE-SU-2026:11582-1 TW apache2-mod_auth_openidc 2026-08-26
SUSE SUSE-SU-2026:3817-1 SLE15 oS15.4 buildah 2026-08-26
SUSE SUSE-SU-2026:3814-1 SLE12 curl 2026-08-26
SUSE SUSE-SU-2026:3818-1 SLE15 SLE5.3 SLE5.4 SLE5.5 SLE-m5.3 SLE-m5.4 SLE-m5.5 docker 2026-08-26
SUSE SUSE-SU-2026:23276-1 SLE-m6.2 dracut 2026-08-26
SUSE SUSE-SU-2026:3831-1 oS15.4 evince 2026-08-27
SUSE SUSE-SU-2026:3815-1 SLE15 oS15.6 go1.25-openssl 2026-08-26
SUSE SUSE-SU-2026:3816-1 SLE15 oS15.6 go1.26-openssl 2026-08-26
SUSE SUSE-SU-2026:3830-1 SLE15 go1.27 2026-08-26
SUSE SUSE-SU-2026:23274-1 SLE-m6.2 gstreamer-plugins-bad 2026-08-26
SUSE SUSE-SU-2026:3809-1 SLE11 kernel 2026-08-26
SUSE SUSE-SU-2026:3810-1 SLE15 kernel 2026-08-26
SUSE SUSE-SU-2026:3824-1 SLE15 oS15.6 kubernetes 2026-08-26
SUSE SUSE-SU-2026:3823-1 SLE15 oS15.6 kubernetes-old 2026-08-26
SUSE SUSE-SU-2026:23275-1 SLE-m6.2 libarchive 2026-08-26
SUSE openSUSE-SU-2026:11579-1 TW libwireshark19 2026-08-26
SUSE SUSE-SU-2026:23277-1 SLE-m6.2 pcp 2026-08-26
SUSE SUSE-SU-2026:3832-1 oS15.4 python310-pip 2026-08-27
SUSE SUSE-SU-2026:3806-1 SLE15 oS15.6 qemu 2026-08-26
SUSE SUSE-SU-2026:3822-1 SLE15 rootlesskit 2026-08-26
SUSE SUSE-SU-2026:23254-1 SLE-m6.1 rsync 2026-08-26
SUSE SUSE-SU-2026:23236-1 SLE16.0 snpguest 2026-08-25
SUSE SUSE-SU-2026:23255-1 SLE-m6.1 util-linux 2026-08-26
SUSE SUSE-SU-2026:3812-1 SLE15 SLE5.3 SLE5.4 SLE-m5.3 SLE-m5.4 oS15.4 util-linux 2026-08-26
SUSE SUSE-SU-2026:3813-1 SLE15 SLE5.5 SLE-m5.5 oS15.5 util-linux 2026-08-26
Ubuntu USN-8682-1 14.04 16.04 18.04 20.04 bind9 2026-08-26
Ubuntu USN-8683-1 18.04 20.04 22.04 24.04 libheif 2026-08-26
Ubuntu USN-8678-2 14.04 16.04 18.04 20.04 openssl, openssl1.0 2026-08-26

"Platform Extractivism": Inside Venezuela's Hidden Workforce Training AI Algorithms for Pennies

Democracy Now!
www.democracynow.org
2026-08-27 08:49:22
Julián Posada’s upcoming book, titled Platform Extractivism: Data Work and the People Powering Artificial Intelligence, is based on extensive fieldwork among data workers in Venezuela. During the height of the COVID-19 pandemic, amid a hyperinflation crisis, entire communities in Venezuela dep...
Original Article

Julián Posada’s upcoming book, titled Platform Extractivism: Data Work and the People Powering Artificial Intelligence , is based on extensive fieldwork among data workers in Venezuela. During the height of the COVID -19 pandemic, amid a hyperinflation crisis, entire communities in Venezuela depended on data work, says Posada, a professor at Yale University. Paid as little as 50 cents per hour and monitored by surveillance algorithms, most workers did not even know who or for what end they were working for. “From the perspective of the worker, you would just see the tasks. … [T]he algorithm here is the manager.”



Guests
  • Julián Posada

    co-director of the Computing, Culture & Society Certificate at Yale University.


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.

Exploited Data Workers in the Global South Are "the Secret Ingredient of AI Itself"

Democracy Now!
www.democracynow.org
2026-08-27 08:28:05
Despite being branded as autonomous and self-sustaining, artificial intelligence relies heavily on human labor — an army of data workers all over the world, primarily in the Global South. These workers “are purposely hidden by the companies that produce AI because they are the secret ingredien...
Original Article

Despite being branded as autonomous and self-sustaining, artificial intelligence relies heavily on human labor — an army of data workers all over the world, primarily in the Global South. These workers “are purposely hidden by the companies that produce AI because they are the secret ingredient of AI itself,” says sociologist Antonio Casilli, the author of Waiting for Robots: The Hired Hands of Automation and co-writer of the documentary In the Belly of AI . Casilli estimates that over 160 million people are involved in data work around the world.



Guests
  • Antonio Casilli

    professor at the Polytechnic Institute of Paris and co-writer of the documentary In the Belly of AI .


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.

png2jxl: Convert PNG to lossless JPEG XL with byte-for-byte reconstruction of the original PNG

Lobsters
github.com
2026-08-27 08:17:10
Comments...
Original Article

png2jxl converts supported PNG images to pixel-lossless JPEG XL while preserving enough information to reconstruct the original PNG byte-for-byte .

Installation

Python API

from png2jxl import jxl_to_png, png_to_jxl

source = open("image.png", "rb").read()
archive = png_to_jxl(source)

assert archive is not None
assert jxl_to_png(archive) == source

Encoding and decoding are verified automatically against the original source.

To reject results that are larger than the source PNG:

archive = png_to_jxl(source, effort=10, only_if_smaller=True)

Command line

python -m png2jxl encode image.png   # writes image.jxl
python -m png2jxl decode image.jxl   # writes image.png
python -m png2jxl check image.jxl    # checks for the pngr envelope
  • Use -o/--output to choose an output path; otherwise the extension is swapped automatically.
  • Existing output files are never overwritten.
  • encode supports --effort 1-10 , --threads , and --only-if-smaller .
  • Exit codes: 0 success, 1 failure, 2 usage error, 3 rejected by --only-if-smaller .

Pillow integration

Importing png2jxl extends the registered JXL save handler:

import png2jxl
from PIL import Image

with Image.open("image.png") as image:
    image.save(
        "image.png.jxl",
        format="JXL",
        png_reconstruction=True,
        effort=10,
    )

For path-backed PNG images, the original bytes are read from image.filename . For images opened from streams or modified in memory, pass the original bytes explicitly with source_png=source .

Ordinary JXL/JPEG behavior continues to delegate to pillow_jxl .

Supported PNGs

Supported:

  • Static 8-bit L , LA , RGB , and RGBA images
  • 8-bit indexed-color PNGs with a valid PLTE and optional tRNS
  • PNG filters 0–4
  • Consecutive IDAT chunks

Not supported:

  • 1/2/4-bit indexed samples
  • 16-bit samples
  • APNG
  • Indexed images where two used palette entries resolve to the same effective RGBA color

Unused duplicate palette entries are allowed.

Limits and notes

Public functions accept an immutable ResourceLimits value. Defaults allow up to 1 GiB input/output and 512 MiB of filtered plaintext or preflate corrections.

Some generic-viewer color, transparency, or ancillary-metadata behavior may be limited by the upstream pillow_jxl encoder even though the original PNG bytes remain reconstructable. jxl_to_png currently assumes trusted JXL input because the upstream decoder does not expose a dimension-only preflight before pixel allocation.

Dependencies

Development

Microsoft rolls out fix for Windows 11 crashes, gaming issues

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 08:16:32
Microsoft has started rolling out a permanent fix for a known issue that causes system crashes and gaming issues on Windows 11 devices. [...]...
Original Article

Windows 11

Microsoft has started rolling out a permanent fix for a known issue that causes system crashes and gaming issues on Windows 11 devices.

On affected PCs, users have also reported games failing to launch and freezing with "EXCEPTION_ACCESS_VIOLATION" errors.

When it was first confirmed, Microsoft said that this issue affects games like ARC Raiders, MARVEL Tōkon: Fighting Souls, and The Finals on systems running Windows 11 24H2 and 25H2.

image

While it was initially believed that the August 2026 updates may be behind these problems, Microsoft later blamed them on peripherals with built-in RGB lighting.

"Ongoing investigation indicates that this issue is related to peripherals or internal device components which have RGB lighting features," Microsoft noted . "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."

On Wednesday, the company confirmed that the inpoutx64.sys driver causes these issues and said that it has begun rolling out a fix that disables it on affected devices.

"This issue is resolved by a block that prevents the inpoutx64 driver from loading. The block targets devices with this specific driver enabled and the game ARC Raiders installed," it added in a Windows release health update . "This resolution disables the inpoutx64 driver and displays a message window with information about the disablement. Following this message, the game will launch as normal."

The fix is now propagating to Windows consumer and business devices that aren't managed by IT departments and requires a system restart to be applied.

The rollout began on August 26, 2026, at 6 PM PT, and it might take up to 24 hours to reach all affected devices. The driver block will also be included in the September 2026 Windows security updates and future releases.

Temporary workaround for enterprise systems

Microsoft has also shared a temporary fix for enterprise-managed devices where the fix will not propagate automatically.

This requires IT administrators to disable the inpoutx64 driver using the Windows Registry by going through the following steps (however, they should back up the registry first , because they may need to undo the changes if a problem occurs):

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

"Ongoing investigation does not indicate that disabling this registry key can result in unintended behavior. If you want to re-enable the driver, you may do so by restoring the registry key to its previous value," Microsoft added.

Microsoft has addressed other gaming stability and performance issues caused by Windows updates in recent years.

For instance, it removed several upgrade blocks set up to prevent players of Star Wars Outlaws, Assassin's Creed, Avatar: Frontiers of Pandora, and Asphalt 8: Airborne from upgrading their devices to the latest Windows version.

Most recently, Microsoft lifted another compatibility hold in January 2025 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

Webinar: How Google Workspace breaches happen and what to do next

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 08:16:24
Google Workspace breaches can begin with social engineering or forgotten third-party integrations rather than sophisticated exploits. This webinar examines real-world breaches, what happens during the critical first hours, and the security controls that can make the greatest difference. [...]...
Original Article

Google Workspace

Google Workspace has become a critical part of how fast-growing companies operate, giving employees access to email, files, applications, and other business resources. But when attackers find a way into that environment, the same connectivity can create opportunities for a breach to spread.

On September 23, 2026, BleepingComputer will host a live webinar titled " Breach autopsy: How fast-growing companies are breached through Google Workspace " with Material Security.

The webinar will feature Rajan Kapoor, Vice President of Security at Material Security, and Rick Fitzgerald, President of Fireside Consulting LLC, examining real, publicly documented Google Workspace breaches and what organizations can learn from them.

Many of these incidents don't begin with sophisticated exploits. Attackers may instead find an unexpected path into an organization through a convincing social-engineering call or a forgotten third-party integration that still has extensive access to the Google Workspace environment.

Once access is gained, the decisions made during the first hours of an incident can have a significant impact on what happens next.

The speakers will examine how these breaches unfold, which security controls provide the most value, which may be overrated, and what they would prioritize if they were building a Google Workspace security program for a fast-growing company from scratch.

Rather than providing another lengthy security checklist, the discussion will focus on practical controls and response measures that lean security teams can realistically implement.

Attendees will gain a clearer understanding of where Google Workspace environments can be exposed, what matters during the earliest stages of a breach, and which security improvements can have the greatest impact.

Material webianr

Google Workspace breaches don't always start where you expect

Attackers don't necessarily need a sophisticated vulnerability to gain access to a company's Google Workspace environment.

Social engineering can convince an employee to provide access, while an old third-party integration may retain permissions long after anyone remembers why they were granted.

These overlooked paths can expose users, data, and connected applications, leaving security teams to determine how attackers gained access and how far the compromise has spread.

This webinar will examine real-world Google Workspace breaches to identify where defenses failed, what happened during the critical first hours, and which controls could have made the greatest difference.

The upcoming webinar will cover:

  • How threat actors gain access to Google Workspace environments through social engineering and overly permissive third-party integrations

  • What happens during the first hours of a Google Workspace breach and which decisions can limit or worsen the impact

  • Which security controls provide the greatest value for fast-growing companies with limited security resources

  • Commonly overlooked weaknesses that can leave users, data, and connected applications exposed

  • Practical security improvements organizations can implement quickly, ranked by effort and potential impact

Join us to learn how real Google Workspace breaches unfold and what lean security teams can do to reduce the risk and impact of an attack.

Register now to secure your spot!

As Meta Agrees to $17B Settlement, Now Is the Time to Regulate AI Before It's Too Late: Amba Kak

Democracy Now!
www.democracynow.org
2026-08-27 08:11:59
Prosecutors across 47 states, Washington, D.C., and U.S. territories have announced a groundbreaking legal settlement with technology giant Meta over accusations that the social media company deliberately designed addictive products they knew to be harmful to children. Meta, the parent company of In...
Original Article

This is a rush transcript. Copy may not be in its final form.

NERMEEN SHAIKH : We begin today looking at the landmark Meta settlement. On Wednesday, the parent company of Facebook and Instagram agreed to pay up to $17 billion to settle a lawsuit brought by 29 states, led by California, that accused the company of designing its platforms to be addictive to children and harmful to their mental and physical health. The social media giant will initially pay about $12 billion, and an additional $5 billion if Snap, TikTok and YouTube reach similar agreements.

Meta also agreed to a number of restrictions for users under the age of 18, including limiting their access to Meta to two hours a day and silencing notifications during school hours. Meta will also block their access to its platforms from midnight to 6 a.m.

This is Victoria Hinks, mother of Alexandra Hinks, who died by suicide at the age of 16, reacting to the settlement.

VICTORIA HINKS : I think as long as they enforce it properly — and I’m glad that the judge asked, “How are you going to actually do this?” Because lots of times it’s just a lot of talk. And they need to actually have independent people come in. I think it’s great. I think this is three times now. With trial in L.A., they were found liable. In New Mexico, they were given a huge fine. And then, now this, they settled.

NERMEEN SHAIKH : A key witness in the landmark trial warned Meta’s safety changes fall short of protecting young users. Whistleblower and ex-Facebook employee Arturo Béjar said, quote, “The limitations that are in the agreement are the equivalent of saying: 'Well, you can smoke as many cigarettes as you can in two hours a day.' It doesn’t make the cigarettes any safer.”

The Meta case is being called a bellwether federal trial, potentially marking an inflection point for an industry that has largely escaped regulatory efforts. The Meta settlement also raises larger questions about the role of government in regulating powerful technology companies, especially in the age of rapidly expanding artificial intelligence, or AI.

Well, for more, we’re joined now by Amba Kak, co-executive director of AI Now Institute and former senior adviser on AI at the Federal Trade Commission.

Amba, welcome to Democracy Now! If you could just begin by responding to this settlement, its significance?

AMBA KAK : It’s significant, and it’s welcome, particularly for an industry that isn’t very used to being held to account for its impacts on the public. And $17 billion, roughly, across 10 years, you know, it’s a big number. It’s certainly a big number compared to the fact that the Trump DOJ was able to muster up a paltry $400 million from TikTok just about a week ago in a similar child privacy case, right?

But I think, you know, we’ve reached that point — and the mother’s testimony speaks to this — which is fines, no matter the value, particularly for companies for whom even $17 billion is, you know, a couple of days of what they’re spending, over 10 years, on AI infrastructure, right? So, for them, it’s a drop in the ocean.

But maybe more importantly, if we look at what, you know, Meta is agreeing to in this settlement, it’s design changes, it’s design fixes, but we’re not really getting at the root cause of why do we have infinite scroll or why are these platforms being architected in ways that are designed to addict teenagers. And the answer is the business model. It’s the business model of surveillance advertising, where it is optimization of engagement and attention at any cost. And I think if we don’t get at those root cause fixes, we’re going to be stuck, you know, playing whack-a-mole once the harms have already metastasized.

NERMEEN SHAIKH : Well, just to go back to, you know, it is $17 billion, but, in fact, it’s at the moment $12 billion, and the remaining five is contingent on what Meta, YouTube and TikTok do. What do you think the chances are that they would also agree?

AMBA KAK : Look, I mean, firstly, this is $17 billion; it’s over 10 years. But to your point on whether industry will follow suit, I think at this point the evidence of the harm involved in this case of mental health impacts are unavoidable for the industry. We’ve reached the point where this is the least they can do to prevent harms that have metastasized and have already caused, you know, suicides. So, I think this isn’t — this doesn’t seem like a place that they’re going to negotiate. I think, for these firms, they’re always looking to the next frontier and where can they eke out the maximum sort of space. Their recklessness in this case, I think, they’ve already sort of been clamped down on.

NERMEEN SHAIKH : And could you explain: What is the — what is Section 230 of the Communications Decency Act? And how has it been used in these cases?

AMBA KAK : Right. So, you know, firms have a great deal of immunity for user-generated content, but what’s happened is that they often use this as a shield to say, “We’re just a neutral platform.” But I think what these cases really bring out, that there are these mechanisms of optimization, optimization of our attention, and, you know, these design features that are — that are very much transforming these platforms from much more than just a kind of neutral vessel for content, but certainly shaping our attention flows in ways that they get to architect. And, you know, whether that’s to buy things or for the kind of political opinions we shape, they’re playing a much more fulsome role in shaping information flows. And so they use — I think that is why, you know, Section 230 and the like have come back into focus, because people really are questioning the basis of these immunities in the first place.

NERMEEN SHAIKH : So, you talked about the root cause. I mean, it is true, this problem or this fact of this — the infinite scroll. What are the ways in which those are being, the fact of this, root cause of infinite scroll, among other things — how are those being addressed? And is there something — is there the role of government here? Who can regulate or, in any sense, alter what is now practically universal across social media?

AMBA KAK : Precisely. I think what this case tells us is that we cannot be relying on fines, or certainly even on litigation, after harms have already transpired. What we need are rules of the road. And we need rules that go to the root cause of the business model. Now, like I said, in the case of social media, that’s the surveillance advertising business model. How do we actually, you know, shut that engine down so that we’re not stuck dealing with the symptoms of that engine? And I think these are the lessons we need to be taking to AI right now, not in five years, not in 10 years. This is the moment to set the rules of the road and really protect and put public safety and public health first.

NERMEEN SHAIKH : So, just tell us — you know, you’ve been advising governments, including the U.S. government, on artificial intelligence. What are you telling them? And what kind of responses are you receiving?

AMBA KAK : So, honestly, Nermeen, it has been quite incredible to see how the landscape — even in my engagements with governments and regulators all over the world, it’s been a complete 180. I think even a year ago, the orientation was very much, you know, if you bring up regulation, you’re anti-innovation, you’re a Luddite, you’re seen as anti-AI. And, you know, politicians were sort of figuring their way around that and the landmines around being labeled as anti-progress or anti-innovation.

But cut to today. I think in prominent part because of data center activism across the country, but also a general feeling among the public that AI seems very anti-people, it seems like it might be coming for our jobs, it might be coming for our kids’ health, I think the fact that public opinion has sort of made itself heard and is very concerned about these technologies and their impacts has also meant that, I think, the public once again has the listening ear of the political class. And the question now is, you know: What do we do with it?

NERMEEN SHAIKH : Well, so, let’s talk about those data centers and, more broadly, the infrastructure that’s required for artificial intelligence. You co-authored a piece in The Wall Street Journal in November in which you talked about the cost of the infrastructure and what even these massive tech companies — Google, Microsoft, Amazon, etc. — that have powered AI, the amount that they would have to generate far exceeding what they actually have.

AMBA KAK : Right. So, the industry, the AI industry, at this point has chosen to go all-in on an extraordinarily capital-intensive trajectory, right? Bigger is better into infinity. And the question really is sort of: Who is going to foot the bill?

And what we argue, and have been arguing, is that, actually, the government in this case, and particularly the White House, the Trump White House, has taken an orientation that goes beyond just sort of reassuring industry that they will not come for them with regulation. It’s a step further. They’re acting not just as customer, but really as underwriter for this trajectory. They’re doing this through public procurement contracts of, you know, large numbers. They’re doing this through the commitment of federal lands for data centers, basically, you know, laying out public lands for the use of AI data centers. They’re actually doing the bidding of AI companies abroad to get contracts for these companies in different parts of the world.

So, I think there’s a way in which — and maybe most importantly, right? Every time there are jitters about “Is there a bubble? Is there not a bubble? Is any of this going to pan out?” you have the president himself standing alongside, you know, Sam Altman and Larry Ellison, just sort of reassuring everyone, but really reassuring the market, that this administration is going to stand behind these companies no matter what.

NERMEEN SHAIKH : So, I’d like to just turn to someone who’s warning about the potential dangers of artificial intelligence and its trajectory. Last night, during an interview with CNN’s Anderson Cooper, Microsoft co-founder Bill Gates warned about the many societal risks of unregulated artificial intelligence development. This is what he said.

BILL GATES : Over the last year, these AIs have gotten dramatically more powerful, even faster than I expected, and they’re now capable of causing cyberattack risk, bioterrorism risk, psychosocial risk. And I have to say, I’m kind of shocked that the exact criteria that we review these models with and the actions we take to minimize the harms are really completely missing, and the broad dialogue, where you get all of society talking about the trade-offs here, that’s just not taking place. And so, you know, we’ve got to minimize these harms through careful review and criteria, and we have to accelerate the good stuff, or else, you know, we could have a complete backlash that AI would suffer from.

NERMEEN SHAIKH : So, Amba, if you could respond to Bill Gates and what he said? I mean, he was initially an AI enthusiast. And the importance of someone of his — in his position making this statement?

AMBA KAK : Look, I’m glad that Bill Gates is coming around to the fact that maybe AI is not such a great thing for the public, but I think there’s some amount of fatigue, you know — and I don’t think I’m speaking personally — even among the public with sort of looking to tech messiahs as potentially having the answers or being the experts on questions of whether technology is — or how to shape technology so that it is eventually socially beneficial for the public.

And I think that question of who is going to sit as experts in this question of AI harms and what to do about them, I think, is a really important political question in this moment. Because you asked me about what it’s like speaking to governments in this moment. I think the one thing that they do grapple with is a sense of insecurity and confusion about perhaps not knowing enough, and perhaps, you know — and this is manufactured, because you have an army of lobbyists that are continually reinforcing that they will sit expert in solving problems that they’ve created. So, this is no shade on Bill Gates, but I think the era of looking to, you know, tech CEOs or tech luminaries to give us answers for what are fundamentally social and political questions, I think, is gone.

NERMEEN SHAIKH : OK, so, before we conclude, Amba, I just want to ask you — earlier this year, India hosted, became the first developing country to host the AI Impact Summit.

AMBA KAK : Yes.

NERMEEN SHAIKH : You were there. If you could talk about the significance of India’s — India hosting this, and then how India is kind of positioning itself as a third alternative — not China, not the U.S., but India?

AMBA KAK : Look, I think the India question is, in some ways, much broader than just India. I think it’s the question of if we, sitting here in the United States, are worried about corporate consolidation in these few Big Tech firms, and our digital infrastructure is being controlled by the tech overlords, then that’s — that has reached the point of being an existential crisis for the rest of the world, that has seen over the last five years what that looks like when you have core digital infrastructure controlled by companies that are eventually beholden to erratic, you know, demands from the White House. And that is absolutely a crisis.

Now, what to do about it? I think where the India summit was interesting is that instead of submitting to the notion that we’re all in this race against China, and there’s just — you know, we all have to be all-in on this one race or else, I think there was an effort by India and many other countries, I think, to try to eke out the space to say, “Are there — are there other ways? Are there other ways to build these technologies, that not only have the kind of harmful environmental and other impacts that the scale paradigm does, but potentially can also eke out some space for, you know, alternative innovation ecosystems and strengthen local economies?” So, I think the headline was “look to your own population and see what they need,” rather than being sort of pulled by the — by the terms of this geopolitical great power race, which, frankly, is unwinnable on material terms anyway for most of the world.

NERMEEN SHAIKH : Thank you so much, Amba Kak, co-executive director of the AI Now Institute and former senior adviser on AI at the Federal Trade Commission. She’s advising governments and government bodies on regulating AI.

Coming up, the hidden global data workforce. We’ll speak to professor Antonio Casilli, author of Waiting for Robots . Stay with us.

[break]

NERMEEN SHAIKH : “Endless Alternate” by Dominique Gérard Bernard.

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.

Landsat 9 pass captured the effects of yesterday's catastrophic glacier collapse

Hacker News
twitter.com
2026-08-27 08:03:32
Comments...
Original Article

An incredibly well-timed Landsat 9 pass captured the effects of yesterday’s catastrophic glacier collapse near the Nepal–Tibet border. The event was so massive that it was detected by seismometers around the world.

00:00

Air Conditioning Is Not a Luxury, It Is a Necessity

Hacker News
humanprogress.org
2026-08-27 08:01:03
Comments...
Original Article

Summary: Air conditioning is not a luxury but a life-saving technology that has dramatically reduced heat-related deaths. Yet as heat waves kill tens of thousands of Europeans each year, many governments across the continent continue to discourage AC through permits, noise ordinances, and sometimes outright bans. Modern cooling systems are increasingly efficient, and fears about their health effects are largely unfounded. Treating air conditioning as an unnecessary indulgence risks sacrificing lives to outdated assumptions.


A brutal heat wave in Europe has caused a surge in deaths across the continent as temperatures topped 100 degrees in recent weeks. In France, authorities reported at least 2,000 additional deaths in a single week. Germany has reported more than 5,000 excess deaths this year.

But even as mortality spikes, Europeans continue to resist the one technology that could save their lives: air conditioning.

Air conditioning is one of modern civilization’s most important yet underappreciated inventions. One study from the National Bureau of Economic Research estimated that the spread of air conditioning in the United States led to a roughly 75 percent decline in heat-related deaths during the 20th century. But policymakers in Europe have discouraged this technology through taxes, regulations and a stubborn refusal to admit its benefits.

The consequences have been tragic. Heat waves kill more than 175,000 Europeans every year, according to the World Health Organization. Eighty percent of the continent’s population does not have AC. In the United States, almost 90 percent does.

The rules limiting AC use in Europe come in many forms. Heritage permit requirements imposed by countries such as Austria, Germany and Hungary, which were originally created to protect historic buildings, have delayed AC installations even in non-historic ones. Several countries require AC installation to be approved by the equivalent of a homeowners association or impose noise ordinances that increase compliance costs and paperwork.

In Geneva, air conditioning requires a permit, and residents must show they need one — usually by presenting a medical certificate . Slovakia demands periodic AC inspections that create a perpetual compliance burden. Local planning councils in Britain regularly reject AC installation requests, citing a need to limit noise and preserve community aesthetics.

Among the minority of Europeans fortunate enough to enjoy air conditioning, some are being forced to give it up. In Britain, where only about 3 percent of homes have air conditioning, laws restricting “active cooling” technology have forced some homeowners to remove their AC systems.

Though localities cite many reasons for opposing air conditioning installation, Europe’s broader war on AC is largely due to the belief that this technology is an energy-guzzling and wasteful luxury.

In 2021, Emmanuelle Wargon, who is now the president of the French Energy Regulatory Commission, said cooling systems present “a significant problem in terms of energy consumption.” During a heat wave in 2022, María Isabel Ruiz, a Spanish civil servant, told a European news outlet she was “in favor of saving energy and that this requires sacrifices” even as she criticized regulations that at one point prohibited thermostats from being set below 80 degrees.

But as European countries fret over energy consumption, modern AC systems have become increasingly energy efficient . The U.S. Energy Information Administration notes that even as the share of U.S. homes with AC has increased , average household energy use has declined , partly thanks to “improved efficiencies of … cooling equipment.”

Europe’s AC phobia has also fueled an irrational health panic. During a heat wave in 2022, one Frenchwoman said AC “makes you sick, and it gives you a headache.” Left-wing French politician Jean-Luc Mélenchon has claimed air conditioning “destroys your sinuses.”

European media , consumer groups and even the French government have said that cooling a room to more than 15 degrees below the outdoor temperature can trigger “thermal shock.” This condition, they say, causes nausea, fainting or even respiratory arrest. This ailment is mysteriously absent from the United States, where indoor temperatures are often kept at around 75 degrees even when it’s 100 degrees outside.

Opponents of AC forget history at their peril. The Book of Judith (probably written between 150 and 100 B.C.) contains an early description of someone dying of heatstroke. The extreme European heat wave of 1540 was so severe that some religious figures, including Martin Luther, believed that it presaged the end times.

Relief from boiling summers remained elusive in the early modern era. The 18th-century English physician George Motherby noted that “exposure to a hot sun often produced an inflammation that was speedily fatal.” He recommended treatment with history’s favorite quack cure-all: bloodletting.

“Bleed as freely as the strength will admit,” he wrote.

Thankfully, modern understanding has advanced, and not just in medicine. Humanity now knows how to cool buildings with technology and that the best way to treat heatstroke is rapid cooling, not bloodletting.

AC opponents like to imagine they are leading humanity toward a wiser, more sustainable future. But forgoing air conditioning is a refusal to move on from a lethally hot past.

This article was originally published in The Washington Post on 7/14/2026.

Adentris (YC P25) Is Hiring

Hacker News
www.ycombinator.com
2026-08-27 08:00:31
Comments...
Original Article

Founding Engineer, AI RCM Healthcare Platform (TypeScript, Python)

$160K - $220K 0.01% - 2.00% San Francisco, CA, US / Austin, TX, US

Role

Engineering, Full stack

Skills

Node.js, Python, React, TypeScript, SQL, AI Agents

Connect directly with founders of the best YC-funded startups.

Apply to role ›

About Adentris

Adentris (Y Combinator) builds AI-powered compliance and revenue integrity infrastructure for behavioral health providers. Our systems read real patient records, find clinical and regulatory risk, and put it in front of the people who can act on it. We run on production PHI for paying customers, so every design decision reaches actual patients.

We're also architected differently from most healthcare AI companies: all model inference runs inside our HIPAA-compliant Azure environment. No external LLM APIs ever touch patient data. That data-sovereign architecture is a core reason enterprise customers choose us, and you'll own it.

The founders

You'd be joining three founders, not just a company. Dmitry Karpov (CEO) is a second-time YC founder with a track record in B2B enterprise products and go-to-market. Sergey Yudovskiy (CPO) is also a second-time YC founder: he previously ran ElectroNeek (YC W20) as CEO, scaling it to ~$5M ARR across 30+ countries. He also comes from a family of physicians, which is why claims denied over documentation errors are personal, not abstract. Alex Odin (CTO) is a third-time founder who led AI at ManyChat ($140M+ ARR) and built consumer products used by 25M+ people; he owns the multi-agent architecture behind every Adentris module.

You'll work with all three of us daily, and your line to a decision is one Slack message long.

The role

You'll own the technical direction of the platform end to end. This is not a senior IC role with a bigger title. You decide how clinical data is modeled, how our AI pipelines are evaluated and trusted, and what the platform looks like in two years. Then you build it.

You'll sit in customer calls with Directors of Compliance, leave with a problem nobody has written down yet, and ship it within the quarter. When there's a hard call on architecture, or on whether a model output is safe to show a clinician, you're in the room making it.

This is right for you if you've been the technical center of gravity on something real, and you'd rather own an ambiguous problem than a well-specified ticket. It's wrong for you if you want a defined scope or a team that already exists. You're the person who creates them.

Your first 90 days

  • First 30 days: ship to production. Take over one of our five live modules (Documentation QA is the busiest), get its evaluation harness under your control, and ship an improvement a customer notices.
  • By day 60: own the EHR data layer. We integrate with the behavioral-health-native EMRs (Kipu, Alleva, BestNotes and others), and the ingestion and normalization architecture across them is yours to set.
  • By day 90: you've made at least one architecture decision the company will live with for years, defined how we evaluate model output before a clinician sees it, and set the bar the next engineering hires will be measured against.

What you'll own

  • Architecture across the full stack: data model, ingestion, AI pipelines, application layer, infrastructure
  • The clinical data layer: ingesting and normalizing messy EHR data: FHIR, HL7, and the many formats that pretend to be them
  • AI systems clinicians actually trust: evaluation, ground truth, error analysis. Calling a model is easy. Proving the output is right is the job
  • Product judgment from data: go into real client data, find quality gaps nobody has flagged, turn them into shipped features
  • The engineering bar: as the team grows, you define how we hire, review, test, and ship

What we're looking for

  • 5+ years shipping production software, with real ownership of systems that outlived your involvement
  • Deep TypeScript/Node and Python; advanced React and Next.js
  • Data engineering at scale: schema design, query optimization, pipelines over large volumes of semi-structured records
  • Production LLM systems, not demos. You've built the evaluation harness that kept them honest
  • Communication that carries weight: equally clear with a clinician, a founder, and an engineer

Strong signals

  • Founding or early engineer at a startup that reached real scale
  • Regulated data experience (healthcare, finance, legal); you've been through a SOC 2 or HIPAA audit rather than only read about them
  • Hands-on with EHR data and clinical formats; embeddings and retrieval in production
  • Self-hosted or private model inference experience (Azure ML, vLLM, or similar)

Details

  • Full-time, remote (US), with team meetups in San Francisco
  • Competitive salary plus founding-level equity
  • Direct line to the founders; short path from idea to production

Stack: TypeScript, Node.js, React, Next.js, Python, SQL/NoSQL, Azure-hosted LLM inference, Docker, Kubernetes

US healthcare providers lose billions every year to denied claims, most of them traced back to documentation and coding gaps no one catches until the payer says no. Adentris is an AI revenue integrity platform that catches them first. Our AI agents read EHR and payer interfaces directly, no API integration required, across five modules: documentation, coding QA, prior authorization, appeals and denials, and discharge summaries. And for providers that don't have their own CDI or billing teams, we run billing as a service on top of the platform.

Resonance: A Plague Tale Legacy review – picture-postcard retelling of haunting Minoan myth

Guardian
www.theguardian.com
2026-08-27 08:00:14
PlayStation 5, Xbox Series S/X, PC; Asobo StudioThe medieval franchise is transplanted to Crete, conjuring action-adventure magic from familiar ingredients The path in Resonance: A Plague Tale Legacy is a familiar one. Amid ancient ruins and sun-dappled gorges, a young woman, Sophia, dutifully trea...
Original Article

T he path in Resonance: A Plague Tale Legacy is a familiar one. Amid ancient ruins and sun-dappled gorges, a young woman, Sophia, dutifully treads the same footsteps as a Minoan warrior from millennia ago, one with whom she seems to share a visionary connection. The “resonance” between these two characters is made clear by their echoing actions – a crank pushed in the bronze age that still works in the medieval present, for example. Through these spliced timelines, it becomes clear that Sophia, compelled by her supernatural gift, possesses little agency. Destiny beckons her forwards.

This is a smart meta concept for a game that, at its most basic level, boils down to keeping your left thumb planted firmly on the analogue stick, always pushing Sophia onwards in linear fashion. You jostle her through ornate corridors rendered as higgledy-piggledy pirate camps and cobbled Venetian streets. For the greater part of the game, you propel her through the Minoan remains of Crete, which harbour a dark and terrible secret. It is classic third-person action-adventure fare, building on the template laid down by the likes of Tomb Raider and then refined and complicated by titles such as The Last of Us . Little, from an interactive perspective, surprises: you dash, vault and swing between teetering podiums, squeeze through tiny gaps in rock and crouch behind conveniently placed walls to avoid enemies.

Resonance: A Plague Tale Legacy.
Immersed in the bronze age … Resonance: A Plague Tale Legacy. Illustration: Asobo Studio

Yet the Bordeaux-based studio Asobo conjures magic from the familiar. Sophia, a supporting character from the second game in the A Plague Tale series, carries this swashbuckling adventure with aplomb. She is spiky and confident, the daughter of a wealthy mother and a smuggler father. The game starts with her as a young child, recently escaped from abuse in a nunnery, before cutting to roughly a decade in the future. Now in her 20s, Sophia is a capable, cut-throat fighter, on the hunt for the treasure that lurks deep inside the extensive cave network of Crete – the home, according to Greek mythology, of the bull-headed Minotaur.

In tone, Resonance: A Plague Tale Legacy is a long way off the dour machismo of Christopher Nolan’s recent Odyssey adaptation . Rather than brooding, greyscale landscapes, Asobo delivers a Crete that, at least initially, seems lifted directly from holiday brochures: soft sandstone cliffs, swallows dancing in the evening light, vivid green vegetation tangling around crumbling statues. Some of the most striking sights arrive via the Minoan frescoes: their deep oranges and eye-popping yellows have not faded but remain ebulliently bright.

Resonance: A Plague Tale Legacy.
Worthy of a holiday brochure … Resonance: A Plague Tale Legacy. Illustration: Asobo Studio

It is always a treat when the game pivots to this classical time period, briefly putting us in control of the warrior and letting us soak up the vibrant atmosphere through their eyes: crowds baying for blood; stands draped in textile finery; magenta-coloured flowers strewn across mosaic floors.

But, slowly, the world and story darken, though Asobo’s fascination with light – a means of warding off hordes of rats in prior A Plague Tale games – remains. Sophia carries a sphere that can reflect and refract light, crucial for solving environmental puzzles that often involve rotating supersized lenses to redirect beams. But these puzzles, like the platforming, are somewhat rudimentary, causing you to only briefly pause and ponder without ever yielding oh-so-satisfying “aha” moments. Rarely is there more than one solution or the opportunity to get creative: rather, you must follow the logic clearly signposted by the designers.

Although stealth is sometimes an option, often our champion must engage in hand-to-hand combat. The most memorable fights occur towards the game’s conclusion, in which swirling light causes calcified, zombie-like figures to disintegrate into dust, Sophia teeing up their demise with lethal slashes of her sword. These are some of the most dynamic melee encounters in the game’s roughly 12-hour run time: a balletic, show-stopping dance of light and movement.

Sophia may traipse a path similar to that of countless treasure-hunting, action-adventure video game classics – but for all the overfamiliar design choices, there is enough verve in the beguiling presentation and lively, compellingly drawn characters to elevate this beyond mere retread. Resonance: A Plague Tale Legacy succeeds, in large part, because of Sophia, a heroine who confronts history head on, before finally breaking free of it in apocalyptically spectacular style.

Headlines for August 27, 2026

Democracy Now!
www.democracynow.org
2026-08-27 08:00:00
Over 350 Die and Hundreds Are Missing as Glacier’s Collapse Triggers Floods in Nepal and Tibet, Pentagon Says It Killed 4 People in Latest Strikes on Alleged Drug Boats, Iran Blocks IAEA Inspectors from Visiting Nuclear Sites Bombed by U.S. and Israel, Ukraine and Russia Trade Attacks as Mosco...
Original Article

Headlines August 27, 2026

Watch Headlines

Over 350 Die and Hundreds Are Missing as Glacier’s Collapse Triggers Floods in Nepal and Tibet

Aug 27, 2026

More than 350 people are dead, and over 1,300 remain missing, after a massive wall of water, mud and debris crashed through a Himalayan river valley on the border of Nepal and Tibet. It’s the region’s worst disaster since a devastating earthquake over a decade ago. The mudslide swept through the Lhende Khola river valley just after 8:30 a.m. on Wednesday, washing away homes and burying entire villages. Water levels along the river at one point rose by as much as 27 feet over half an hour. This is Subina Tamang, whose husband remains missing.

Subina Tamang : “In our last conversation at 7:30, he said he was sending two kilos of walnuts and two kilos of chocolates for the children. He also sent some instant noodles for them. And he said he would be coming soon, but he didn’t. … All I want is for my husband to come back to me safely in one piece. I don’t want anything else.”

Hundreds of foreign tourists are among the missing. The mudslide washed away at least 19 bridges, complicating rescue efforts. The disaster was triggered by a 2,000-foot-long chunk of ice that broke from a glacier high in the Himalayas. Climate scientists warn the region is warming much faster than the global average, leading to the rapid retreat of glaciers. Nepal has lost nearly a third of its total ice volume over the last three decades.

Pentagon Says It Killed 4 People in Latest Strikes on Alleged Drug Boats

Aug 27, 2026

Image Credit: U.S. Southern Command

The Pentagon said it carried out strikes against alleged drug boats in the Caribbean Sea on Tuesday, killing four people. The latest attack brings the number of those killed, according to the Pentagon’s own figures, to 227, across 68 strikes that began almost a year ago. Once again, the Pentagon provided no evidence the boat was carrying drugs. Amnesty International has condemned the strikes as extrajudicial killings, a form of murder, saying they amount to crimes under international law.

Iran Blocks IAEA Inspectors from Visiting Nuclear Sites Bombed by U.S. and Israel

Aug 27, 2026

Image Credit: Maxar Technologies

The chief of Iran’s nuclear program says inspectors with the International Atomic Energy Agency will not be allowed to visit nuclear sites in Iran that were bombed by the U.S. and Israel. On Wednesday, Mohammad Eslami, the head of the Atomic Energy Organization of Iran, criticized the IAEA for failing to condemn the strikes, and said the U.N. agency was being used by Iran’s enemies as an intelligence-gathering tool.

Mohammad Eslami : “The IAEA is pressing to visit the damaged sites under pressure from the United States and Israel. The reason for that pressure is that they want to see what their military operation has done to those sites.”
On Wednesday, President Trump told Al Jazeera he has “no time schedule” for when he expects to return to the negotiating table with Iran, adding, “I’m not in a hurry.”

Ukraine and Russia Trade Attacks as Moscow Warns the U.K. Against Supplying Arms to Kyiv

Aug 27, 2026

Ukraine resumed drone attacks on Russia on Wednesday, just hours after CIA Director John Ratcliffe departed Moscow following an unannounced meeting with Russian intelligence officials. Following Ratcliffe’s visit, a wave of Ukrainian strikes killed 12 people inside Russia and in the Russian-occupied Donbas region of Ukraine.

Meanwhile, Russia’s military targeted nine Ukrainian cities overnight, with officials in Ukraine reporting hundreds of ballistic missile and drone attacks. The barrage damaged residential blocks, a school and a medical facility in Kyiv and killed a 78-year-old woman in Zaporizhzhia.

The attacks came as Russia’s Foreign Ministry has warned it could target British military assets, after the U.K. supplied Ukraine with long-range missile technology.

Maria Zakharova : “We have repeatedly warned that the response to Ukrainian strikes using British weapons on Russian territory could target any British military facilities and equipment, whether in Ukraine or beyond. Those responsible for war crimes, including those committed against our country’s civilian population, will be punished in accordance with their actions.”

ICE Arrests Parents at School Bus Stops as Agents Target Danbury, Connecticut

Aug 27, 2026

Connecticut Senator Chris Murphy is calling on the Trump administration to halt immigration raids in the city of Danbury, following reports that ICE has been arresting parents at school bus stops. Murphy wrote on social media, ” ICE waited until the kids were on the bus so when they are dropped off at the end of the day, they are alone, scared to death they can’t find their parents.” Senator Murphy joined other elected officials in Danbury Wednesday at a rally of immigrant rights groups demanding accountability.

Sen. Chris Murphy : “Congress should not authorize a single additional dollar for ICE while this illegality continues.”

The advocacy group Danbury Unites for Immigrants counted 25 people detained Wednesday, 16 on Monday and at least nine on Tuesday. The group says detentions occurred at day-laborer gathering spots and a Latino grocery store and that two of its legal observers were shoved by officers, with one hospitalized with injuries from pepper spray.

5-Year-Old Liam Tadeo and His Father Deported to Mexico

Aug 27, 2026

Image Credit: via GoFundMe

Five-year-old Liam Tadeo and his father Victor Martinez Nieto, who were detained by ICE in Austin, Texas, earlier this month, were deported to Mexico on Tuesday. According to the family’s lawyer, Liam’s father had begged officers to let his son go as they were arrested on their way to soccer practice. His father had wanted his son released to his mother, but that option wasn’t provided to him.

Alex Pretti’s Family Calls for Accountability Seven Months After His Killing by Federal Agents

Aug 27, 2026

Alex Pretti’s family is calling for accountability from the Trump administration seven months after he was fatally shot by Customs and Border Protection agents in Minneapolis. Pretti’s parents said they found out their son had been shot while watching the coverage of the shooting on the news. His mother said she recognized her son’s jacket and sunglasses from the footage. Two CBP agents have been charged for use of force, but they have not been charged for the killing. Alex Pretti’s parents spoke to ABC’s “Good Morning America.”

Susan Pretti : “My shock is, is that he was murdered, and no one has given us the complete truth or anyone has been held accountable. And it’s been seven months.”

Michael Pretti : “There was more effort in vilifying him than pursuing justice, investigating this.”

Appeals Court Declines to Dismiss Charges Against Rep. LaMonica McIver over ICE Jail Visit

Aug 27, 2026

Image Credit: X/@RepLaMonica

A federal appeals court has declined to dismiss charges against Democratic Congressmember LaMonica McIver, who visited the notorious ICE facility Delaney Hall as part of routine congressional oversight. She was charged with interfering with an arrest in May 2025 outside Delaney Hall. She is the only congressmember indicted by Trump’s Justice Department. Earlier this year, Democracy Now! spoke to Congressmember McIver about the charges.

Rep. LaMonica McIver : “The process is the punishment. This is what they’re doing. They’re doing this with your taxpayer dollars, prosecuting a member of Congress for doing their job. It doesn’t cost them anything, because they’re using taxpayer dollars to do so. But I think what it does is it inserts fear in other leaders to step up and hold the administration accountable. It’s intimidation. It’s bullying. And they’re just using me as a tool and a prop to do so.”

U.S. Designates Palestine Action as “Specially Designated Global Terrorists”

Aug 27, 2026

The Trump administration has imposed sanctions on the U.K.-based direct action group Palestine Action and two other organizations, designating them as “specially designated global terrorists.” Palestine Action’s members have broken into factories that produce arms for Israel’s military, where they sabotaged equipment. The U.S. sanctions follow a U.K. appeals court ruling last June that found the British government acted lawfully when it banned Palestine Action under the Terrorism Act. Palestine Action co-founder Huda Ammori responded in a statement, “The fact that Trump is now taking inspiration from Britain’s repression of the movement for Palestinian freedom exposes just how dangerous this ban is and should be a wake-up call to anyone who cares about free speech and civil liberties.”

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.

Please stop flooding our projects with AI slop to furnish your CV

Lobsters
neilalexander.dev
2026-08-27 07:36:05
Comments...
Original Article

30 June 2026 by Neil

Successful contributions to open source projects are a kind of currency. GitHub in particular encourages this in a number of ways: by showing avatars of contributors on repository pages, by showing your contributions to your followers via the activity feed and by signalling contributions per day on the activity graph of your profile. Potential hiring managers often take note of this. Recruiters often find and screen candidates this way. If you are a software developer (either existing or aspiring) looking for work, tuning these signals can often work to your advantage.

As an open source maintainer, it’s quite noticeable how the pattern of external contributions has changed in the last year. We’re far more likely to receive pull requests instead of issues. If we do receive issues, they often come with an AI-generated analysis attached. We’re receiving far more security vulnerability reports than ever before and often they even come with AI-generated fix proposals attached too.

I don’t doubt that some of these contributions are from people who are genuinely interested in what we do, but the cynical part of me believes that a substantial amount of this is that people are realising that AI can be used to game GitHub to their own benefit. It’s now easy to ask Claude to generate a list of interesting open source projects, then ask Claude to find some problems in them, and then ask Claude to raise some PRs to fix them. You don’t even have to use the projects or care about them, but you can easily create the illusion to outsiders that you care, or that you found a problem, or that you put the time into fixing it. On the internet, nobody knows you’re a dog, but with the help of LLMs, you can effortlessly overstate your human abilities on your GitHub profile.

Recently, a contributor with virtually no GitHub-wide contributions from late 2018 up until a couple weeks ago, with no prior engagement with our project that we know of, raised three separate PRs to correct spelling and grammar mistakes in comments. Claude made the fixes, presumably wrote the PR descriptions, even signed off the commits on behalf of the user and then helpfully inserted its co-authorship into the commit message trailers. Maybe it even opened the PRs itself, who knows. I’d be fascinated to know whether the prompt was to “go and find issues” or whether to focus on spelling and grammar issues in particular for whatever reason.

The changes were harmless and correct, but that did not make me feel better about accepting or merging them. Instead I couldn’t help but ask myself: why this, why now? Why, out of all of the issues and TODO s and FIXME s in our codebase are they submitting this ? And then it dawned on me that these contributions weren’t about our project at all.

I closed all three PRs without comment.

Maybe this was unreasonable, but truthfully, I’m just not interested in encouraging people to take up our time with this kind of busywork. I do not want to set a precedent of accepting PRs that materially improve nothing, nor do I want our contributor list to become a reward for asking a robot to fix typos.

The same pattern has emerged with security vulnerability reports. CVEs traditionally are credited to their reporters, but all of the reports that we have received recently have been obviously AI-generated. Security fixes are always important of course, but again I find myself wondering if this is happening because people care about the fixes or because they are looking for an easy credit. We have been far more selective lately when evaluating the severity of such reports and, in some cases, declining to issue CVE notices for low-severity items. I have some feelings about the fact that private disclosure is dying anyway, which I may write about another time, but the effort involved in coordinating private fixes and disclosure notices and releases is substantial enough to require us to be selective.

Ultimately, open source is built on trust. The metric that matters is not how many pull requests you can persuade an LLM to produce, nor how many CVEs you can accumulate, but whether you can make a project meaningfully better. If you want to contribute to open source projects, contribute because you care. If all you want is another green square or another contributor badge, please go elsewhere.

Carhartt data breach exposes information of 12.9 million accounts

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 07:10:04
The ShinyHunters extortion group has published sensitive data from nearly 13 million accounts stolen from clothing retailer giant Carhartt earlier this month, according to data breach notification service Have I Been Pwned. [...]...
Original Article

Carhartt

The ShinyHunters extortion group has published sensitive data from nearly 13 million accounts stolen from clothing retailer giant Carhartt earlier this month, according to data breach notification service Have I Been Pwned.

Founded in 1889, Carhartt is an American apparel company with workwear and streetwear manufacturing facilities in Kentucky and Tennessee and more than 3,000 employees in the United States and Europe.

While Carhartt has yet to confirm the extortion group's claims or issue a statement about the breach, ShinyHunters claimed the attack on August 13 and said they allegedly stole more than 50GB of documents containing a wide range of customer, employee, and corporate data.

image

"Millions of records of customer data and vast amount of sensitive information and PII containing employee, customer, customer metadata (royalty info), and other internal corporate data was compromised," the cybercrime gang said.

ShinyHunters also released an archive of the allegedly stolen records on its dark web after failing to pressure the apparel giant into paying a $3.3 million ransom demand.

"After careful review and internal discussions with leadership, we have decided not to move forward with negotiations or further discussions," a company negotiator told the extortion gang, according to ShinyHunters.

Carhartt entry on ShinyHunters leak site
Carhartt entry on ShinyHunters leak site (BleepingComputer)

​After analyzing the 50GB archive released by ShinyHunters on their dark web site, Have I Been Pwned founder Troy Hunt linked the resulting data breach to the compromise of Carhartt's Databricks analytics platform (a cloud-based data platform that combines standard business reporting and data storage into a unified architecture).

Hunt added that the data breach affects more than 12.9 million Carhartt accounts , with the exposed information including unique email addresses, names, phone numbers, and physical addresses, as well as "millions of synthetic records that did not relate to real individuals and were excluded from the breach ."

The Have I Been Pwned founder also found over 15,000 employees with @carhartt.com email addresses in the leaked database.

A Carhartt spokesperson was not immediately available for comment when BleepingComputer reached out with more questions regarding the incident.

Over the past year, ShinyHunters has also been linked to security breaches at over a dozen Snowflake customers , as well as many third-party integration providers , and claimed breaches at hundreds of Salesforce customers , saying they've stolen more than 1.5 billion records in Salesforce Aura and Salesloft Drift campaigns.

Most recently, ShinyHunters claimed responsibility for a series of breaches at more than 100 organizations following data-theft attacks that exploited an Oracle PeopleSoft zero-day flaw .

Among the breaches claimed by ShinyHunters are the European Commission , Google , Cisco , online dating giant Match Group , PornHub , video service Vimeo , Rockstar Games , edtech giant McGraw Hill , convenience store chain 7-Eleven , cruise line operator Carnival, online training company Udemy, and medical device maker Medtronic ,

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

Two Alleged ‘TeamPCP’ Hackers Arrested in Australia

Krebs
krebsonsecurity.com
2026-08-27 07:04:15
Authorities in Australia have arrested two men believed to be members of TeamPCP, a prolific cybercrime and data extortion group blamed for perpetrating the longest running spree of software supply chain attacks ever. In a statement released today, the Australian Federal Police (AFP) said two unnam...
Original Article

Authorities in Australia have arrested two men believed to be members of TeamPCP , a prolific cybercrime and data extortion group blamed for perpetrating the longest running spree of software supply chain attacks ever.

In a statement released today, the Australian Federal Police (AFP) said two men from Western Australia, aged 21 and 23, were arrested in connection with a “sophisticated cybercrime syndicate that allegedly created malicious open-source software to rob thousands of global businesses.”

The AFP did not name the defendants, but KrebsOnSecurity learned the 21-year-old suspect’s real identity in June, and has been communicating with him ever since. This story includes interviews with TeamPCP’s self-described spokesperson, and examines clues left behind by the TeamPCP leader that likely led to his undoing.

TeamPCP vaulted onto the cybercrime scene in late 2025, embedding malicious code in hundreds of open source software tools and extorting victims for profit. Members of the group made headlines by compromising corporate cloud environments using a self-propagating worm dubbed Shai-Hulud , which added malicious code to open source programs maintained by developers whose credentials at public code repositories like GitHub or NPM were phished or stolen.

Writing for Wired , journalist Andy Greenberg described TeamPCP’s core tactic as a kind of cyclical exploitation of software developers.

“The hackers gain access to a network where an open source tool commonly used by coders is being developed,” Greenberg wrote in May . “The hackers plant malware in the tool that ends up on other software developers’ machines, including some who are writing other tools intended to be used by coders. The malware allows TeamPCP’s hackers to steal credentials that let them publish malicious versions of those software development tools, too. The cycle repeats, and TeamPCP’s collection of breached networks grows.”

TeamPCP also has practiced something akin to cyclical recruitment. In May, the source code for the third iteration of Shai-Hulud was published online, and TeamPCP soon after launched a contest offering $1,000 in virtual currency to whichever participant could conduct the largest supply chain operation using the worm’s code. According to the contest rules, participants were scored based on the number of weekly and monthly downloads of packages they compromised — directly incentivizing them to target the most popular code libraries.

A screenshot of a message from TeamPCP’s Telegram account, announcing the supply chain hacking contest. Image: dataminr.com.

“TeamPCP has stated the competition is a recruiting opportunity and they intend to purchase all meaningful access harvested from participants’ campaigns,” the security firm Dataminr wrote . “The $1,000 XMR (Monero) prize is a recruitment floor and has been dismissed by the actor as ‘just like participation trophy,’ adding ‘if you find something good you will be paid way more,’ confirming the contest’s true function as talent identification and malicious access acquisition at scale.”

In March, TeamPCP executed a supply chain attack targeting AI infrastructure by compromising the code for LiteLLM , an open source AI gateway that connects users to more than 100 different large language models. A recent analysis by the security firm CloudSEK found TeamPCPs attack on LiteLLM harvested cloud service keys and other secrets from more than 2,500 organizations, including many of the world’s top technology companies.

In May, TeamPCP claimed credit for compromising at least 3,800 code repositories at the Microsoft-owned GitHub , after a GitHub developer installed a code extension that was compromised by TeamPCP’s malware.

MEET THE CYBERCATS

Security experts say TeamPCP is less of a hacker group than an amalgamation of threat actors from multiple cybercriminal gangs who sometimes work together toward similar goals.

“It is not a structured criminal crew with a single operator,” said Austin Larsen , a principal threat analyst with the Google Threat Intelligence Group . “It is a peer community of individually-skilled actors, with one clear center of gravity.”

That center of gravity is George Prepakis , an accomplished security researcher and self-described exploit developer who operates the Twitter/X profile @kernelstub . Earlier this year, @kernelstub tweeted a public invite link to a Matrix chat server he created and dubbed “Cybercats,” and TeamPCP and several other cybercrime entities have been using this server to communicate daily for the past several months.

A screenshot of the Element Matrix chat server “Cybercats,” whose members used hacker handles associated with multiple distinct cybercrime groups that have occasionally collaborated on a series of supply chain and data ransom attacks over the past nine months.

Kernelstub, like other administrators in the Cybercats chat, has been using his Twitter/X profile name as his handle in these Matrix communications, frequently tweeting references to other members and to conversations taking place in the Cybercats chat. In a number of cases, the corresponding X accounts for members of the Cybercats chat taunted cybercrime victims publicly before the incidents were reported in the news media.

The Cybercats administrator listed at the top of the screenshot above — “ Boxturtle ” — is a close associate of TeamPCP who has been tweeting about the group’s conquests under the name @xpl0itrsturtle . This handle corresponds to a data breach broker active on Breachforums and Darkforums who has been selling data stolen in a wave of recent breaches at automobile manufacturers, including BMW Group , Audi , Honda , Mercedes-Benz , Volvo and Toyota , as well as data allegedly taken from Snapchat and SportRadar .

The data leak site for the extortion group or handle “xpl0itrs.”

The Cybercats administrator “ SeesawSec ” in the screenshot above is the alias of whoever is behind the cybercrime group known as Fulcrumsec , which recently claimed credit for data extortion attacks against the pharmaceutical giant Novo Nordisk , the data broker LexisNexis , and Avnet , a Fortune 500 distributor of electronic components.

The data leak site of Fulcrum Security, a.k.a. Fulcrumsec.

The Cybercats administrator “ @pcpcasper ” also has been using a similar name on X to discuss TeamPCP’s attacks and victims. This person has an extensive message history on Telegram, where their messages and shared videos show @pcpcasper is an active and vocal member of the National Socialist Network, a neo-Nazi political organization based in Australia.

At one point in these chats, @pcpcasper shared videos and images of what they claimed was their cat, and several of those videos place this user in Western Australia. One source close to the investigation told KrebsOnSecurity that @pcpcasper was the other suspect arrested today, a claim supported by messages that @kernelstub posted online this morning.

The Cybercats member roster pictured above also features an administrator with the username “ T ,” which is short for the now-banned Twitter/X profile @pcpcats , the account operated by the self-described TeamPCP spokesperson who was arrested today. As we’ll see in a moment, @pcpcats also is from Western Australia.

By the time @kernelstub tweeted a public invite link to the Cybercats Matrix server, T/@pcpcats was posting only infrequently to the group chat, with other members often inquiring as to his whereabouts and well-being. The group’s collective concern related to @pcpcats’s tendency to blame his increasingly extended absences on the use of hallucinogens and other narcotics that kept him awake for days on end, but also caused him to crash in bed for several days after the highs wore off.

WHO IS THE TEAMPCP LEADER?

The Cybercats member @pcpcats has used multiple nicknames on the cybercrime forums, including EllisD25/LSD on Darkforums, BulkDMT on Breachstars, and Express on Breachforums. These accounts are linked because they all advertised the same Tox ID and/or Session ID as instant message contact handles in their cybercrime forum posts. BulkDMT was also known on the forums as DMT Host , which was a virtual private server (VPS) hosting service that was peddled on Darkforums and Breachstars.

DMT Host/EllisD25, posting on the English-language cybercrime community DarkForums in September 2025. Image: ke-la.com.

According to the cyber intelligence firm Intel 471 , Express registered on Breachforums using the email address shitstickpp@gmail.com . Intel 471 finds Express posted on Breachforums across a two-month period in 2025 using four different Internet addresses located in South Africa . On July 30, 2025, Express announced on Breachforums they were selling access to 14 gigabytes of data stolen from South Africa’s State Information Technology Agency.

The threat intelligence platform Flashpoint recorded more than a year’s worth of messages from the TeamPCP leader’s alter ego on Telegram — Persy_PCP —  who claimed they split their life living between two countries [full disclosure: Flashpoint is an advertiser on this blog]. “I have these [files] as well, problem is these are in another country,” Persy_PCP explained to another user inquiring about a stolen data set in November 2025.

Later that month, Persy_PCP complained, “My whole country is racist and they want people like me dead.” Flashpoint records show BulkDMT shared in September 2025 that “this country is going to fucking starve when they take the farmers land,” a likely reference to white landowners in South Africa who claim to be targeted by an ongoing genocide campaign .

This tracks with public reporting on TeamPCP. Cyberscoop reported in June that Google had traced TeamPCP’s residential and mobile Internet address connections to South Africa, “indicating the primary operator was located there during at least some of its attacks.”

BulkDMT also shared on the group chat at Breachforums that they were recovering from an addiction to methamphetamine. “My life is kinda fucked rn [right now], but that’s fine and there isn’t really a point in pouring so much emotional energy into that fact, my parents had money but I unfortunately got really addicted to some things so I don’t get to benefit from that. As long as I continue to survive, stay sober, and move closer towards my goals that’s enough drive and meaning.”

The breach tracking service SpyCloud finds shitstickpp@gmail.com shows up in the registration of an account called ChristmasSnow on the cybercrime community Raidforums in 2022. Nearly all of the Internet addresses used to access that account came from ISPs in Perth, Australia, SpyCloud found.

KrebsOnSecurity looked up all of those Perth IP addresses in passive DNS records maintained by DomainTools.com , and found one of them — 211.27.196.111 — for several years was used as a private file server by a family in Perth with the last name of Thomson . Those records show at least three hosts — ithomson.direct.quickconnect.to (a remote Synology server), kthomson0061.direct.quickconnect.to, and joshuawthomson39.myqnapcloud.com (a QNAP network storage device) — persisted at that address between 2022 and 2025.

Searching on “ joshuathomson39 ” in the breach tracking service Constella Intelligence reveals an account at the freight forwarding company kwe.com created in the name of Joshua Thomson from Perth, Australia. The open source intelligence platform Epieos finds the phone number attached to that kwe.com account was used to register a Facebook profile for Josh Thomson, which says his family includes a brother named Ruben , his father Ian , and his mom Cindy.

That Facebook profile also says Josh and his family are originally from Pietermaritzburg , in KwaZulu-Natal, South Africa, but currently living in Cottesloe , a beach-side suburb of Perth. A search in DomainTools for Ian Thomson and Australia unearthed five domains by the same registrant, including securecomputing.au , thomson.org.au , and thomsonfamily.net.au . Ian Thomson is a dentist in Cottesloe, and a biography says he graduated from The University of the Witwatersrand in Johannesburg, South Africa.

Constella finds a joshua@thomson.org.au registered a number of accounts online, but Josh doesn’t seem to have much of a connection to dodgy cybercrime forums. His brother Ruben, on the other hand, has quite the presence on these communities, dating back to at least 2018. Constella reports ruben@thomson.org.au frequently reused the password “joshuathomson1,” and Constella further finds that password was used by just a handful of accounts, including yolosolo17@gmail.com and surfinup8@gmail.com .

According to Intel 471, surfinup8@gmail.com was used to register the user Yolosolo17 on the crime forum Altenen in 2018, and that user account was registered from the Perth address 110.141.230.15 . On Altenen, Yolosolo17 advertised free web proxies, as well as the domain rubenthomson.com, which was at one point used to sell steeply discounted iPhones. DomainTools says rubenthomson.com was hosted at 110.141.230.15 and registered to surfinup8@gmail.com.

A cached copy of the domain rubenthomson.com from 2017 shows a login page underneath a banded stack of money. Image: archive.org.

SpyCloud reports 10.141.230.15 was used by the email address sheepstealing@gmail.com on Raidforums and surfinup8@gmail.com on Nulled, and that the same IP was used by the email addresses ian@thomsonfamily.net.au, jasper@yakuza.cc, and rubenthomson1@gmail.com. SpyCloud also shows that sheepstealing Gmail address is tied to the accounts Sheep420 , YoloSolo117 and Yakuza.cc on Raidforums, and to the account “Sheep Stealing” on Hackforums. Intel 471 says sheepstealing@gmail.com was used to register the account DingoFlour on Breachforums in October 2023, as well Sheepx on Altenen.

Epieos reports that ruben@securecomputing.au is tied to an Airbnb account for Ruben, who described himself as a Web developer who went to school at the University of Western Australia and was living outside the country. “Hey, I’m Ruben, my friends call me Ellis . I’m a Perth creative who occasionally books rooms when visiting family and for photography.”

Epieos also finds sheepstealing@gmail.com registered an upwork.com profile under the name Ruben, who said his main skills are setting up secure server hosting solutions and PHP full-stack Web development.

“I’m familiar with Linux, working with relational databases (SQL),” the Upwork profile reads. “I also script in Python mainly for writing social media bots.”

The Upwork profile for Ruben Thomson in Cottesloe, Australia.

Epieos further discovered sheepstealing@gmail.com is connected to a Microsoft account for Ruben Thomson, and to a now-defunct GitHub account called XmasSnow/XmasSnowisBack that scammed people on the forums in 2022 by claiming to sell exclusive exploits for recently-released software patches (recall that shitstickpp@gmail.com was used to register a forum account named ChristmasSnow).

This same sheepstealing email address registered a Twitter/X account in 2026 called “Gone Fishing” that lists its location as South Africa. That Gmail account also left several reviews for businesses listed on Google Maps over the past seven years, but all of those establishments are located on the west coast of Australia.

Business reviews in Western Australia left by the Google account sheepstealing at gmail.com.

The people search service Pipl finds a 21-year-old Ruben Thomson in Western Australia who has a phone number ending in 979. A lookup on that number at Epieos reveals it is connected to a TikTok account under the name Ellis, and to a PayPal account in the name of Ruben Thomson.

Finally, a search on the name Ruben Thomson from Cottesloe at the Australian government’s record of registered businesses finds he has incorporated or served as an official in multiple companies created since 2024, including Secure Computing Solutions , Tensor Industries , and another entity ironically named OPSEC Express . Recall that Express was BulkDMT’s nickname on Breachforums.

Australian companies connected to Ruben Thomson. Image: abr.business.gov.au.

It’s ironic because OPSEC is short for the term “operational security,” which refers to techniques and behaviors used to obfuscate and compartmentalize one’s real-life identity online, and using your cybercrime handle as part of your own company name is very much the antithesis of that practice.

There is at least one other major opsec failure by Ruben that exposed a link to TeamPCP. In June 2025, someone using the name Ruben Thomson registered on HackerOne , a popular “bug bounty” program that seeks to reward and recognize researchers who agree to work with affected software vendors to help fix the flaws before publishing about their findings. What was Ruben Thomson’s chosen HackerOne username? Deadcatx3 , a nickname that has been flagged by multiple security firms as an alias used by TeamPCP.

The HackerOne profile for “Ruben Thomson” uses the nickname Deadcatx3, which multiple security firms have concluded is an alias used by TeamPCP. Image credit: flare.io.

INTERVIEW WITH ELLIS

In early July 2026, not long after having discovered clues about Ellis’s real life identity, KrebsOnSecurity interviewed the TeamPCP leader via Signal, where he was remarkably open about his activities and personal struggles [for the sake of simplicity, the TeamPCP spokesperson will be referred to from here on as Ellis].

Ellis claims he stopped doing cybercrime for TeamPCP in March 2026 — just before the attacks that compromised LiteLLM — and that at least one other individual has taken over the group’s leadership since then. Ellis shared that a year earlier he had just completed the latest in a series of detox and sobriety programs, and was two months sober when he reconnected with some old friends from the malware development scene.

“One year ago I needed help monetizing some [GitHub credentials], I was two months sober and needed a distraction and something to keep busy as well as people to speak to,” Ellis said. “I had largely disconnected from my old circle, they had become very toxic and I needed to get away from the substances. Previously I had done some mass exploitation campaigns and grew up doing [malware development] and [capture the flag] contests. There were some friends who were also vending but had stopped a while, and one of them introduced me to some chats where I posted access for sale.”

Prior to that, Ellis said, he was homeless and hopping between “some very unstable places.”

“Blackhatting is fun,” he said. “There are actual rewards and incentives to learn and you grow with your team. Without qualifications, no employer will even take the time to hear you out.”

Ellis claims he’s earned a grand total of about $20,000 for his activities with TeamPCP, and that it was never about the money or fame for him. Asked whether his experiences with TeamPCP might prepare him for gainful employment in a legitimate IT job, Ellis said he doubted it.

“I am nowhere close to a skill level where I am comfortable, and this would take maybe half a decade of further experience,” he said. “I no longer have to choose between rent and food for that I’m grateful and so are the team members.”

Ellis expressed no remorse over his cybercrime activities, and said he was grateful for the friendships and relationships built throughout his engagement with TeamPCP. The young hacker also seemed resigned to his fate, and told KrebsOnSecurity that he’ll accept the consequences if he’s ever arrested.

“If I’ve already been found out then its out of my control, I’ll make peace with that,” he said. “Honestly, I think someone like me needs a lot of help that prison just can’t provide. If I had the funds to study different parts of the field and closer guidance, this would have turned out differently. But that’s a pipe dream and we both know this.”

It is clear from reading Ellis’s posts to the group’s Matrix server chats that his struggles with sobriety are ongoing. On Thursday, June 25, Ellis told @kernelstub he was about to “trip” with his “homie.”

“What kind,” @kernelstub inquired.

“Ketty and some DMT,” Ellis replied, referring to the dissociative anesthetic ketamine and dimethyltryptamine (DMT), a powerful psychedelic compound that is found naturally in some plants but is also synthetically produced in underground lab environments. “There’s a little 2cb so we might throw that in the mix,” he continued, referring to another psychedelic compound by its chemical shorthand.

Roughly two weeks before his arrest, Ellis told KrebsOnSecurity he was ready to leave his life of crime behind and was prepared to turn himself in, but that in the meantime he was making plans to tie up loose ends.

Less than 24 hours later, the TeamPCP leader posted an image on Telegram showing a yellowish powdered substance in a baggie and on a scale, possibly synthetic DMT. The image shows the powder being weighed next to a series of small vape cartridges, two of which are open on the table in front of the photographer.

An image posted by the TeamPCP leader to Telegram, advertising his acquisition of some type of psychoactive substance, most likely a synthetic version of the powerful hallucinogen known as DMT.

The two defendants were arrested Wednesday morning. The AFP said the men face a combined 14 cybercrime offenses and are scheduled to appear in Perth Magistrates Court today.

Charlie Eriksen is a security researcher at Aikido Security who has closely followed TeamPCP’s cybercrime campaigns. Eriksen said TeamPCP are a good example of a new kind of threat actor that does not fit neatly into the usual categories.

“They are not a state actor, not quite organized cybercrime, and not purely ideological,” he said. “Their motivations seem to mix money, disruption, attention, and ideology.”

Eriksen said that historically there has always been a meaningful gap between reading about an attack technique and being able to reliably turn it into an operational campaign, but that large language models (LLMs) and artificial intelligence increasingly are helping threat actors to bypass that knowledge gap.

“You had to understand the research, adapt the code, troubleshoot it, build infrastructure around it, and then repeat that process across different targets,” he said. “LLMs have compressed that gap significantly.”

According to Eriksen, this creates an environment where threat actors suddenly have the ability to operate at significant scale without having developed the operational discipline that traditionally accompanies that level of capability. Put another way, it sets the stage for cybercriminals who are capable enough to cause significant damage, but not necessarily careful enough to understand or care about the consequences.

“They can be noisy, they can make mistakes,” he said. “They can leave evidence everywhere. They can take risks that a professional criminal group or intelligence service would consider completely unacceptable. But that does not necessarily make them less dangerous. In some ways, it can make them more dangerous. ”

In a recent blog post , Eriksen called TeamPCP’s Shai-Hulud worm the “best thing to happen to supply chain security,” because it forced GitHub and other public coding platforms to erect new security safeguards.

In direct response to TeamPCP’s broad success at pushing poisoned versions of popular software packages, GitHub in late July introduced a three-day “cooldown” mechanism for Dependabot, the platform’s tool for auto-fetching newly shipped updates for any package dependencies. Cooldown periods are designed to help buy time for security tools and package maintainers to identify and remove any compromised versions. Other coding ecosystems like Python and various JavaScript platforms also added support for cooldown periods this year amid growing calls from security experts about the need for more widespread adoption of the safety feature.

Eriksen said TeamPCP’s legacy is that they achieved in the span of a few months what the supply chain security community has been unable to do for years.

“They managed to wake up Microsoft to the fact that they had become negligent in terms of security,” Eriksen said. “By compromising GitHub and stealing their source code, they humiliated Microsoft into action, making them finally act on what we had been asking them to do and take seriously for a while now.”

Pollen Robotics (Hugging Face) Microduck

Hacker News
pollen-robotics.com
2026-08-27 06:57:56
Comments...
Original Article

Microduck Made to move · Ready to learn

A 25 cm open-source biped you train yourself with reinforcement learning. Playable out of the box.

Pre-order for $399

The Microduck squad

The launch film · sound on

Roll the tape

Meet the twin

sim2real that works

Trained in sim, deployed on the real robot. This is the simulated twin the ducks were trained on.

Fun out of the box. Yours to retrain.

Teach it new tricks

Every behaviour is a policy you can retrain on your own machine .

01

Train in simulation

Behaviours are learned in physics sim, on your machine or on Hugging Face Jobs.

02

Deploy on the robot

One step from simulation to the real thing.

03

Refine the simulation

Tune, re-train, re-deploy.

04

Publish the policy

Share your new behavior with the community!

Walk

Velocity-tracking gait.

Sit & stand

Sits down, holds the pose, stands back up on its own.

Kick

A one-shot boot, then straight back to walking.

Grab

Dips the beak to the ground, scoops, and pops back upright.

Roller skating

Roller skating locomotion when the skates are equipped.

Get back up

Flat on its back to standing, all by itself, ready for the next command.

One robot, four colourways

Choose your colour

Every Microduck ships in one of four colourways . Same robot, same brains underneath - pick the shell that best fits you.

Out in the world

In the wild

The real robot in real places - on desks, on the pitch, out at golden hour.

The robot, and what to add to it

Pick your pack

The robot is everything you need on day one . The packs add play gear and spare parts.

The Microduck robot standing on a desk, drawn as a comic panel

$399

The robot

Microduck

In the box

Robot, battery, USB-C cable, game controller.

Charger pack

A dual-slot battery charger, two spare batteries and a USB-C cable, drawn as a comic panel

$39

Dual charger, 2x batteries.

Dev pack

Three spare motors, motor cables, two batteries, a charger, ten NFC tags, a Hugging Face sticker, a screwdriver and spare screws, drawn as a comic panel

$119

3x spare motors, 5x motor cables, 2x batteries, dual charger, 10x NFC tags, Hugging Face credit, screwdriver, screw pack.

Accessory pack

Two yellow roller attachments, a ball, a laser pen, an NFC polaroid and ten NFC tags, drawn as a comic panel

$39

Laser pointer, NFC polaroid, 2x rollers, ball, 10x NFC tags.

15
Motors

25 cm
Tall

800 g
To pick up

Camera
Plus LiDAR and two IMUs

7
Trained moves in the box

50 Hz
Onboard policy loop

Built in the open

Open source

The SDK, the simulation and the full RL training stack are on GitHub. What the robot runs is what you can read, fork and retrain .

pollen-robotics/microduck

$ robotctl monitor   # status of the robot$ robotctl configure # configure the robot$ robotctl update    # update the robot

Apache-2.0

The whole software stack, permissively licensed

MuJoCo

The physics sim every policy is trained in

7 policies

Every shipped move, published and retrainable

Join the flock

Builds on show, policies to swap , help when a leg does something strange. The community lives on Discord.

End of tape · be kind, rewind

Pre-orders are open now

Pre-order for $399

In four colourways. Ships before Christmas 2026 .
Introductory price, before taxes and shipping .

tailcat: like netcat, but over Tailscale's data plane, without Tailscale's control plane

Lobsters
github.com
2026-08-27 06:51:27
Comments...
Original Article

Tailcat

"Tailscale without Tailscale, by Tailscale"

Tailcat is a remix of Tailscale open source pieces to act like netcat , but over Tailscale's data plane, without Tailscale's control plane. Tailscale's data plane ( magicsock , internally) gives you point-to-point WireGuard®-encrypted tunnels between two machines with DERP as the NAT-hole-punching communication side channel and the ultimate relay-of-last-resort if NAT traversal fails. Instead of using the Tailscale control plane, all tailcat connection metadata is exchanged out of band, however you want.

The tailcat CLI (in cmd/tailcat ) is built on the tailcat Go library (importable as github.com/tailscale/tailcat ).

Whether you use tailcat as a CLI tool or library, one side runs a tailcat server (listener) and gets back a short connection token. The other side passes that token to tailcat 's client side to connect. All traffic between the two is encrypted end-to-end with WireGuard. The initial connection bootstraps through a DERP server ( see below ), and then magicsock performs NAT traversal to upgrade to a direct peer-to-peer UDP connection when possible (usually!).

You don't need a Tailscale account, root/admin access on the machine (it doesn't alter your machine's routing tables, DNS, etc.). It's just a userspace library and CLI tool.

And it's all open source.

You can use our free rate-limited DERP relays (the default DERP map is https://tailcat.dev/derpmap.json ) or you can run your own .

There's also an experimental in-browser web demo (tailcat compiled to WebAssembly) at https://tailscale.github.io/tailcat/ that can send and receive files or text, interoperating with the CLI. Browser traffic is relayed over DERP only, with no direct connections until WebRTC support ( #4 ).

Install

$ go install github.com/tailscale/tailcat/cmd/tailcat@latest

Or with Nix flakes, run it directly or install it:

$ nix run github:tailscale/tailcat
$ nix profile install github:tailscale/tailcat

Usage

Pipe stdin/stdout between two machines

Server starts, printing out its ephemeral address:

$ tailcat
# Selected bootstrap relay region 302, San Francisco
# 🐈 Server listening with new address: tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
(hangs, waiting...)

And then the client can:

$ echo hello | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
$ 

Then the server unblocks:

$ tailcat
# Selected bootstrap relay region 302, San Francisco
# 🐈 Server listening with new address: tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
hello
$

Expose local ports through the tunnel

Or you can serve a local TCP port, forwarded to localhost:

$ tailcat --serve=8080,8443 # or --serve=all
# 🐈 Server listening with new address: tcXXXXXXXXX

And then the client:

$ tailcat tcXXXXXXXXX 8080
GET / HTTP/1.1
Host: foo

HTTP/1.1 200 OK
....

Auth-free SSH server

On Linux and macOS, you can run an SSH server too with no auth. (If you want auth, you can just tailcat --serve=22 and proxy to your system SSH server)

$ tailcat --serve=no-auth-ssh
# 🐈 Server listening with new address: tcXXXXXXXXX

And on the client side:

$ tailcat ssh tcXXXXXXXXX
$ tailcat ssh tcXXXXXXXXX ls -la

Misc commands

Ping to test connectivity; each pong reports whether it arrived via a DERP relay or a direct path. --until-direct keeps pinging (up to --timeout , default 10s) until a direct path works, exiting non-zero if one doesn't:

$ tailcat ping --until-direct <token>
pong in 42.1ms via DERP(sfo)
pong in 1.2ms via 203.0.113.7:41641

Run a command through a SOCKS5 proxy routed over the tunnel:

$ tailcat socks <token> curl http://server.tailcat:8081/

Tokens also work directly as URL hostnames: the SOCKS proxy recognizes and dials them, so the token argument is optional. (Tokens are case-sensitive; this works with curl and most CLI tools, but not with browsers, which lowercase hostnames.)

$ tailcat socks curl http://<token>:8081/

Act as an exit node so the client can reach the server's network:

$ tailcat --serve=exit-node

Parse a connection token and print its contents (the server's WireGuard public key and DERP info) as JSON, without connecting to anything:

$ tailcat parse tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
{
    "ServerPublic": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34",
    "RegionID": 302
}

Resolve a short token (which references a DERP region by ID, requiring clients to fetch the DERP map) into a longer self-contained one with the DERP server info embedded, letting clients connect more quickly:

$ tailcat resolve tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFygaFhToGjYWhudGMzMDJhLmlwbi5kZXZhNG0yMDguMTExLjM5LjM4YTZzMjYwNzpmNzQwOjA6M2Y6OjcyMA

Parsing that resolved token shows the embedded DERP info:

$ tailcat parse tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFygaFhToGjYWhudGMzMDJhLmlwbi5kZXZhNG0yMDguMTExLjM5LjM4YTZzMjYwNzpmNzQwOjA6M2Y6OjcyMA
{
    "ServerPublic": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34",
    "Region": [
        {
            "Nodes": [
                {
                    "HostName": "tc302a.ipn.dev",
                    "IPv4": "208.111.39.38",
                    "IPv6": "2607:f740:0:3f::720"
                }
            ]
        }
    ]
}

A server can print the long self-contained form directly with the --full-address flag.

Key Management

A server's address (connection token) is derived from its WireGuard key, so the key you use determines who can reach you:

  • Ephemeral keys (the default): each server run generates a fresh key in memory and prints an address nobody has ever seen. When the process exits, the key is discarded and the address is dead forever. This is the safe default: sharing that address only ever refers to that one run.

  • Saved keys: tailcat genkey generates a key saved to disk so the address stays stable across restarts. The flip side: anyone you've ever shared that address with can connect to any future server using that key, unless you restrict clients with --allow (see tailcat genkey --client ).

The CLI says at startup which kind it's using, so you know whether you're starting a fresh single-use server or re-listening on an address you may have shared in the past.

$ tailcat genkey --region=nyc
# prints the token; key saved to ~/.config/tailcat/keys/default.private.json

# later; the key named "default" is used automatically once it exists:
$ tailcat --serve=8080
# 🐈 Server listening with saved key "default": tcXXXXXXXXX

# ... unless you force a one-off ephemeral key:
$ tailcat --serve=8080 --key=new
# 🐈 Server listening with new address: tcXXXXXXXXX

That is, default is a magic key name: once it exists, plain tailcat silently uses it instead of generating an ephemeral key, and the startup line above is what tells you which happened. Use --key=new to get an ephemeral key anyway, --key=<name> to use a different saved key, or tailcat genkey --delete --key=default to remove the saved default key. tailcat genkey --list lists your saved keys.

Tokens can also be published as DNS TXT records and looked up by name; a DNS name works anywhere the CLI takes a token:

# If example.com has a TXT record "tailcat=tc..."
$ tailcat example.com 8080
$ tailcat ssh example.com
$ tailcat ping example.com

Examples

Protected SSH server over DNS

Who needs port forwarding or port knocking? This runs an SSH server reachable from anywhere by name, with no open inbound ports on the server, where WireGuard authenticates the client before the SSH server ever sees a packet.

On the client machine, generate a client identity keypair. It prints the public key, which is all the server needs to know:

client$ tailcat genkey --client
# wrote file to ~/.config/tailcat/keys/client-default.private.json
nodekey:cfb6bfa77a0654d7450947fd6acef17d2cd848da1d30b2540b13dac272ddfd16

On the server, generate a server keypair pinned to its nearest DERP region (see why below), then serve SSH to only that client:

server$ tailcat genkey --fixed-region
# wrote file to ~/.config/tailcat/keys/default.private.json
tcXXXXXXXXX

server$ tailcat --serve=22 --allow=nodekey:cfb6bf...ddfd16
# 🐈 Server listening with saved key "default": tcXXXXXXXXX

Publish the token in DNS as a TXT record:

my-server.example.com. 300 IN TXT "tailcat=tcXXXXXXXXX"

And then the client side is just:

client$ tailcat ssh my-server.example.com

Client modes automatically use the saved client-default key when it exists, so no extra flags are needed to present the allowed identity. Anyone else's handshake is silently ignored: they can't reach the SSH server, or even learn that one is running.

Why --fixed-region : it discovers the nearest DERP region once, at genkey time, and bakes its ID into both the printed token and the saved key file, so server restarts bind to the same region (keeping the published token valid) without re-probing. Plain tailcat genkey defaults to --region=auto , which instead bakes in "pick at startup": fine for one-off use, but a token published in DNS should name a fixed region so clients and future server restarts all rendezvous in the same place. ( --region=<name> pins an explicit one instead; --region=list shows the choices.)

TODO: make the client more robust here if the DERP map changes over time: #7

Bring your own DERP relay

Nothing requires Tailscale's relays: run your own DERP server (it needs a hostname with a TLS certificate, which derper can get itself via Let's Encrypt), then generate a server key that uses it by passing its hostname (or several, comma-separated) as the region:

server$ tailcat genkey --region=derp.example.com
tcomFwWCCAIsKOqPUux6ClG2RM4A_vOq4VBzGgHGGjq9OsJuFKSWFygaFhToGhYWhwZGVycC5leGFtcGxlLmNvbQ

server$ tailcat --serve=22

The token embeds your relay's hostname:

$ tailcat parse tcomFwWCCAIsKOqPUux6ClG2RM4A_vOq4VBzGgHGGjq9OsJuFKSWFygaFhToGhYWhwZGVycC5leGFtcGxlLmNvbQ
{
    "ServerPublic": "nodekey:8022c28ea8f52ec7a0a51b644ce00fef3aae150731a01c61a3abd3ac26e14a49",
    "Region": [
        {
            "Nodes": [
                {
                    "HostName": "derp.example.com"
                }
            ]
        }
    ]
}

so clients need no extra flags and never contact Tailscale's DERP map server or relays, and the only rate limits are yours. Alternatively, if you run a whole fleet of relays, serve your own DERP map JSON and point both sides at it with --derpmap-url .

Go library

A minimal server that answers any TCP port through the tunnel and prints its token. The zero value Server picks defaults for anything unset: a fresh ephemeral key, the nearest region of the default DERP map, and log.Printf logging (set Logf to logger.Discard for quiet):

package main

import (
	"fmt"
	"log"
	"net"

	"github.com/tailscale/tailcat"
)

func main() {
	s := &tailcat.Server{
		OnTCP: func(port uint16) func(net.Conn) {
			return func(c net.Conn) {
				fmt.Fprintf(c, "hello from port %v\n", port)
				c.Close()
			}
		},
	}
	if err := s.Start(); err != nil {
		log.Fatal(err)
	}
	fmt.Println(s.ConnBlob())
	select {}
}

And a minimal client that dials it, given that token as its argument. Like Server, the Client zero value works with just its Server token field set ( tailcat.NewClient is shorthand for exactly that), and the tunnel is established lazily by the first dial:

package main

import (
	"context"
	"io"
	"log"
	"os"

	"github.com/tailscale/tailcat"
)

func main() {
	cl := tailcat.NewClient(tailcat.ConnBlob(os.Args[1]))
	defer cl.Close()
	c, err := cl.DialTCPPort(context.Background(), 80)
	if err != nil {
		log.Fatal(err)
	}
	io.Copy(os.Stdout, c)
}
$ ./client tcomFwWCAWf933BLELdzd3RkHiOufJ...
hello from port 80

How it works

Connection tokens

A Tailcat server is identified by a connection token (called a ConnBlob internally). It looks like tcXYZ... and is a "tc" prefix followed by base64-encoded CBOR containing:

  • The server's WireGuard public key (Curve25519, 32 bytes)
  • DERP info. Either:
    1. a small integer referencing one of the default Tailscale-run tailcat servers ), or
    2. full DERP server metadata, to either use a custom DERP server, or to avoid the client needing a potential round-trip to fetch the latest DERP map (the server's --full-address flag and the tailcat resolve subcommand produce this form)

A typical token with just an integer region ID is around 50 bytes. With embedded DERP node details it's longer but self-contained.

Network stack

Tailcat reuses Tailscale's client networking components but without the control plane.

  • WireGuard -- a userspace WireGuard implementation for encrypting all tunnel traffic. It doesn't use a kernel TUN/TAP device (nor does it configure any networking routes or DNS settings), so root isn't required.
  • magicsock -- Tailscale's transport layer that multiplexes traffic over direct UDP and DERP relays. It handles STUN-based endpoint discovery and UDP hole-punching for NAT traversal.
  • Netstack (gVisor) -- a userspace TCP/IP stack that terminates TCP connections inside the process. This is what lets Tailcat accept inbound connections and dial outbound ones without any OS network configuration.
  • DERP relay -- Tailscale's encrypted relay protocol, used as a rendezvous channel and as a fallback data path when direct connectivity isn't possible.

Connection flow

  1. Server starts. It generates (or loads) a WireGuard keypair, connects to a DERP relay, and prints its connection token to stderr. It then waits for clients.

  2. Client parses the token to learn the server's public key and DERP region. It generates its own ephemeral keypair and connects to the same DERP relay.

  3. Discovery handshake. The client sends a " Meow " ping message to the server through the DERP relay. This message carries the client's node public key. The server receives it, adds the client to its WireGuard peer list and network map, reconfigures the WireGuard engine, and replies with a " Meowed " acknowledgment.

  4. WireGuard tunnel. With both sides configured as WireGuard peers, the standard WireGuard handshake proceeds (routed through DERP initially). Once complete, the tunnel is up and encrypted traffic can flow.

  5. NAT traversal. In parallel, each side advertises its UDP endpoints (public IP:port learned via STUN, plus local interface addresses) to the other in disco call-me-maybe messages over DERP, re-advertising whenever they change. Both sides then run Tailscale's disco protocol and attempt UDP hole-punching. If successful, traffic upgrades from the DERP relay to a direct peer-to-peer path. If hole-punching fails, DERP continues as a fallback and the connection still works, just with rate-limited throughput if you're using our public hosted DERP relays.

  6. Data transfer. The client dials a TCP port on the server through the tunnel. gVisor's TCP/IP stack on both sides handles connection setup. On the server, the incoming connection is dispatched to a handler based on the port: forwarding to localhost, piping to stdout, running an SSH session, etc.

Addressing

Each peer currently derives a deterministic IPv6 address from its WireGuard public key, but that's an implementation detail not exposed to end users and might change. (e.g. we might remove those bytes from the IP headers entirely and recover that redundant MTU)

Stability

Tailcat is free to use, but it comes with no API or CLI stability promises: the Go API, the CLI flags and output, and the wire format may all change. The public rate-limited Tailcat DERP relays have no uptime SLAs or throughput targets, and we may revoke access to them at any time, for any reason. Everything is provided best effort, without a contractual relationship (e.g. dedicated DERP relays and/or support) saying otherwise.

Contact Sales?

If you don't want to run and support things on your own, or want any help, contact sales and we can exchange money for goods and services .

History

Tailcat began life in September 2023 as "derpcat", written on a long flight while catching up on bad movies: the first sketch was commit 9e4d925cc ("cmd/dc: start of derpcat tool"), and it first worked in commit 911915fbb ("derpcat: it's alive!", whose commit message notes "UA 605 PDX-ORD en route to Ireland. yay not buying the wifi."). Back then it lived inside a fork of the tailscale.com repo and it bitrot several times as the Tailscale internals moved on without it. We've since brought it back to life and refactored it to be a regular Go module client of the tailscale.com repo instead of a fork of it.

It was open sourced August 2026 at the TailscaleUp conference .

Australia Bans Generative A.I. From Official Music Charts

Hacker News
www.nytimes.com
2026-08-27 06:48:54
Comments...
Original Article

Please enable JS and disable any ad blocker

UK expects Meta to match US child safety measures after $18bn settlement

Guardian
www.theguardian.com
2026-08-27 06:30:22
Minister calls for Instagram owner to extend sweeping new safeguards for young users to BritainUK politics live – latest updatesBusiness live – latest updatesThe UK government expects the Instagram owner Meta to roll out the same protections for children in Britain as those it agreed in the US on We...
Original Article

The UK government expects the Instagram owner Meta to roll out the same protections for children in Britain as those it agreed in the US on Wednesday , as part of a court settlement that could cost the company up to $18bn (£13bn).

Pat McFadden, the work and pensions secretary, said on Thursday he did not want young people in the US to have “a higher rate of protection” than those in Britain, after Meta settled a lawsuit brought by dozens of US states accusing the company of harming children with dangerous products .

As well as the payouts, Meta agreed to a default daily time limit of two hours for users under 18 that can be lifted only by a parent – a measure not currently proposed under plans to ban social media for under-16s in the UK – and a default block between midnight and 6am for under-18s, as well as default blocks on user notifications at night and during the school day.

Analysts have pointed out the measures largely fall within the bounds of changes Meta has already been required to make elsewhere. But restrictions agreed by Meta in the US that have not been proposed in the UK include bans on under-18s displaying numbers of likes or reactions and on cosmetic procedure image filters.

Meta has urged TikTok and YouTube to adopt the same standards “to ensure teens use social media in a healthy and responsible way”.

Asked on Sky News whether he expected Meta to roll out the new safety features in the UK, McFadden said: “Yes, we would. We don’t want a situation where young people in America have got a higher rate of protection than young people in the UK.”

In June, Keir Starmer’s government announced an Australia-style ban on social media for children under 16 would come into force by early 2027. It also said in July that default overnight curfews from midnight to 6am would be switched on for 16- and 17-year-olds suing social media apps, while features designed to keep users scrolling for longer would be switched off by default.

McFadden said the social media ban for young people would come into force next year, confirmed the overnight curfews and added: “We’ve got to do something about this endless scrolling, which is so addictive for young people.”

Countries around the world are beginning to restrict children’s access to social media amid rising concern about harms. In March, Indonesia began blocking children under 16 from accessing most social media. Malaysia followed suit in June. France passed a law banning social media access for under-15s in July, while Turkey passed a bill with similar restrictions. Bans or limits are being considered by 19 other countries , according to the Tech Policy Press non-profit organisation.

The Meta settlement announced on Wednesday cut short a trial in Oakland, California, in which lawyers for 29 US states accused Meta of covering up internal research showing that Instagram was addictive for teenagers. Legal experts, including James Grimmelmann, a professor of digital and information law at Cornell University, described the settlement as “a sign of vulnerability on Meta’s part”. It also prompted calls for the UK government to tighten its grip on social media companies after critics said the 2023 Online Safety Act , enforced by Ofcom, had had limited effect.

The Molly Rose Foundation, set up by the father of Molly Russell, who took her own life in 2017 after falling into a vortex of despair on social media , called on the UK government to “seize this opportunity to deliver a reset to children’s online safety”.

“Andy Burnham has now seen that it is possible to take on big tech to address drivers of online harm,” a spokesperson said. “It’s time for the UK government to be brave, bold and decisive in ways it hasn’t been before.”

Munira Wilson, who leads on children and families for the Liberal Democrats, said: “If a US court can pressure Meta into making significant changes to its platforms, why is our government still relying on optional curfews, strongly worded statements and unworkable bans?”

Meanwhile, experts were sceptical that Meta’s agreed measures would tackle the underlying problems with the compulsive – some say addictive – app design that critics blame for social media harms.

Dr Rachael Kent, a senior lecturer in digital economy and society education at King’s College London, said the settlement “does not fundamentally redesign the engagement-driven model. Some of the measures being introduced do not remove many of the underlying engagement mechanisms altogether – infinite scroll, autoplay and algorithmic recommendation remain – but introduce limits and stopping points around them.”

Xcancel and Nitter have been taken down

Hacker News
news.ycombinator.com
2026-08-27 06:19:42
Comments...
Original Article

Ex-x account holder here. Even if the world is going to fall and details about this even will be accessible exclusively behind X login wall, I am not setting up the account there again, NO WAY.

I wholeheartedly recommend you do the same - remove your account and forget about it. Almost certainly you won't miss it, as I didn't miss it. And there is a big chance you will get a big sight of relief, as I did.

If you really must, use https://twitterwebviewer.com/ which imo has better interface than Nitter.


I disagree. Nitter's big pull was lightweight SSR, this site is not that. Nitter also actually _looks like_ Twitter more than this site!


It's quite unfortunate, a lot of people or organisations I am interested in - AI for example - only post on X, and perhaps it's only a matter of time until services like bird.makeup also get taken down. Also, accessibility wise it's sad too, X's web interface is not the best out there and without login you cannot do really much.


Sir, you are controlling the buttons you push. I.e. it's up to you who you follow and what exactly you read on Twitter - just like any other social network.

There are news that are circulating much faster on Twitter than anywhere else (for example about war in Ukraine). There are people and companies that post only on Twitter and nowhere else (especially in tech).


> it's up to you who you follow and what exactly you read on Twitter

The Twitter experience is a highly algorithmic feed where tweets from the people you follow are not guaranteed to be in chronological order, or even shown to you at all. The default experience also mixes it other tweets "you might be interested in", that is, things they want you to see.

There's also the fact people could freely see tweets and follow discussion threads, that's now locked behind an account requirement.


A half of Twitter's point for me was the trending section, that you don't have any control on now (you used to be able to disable the personalization of that section but since X you cannot, if you want the actual trends you need to go in a subsection). The whole section is full personalized ragebaits (because at some point I used to reply to those), now it just makes the experience of trends quite unbearable and I can't change that.


Sir, you are voluntarily using a website owned by an unstable Nazi, who purchased it because his feelings were hurt and people were making fun of him there. Now his brain droppings make it into everyone’s feed by default, from what I understand.

> There are news that are circulating much faster on Twitter than anywhere else (for example about war in Ukraine).

I am certain that Twitter is not the only place where you can find these updates, if you really care for up-to-the-minute news. But I don’t.

> There are people and companies that post only on Twitter and nowhere else (especially in tech).

These people and companies are (knowingly or unknowingly) supporting a Nazi billionaire and they are not worth paying any attention to until they change their behavior.


> Who TF wants to use Twitter? Its the worst echo chamber out there.

It's certainly more diverse than Bluesky, if this is an echo chamber-measuring contest.


Unbeatable (just like reddit) if you want live sport replays. /r/soccer uploads goals before it happens on the broadcast I watch on my TV

Also the Asian community (Korea, Japan etc) is incredibly strong on Twitter. They don't really care about the whole politics around the platform.


Option A: You occasionally encounter power tripping mods on a site where you are free to create your own community and become the mod yourself.

Option B: a power tripping drug-addled Nazi billionaire owns the entire site and can change the site behavior for every user on a whim, with no recourse.

This doesn’t seem like a hard choice to make.


There’s likely some information on there that some people must want to share if services like Xcancel and Nitter exist and allow you to share it without being on X itself.


General sentiment might be this, but every social network (even Instagram and Facebook) can be good and productive if you change how you use them.

If you follow specific profiles/channels/pages and just read the feeds from them as if they were news, you are removing the toxic part (mostly infinite scrolling) and getting a resourceful feature.

If for some reason someone you need to follow is on X (twitter) only, you have to choose between losing a source or compromise with the platform.

I personally belong to the former group (and possibly you do, too), leaving behind sources, but not everyone likes it that way ¯\_(ツ)_/¯


The platform compromise is a new thing. One of the reasons people used Twitter was its open nature, enabling its use as a bulletin board where anyone could post a message and being sure that the message link was free for anyone to see. This isn't the case anymore, as X forces people to make accounts to see messages.


> you have to choose between losing a source or compromise with the platform

I thought so too. But after leaving 3 years ago it turns out: Not a single source is that important.

Also, as the importance increases, the likelihood of seeing the same information outside that hellhole increases linearly.


But it’s still supporting a man who’s a toxic as they come and working hard to distort reality and undermine democracy, you won’t wash that toxic off.


Allowing more voices on the platform might've made it more toxic (who knows - you're not the judge of toxic) but at least we have left- and right-wing toxicity, instead of only left-wing. And we get a lot of additional non-toxic voices, which was the actual point.


If someone thinks Twitter is an echo chamber to the extent they can’t fathom how people tolerate it (and it isn’t just an appeal for easy upvotes), but they happily post on HN, they’ll be able to clear up their initial confusion with a bit of self reflection.


If someone is still on twitter I'm just going to assume their morals align with those of Musk.

And then I avoid them.


urgh, there goes my automatic redirect... any alternatives?

Although, I don't see how this will hold up in court as they're pretty much an archive-like site hosting UGC.

AI slopper in chief: Trump turns to social media amid tough questions

Guardian
www.theguardian.com
2026-08-27 06:00:12
As the US president struggles to end his Iran war, and approval ratings hit new lows, he leans on a familiar gambit Donald Trump knows the power of an image – of himself, with everyone from Vladimir Putin and Kim Jong-un to Kim Kardashian. How about George Washington? As the US president struggles t...
Original Article

Donald Trump knows the power of an image – of himself, with everyone from Vladimir Putin and Kim Jong-un to Kim Kardashian . How about George Washington?

As the US president struggles to end his war with Iran, and with his approval ratings hitting the lowest levels of his second term, he has in recent weeks posted a series of AI-generated images of himself alongside key historical American figures.

Facing tough questions over reports of poor living conditions and morale aboard the USS Abraham Lincoln following its record-breaking deployment, and his efforts to reach a deal with Tehran, Trump has repeatedly turned to his Truth Social platform to post images apparently designed to bolster his legacy.

Earlier this month, he posted an AI image of himself and Washington standing side by side in what appears to be an imagining of Trump’s completed White House ballroom. A minute later, he posted three more AI pictures of himself and Washington in the ballroom. In one image, they’re looking into the middle distance; in another, Trump is holding a piece of paper and pointing at the ceiling .

Donald Trump in the Rose Garden, next to a statue of George Washington, at the White House in Washington DC on 24 August.
Donald Trump in the Rose Garden, next to a statue of George Washington, at the White House in Washington DC on 24 August. Photograph: Win McNamee/Getty Images

Trump wasn’t done. The next day, he posted an AI image of himself and Washington sitting at a table, holding quills over what appears to be a map. Three minutes later, he posted an image of the pair on horseback – Washington on a white horse, Trump on a black horse. There was no caption on either.

Still, it was Sunday’s post that was the most striking: a video that showed Washington and Trump walking through the ballroom, taking turns to point to the ceiling as if appraising the room’s construction.

“I think part of the reason he’s posting it is because it ties in with this deeper sentiment that he has that he is on par with, or even potentially better than, George Washington,” said Angelo Carusone, president and CEO of Media Matters, a non-profit media watchdog organization.

“He’s trying to basically be a founder,” added Carusone. “And AI gives him the ability to project his imagination out into the world.”

The Guardian asked the White House whether Trump, 80, thought he had actually met with Washington, who died more than 200 years ago. A spokesperson did not directly address the question, but responded: “Truth Social is the most powerful and popular social media platform in the world [ sic ] because it serves as President Trump’s authentic voice, where he communicates directly with the American people [ sic ] and the world without the biased media taking him out of context.”

“Every day in Washington DC the city changes and gets more Trump-branded,” Carusone said. “That is the analog to Washington: there are all these things named after him, but that happened posthumously. With Trump, it’s almost like he’s building a living mausoleum.”

Trump’s ballroom has at times appeared to be among his main interests during his second term. The president has openly admitted he wants the ballroom to serve as a “ legacy project ”, and when the going gets tough, this seems to be a topic to which he retreats.

There is evidence, too, that Trump wants to secure a legacy that sees him not just as an accomplished ballroom builder, but as a successful wartime leader.

Trump has also posted an AI image showing him wearing a military uniform, flanked by second world war generals George Patton and Douglas MacArthur on a battlefield. In the image, two tanks appear to be on fire in the background, and Trump, who has received a generous AI glow-up, has six rows of medals on his chest – more than Patton and MacArthur are shown with combined.

Black Box: The Chatbots: a new series from The Guardian Investigates – trailer

Guardian
www.theguardian.com
2026-08-27 06:00:11
People are becoming convinced AI chatbots have helped them make scientific breakthroughs, cure diseases or invent new technologies. What does this reveal about a technology used by more than a billion people? A new series from The Guardian Investigates, coming soon Continue reading......
Original Article

People are becoming convinced AI chatbots have helped them make scientific breakthroughs, cure diseases or invent new technologies. What does this reveal about a technology used by more than a billion people? A new series from The Guardian Investigates, coming soon

Trump Admin Said She Was Lying About Stillbirth in ICE Custody. New Evidence Points to Lack of Prenatal Care.

Intercept
theintercept.com
2026-08-27 06:00:00
The Trump administration claimed Iris Dayana Monterroso Lemus received “FULL medical, prenatal care” in ICE custody. The post Trump Admin Said She Was Lying About Stillbirth in ICE Custody. New Evidence Points to Lack of Prenatal Care. appeared first on The Intercept....
Original Article

Two months after Iris Dayana Monterroso Lemus lost her son to a stillbirth last year while detained by U.S. Immigrations and Customs Enforcement, the Trump administration issued a public response to her allegations that she did not receive prenatal care.

“This reporting is absolutely FALSE,” said Tricia McLaughlin, then a spokesperson for the Department of Homeland Security, in a statement. “Iris Dayana Monterroso-Lemus had FULL medical, prenatal care.”

The statement, labeled as a “Fact Check,” said the Guatemalan-born Monterroso Lemus had “received prenatal care, including an ultrasound and OB-GYN visit.”

Neither side of the disputed account provided evidence to back up their claims.

Now, federal government documents obtained by The Intercept appear to undermine the Trump administration’s version of events. The documents show a lack of basic care needed for a healthy pregnancy, according to expert analysis. One document from an outside healthcare center made after the stillbirth describes a “pregnancy complicated by lack of PNC” — meaning prenatal care.

“The administration was engaged in CYA — cover your ass,” said Dr. Andrea Schecter, an OB-GYN physician with a decade’s experience working with high-risk pregnancies, including those of immigrants. “They know that what they provided is probably not sufficient care.”

“Flouting the Directive”

The new records, obtained through a Freedom of Information Act request, include documents from Monterroso Lemus’s visit to Ochsner LSU Center, a healthcare facility in Shreveport, Louisiana, after she complained for days about not feeling fetal movement. It was the only recorded instance of her leaving Richwood Correctional Center, an ICE detention facility run by the family-owned private prison giant LaSalle Corrections.

The Ochsner LSU documents, produced after the stillbirth, say that Monterroso Lemus had told medical staff at Richwood that “this pregnancy didn’t feel right a couple days ago but nothing was done.”

Other new records include timelines produced by ICE that show a referral for an OB-GYN appointment but don’t indicate that any visit was scheduled or took place, or that Monterroso Lemus ever received an ultrasound.

Asked about the new documents, a spokesperson from the Department of Homeland Security simply repeated the previous claims that Monterroso Lemus received regular, timely prenatal care without responding to queries.

On May 9, ten days after losing her son, Monterroso Lemus was shackled, put on a plane, and deported to Guatemala, causing her postpartum visit to be canceled.

Ten days after losing her son, Monterroso Lemus was shackled, put on a plane, and deported to Guatemala.

“Everyone knows that ICE and DHS lie on a daily basis — and Americans have witnessed the deadly consequences of this administration’s reckless actions for nearly two years,” said Sen. Patty Murray, D-Wash., when asked about the case. “The Trump administration’s barbaric treatment of pregnant women in immigration custody is unconscionable.”

In fact, the Trump administration is detaining many more pregnant women than before. During the Biden administration, for example, ICE would detain about a dozen pregnant women nationally during a year, said Eunice Cho, an immigration attorney with expertise in detention conditions. During a congressional visit to Louisiana’s Basile detention center last April, however, there were 14 in that one facility.

According to a 2021 ICE directive , “Generally, ICE should not detain, arrest, or take into custody for an administrative violation of the immigration laws individuals known to be pregnant, postpartum, or nursing unless release is prohibited by law or exceptional circumstances exist.”

Cho said, “The Trump administration is flouting the directive.”

Murray introduced legislation last year to codify in federal law the notion that pregnant women should not be detained, as well as other standards. The bill remains in committee.

“This case stands out as an example of the enormity of the tragedy pregnant women and families are facing because of the Trump administration,” Cho said, of Monterroso Lemus’s experience. “The bottom line is: No one deserves to be treated like this.”

The Timeline

Monterroso Lemus, now 38 years old, met her neighbor Gary Bivens in Lenoir City, Tennessee, about six years ago. The pair began to grow close about four years ago, after Bivens lost his wife to a heart condition.

Monterroso Lemus became pregnant, and the couple had an OB-GYN visit in February. They had plans to get married when ICE detained her in mid-March.

After ICE transferred Monterroso Lemus multiple times, on April 2, she arrived at Richwood Correctional Center, in Monroe, Louisiana.

Most of the documents obtained by The Intercept are emails between officials with ICE and at its parent agency, the Department of Homeland Security, where officials sought to rebut Monterroso Lemus’s statements to the media by compiling information on her medical care while detained.

The timeline included in the documents, annotated and labeled as a “[f]ull overview of her care,” begins on April 2. Versions of the timeline are included in several other places in the documents.

The timeline has nine entries under what is called a “List of medical visits.” Four of them are visits to a nurse. Two others are labeled “Mental Health Visit.”

On April 17, according to the timeline, she visited the on-site medical provider for what is labeled “prenatal care non–compliance.”

Monterroso Lemus told The Intercept that visit was due to her unwillingness to continue taking 12 pills daily, including what she said may have been vitamins and others for constipation and headaches. She had been taking them for three days.

“I felt that they made me sick,” she said. Also, “other people told me to watch out for the medicine they give you.”

On April 29, after several days of not feeling any fetal movement, Monterroso Lemus was transferred to Ochsner LSU. In the presence of several federal guards, she delivered a stillborn fetus at about 23 weeks of pregnancy.

Monterroso Lemus said she had tried to get medical attention during the days before the tragedy.

“The worst part is, I told them I felt bad — and they didn’t pay attention to me,” she said.

What’s missing from the timeline — any indication of having an OB-GYN visit before she stopped feeling fetal movement or of receiving any ultrasound — makes it difficult to understand what caused the stillbirth.

“There are some reasons this could’ve happened that would have been identified by comprehensive prenatal care,” Schecter, the OB-GYN expert, said. “At some level, they know this.”

No Ultrasound?

A separate timeline in the documents refers to medical care Monterroso Lemus received during the several days in late March that she was detained at Etowah County Detention Center in Alabama. There, it says, she got a “fetal doppler,” which measures fetal heartbeat, but is not the same as an ultrasound.

Nonetheless, the “Fact Check” DHS published months later read, “she received prenatal care including a fetal doppler ultrasound.”

Schecter told the Intercept, “A fetal doppler is just audio, but it is not the same as an ultrasound, which is visual.”

“That is not an adequate assessment of the health and well-being of the pregnancy. It absolutely is not full prenatal care,” she said.

“Full prenatal care would include an ultrasound and an anatomy scan. We already know that doesn’t generally happen in immigration detention.”

Amy Zeidan, a professor of emergency medicine at Atlanta’s Emory University who researches health care in immigration detention, said, “Full prenatal care would include an ultrasound and an anatomy scan.”

“We already know that doesn’t generally happen in immigration detention,” said Zeidan.

Of the DHS “Fact Check,” Zeidan said, “They’re not being truthful about what happened.”

The experience Monterroso Lemus faced in ICE detention is not unique, according to several experts consulted by the Intercept.

“Unfortunately, this story is consistent with reports made by pregnant women in ICE detention,” said Cho, the immigration attorney. “There’s a lack of prenatal care, indifference to very serious symptoms, and a lack of treatment.”

“Waiting for My Baby”

By the end of May, the Nashville Banner had published an article in which Monterroso Lemus said, “They didn’t give me medical attention.”

The remark touched off a flurry of activity within ICE and DHS.

On June 25, at 4:41 p.m., McLaughlin, then a DHS spokesperson, wrote to another official whose name is redacted: “Wow so this is all garbage claims. This is FALSE. She had FULL medical, prenatal care. We have documentation to show it.”

The following day, DHS published its “Fact Check” — the same document the agency sent The Intercept when confronted with discrepancies.

Meanwhile, Monterroso Lemus and Bevins haven’t seen each other for 15 months. They communicate by WhatsApp regularly, using a translation app. On separate calls with The Intercept, both described suffering depression.

Bivens drives 100 miles every day to and from his $26-an-hour job as an iron worker. He regularly sends part of his paycheck to Monterroso Lemus. He says he’s bought a plane ticket to Guatemala for December and has created a GoFundMe to help pay for the cost of moving his tools and other things needed for the couple to start a new life in the Central American country.

The GoFundMe includes a photo of her holding her baby, taken in Ochsner.

“I don’t consider the way they treated her the American way.”

He has also engaged attorneys and sued the federal government.

“I don’t consider the way they treated her the American way,” he said. “My family goes back a long way in Tennessee. I have a great-grandfather who fought for the Confederates.”

He added, “I just want someone to be held accountable.”

Monterroso Lemus said she doesn’t think much about the officials who set in motion the events leading to the loss of her son and deportation.

“God will take care of all of them,” she said.

Bivens said he keeps the ashes of his son on a table by his bed in Lenoir City. It took him a while to figure out, but he’s obtained the paperwork needed to take the ashes with him to Guatemala in December.

“I’m waiting for my baby,” said Monterroso Lemus. “That would give me some peace.”

LLM-Based Social Engineering Scams

Schneier
www.schneier.com
2026-08-27 05:56:56
OpenAI disrupted a social engineering group from Cambodia that used ChatGPT. Its scope is impressive: The network simultaneously conducted multiple types of scams, often blending elements from different schemes. For instance, operators used dating personas to build trust before introducing fraudulen...
Original Article

OpenAI disrupted a social engineering group from Cambodia that used ChatGPT. Its scope is impressive:

The network simultaneously conducted multiple types of scams, often blending elements from different schemes. For instance, operators used dating personas to build trust before introducing fraudulent investment opportunities involving cryptocurrencies and spot gold trading. Other users engaged in lengthy romantic conversations with targets using fictitious identities, posed as representatives of online gambling platforms offering fake bonuses and winnings, or impersonated law enforcement agencies to tell targets they needed to pay fines for committing serious criminal offenses.

Although the narratives varied, users across the network consistently displayed the same underlying pattern of deceptive behavior. For example, they created and operated fake dating profiles, fictitious investment experts, and fraudulent law enforcement personas. They also generated images of forged documents, including passports, legal notices, stock-purchase confirmations, and gambling platform interfaces.

Tags: , , , ,

Posted on August 27, 2026 at 5:56 AM 0 Comments

Sidebar photo of Bruce Schneier by Joe MacInnis.

Tell HN: PayPal Blocks GrapheneOS

Hacker News
news.ycombinator.com
2026-08-27 05:56:54
Comments...
Original Article

This is arguably the most irritating thing with just about every largecorp developer: "os that hasn't been updated in 6 years? Sure boss!". Os that is built specifically around security and privacy with daily updates: "No, you can't do that". Annoying - yes. Safe way to make sure I will stop being your customer - also YES!


I see this happen from time to time. Lately, almost all of the apps work fine on GrapheneOS. The best strategy is to keep writing the business once every two or so weeks that you can’t log in to and use the app. Don’t go too technical at first, because most of the time, the moment they hear things like “rooted” or “unofficial,” they just say your phone is the issue. To date, I was able to convince, or at least contribute to, making three apps work on GOS.


Why would anyone still use PayPal after so many cases of accounts being banned and funds being frozen for no reason, and all the other terrible stuff they've done?


Critical mass? I had to start using it after moving to Germany, because everyone else expects you to use it.

One of the ladies at daycare is leaving? Here's a paypal link to chip in for a good-bye present.

Split a take-out order with a German friend, but he paid? Here's his paypal to send him your share.

It's just assumed that everyone has paypal over here...


SEPA uses your IBAN (account number), and one can also enter this account number for payment, implicitly allowing the store to withdraw money from it...


I was always suspicious of GrapheneOS, thought it was too good to be true. But this makes me reconsider and want to install GrapheneOS.


I'm on Debian Testing sometimes on amd64 and sometimes on m1. Paypal also doesn't like me. Than I have two options: I use a Windows VM to do the payment or I use another payment method. Most of the time I use the other payment method.


You need to use your bank's app for Wero, and many EU banks' apps refuse to run on GrapheneOS for the same reasons as PayPal. This is sadly not a clear win for Wero.


wait for it... I can see a future were every wallet, payment etc. app will block devices which are on custom ROMs and do not pass strong hardware integrity with blessing from Google.

I've read once that there are paid app testing labs which test if an app has root and custom ROM detection and when they don't have that it's a minus point on the report.


I'm starting to see these restrictions as a deterrent for using the products in question. My GOS handset is slowly fizzling away into a dumbphone with Firefox, organic maps and k9. And you know what, I am starting like it.


I still remember when my bank wanted me to run Android 9 instead of my Android 15 rom (without root) on my Samsung S8 because "muh security!!"

Funnily enough, the only way to hide those detections was to Root my phone... And i still remember when i had an appointment there, they wanted to see something in my Bank app, i opened it (and i assume it had an update since i then last used it) and a big "THIS DEVICE IS NOT SUPPORTED. ROOT IS NOT SUPPORTED" poped up

But was as simple as readding the bank app to my root hiders.

but still, i hate this security theater


Paypal doesn't work on LineageOS since a long time, even though the connections of that dubious Graphene distro with the US government are always in the horizon it is just natural that paypal doesn't work there now.

Otherwise it would just continue to raise suspicious that Graphene is favored by governments and big tech.


These days, root is mostly flagged via indirect indicators rather than detecting the root binary itself. For instance, detecting custom ROMs is a common clue. Does anyone remember the suhide days? ;)

CISA orders feds to patch Citrix NetScaler RCE flaw by Saturday

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 05:16:50
CISA has ordered U.S. government agencies to patch their Citrix NetScaler appliances against an actively exploited remote code execution vulnerability by Saturday. [...]...
Original Article

Ctirix

The U.S. Cybersecurity and Infrastructure Security Agency (CISA) has ordered government agencies to patch their Citrix NetScaler appliances against an actively exploited vulnerability by Saturday.

Tracked as CVE-2026-8452 , this high-severity security flaw stems from a memory overflow weakness affecting NetScaler ADC and NetScaler Gateway appliances configured with Gateway VPN or AAA (Authentication, Authorization, and Auditing) virtual servers.

While Citrix said in June that threat actors could only exploit the flaw in denial-of-service (DoS) attacks , cybersecurity firm watchTowr showed in August that successful exploitation can also allow attackers to gain remote code execution as root on unpatched NetScaler instances.

image

"This is a memory overflow vulnerability that may lead to unpredictable behavior or denial of service and impacts NetScaler Gateway or AAA virtual server," Citrix said at the time. "We have not observed any unmitigated exploitation of this vulnerability as well."

At the moment, Internet threat watchdog Shadowserver tracks over 22,000 NetScaler ADC appliances and nearly 1,800 Gateway instances exposed online.

However, there is no information on how many are honeypots, have vulnerable configurations, or have already been patched.

Citrix NetScaler appliances exposed online
Citrix NetScaler appliances exposed online (Shadowserver)

​​On Monday, CISA added the CVE-2026-8452 flaw to its Known Exploited Vulnerabilities (KEV) Catalog , ordering Federal Civilian Executive Branch (FCEB) agencies to secure all vulnerable Citrix appliances by August 29, as mandated by Binding Operational Directive (BOD) 26-04 .

CISA didn't share any details on the attacks currently targeting the CVE-2026-8452 flaw, but its warning comes one week after security researchers and cybersecurity experts flagged the vulnerability as actively exploited in "pray and spray" attacks that deploy web shells on compromised appliances.

Citrix has yet to update the security advisory for the CVE-2026-8452 vulnerability to acknowledge that it's now being targeted in the wild.

One week ago, the company also urged customers to immediately secure their systems against two other NetScaler vulnerabilities, tracked as CVE-2026-19490 and CVE-2026-19489 , that remote, unauthenticated threat actors can exploit in DoS attacks or to bypass authentication.

While these two flaws have not been tagged as exploited in the wild, Citrix asked admins to patch two other NetScaler vulnerabilities ( CVE-2026-3055 and CVE-2026-4368 ) in March, days before threat actors began abusing them .

Since November 2021, the U.S. cybersecurity agency has flagged 23 Citrix vulnerabilities as exploited in the wild, seven of them also abused by ransomware gangs.

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

Qwen3.8-Flash-Next Intelligence, Performance and Price Analysis

Hacker News
artificialanalysis.ai
2026-08-27 05:06:30
Comments...
Original Article

Intelligence

Artificial Analysis Intelligence Index

Artificial Analysis Intelligence Index v4.1.1 incorporates 9 evaluations: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR

Reasoning models are indicated by a lightbulb icon

Artificial Analysis Intelligence Index v4.1.1 includes: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR . See Intelligence Index methodology for further details, including a breakdown of each evaluation and how we run them.

Artificial Analysis Intelligence Index by Open Weights / Proprietary

Artificial Analysis Intelligence Index v4.1.1 incorporates 9 evaluations: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR

Reasoning models are indicated by a lightbulb icon

Artificial Analysis Intelligence Index v4.1.1 includes: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR . See Intelligence Index methodology for further details, including a breakdown of each evaluation and how we run them.

Indicates whether the model weights are available. Models are labelled as 'Commercial Use Restricted' if commercial use is limited by conditions, and as 'Non-commercial' if the license prohibits commercial use.

Intelligence Evaluations

Intelligence evaluations measured independently by Artificial Analysis · Higher is better

Quantitative analysis on spreadsheets & documents

Reasoning models are indicated by a lightbulb icon

While model intelligence generally translates across use cases, specific evaluations may be more relevant for certain use cases.

Artificial Analysis Intelligence Index v4.1.1 includes: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR . See Intelligence Index methodology for further details, including a breakdown of each evaluation and how we run them.

AA-Omniscience

AA-Omniscience Index

AA-Omniscience Index (higher is better) measures knowledge reliability and hallucination. It rewards correct answers, penalizes hallucinations, and has no penalty for refusing to answer. Scores range from -100 to 100, where 0 means as many correct as incorrect answers, and negative scores mean more incorrect than correct.

Reasoning models are indicated by a lightbulb icon

AA-Omniscience Index (higher is better) measures knowledge reliability and hallucination. It rewards correct answers, penalizes hallucinations, and has no penalty for refusing to answer. Scores range from -100 to 100, where 0 means as many correct as incorrect answers, and negative scores mean more incorrect than correct.

Openness Index

Artificial Analysis Openness Index: Score

Openness Index assesses model openness on a 0 to 100 normalized scale (higher is more open)

Reasoning models are indicated by a lightbulb icon

Intelligence Index Comparisons

Intelligence Index vs. Cost per Intelligence Index Task

Artificial Analysis Intelligence Index · Weighted average cost (USD) per Artificial Analysis Intelligence Index task

Reasoning models are indicated by a lightbulb icon

Weighted average cost per Intelligence Index task. Each evaluation’s cost is calculated from input, cache hit, cache write, reasoning, and answer token prices, divided by task count, and weighted by its Intelligence Index weight.

Artificial Analysis Intelligence Index v4.1.1 includes: GDPval-AA v2, 𝜏³-Banking, Terminal-Bench v2.1, SciCode, Humanity's Last Exam, GPQA Diamond, CritPt, AA-Omniscience, AA-LCR . See Intelligence Index methodology for further details, including a breakdown of each evaluation and how we run them.

Token Use

Output Tokens per Intelligence Index Task

Weighted average number of output tokens used to run one task in the Artificial Analysis Intelligence Index

Reasoning models are indicated by a lightbulb icon

The number of tokens required per Intelligence Index task. This is calculated by multiplying the output tokens per eval by the relative weights of each benchmark in the Intelligence Index, then dividing by task count (excluding repeats).

Cost

Cost per Intelligence Index Task

Weighted average cost (USD) per Artificial Analysis Intelligence Index task, segmented by token type. Lower is better

Reasoning models are indicated by a lightbulb icon

Weighted average cost per Intelligence Index task. Each evaluation’s cost is calculated from input, cache hit, cache write, reasoning, and answer token prices, divided by task count, and weighted by its Intelligence Index weight.

Cost to Run Artificial Analysis Intelligence Index

Cost (USD) to run all evaluations in the Artificial Analysis Intelligence Index

Reasoning models are indicated by a lightbulb icon

The cost to run the evaluations in the Artificial Analysis Intelligence Index, calculated using the model's input, cache hit, cache write, reasoning, and answer token prices and the number of tokens used across evaluations (excluding repeats).

Pricing: Cache Hit, Input, and Output

Price (USD per M Tokens)

Reasoning models are indicated by a lightbulb icon

Price per token for cached prompts (previously processed), typically offering a significant discount compared to regular input price, represented as USD per million tokens. The values shown here are the cache hit price; cache write and cache storage are billed separately and vary by provider — see "Cache pricing by provider" for detail.

Context Window

Context Window

Context window: tokens limit · Higher is better

Reasoning models are indicated by a lightbulb icon

Larger context windows are relevant to RAG (Retrieval Augmented Generation) LLM workflows which typically involve reasoning and information retrieval of large amounts of data.

Maximum number of combined input & output tokens. Output tokens commonly have a significantly lower limit (varied by model).

Speed

Measured by Output Speed (tokens per second)

Output Speed

Output tokens per second · Higher is better

Reasoning models are indicated by a lightbulb icon

Tokens per second received while the model is generating tokens (ie. after first chunk has been received from the API for models which support streaming).

Figures represent performance of the model's first-party API (e.g. OpenAI for o1) or the median across providers where a first-party API is not available (e.g. Meta's Llama models).

Time per Intelligence Index Task

Weighted average decode time (minutes) per task; excludes TTFT and overhead time · Lower is better

Reasoning models are indicated by a lightbulb icon

The weighted average time (seconds) per Artificial Analysis Intelligence Index task. This is calculated by dividing output tokens per task by output speed, weighted by the relative weights of each benchmark in the Intelligence Index.

Latency

Measured by Time (seconds) to First Token

Latency: Time To First Answer Token

Seconds to first answer token received · Accounts for reasoning model 'thinking' time

Reasoning models are indicated by a lightbulb icon

Time to first answer token received, in seconds, after API request sent. For reasoning models, this includes the 'thinking' time of the model before providing an answer. For models which do not support streaming, this represents time to receive the completion.

End-to-End Response Time

Seconds to output 500 tokens, calculated based on time to first token, 'thinking' time for reasoning models, and output speed

End-to-End Response Time

Seconds to output 500 tokens, including reasoning model 'thinking' time · Lower is better

Reasoning models are indicated by a lightbulb icon

Seconds to receive a 500 token response. Key components:

  • Input time: Time to receive the first response token
  • Thinking time (only for reasoning models): Time reasoning models spend outputting tokens to reason prior to providing an answer. Amount of tokens based on the average reasoning tokens across a diverse set of 60 prompts ( methodology details ).
  • Answer time: Time to generate 500 output tokens, based on output speed

Figures represent performance of the model's first-party API (e.g. OpenAI for o1) or the median across providers where a first-party API is not available (e.g. Meta's Llama models).

Model Size (Open Weights Models Only)

Model Size: Total and Active Parameters

Comparison between total model parameters and parameters active during inference

Reasoning models are indicated by a lightbulb icon

The total number of trainable weights and biases in the model, expressed in billions. These parameters are learned during training and determine the model's ability to process and generate responses.

The number of parameters actually executed during each inference forward pass, expressed in billions. For Mixture of Experts (MoE) models, a routing mechanism selects a subset of experts per token, resulting in fewer active than total parameters. Dense models use all parameters, so active equals total.

Trainwatch – alone with your thoughts on a railway line to nowhere

Guardian
www.theguardian.com
2026-08-27 05:00:10
The flat routines of a dead end railway job screen out an approaching menace in a quietly intriguing game from the indie developer of Cat Lady and Lorelai Lonely jobs have provided excellent material for independent video games over the years. From Papers, Please to Firewatch to The Stanley Parable...
Original Article

L onely jobs have provided excellent material for independent video games over the years. From Papers, Please to Firewatch to The Stanley Parable , players have been happy to spend hours dwelling in depressing cubicles or rural hideaways, usually because there is an intriguingly hidden point to it all.

In Trainwatch, a character named Troy has taken a seemingly godforsaken job as a railway worker in an unnamed desolate backwater. His main task over the course of a single month is to manage a level crossing, closing the gate whenever a train comes, while also carrying out daily chores such as cooking and washing. It sounds serene, but Troy is also running away from something. The other stipulations are that he stays sober and calls his wife every night. And there is something lurking in the fog at the edges of the fields – one day he must face it.

Trainwatch.
Desolate … Trainwatch. Photograph: Harvester Games

Trainwatch is the sixth game from solo developer Remigiusz “Rem” Michalski (AKA Harvester Games), and was inspired by a childhood memory. “We used to live near the railway tracks,” he says. “Every night, I’d hear that thundering hum of trains in the distance and see their lights moving slowly in the darkness outside my window. I found that oddly comforting. The world seemed dead and empty, and that train rolling through the night was the only sign of life happening out there.”

Michalski describes the game as a time-management mystery adventure, which sounds cosy, but the game’s muted colours and uneasy sense of dread suggest otherwise. Previous games, such as Cat Lady and Lorelai, have explored mental anguish and isolation, and it seems that Trainwatch will continue this theme. “I think most of us are lonely, guilty, or isolated in one way or another,” says Michalski. “We all have our demons living deep inside, and we rarely show them to anyone. Most of the time we don’t even want to acknowledge their existence ourselves.”

While you’re running the signal room and carrying out daily tasks of self-care, there are also chances to explore nearby buildings and meet the inhabitants of this strange wasteland, some of whom you’ll have the chance to help. So is there a redemptive arc beneath the rather bleak overtones of Trainwatch? Michalski suggests there is: “It’s a game about trying to dig ourselves out of a hole, re-evaluating what our priorities are, fixing our lives while having a million things on our shoulders all at the same time. And while it touches on many difficult topics, it does so with a sprinkle of dark humour. ”

When asked if there were movies or novels that inspired the game’s look, setting and themes, Michalski makes his own personal discovery. “Now that I think about it … I guess being an indie game developer is a little like being a Gatekeeper in Trainwatch. Sure, there’s my wife, pottering about in the flat, the kids getting home from school, talking with excitement … but I spend most of my time here, in my little studio, alone, pushing buttons. So really, the main influence for Trainwatch comes from my secluded life in a tiny Polish town. Thanks for making me realise that!”

A Giant “Grandmother” Tree Sparked a New Struggle to Block Trump’s Border Wall

Intercept
theintercept.com
2026-08-27 05:00:00
A single tree sit harnessed a cross-border movement to defend the Arizona borderland ecology. So far, the activists are blocking Trump’s wall. The post A Giant “Grandmother” Tree Sparked a New Struggle to Block Trump’s Border Wall appeared first on The Intercept....
Original Article
A view of the sunrise over a cottonwood tree where locals are protesting Trump’s border wall in Lochiel, Ariz., on Aug. 10, 2026. Photo: John Washington

Of the more than $170 billion that President Donald Trump secured for his border regime in the “One Big Beautiful Bill,” nearly $50 billion is allocated to border wall construction. Even with these enormous resources, however, the administration continues to face challenges constructing its monument to violent exclusion along the southern border through tribal , private , and state lands.

For nearly a month , the key force standing in the way of Trump’s border wall project in southeast Arizona has been a person sitting in a 200-year-old tree.

More precisely, at every moment since late July, one person — although not always the same person — has been on a platform in the branches of a giant cottonwood tree in Lochiel, Arizona, with an expanding encampment of primarily local activists 50 feet below.

The protesters’ aim is to stop the ongoing construction of two parallel, 30-foot-high border walls ripping through the remote San Rafael Valley.

Miles of the double wall structure have already been built in the area. This part of the valley is sparsely populated and hardly ever used as a border-crossing site by humans, but is renowned as a unique wildlife migration corridor. According to the Sierra Club’s borderlands coordinator, Erick Meza, the region is “a biodiversity hotspot and the most important jaguar corridor that we have left in the U.S.”

Residents from Lochiel and the surrounding area, including from Sonora, Mexico, had been coming together regularly for over a year for binational gatherings to organize against wall construction. They shared music, art, food, and ceremonies across the border, which is demarcated there by only a rancher’s wire fence.

“People got together that night and decided to go down and set up a tree sit in that final tree on the U.S. side.”

The planned double wall structure, with a 60-foot no man’s land in between, would not only devastate the land and its ecosystems — it would also sever the binational life worlds of the area.

The “happenings,” as organizers called the gatherings, escalated into a continuous protest and tree sit when construction workers with government contractors Fisher Sand & Gravel crushed three giant cottonwood trees, known locally as “grandmother” trees, in one day on July 27.

Local activists moved in swiftly to save the last cottonwood standing on the U.S. side of the border, and the tree sit began.

“Momentum had been growing locally in the region to try to make more of an intervention,” said an Arizona-based participant in the tree sit, who asked for anonymity out of concern for government repression. “People got together that night and decided to go down and set up a tree sit in that final tree on the U.S. side, which was planned to be cleared.”

Ever since, a tree sitter has been in the cottonwood at all times, numerous participants told The Intercept.

“U.S. Customs and Border Protection identified four cottonwood trees on federal land in Lochiel, Arizona, that needed removal for planned border wall construction,” said a spokesperson from CBP. “Preconstruction surveys found no active migratory bird nests, and environmental monitors were present at the start of clearing activities to ensure work was limited to the identified trees. Three trees have been removed, and the remaining tree is scheduled for removal.”

Meza, of the Sierra Club, told The Intercept that the government’s environmental survey was out of date and that the day before the cottonwoods were felled, he had taken video of an active nest in one of the trees.

“The next day, they had sent the contractors to take down the trees,” he said. “Their environmental monitor was not present.” Meza added that “when people saw what happened, the community in general got outraged.”

For participants in the Lochiel encampment, protecting the remaining “grandmother” is an anchoring point for the protest, but stopping the border wall and all it represents is the organizing principle.

“Some people are tree sitting and supporting the tree sit. Some people are more focused on getting into the roads, and intervening in construction work that’s happening,” the tree-sit participant said. “Now there’s a whole zone of a few miles where they’re having trouble building. And as camp grows, the ability to affect construction also grows.”

The remaining cottonwood itself is on federal land, but the encampment, just feet away, is technically on private land. It’s a unique setup, organizers told The Intercept, in which local ranchers and authorities oppose the border wall construction, and construction workers cannot risk forging forward in the path of the tree as a person remains perched in its branches. The small standoff is becoming a growing site of border resistance, and the construction of Trump’s wall in the area has been disrupted for a month.

“Living Things on the Land”

At a time when jack-booted agents with U.S. Immigration and Customs Enforcement are terrorizing communities nationwide and over 73,000 people are held in ICE detention , the defense of a remote stretch of borderlands may seem a minor struggle.

The binational protest around the cottonwood, however, exemplifies what it looks like to take strategic action to disrupt the infrastructure of the border regime.

“Something happens along these borderlands,” said another participant in the tree sit and encampment, Uni Yuchi Trejo, a first-generation Mexican American. “You still feel the way the land moves here, how the living things on the land migrate and move with it.”

Trejo highlighted other sites of resistance along the Arizona border, like fights waged by the Tohono O’odham Nation to block the wall on its sovereign and sacred lands — fights that are heating up just this week.

Compared to other struggles against border enforcement, the Lochiel encampment has seen remarkably little law enforcement repression, despite creating disruptions to a major border infrastructure project.

One protester was arrested in late July by local sheriffs for blocking construction workers on a roadway but was released the same day without charge; the sheriff himself is on the record as opposing the border wall construction. And with the encampment on private property, it remains relatively protected from federal law enforcement sweeps.

According to activists on the ground, a second tree sit on the Mexico side of the border was initiated last week but ended after a few days, following reported interventions from Mexican law enforcement and U.S. Customs and Border Protection agents.

The relative peace the Arizona-based activists have enjoyed stands in stark contrast to the brutal persecution others opposing border regime enforcement have faced in places like Prairieland Detention Center in Alvarado, Texas; Spokane , Washington; and Minneapolis . The Arizona demonstration also sits in the legacy of site-based struggles not tied directly to the border, like Stop Copy City in Atlanta, or the Dakota Access Pipeline protests at Standing Rock — movements that have also faced ruthless repression .

This might speak to the place of the border wall in the Trump administration’s current priorities. Even for an anti-immigrant fascist like Stephen Miller, swift border wall construction in the San Rafael Valley is not an urgent matter, owing to the minuscule number of border-crossing attempts there. Those that do attempt to cross are already facing long odds against a system designed to push them into death’s grips .

Though the environmental destruction of border wall construction is well established , a spokesperson from Customs and Border Protection absurdly pointed to people who might attempt to cross as the real environmental threat.

A view of Trump’s double wall on a stretch of the U.S.–Mexico border running through Lochiel, Ariz., on Aug. 10, 2026. Photo: John Washington

“While concerns exist about impacts to sensitive areas, it is important to note that illegal immigration itself poses significant environmental challenges,” the spokesperson said. “High volumes of unauthorized crossings often result in substantial amounts of trash, pollution, and damage to natural resources, including sensitive habitats and agriculture.”

Suffice it to say, the people crossing borders do not tear down ancient trees, plow over tribal burial grounds , or cut off wildlife corridors. Not to mention that no “high volumes” of crossings occur in the San Rafael Valley.

As Arizona-based reporter and author of “How to Close a Camp,” John Washington, told Democracy Now!, “People, I think, are right to point out that this very much smells of a boondoggle — that no one is crossing here, and yet they are spending maybe a half a billion dollars on just this about 27-mile segment of wall to devastate the local ecosystem.”

“The Border Is Everywhere”

“We’re taking the proactive stance of: ‘No, we don’t want the wall and we’re going to make sure you’re not doing it through Lochiel,’” said Katie Scott, a local resident and co-founder of the Madrean Archipelago Wildlife Center, who was among the original organizers against border construction in the region. “And we will hopefully have inspired people all across the world, wherever their horrible border walls are, and to question them in a way that’s most defiant.”

Activists on the ground are aware that reaching remote Lochiel is no easy task, so organizers are encouraging action wherever people can undertake it.

One target of activists’ campaigns is Fisher Sand & Gravel, the contractor working on the wall, which has received around $1.5 billion in government contracts in Arizona alone. (Fisher Sand & Gravel and its parent company, Fisher Industries, did not respond to requests for comment.)

Subcontractors working on the project are falling under scrutiny, too.

“The border is everywhere,” said Trejo, the Mexican-American land defender, “which means that there are subcontractors and there are power players maybe in your backyard, maybe in your city, maybe an hour drive from where you’re living.”

“Right now we’re at a really crucial point, where those of us that have been holding space and ground are seizing more of it each day. And so imagine if the 30, 40 holding that space becomes a 1,000 or becomes 5,000. What kind of opening will that then create?”

Show HN: The load-bearing vocabulary of Claude

Hacker News
louisabraham.github.io
2026-08-27 04:59:49
Comments...

Announcing our first Maintainers in Residence

Lobsters
blog.rust-lang.org
2026-08-27 04:44:13
Comments...
Original Article

We are very happy to announce the Rust Project's first round of Maintainers in Residence: Gen Li ( @rami3l ), Chris Denton ( @ChrisDenton ), Alejandra González ( @blyxyas ), León Liehr ( @fmease ), and Maintainer Grant recipients: Jason Newcomb ( @Jarcho ) and Jonas Böttiger ( @joboet ). These contributors will be funded for their rust-lang maintenance activities for (at least) the following 12 months!

The funding of the Maintainer in Residence (MiR) and Maintainer Grantee roles is possible thanks to generous donations to the Rust Foundation Maintainers Fund (RFMF) from Google, AWS, OpenAI, the Rust Project Leadership Council and also individual sponsors. We also want to thank the people who advocated for maintainer funding within their companies; Tyler Mandry from Google, Niko Matsakis and Jess Izen from AWS and Predrag Gruevski from OpenAI, and also the whole Rust Leadership Council and our funding advisors . If you would like to help us support even more Rust contributors, consider donating to RFMF.

The Rust Foundation has published a press release and a blog post , where you can learn more about the sponsors and the supported contributors.

Read more below to learn about the MiR program, how we chose the funded contributors, and of course who they are !

Background

The Maintainer in Residence program, established in RFC 3931 , is designed to provide stable financial support for Rust contributors, so that they can truly focus on crucial maintenance activities. Currently, there are three categories of support that we offer:

  • Full-time MiR: funded for 5 days/week of Rust Project work
  • Half-time MiR: funded for ~2.5 days/week of Rust Project work
  • Maintainer Grant: funded for ~1 day/week of Rust Project work

Funding for this program comes from the Rust Foundation Maintainers Fund, which was launched recently, and the whole program is managed by the Rust Funding team .

When deciding who to fund, we took a systematic approach. First, we looked at Rust teams to understand their maintenance baseline (the smallest number of maintainers they need to ensure a healthy long-term status of the given project or repository), and how far they currently are from that baseline. From there, we identified and prioritized Rust teams who were both critically underfunded, and have a high impact on the language and its users. These teams (in no particular order) were rustdoc , rustup , cargo , compiler , libs , clippy , rustfmt , rust analyzer and mods .

The next step was pairing these teams with maintainers looking for funding. And it turns out that finding such maintainers for some teams turned out to be much more difficult than we originally assumed! For example, some maintainers are already employed, some do not want to be funded, and while we did our best to promote our funding efforts, not everyone looking for funding actually asked us for it. We also realized that some teams on our list have essentially no active members, which makes it tricky to onboard new contributors, even if they would like to help out.

In the end, we decided to start by supporting six contributors, who will help maintain several critical Rust projects and teams and who could start immediately. However, we are not stopping there. Our funding efforts are ongoing, so stay tuned for more MiR announcements in the near future! If you would like to learn more about our process, check out our recent post .

And now, without further ado, let's meet our newly funded maintainers!

Gen Li (@rami3l)

Gen Li ( @rami3l ) is a full-time MiR focusing on Rustup.

He has been a Rustup team member since 2023 and its lead since 2025. He deeply cares about the facets of Rust that many might have taken for granted, and embodies all attributes we were looking for in a MiR: he wants to take on complex issues, continue mentoring, and work on important Rustup features, among many other things.

Turning volunteering into an actual job has really been an empowering experience so far! I finally have the bandwidth to take a careful look at my inbox and can actually read each message without the fear of missing crucial details while rushing prompt replies, which has really helped me retain the essential compassion as a maintainer. I also get to interact with regular contributors a lot more often. Finally, I can't wait to see what I can come up with in terms of Project Goals :)

Chris Denton (@ChrisDenton)

Chris Denton ( @ChrisDenton ) is a half-time MiR focusing on the standard library, compiler, Rustup and anything Windows-related.

For the past five years Chris has been bringing his deep knowledge of Windows to help Rust sustain and improve its great cross-platform support. He will be unblocking other contributors in various Windows use cases, performing refactoring and code reviews and implementing new features across several areas of the Project.

Even though it is still early days, I'm feeling pretty optimistic about the health of the Rust Project going forward, thanks to the recent funding efforts.

Alejandra González (@blyxyas)

Alejandra González ( @blyxyas ) is a half-time MiR focusing on Clippy.

She is a Clippy team member always keen on improving performance and helping new contributors. She will focus on making Clippy faster and also reviewing its pull requests, to help get the ~300 pull request backlog down. Additionally, she is excited to mentor people from the Rust for Linux project to work on Clippy, and fine tune the open peer review system that Clippy started using earlier this year.

Funding is the system that helps me pour my heart into a project without worrying about making ends meet. Having those needs met is a game-changer and boosts my productivity. One of the areas where I want to focus my efforts is mentoring new contributors. If new people coming is the lifeblood of a project, I want to be the cardiologist!

León Liehr (@fmease)

León Liehr ( @fmease ) is a half-time MiR focusing on rustdoc and the compiler.

He is a member of the rustdoc and compiler teams, who is usually working on the Rust type system or issues related to parsing. He will continue working on complex features that he started a few years ago, and also focus on general maintenance, code reviews, refactoring and mentoring.

Being funded to work on Rust means I can sustainably focus my time and energy on a project I call a passion of mine.

Jonas Böttiger (@joboet)

Jonas Böttiger ( @joboet ) is a maintainer grantee focusing on the standard library.

He is a musicology student from Germany. When he is not playing the Cello or reading about Fanny Hensel, he applies his research skills to ensure that programs written in Rust run quickly and soundly on all platforms, no matter how quirky the operating system may be. He loves helping contributors write excellent code that they can be proud of; and considers it to be just as much fun as writing it himself.

Getting funding for my work is a dream come true. It will allow me to continue doing the thing I love instead of worrying about whether I should rather invest all that time in a money-earning job with much less positive impact on the world around me.

Jason Newcomb (@Jarcho)

Jason Newcomb ( @Jarcho ) is a maintainer grantee focusing on Clippy.

He is primarily working on fixing bugs and making it easier to develop and contribute to Clippy. He is also focusing on making the review process as smooth as possible.

Being funded allows me to work on something I care about and want to work on instead of what will get me paid. I'm looking forward to seeing how this will impact Clippy and the Rust project in general.

Conclusion

The contributors presented above will be funded for the next 12 months, though of course we hope that we will be able to extend their support going further, as this program is designed to be for long-term stable maintenance funding. We are very excited about them; each one of them has been with the Project for years, and we are very glad that we can support their maintenance work! All of them have already signed their contracts, so they are already being funded as we speak.

While there are many other Rust contributors who are doing awesome work, and who would also deserve to get proper funding for it, we think that this is a great start. We hope that the awesome work done by the funded maintainers will allow us to promote this program, so that we can fund even more Rust contributors!

We would like to once again sincerely thank everyone who made this possible, especially our sponsors. If you would like to help us fund more maintainers, consider donating to RFMF . You can also sponsor individual Rust contributors directly .

Changes to SourceHut's terms of service regarding LLMs

Lobsters
sourcehut.org
2026-08-27 04:37:19
Comments...
Original Article

In late July, Codeberg announced that they would limit the use of LLMs on their platform , something that SourceHut has also been considering for some time.

Last week, we discussed with the SourceHut community the possibility of limiting or prohibiting the use of LLMs (large language models) and other generative AI technologies on SourceHut. Thank you to everyone who participated, shared a variety of views, and ensured we had a productive and civil conversation on the subject. Following this conversation and more discussions internally, we have elected to move forward with the necessary changes to our terms of service.

I encourage you to read through this thread to see the varied and thoughtful opinions of the SourceHut community on this subject, both for and against the change. In summary, the SourceHut community broadly has strong support for restrictions on the use of AI on this platform. However, ultimately this decision was made by staff, so we’ll focus on our own rationale for it, give examples of how the new policies will be interpreted and enforced, the expected timeline for the change, and options for people affected by the change and how they can move their projects forward afterwards.

=> Click this to skip the background and read about the changes

There are material incentives for us to curtail “vibe coded” projects on SourceHut. They tend to, as a class, be outliers in terms of resource usage, as the practice tends to invent complex CI configurations that waste build minutes, produce larger codebases, and push commits often, all of which causes excessive resource usage and can lead to outages. Often these codebases are abandoned after burning through all of these resources for naught. And, of course, the scourge of LLM crawlers scouring the internet causes more outages and headaches for our sysadmins, and AI is causing skyrocketing costs for the hardware we need to run the platform and the hardware you need to use it. But, in truth, the rationale is more about politics and ethics than anything else.

Deciding which “hills to die on” is tricky. We are an organization which is transparent about politics, both the fact that we, like all others, have politics, and also about what our politics are. But, although the world is a turbulent place, and this calls all of us to action, there are many issues we believe firmly in but which need not necessarily steer SourceHut policy. If we were to shape our policies in terms of our values on, for example, Palestine, it would serve to stoke controversy and increase our workload without meaningfully contributing anything to the problem. We lack the cultural and intellectual context to know what to do about that situation, and we have access to few resources knowledgeable enough to steer our policies with wisdom and care.

In the case of AI, though it touches on complex social, economic, and political factors, many of which are beyond the realm of our our expertise, it overlaps considerably with matters on which we are experts – software development, open source, and open culture, for example. As experts, we can more easily see that we have an obligation to evaluate their impact and to weigh in and make decisions accordingly.

If we focus narrowly on how LLMs affect our community, we can consult our mission statement for guidance:

We are here to make free software better. We will be honest, transparent, and empathetic. We care for our users, and we will not exploit them, and we hope that they will reward our care and diligence with success.

It’s not easy to argue that LLMs make free software better. The means by which they operate involves taking, by force and without regard for the wishes of the software authors, the obligations of software licenses , or the platforms on which our work relies, vast swaths of open source software, disregarding the licensing requirements, and charging rent to produce code which is a plausible reinterpretation of its training data applied to new problems. The models which are produced in this process are proprietary, owned and controlled by private corporations, and give little back to the open source community. Therefore, the relationship between LLMs and open source seems to exploit the users we are responsible for caring for.

We have also seen some other troubling incidents, for example the use of LLMs to rewrite open source software to circumvent copyleft obligations, such as in the case of the chardet library , a practice which seems to straightforwardly work against the interests of open source software authors.

However, LLMs have shown some utility. They find real bugs, including security bugs , and open source software has become more robust as a consequence. Some programmers find them useful for code reviews and other creative applications, and indeed many programmers report good results in using them to write or assist in writing code.

The more we zoom out, though, the more alarming it gets.

The biggest concern is the impact on the climate. Cars fueled by fossil fuels are also useful, but most people support efficiency improvements and ultimately a complete replacement with electric vehicles to mitigate their effects. The transformation of society to address the climate emergency must be comprehensive, and each of us, in our respective industries and expertise, have a moral obligation to work to reduce our environmental footprint, particularly in systemic and institutional ways. The roll-out of AI is a massive trend in the wrong direction. LLMs and similar tools are an extremely energy-inefficient way of solving the problems they address, such as authoring software, and are fundamentally at odds with mitigating the climate disaster .

Planned developments in AI infrastructure are expected to generate an electricity demand comparable to the entire country of India , a country which is experiencing tens of thousands of deaths due to heatwaves exacerbated by climate change. This build-out consumes a large portion of the green energy coming onto the grid, delaying de-carbonization of other sectors , or else AI drives demand for new fossil fuel infrastructure outright . In either case the average energy consumer often pays the bill .

It’s often unclear how to respond to the climate crisis at an individual level. Taking shorter showers or using your air conditioner less might help – and the wealthy tend to highlight these “solutions” to diffuse responsibility for their own impact – but this isn’t comparable to the meaningful institutional change that needs to take place.

Individuals do make a difference when they have their hands on the levers of those institutions. As software engineers we have front-row seats for the deployment of one of the world’s fastest growing energy consumers : AI. Our conscience calls us to resist the deployment of technologies which will exacerbate death and suffering for millions. AI might deliver benefits to society, but the cost is so high that we need to make careful decisions about how it’s deployed and if the benefits to society outweigh those costs. On the whole, vibe coding does not deliver benefits which, in the view of SourceHut and our community, outweigh the costs. Cheap, green electricity, preservation of freshwater resources, husbanding our planet and its wildlife: these are all much more important than AI-assisted coding.

The broader social and economic consequences add to the alarm. These tools are disrupting labor and increasing the already unprecedented gap between the haves and the have-nots. These companies pay minimum wage in inhumane conditions in impoverished countries for the labor they exploit to train models that can be applied to taking the bottom out of the labor market in wealthy countries. Moreover, the accumulated wealth of the AI owners, and the depleted resources of the AI proletariat, is further exploited to consolidate power, enable the rise of fascism, and destroy the social order alongside the environmental order. AI is being used to deport immigrants without due process , surveil and police poor and racialized communities, manipulate elections and political discourse, facilitate crimes against humanity at scale , and amplify injustices in our institutions.

Finally, AI simply seems to be bad for the people who use it. Many open source maintainers complain of being exhausted by a deluge of low-quality AI generated contributions . AI has been linked to “ deskilling ”, making its users worse at problem solving and other cognitive tasks. And the number of people who have been talked into psychosis or suicide by their chatbots continues to rise.

These concerns are myriad, credible, and demand action. Our small contribution to the problem is to clearly state our position on the matter and adjust our policies to provide a safe platform for people who are concious of these issues to work and find community.

The upcoming changes

The new terms of service, which will go into effect for new projects after the usual two week notice period (i.e. September 10th), will now include the following under the list of prohibited content:

  • original content written with or which facilitates the use of LLMs (large language models) or other generative AI technologies

The use of LLMs or other generative AI tools to produce or assist with the production of source code, assets, tickets, emails, and so on, will no longer be permitted on SourceHut once these terms take effect.

As with our other policy changes, the intention is to roll this out slowly and thoughtfully. Each possible violation will be evaluated on a case-by-case basis and we are open to making exceptions.

A matter of interpretation

This policy is worded carefully to allow some room for reasonable interpretation. For instance, the choice to target “original” content in the policy is intended to allow you to host mirrors of major codebases that may have more lenient LLM policies, such as the Linux kernel. An individual who contributes to a project like Linux can host their personal tree and stage patches on SourceHut, and a Linux kernel subsystem which has an internal policy on LLM use which aligns with SourceHut is welcome to host their tree, mailing lists, and so on, on our platform, without worrying about the impact of AI-assisted code in the rest of Linux. However, SourceHut would not be suitable as the upstream platform for the broader Linux project as a consequence of their liberal LLM policy.

Moreover, the use of AI for purposes other than co-authoring code, tickets, emails, and so on, is discouraged but not prohibited. If you use LLMs privately to review your work, to ask questions of, to perform security analysis, and so on, and then write original code to push to SourceHut, your use-case is aligned with our policy.

Software which contains generative AI features or directly enables the use of generative AI is not welcome on SourceHut once this policy comes into effect.

Enforcement

We intend to use a light touch with enforcement. Honesty and transparency is among our core values, and we have extended it to our users and expected it in return. We rely on the honor system when awarding financial aid on the basis of need almost every day, when we refrain from asking users to provide evidence of their financial situation to receive free service. All users pay according to their means, choosing the price point that they can afford, and have never been expected to justify their choice.

So, in terms of enforcement, first and foremost we have made our position clear and shown that AI-assisted projects are not welcome on SourceHut. We will not be deploying any automated tools for detecting AI use or going out of our way to identify covert AI use in projects.

One can lie or mislead us about their use of AI, but we want to signal to them that, if this behavior is discovered, they will lose the assumption of good faith and their account will be suspended. Therefore, it is not a wise choice to invest in SourceHut as the platform upon which this kind of software can be built, and we hope that reasonable users will make their choices accordingly.

Existing projects on SourceHut which have made use of AI assistance in their work may remain on SourceHut provided that they adopt policies which are consistent with our terms of service for their future development. If you have used AI tools in your software before, and want to remain on SourceHut, there will be no retroactive enforcement, and we will take action against users who shame or harass those who have used AI in their work. Nonetheless we invite you to consider the arguments presented here and adjust the way you work in the future before you consider migrating away.

If your project is affected

Projects which utilize and intend to continue utilizing AI assistance after the policy change takes effect will be treated the same as most cases of ToS violation: with patience and understanding. If you or your project are affected by these changes and wish to continue making use of generative AI tools, you are required to migrate away from SourceHut at your earliest convenience. There is no deadline per-se, but you should have a viable migration plan in place as soon as possible.

SourceHut is free and open-source software. You are welcome to follow the installation instructions to self-host it, or to find a community that operates their own instance and would welcome you there. We can also recommend Forgejo as an easier to deploy forge that may be suitable for your needs, and a list of public instances is available. If you prefer to retain the mailing list workflow, deploying a solution like GNU mailman may be suitable for your needs. Proprietary solutions like GitHub may also be viewed favorably by projects which support AI use, and provide many features to support AI users.

Much of your account and project data can be exported from SourceHut and imported with minimal loss into other forges. You can transfer your data to another SourceHut instance with high fidelity, and other platforms should be able to import a subset of the data (e.g. git repos to Forgejo or mailing list archives to GNU mailman). Please consult the hut tool for this purpose.

If you require assistance in figuring out your migration plan, or want to make sure you have enough time to implement the changes while minimizing the disruption for your project, please don’t hesitate to ask us for help .

The Dutch are filling gas wells with cement

Hacker News
www.siliconcontinent.com
2026-08-27 04:28:31
Comments...
Original Article
The machine for turning productive infrastructure into cement plugs

Readers will be familiar with the German nuclear phase-out. The Merkel and Scholz governments prematurely shut down twenty gigawatts of nuclear power. Those plants provided energy for 38 million households for less than twenty percent of the cost of gas. The Scholz government closed one power plant thirteen years before its expected retirement date.

But few know that the Dutch government is doing something similar: it is pouring cement down the country’s gas wells. These wells are already inactive; destroying them doesn’t do anything for safety or the environment. The government is demolishing the wells to prevent a future government from reconsidering its decision to stop producing gas.

The power of concentrated losers

The wells are located in Groningen, a province in the north of the country. Prospectors discovered the gas field in 1959 and soon realized it was the largest in Europe. Over the next 60 years, they extracted 2.2 trillion cubic metres of gas. Groningen earned the treasury lots of money – 363 billion euros – and gave Dutch utilities the ability to generate power without relying on foreign countries.

But gas production in Groningen had local downsides. The field is large, shallow, and crossed by small faults, so extraction caused bits of it to shift. In 1986, the region started experiencing small earthquakes. The majority of these quakes registered beneath 1.5 on the Richter scale, too faint for most people to notice. But a small number exceeded 2.0, and a tiny handful 3.0. The earthquakes led vocal Groningers to demand an end to the drilling

Jesse Frederik, a smart Dutch journalist, has argued that locals greatly exaggerated the harmfulness of the earthquakes. 1 But even if they hadn’t, there was a good case to keep drilling. The remaining reserves, some 500 billion cubic metres, are worth around €200 billion at current wholesale prices enough to pay every single resident of the province €150,000 as compensation and still have 110 billion euros.

And while gas alone is not good for the environment, more gas usually results in less coal usage, not less renewable generation. Norway is one of the world’s largest gas exporters despite its sincere concerns about climate change. (The enlightened Norwegians opened seventy more sites for drilling this past May.)

But like many modern Western countries, the Dutch are increasingly unable to pursue policies with huge numbers of winners and small numbers of concentrated losers. Rather than buy off the Groningers, the cabinet decided to give in to them. In 2018, the cabinet promised to end gas production by 2030. In 2019, it accelerated that deadline to 2023.

The concessions to the losers continued. In 2023, a parliamentary commission released a report announcing that the Dutch government had a ‘debt of honour’ to the people of Groningen, and that economic interests had superseded the interests of Groningers for too long. Hans Vijlbrief, the D66 minister responsible, then decided to fill the wells with 500 metres of cement.

The Mining Council opposed the decision: they said that it was possible and preferable to mothball the facilities. The main scientific advisor to the government also opposed the decision: they argued (and continue to argue) that pausing production was no worse for the environment than plugging the wells was, and preserved much greater flexibility for the government in case of geopolitical necessity or economic crisis.

The Groningen gas field still holds twice as much gas as the EU has imported from Russia since the 2022 invasion of Ukraine. At market value, that gas would be worth enough to increase the Netherlands’ aid to the Ukrainian government thirteenfold .

But the politics of the ‘debt of honour’ overcame the national and European interest. A specialised machine is now travelling around the province ripping out kilometres of pipes and filling what is left with thousands of tonnes of cement. It has destroyed 70 of the 300 wells this way so far.

A plea for optionality

This is a story of a few concentrated losers defeating a very diffuse majority of winners. But it is also a story of a government proactively choosing to limit the country’s options.

Destroying the wells does not change the likelihood of additional earthquakes. It does not change the world’s emissions pathway either, given that production had stopped. Its only purpose is to ensure that a future government, faced with different circumstances – a collapse in global LNG production – or different preferences – the Groningers decide that they would rather have more money than fewer tremors – has no ability to change course.

The situation in Groningen is unique, but the effort to reduce options is not. The German Greens chose to speed through the nuclear phase-out, rejecting a pause proposed by their partner in government, the FDP. In the case of one reactor, Neckarwestheim 2, they issued the dismantling permit before the reactor even shut down . An Austrian Green minister cast the pivotal vote in the European council for the European Nature Restoration Laws against the wishes of their coalition, weeks before an election they lost.

Restricting optionality ‘works’. Friedrich Merz opposed Olaf Scholz’s decision to shut down Germany’s remaining nuclear reactors in April 2023, but now says that it is too late to restart them. Future governments do find it difficult to reverse course if the alternative course has become impossible.

But it comes at a cost. The impulse to make a decision irreversible signals a lack of confidence in one’s decisions. If a decision is good, it should be capable of surviving the judgement of voters. That the government feels the need to shield it from such judgement suggests that they are not sure it would.

It is an act of institutional vandalism, raising the stakes of elections. It is also inefficient. Sometimes circumstances change in unforeseen ways. The demand for data centres has suddenly increased the usefulness of baseload power. Though Japan closed every reactor after Fukushima, it dismantled few; more than a dozen have since restarted. Michigan’s Palisades plant closed in 2022; it is now in the final stage of a restart. (Although it didn’t require much foresight in 2023 to think that gas might be geopolitically useful.)

Options are valuable. It would be good for the current Dutch government to prioritize the interests of the Netherlands and Europe over that of Groningen. Failing that, it would be nice for it to allow future governments to reconsider its priorities. For now, the cement-pouring machine is destroying more wells.

ATF confirms “major incident” after recent Qilin breach claims

Bleeping Computer
www.bleepingcomputer.com
2026-08-27 04:13:50
ATF, the regulatory agency that enforces federal laws governing firearms and explosives in the United States, has confirmed that one of its systems was compromised after breach claims made by the Qilin ransomware gang. [...]...
Original Article

Qilin

ATF, the regulatory agency that enforces federal laws governing firearms and explosives in the United States, has confirmed that one of its systems was compromised after breach claims made by the Qilin ransomware gang.

This follows Qilin adding the U.S. Bureau of Alcohol, Tobacco, Firearms and Explosives to its dark web data leak portal on Wednesday, without saying whether it had stolen files from ATF's systems or demanded a ransom.

The same day, the ATF published a press release saying that a standalone system was breached in what it described as a "major incident," which is now being investigated in collaboration with the Department of Justice.

image

"The impacted system operates separately from the ATF enterprise network, and there is no indication that the incident has affected the ATF enterprise network, the ATF eForms system, or any other ATF system," the federal law enforcement agency said .

"Upon discovery of the incident, ATF immediately terminated connections to the affected environment and initiated incident‑response and forensic activities. ATF is coordinating closely with the Department of Justice to investigate."

ATF added that the incident did not affect the agency's operations and asked the public to share any information on the attack via its official tipline.

BleepingComputer reached out to an ATF spokesperson with further questions about the incident, but a response was not immediately available.

ATF entry on Qilin leak site
ATF entry on Qilin leak site (BleepingComputer)

​Qilin is a Ransomware-as-a-Service (RaaS) operation first spotted in August 2022 under the "Agenda" name that has since claimed responsibility for more than 2,200 victims on its dark web leak site.

The list of victims includes many high-profile organizations such as automotive giants Nissan and Yangfeng , pathology services provider Synnovis , Japanese beer giant Asahi , publishing giant Lee Enterprises , and Australia's Court Services Victoria .

Several other U.S. federal agencies have disclosed cybersecurity incidents since the start of the year after their networks were infiltrated in cyberattacks.

For instance, the U.S. Federal Bureau of Investigation (FBI) confirmed in early March that it was investigating a breach affecting systems used to manage wiretap and surveillance warrants.

More recently, in July, the U.S. Department of Homeland Security also disclosed a cyberattack that compromised the Homeland Security Information Network (HSIN), a sensitive information-sharing platform used by federal, state, local, and private-sector partners.

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

Bill Gates - The turbulent AI era is here

Lobsters
www.gatesnotes.com
2026-08-27 01:32:18
Comments...
Original Article
You don't have permission to access "http://www.gatesnotes.com/work/make-ai-work-for-everyone/reader/a-turbulent-ai-era-and-critical-choices-to-make?" on this server.

Reference #18.4a7fd117.1787835928.1a9eefe3

https://errors.edgesuite.net/18.4a7fd117.1787835928.1a9eefe3

The Power of Ten: Rules for Safety Critical Coding

Lobsters
www.youtube.com
2026-08-27 01:20:16
Comments...

Pnpm 12.0

Hacker News
pnpm.io
2026-08-27 01:12:39
Comments...
Original Article

pnpm 12 is stable. It is a rewrite of pnpm in Rust, and it is deliberately not a migration: the commands, flags, settings, and lockfile format of pnpm 11 all carry over, and the documentation describes both versions.

The short list of things that genuinely behave differently is in What's different in pnpm 12 . This post covers what pnpm 12 adds that pnpm 11 never shipped.

Installing it

latest on npm still points at the pnpm 11 line, so pnpm 12 is installed from the next-12 tag:

See Installing pnpm 12 for the other ways, including without Node.js. Homebrew, winget, Scoop, and Chocolatey don't offer it yet.

Breaking changes

Git dependencies are identities

For repositories on GitHub, GitLab, and Bitbucket, a specifier now names a repository rather than choosing a transport. github:owner/repo , owner/repo , git+https://… , and git+ssh://git@… all resolve through the host's canonical HTTPS URL, and the lockfile never records an SSH URL for those hosts. To reach a private hosted repository over SSH, configure the machine with git's own URL rewriting:

git config --global url."git@github.com:".insteadOf https://github.com/

pnpm shells out to git , so the rewrite applies to all of its git operations. Unknown hosts keep their exact URL, SSH included, and a URL with embedded credentials is kept verbatim and never resolves to a host archive. Details in How git dependencies are resolved .

An unrecognized setting in pnpm-workspace.yaml is reported

A setting pnpm does not recognize used to be ignored in silence — a misspelled minimumReleaseAge dropped the policy it was meant to set, and nothing said so. It is now reported, with the closest real setting name suggested when the key looks like a typo.

It fails the command with ERR_PNPM_UNRECOGNIZED_WORKSPACE_SETTINGS when the project pins a pnpm version the running pnpm satisfies: with the pin honored, the setting cannot have been meant for a different pnpm version, so it is a mistake to fix rather than a key to ignore. Everywhere else it is a warning, so a project that has yet to be cleaned up keeps working. The pnpm config subcommands never fail on it, so a broken file can still be inspected and repaired.

Lockfiles of cyclic dependency graphs

Dependency cycles are now broken canonically during peer resolution: the members of each cycle are ordered by package id, and the edges that close a cycle are always cut at the same place, wherever the installation walks into the cycle from.

The lockfile therefore becomes a pure function of the dependency graph — reordered importers, reordered dependencies, and repeated installs all produce byte-identical lockfiles, which they could not before ( #13846 , #13865 ). On large cycle-heavy workspaces peer resolution is 2–3× faster, uses about 25% less memory, and produces a substantially smaller lockfile.

Existing lockfiles keep working: --frozen-lockfile consumes them unchanged, and an install that skips resolution leaves them untouched. The first install that actually re-resolves re-keys the walk-order-dependent peer variants of cyclic packages once. See How peers are resolved .

A reflink materializes a new inode and copies extent bookkeeping inside the filesystem's metadata trees, where a hardlink is one directory entry — on btrfs that roughly halves the time an install spends materializing node_modules from a warm store. So on Linux, auto now tries the hardlink first.

ext4 is unchanged (cloning was never supported there, so auto already hardlinked), and macOS keeps clone-first, where APFS clonefile is the platform's cheap primitive. On Linux, cloning becomes the second rung rather than the first, so a store that refuses a hardlink still gets a clone; packageImportMethod: clone still asks for one outright.

engineStrict follows the edge, not the subtree

Under engineStrict , an install now fails when an incompatible package is reached through a regular dependencies edge of an installable package, even when that whole subtree hangs off an optionalDependencies entry. pnpm 11 installs the package and emits an install-check warning instead. Packages reachable only through optional edges, or through a package that was itself skipped, are still skipped in both versions ( #13286 ).

New features

Not all of these are exclusive to pnpm 12. Registry revisions , the remote side-effects cache , audit.ignorePrune , batch staged approval , and the pnpm init latest-tag pin ship in pnpm 11.25 as well; the rest are v12 only, because they belong to the Rust rewrite.

Project-aware global bins

A globally installed node , deno , or bun follows the version the current project pins, instead of always running the globally installed one — no shell hooks, no use -style command. The new globalShims setting picks which globally installed packages get such a shim; it defaults to { node: true, deno: true, bun: true } and merges key-wise, so globalShims: { typescript: true } adds one without restating the rest.

A stable Node.js release is authenticated against the Node.js release team's signatures and switches without asking. Everything else — Deno, Bun, Node.js prereleases, ordinary package bins you enable — asks Do you trust this project? once per project and per candidate, and remembers the answer machine-locally. PNPM_SHIM_BYPASS=1 bypasses the feature for one invocation. See Project-aware global bins .

pnpm installs the other package managers

pnpm now provisions npm, Yarn Classic, Yarn Berry, Yarn 6 ( yarnpkg/zpm ), and Bun, each fetched through the trusted package-manager registries, and each npm-published one verified against npm's signature for its exact version before it runs.

Three things use it. A git-hosted dependency is prepared with the package manager it asks for, so a repository built with Yarn installs on a machine that only has pnpm. pnx runs one for a single command — pnx yarn@4 install , pnx npm@11 ci , pnx node@22 . And pnpm shim add yarn links a yarn that runs whatever the current project pins.

Naming a package manager therefore means the tool rather than the npm package that shares its name: pnpm add -g yarn@4 installs Yarn Berry, and in a project pnpm add yarn@4 records "packageManager": "yarn@4.18.0" — what Corepack reads — while every other package manager is recorded in devEngines.packageManager . A specifier that locates a package still installs what it names ( pnpm add yarn@npm:yarn@1.22.22 ). See Other package managers .

Registry revisions

A registry can serve a replacement artifact for an already-published version — a rebuild with a vulnerability patched out — without changing the version number and without rewriting the bytes the canonical name@version URL has always served. pnpm calls each such artifact a revision , addresses it by its complete SHA-512 digest, and records it in the lockfile as one extra line:

pnpm-lock.yaml

packages:

lodash@4.17.21:

resolution:

integrity: sha512-<replacement-digest>

revision: 1

An entry with no revision is revision 0, the original — which is what every entry pnpm has ever written means, so a lockfile that has adopted no replacements is byte-identical to today's.

A dependency or override may pin a revision explicitly as <version>+rN , and pnpm update --patches refreshes the locked artifacts without changing a single version. pnpr serves revisions for the packages it hosts and proxies them for an upstream registry that advertises them. See Registry revisions .

pnpm init pins the latest pnpm

pnpm init pins the latest released pnpm rather than the version that ran the command, so a project scaffolded by an outdated pnpm no longer inherits that staleness through its own pin ( #7490 ). If the latest lookup cannot answer — no network, a slow registry, offline , or a latest that minimumReleaseAge or trustPolicy rejects — the running version is pinned as before. The lookup never fails or hangs the command.

Batch approval for staged publishing

pnpm stage approve approves several staged packages at once. Run it with no stage id to pick from the staged versions interactively, or pass a list. The whole batch is approved with a single one-time password, and pnpm asks for a new one only once the registry stops accepting it. Inside a workspace the packages are approved in dependency order, and one whose workspace dependency could not be approved is skipped rather than published against a dependency that never reached the registry.

audit.ignorePrune

Set audit.ignorePrune: true and pnpm audit --fix removes the ignored GHSA entries that no longer appear in the audit report, so a list of tolerated advisories stops accumulating entries for dependencies that are long gone.

Global commands refuse to run under sudo

pnpm setup , pnpm self-update , and any command that modifies the global installation now fail with ERR_PNPM_SUDO_NOT_SUPPORTED under sudo , instead of silently operating on the root user's home directory. pnpm keeps global packages and configuration in the invoking user's home, so these commands never need root. Read-only global commands such as pnpm bin --global still work.

A remote side-effects cache (proof of concept)

An opt-in proof of concept lets installs reuse a dependency's build output across machines, by publishing and restoring signed , organization-scoped artifacts through pnpr instead of running the lifecycle scripts locally.

A repository names only the eligible remoteSideEffectsCache.organization and packages ; everything describing the act of signing is refused in pnpm-workspace.yaml and read from the global config file or the environment instead, so a cloned repository cannot turn the machine's key into a signing oracle. Every cache failure falls back to the ordinary local build. It restores on Linux/glibc x64 and arm64 only for now — see Shared side-effects cache .

Fixes worth knowing about

The compatibility database drops its static-analysis entries

The built-in compatibility database no longer adds dependencies that were detected by static analysis of published packages. Those entries named packages a dependent only imports for its types , so installing them was at best unnecessary and at worst broke the dependent: @typescript-eslint/types gained a typescript dependency resolved to the newest release, which put TypeScript 7 under older @typescript-eslint versions and made ESLint fail with Cannot read properties of undefined (reading 'Intrinsic') . The @yarnpkg/extensions entries and pnpm's own curated ones stay.

A store inside the project when nothing above it is linkable

When no directory above the project accepts a hard link — an AI agent sandbox that grants write access only to the project, or a container with just the project mounted writable — the default store is created at <project>/node_modules/.pnpm-store instead of in the pnpm home directory. In those environments the home store is either read-only or on another volume, which forces every package to be copied instead of hard linked ( #13525 ).

The filterLog pnpmfile hook is deprecated

pnpm 12 ignores hooks.filterLog and warns when a pnpmfile defines it. Use loglevel to choose how much pnpm reports.

Feedback

Please report any issues you run into.

12,000 Starbucks Workers Call for Boycott of Law-Breaking Coffee Chain

Portside
portside.org
2026-08-27 00:38:23
12,000 Starbucks Workers Call for Boycott of Law-Breaking Coffee Chain Mark Brody Thu, 08/27/2026 - 00:38 ...
Original Article
12,000 Starbucks Workers Call for Boycott of Law-Breaking Coffee Chain Published

Starbucks workers in New Orleans take part in an October 7, 2025 demonstration at which they demanded company leaders negotiate a fair contract. | (Photo by Starbucks Workers United/X)

Starbucks workers who have joined the unionizing effort that started in Buffalo, New York in 2021 and has spread to over 700 stores across the country called on all working people to show solidarity by boycotting the coffee chain, which has refused to finalize a union contract and has been accused of hundreds of labor violations.

“What we’re fighting for is simple: a minimum $17 per hour wage, enough hours to live on, better staffing in our stores, and basic workplace protections,” said Starbucks Workers United (SWU) Tuesday. “Every year, our living costs rise, but our wages don’t keep up—a growing pressure many American workers are feeling as corporate greed accelerates unchecked in our country.”

While the company “fuels working people” across the country every day, said the union, “it’s failing the workers who fuel its profits”—which rose to $25.5 billion in 2025.

Starbucks and the union returned to the bargaining table in April after a monthslong nationwide strike , with about 4,500 baristas reportedly picketing at 230 stores in more than 130 cities at the peak of the work stoppage.

SWU was originally calling for a minimum wage of $20 per hour. Baristas in 43 states make $16 per hour and under as a starting wage. The union is calling for 4% annual raises, arguing that inflation has eaten into any benefit provided by small annual raises.

The workers are also calling for a minimum of three staff members in stores at all times.

“The company is notorious for hiring additional workers while current workers are asking for more hours to survive. The union is demanding more hours for existing employees before new hires,” reported Labor Notes in April.

The union noted that the National Labor Relations Board and its judges “have found that Starbucks committed hundreds of labor violations and there are currently more than 550 unresolved unfair labor practice charges still pending against the company.”

The company has fired workers for organizing, illegally withheld wages and benefits, and illegally surveilled employees.

The call for a boycott coincided with the yearly release of Starbucks’ fall menu, including its popular pumpkin spice latte, which generated $2 billion for the company in its first decade.

“Starbucks has repeatedly demonstrated a lack of care for the workers who fuel the company’s profits by wasting millions of dollars on AI and technology that doesn’t work, launching countless gimmicky drinks designed to distract from real problems, and inventing pointless policies that do nothing but make our jobs harder,” said SWU.

“This ongoing, irrational behavior by Starbucks and its refusal to settle a fair union contract with workers leaves us with no other choice than to call for a boycott,” added the union. “We know when working people stand up together, we win.”

Julia Conley is a senior editor and staff writer for Common Dreams.

“They Threw Me to the Wolves”

Portside
portside.org
2026-08-27 00:22:30
“They Threw Me to the Wolves” Mark Brody Thu, 08/27/2026 - 00:22 ...
Original Article

NERMEEN SHAIKH : This is Democracy Now! , democracynow.org, The War and Peace Report . I’m Nermeen Shaikh.

A private arbitrator has ordered The Washington Post to rehire opinion columnist Karen Attiah with back pay. Attiah was fired last fall over comments she made following the fatal shooting of conservative activist Charlie Kirk.

Attiah is an award-winning journalist who served as the founding editor of the _Post_’s Global Opinions section. In 2019, she was named Journalist of the Year by the National Association of Black Journalists. She was recognized for her writings about Saudi dissident journalist Jamal Khashoggi, who was assassinated by a team of Saudi agents inside the Saudi Consulate in Istanbul, Turkey, in 2018. Attiah had recruited Khashoggi to be a columnist for the Post .

But Attiah’s career at The Washington Post came to an abrupt end last year. Shortly after Charlie Kirk was fatally shot, Attiah wrote online, quote, “For everyone saying political violence has no place in this country… Remember two Democratic legislators were shot in Minnesota just this year. And America shrugged and moved on.” In a follow-up post, she wrote, quote, “Part of what keeps America so violent is the insistence that people perform care, empty goodness and absolution for white men who espouse hatred and violence,” she wrote.

During her arbitration hearing, Attiah said, quote, “My commentary in general was about how America responds to acts of political violence, and quite often that response is different depending on the identity of the perpetrators of that violence.”

Karen Attiah joins us now from Washington, D.C.

Karen, welcome back to Democracy Now! If you could respond to The Washington Post ’s decision to rehire you following this lengthy arbitration process?

KAREN ATTIAH : Yes. It’s good to be back. Thank you for having me on.

What can I say? I feel extremely vindicated. I feel quite tired, quite joyful. I’m sitting here, and I’m wearing red in honor of the Washington Post Guild. I’m a proud union member. And my ability to even challenge my firing, to file a grievance, and then to go to arbitration was all thanks to the fact that the Washington Post Guild and the Washington-Baltimore News Guild had in their contract for binding arbitration. So, as much as this is a victory for me, this is a victory for guilds, for unions, and as well as, you know, I’m feeling very much like this is beyond just a job, beyond just me, beyond just The Washington Post . This is a victory for journalism, for anyone who wants to stand up for just speaking the truth, for — I was just doing my job. So, I really do see this as a symbol that it’s worth it to stand up and fight for freedom of expression, for journalistic freedom. And when you fight, sometimes you win. And sometimes you win big, like in my case.

NERMEEN SHAIKH : So, Karen, could you tell us: Have people from the Post been in touch with you since this was announced, and, in particular, the _Post_’s former opinions editor, Adam O’Neal?

KAREN ATTIAH : I have heard nothing from Adam O’Neal. The only time I’ve heard from him was once last year in a meeting, and then, secondly, during the arbitration, where he testified against me. My lawyers and reps at the moment are going back and forth with the Post , as I understand. But for me, I have still not heard anything yet from The Washington Post .

NERMEEN SHAIKH : And explain, Karen, why exactly, what the justification was that was given for The Washington Post ’s decision to sack you from your post. They cited, among other things, security threats, but not security threats against you.

KAREN ATTIAH : Right. So, two things. I mean, The Washington Post argued that my posts disparaged white men and were in violation of their social media policy. Of course, anyone reading with any reasonable amount of reading and grammar comprehension could see that I was talking about white men who choose to engage in hatred and violence. So there was that.

And then the Post tried to make the argument that because the Charlie Kirk killing was such an overly emotional time, that they had no choice but to distance themselves from me. And I think this is actually a really, really important point of the arbitrator’s decision. She reminded the Post of their own policies to protect their journalists, especially in times of heightened social media abuse and attacks.

I can say from my experience, frankly, the posts that I made did not engender that much backlash. I was not aware of any threats. And instead of The Washington Post calling me, telling me about the posts, they didn’t even tell me to take them down. Instead, they threw me to the wolves and basically blamed me for any supposed threat. The Washington Post basically manufactured a crisis of their own making in terms of the — in terms of posts and used that as a reason to get rid of me.

NERMEEN SHAIKH : And could you place this, Karen, in the context of broader attacks on the media under the Trump administration, and also about what’s going on internally and has been going on at The Washington Post ?

KAREN ATTIAH : So, my firing at the time, of course, people familiar with The Washington Post trajectory, particularly over the last couple of years, this came after Jeff Bezos said that the opinions section was only going to cover personal liberties and free markets, and nothing else. So, there was already a chilling effect and a sense of censorship. There were buyouts that were offered to the entire opinions section, of which I refused. I decided I wanted to stay. And part of the reason why I wanted to stay was because I was the last full-time staff Black opinion columnist in the section, and for a city that has historically been majority Black, I guess I just felt a sense that I needed to stay and do as much of the work as I could.

And in terms of the broader, broader picture, there’s been an attack on the media. We’ve seen how, specifically in the Charlie Kirk case, how JD Vance, members of the right wing were explicitly telling people to go after any critics of Charlie Kirk, and explicitly telling them to go after their jobs. Of course, we saw what happened to Jimmy Kimmel. All of this is coming in an environment where more and more media are facing pressure to kowtow to Trump, to kowtow to MAGA . And so, for me, again, I think this is why my reinstatement and this win means so much for so many people, because they see this as a proxy for standing up to this wave of censorship and oppression and targeting, particularly of Black voices and removing Black voices deemed as DEI from the public sphere.

NERMEEN SHAIKH : And could you talk about — in your recent Substack piece , you mentioned Marc Thiessen, the Post columnist who encouraged Charlie Kirk critics to be doxxed and said on social media, using an expletive, “F— the media and liberal democrats.” But he still has his job at the Post .

KAREN ATTIAH : Right. Well, it all goes back to how, ironically, the _Post_’s treatment of me versus my white male colleagues just goes to the point of how men who encourage harm, or at least support it or appear to platform it, are coddled, are given a pat on the back and allowed to keep going, whereas myself, a woman journalist, a Black woman journalist, I get the harshest of punishments, and not just the harshest of punishments, but I myself am labeled a threat. So, for the Post saying that my posts went against journalistic integrity, perhaps they were more afraid that I actually clocked the behavior of America and The Washington Post when it comes to white men who choose to engage in violence. I was just calling a thing a thing, and The Washington Post , once again, in their treatment of me versus my white male colleagues, proved me right.

NERMEEN SHAIKH : And before we conclude, Karen, so, what is your plan now? Do you plan to return to the Post ? And many people are curious: What will happen with your Substack?

KAREN ATTIAH : So, the way I feel, I mean, right now I’m just savoring this victory as much as I can. I am very much ready and willing to go back to writing. My beat was writing about race, gender, human rights and global issues. So, I fully expect — and, frankly, demand — that I be able to publish freely, that I be able to write freely. So that is what is on the table. They have their marching orders. I’m still waiting to hear from the Post .

And as far as my Substack right now, my Substack, I’m going to keep writing, until I find out more about what’s going to happen with The Washington Post . But as of now, all my options are still on the table. So, for now, I’m — like I said, I’m savoring the victory, and I’m hoping to at least pop champagne in the near future.

NERMEEN SHAIKH : OK, congratulations again, Karen. Karen Attiah is former global opinion editor for The Washington Post . We’ll link to your latest Substack piece , “The Washington Post Fired Me. I Fought — and Won My Job Back.”

Nermeen Shaikh is a co-host and senior producer at the independent television news hour Democracy Now! based in New York City. She is the author of The Present as History: Critical Perspectives on Global Power (2007).

Trump’s ICE Has Detained More People Than the Population of Atlanta

Portside
portside.org
2026-08-27 00:10:41
Trump’s ICE Has Detained More People Than the Population of Atlanta Mark Brody Thu, 08/27/2026 - 00:10 ...
Original Article

People held in Delaney Hall, a federal immigrant camp in Newark, New Jersey, stood at a window in May 2026. During President Donald Trump’s second term in office, ICE has detained more than 610,000 people. | Adam Gray/Getty Images

More than 45,000 people were detained by Immigration and Customs Enforcement last month, the highest number since Donald Trump retook office, according to data the Deportation Data Project released Monday.

In total, since Trump’s inauguration last year, ICE has detained over 610,000 people — more than the population of Atlanta, Baltimore, Milwaukee or the entire state of Wyoming.

At times, previous administrations, both Democratic and Republican, have booked hundreds of thousands of people into ICE custody for processing. But in Trump’s second term, the number of people ICE booked and then held for extended periods of time has ballooned.

Last year, more than 270,000 people spent at least a week detained, surpassing any other year since 2012, the earliest in the Deportation Data Project’s archive. However, even as Trump's enforcement upends lives and livelihoods in immigrant communities, the number of people detained and deported falls far short of the president's goal of deporting 1 million people per year .

The Trump administration’s policy is to detain almost all unauthorized immigrants, regardless of their individual circumstances, and to keep them detained as long as it takes for their cases to move through immigration court — often months, or even years.

Both the Biden and Obama administrations oversaw enormous spikes in book-ins to ICE detention amid increases in migrants arriving at the Southern border, including unaccompanied children in 2012 and single adults in 2023 . Many of those people were not locked up for long; instead, they were processed and then released to the community — where it is easier to challenge their deportations — while their cases played out in immigration courts.

Since Trump returned to office, border crossings have dropped precipitously. And yet ICE detentions, especially long-term, remain among the highest in the timeframe covered by the data.

The other major difference between today’s immigration detention machine and that of prior administrations, including Trump’s first term, is where and how the arrests and detentions are taking place.

About 80% of people detained since Trump retook office have come from the interior of the country, where they are much more likely to have community ties — families, jobs, homes — than those crossing the border. That’s almost a complete reversal of the practice during the previous two years under President Joe Biden, when 30% of detentions came from inside the U.S.

“What we’re seeing is something unprecedented,” said Caitlin Patler, a public policy professor at the University of California, Berkeley who studies immigration. “Going after people where they work, where they pray, in the streets, at the schools. These are these places that in the past you wouldn't really have seen ICE arrests happening at scale.”

César Cuauhtémoc García Hernández, a professor who studies immigration at Ohio State University Moritz College of Law, warned of the lasting impact on a generation of people in the cities hit hardest by Trump’s immigration tactics, like Chicago and Minneapolis.

“People who are detained lose their jobs, lose their homes, lose the money that is needed to pay for food, medical care, school supplies,” Hernández says. “Those are the kind of direct impacts that don’t go away the moment the refrigerator is stocked again, or the electricity is paid.”

Others, who are deported, are not able to return to their homes at all.

“The administration lost a lot of goodwill from a lot of people who thought they were going to remove bad people,” said Sarah Saldaña , who served as director of ICE from 2014 to 2017. “They've done everything to make it look like a lawless-enforcement agency.”

Some people arrested and detained in the last year had already been released from custody by judges during previous administrations with agreements to attend their immigration court hearings.

For many of these people, nothing about their lives or cases has changed to warrant incarceration, said Amy Romero, an immigration attorney with the Lawyers' Committee for Rhode Island, who is representing many people in this situation.

“The only thing that’s changed is we now have an administration that is hell-bent on imprisoning as many immigrants as possible,” she said.

Beth Schwartzapfel reports on prisons and jails, parole, addiction and health, LGBTQ+ issues and more.

Anna Flagg works with data to report on detention, deaths in custody, crime, race, policing and immigration. A lot of my work is visual and built using data.

Generic Methods in Go

Lobsters
go.dev
2026-08-27 00:06:15
Comments...
Original Article

Generics was a profound change for Go—it fundamentally expanded the kinds of programs that gophers could write by adding type parameters to the language.

One could now express generic types and functions in Go. These constructs decreased the need for specialized data types and functions, reducing program verbosity and improving the ergonomics of the language in those cases.

To illustrate, different kinds of linked lists could now be condensed into a single type definition:

// before Go 1.18
type ListOfInts struct {
    elem int
    next *ListOfInts
}
type ListOfStrings struct {
    elem string
    next *ListOfStrings
}
// ...

// after Go 1.18
type List[E any] struct {
    elem E
    next *List[E]
}

Likewise, sorting different kinds of ordered data could be expressed as a single function:

// before Go 1.18
func SortInts(s []int) { /* ... */ }
func SortStrings(s []string) { /* ... */ }
// ...

// after Go 1.18
func Sort[E cmp.Ordered](s []E) { /* ... */ }

However, no such capability came to methods.

The generics proposal reasoned that because generic interface methods are difficult to implement efficiently (discussed later ), it didn’t make sense to add type parameters to non-interface (or “concrete”) methods either. In that view, methods are primarily the means of implementing an interface.

Go 1.27 takes a different view and consequently adds generic methods to Go. In this post, we’ll explain this change of view and demonstrate some uses of this new feature.

Methods for organization

Methods enable organizing functionality around types. To illustrate, let’s reconsider the linked list from above (adding some conveniences):

type List[E any] struct {
    elem E
    next *List[E]
}
func NewList[E any](elems ...E) List[E] { /* ... */ }
func (List[E]) String() string { /* ... */ }

Suppose that one wanted to map this structure to hold a value of some other type, like a string . A method like ToString would do:

func (List[E]) ToString(f func(E) string) List[string] { /* ... */ }

By providing a “transform” function f , ToString can be customized with “off-the-shelf” routines.

For example, strconv.Itoa might work for a List[int] :

func main() {
    fmt.Println(NewList(1, 2, 3).ToString(strconv.Itoa)) // [1 2 3]
}

For a List[[]byte] , more options come to mind (depending on the use case):

func main() {
    l := NewList([]byte("Hallo Welt"), []byte("Helló világ"))
    fmt.Println(l).ToString(hex.EncodeToString)                 // [48616c6c6f2057656c74 48656c6cc3b32076696cc3a167]
    fmt.Println(l).ToString(base64.StdEncoding.EncodeToString)  // [SGFsbG8gV2VsdA== SGVsbMOzIHZpbMOhZw==]
}

Note that parameterizing List allowed generalization of the source type, but not the destination type, since that depends on the transformation being applied. This might be reasonable with just a single destination type, but what if there were many?

In Go 1.18, a generic function could be used for this:

// after Go 1.18
func MapList[E, R any](l List[E], f func(E) R) List[R] { /* ... */ }

But using a function has the disadvantage of moving MapList into the package scope—if many data types support mapping operations, things could get crowded. Furthermore, chained calls must be written “inside out”:

func main() {
    fmt.Println(MapList(MapList(NewList(0, 2, 4), add(2)), divideBy(2))) // [1 2 3]
}

Because Go 1.18 didn’t support generic methods, we needed a generic function as a workaround. This is now remedied in Go 1.27:

// after Go 1.27
func (List[E]) Map[R any](f func(E) R) List[R] { /* ... */ }

This is compact, expressive, and locally scoped. Additionally, chained calls are more readable, as they can be written more naturally from left to right:

func main() {
    fmt.Println(NewList(0, 2, 4).Map(add(2)).Map(divideBy(2))) // [1 2 3]
}

Prefer the “inside out” form? A method expression can convert any method, including a generic one, into its function equivalent. Thus, a function call structure can be recovered if desired:

func main() {
    f := List[int].Map[int]
    fmt.Println(f(f(NewList(0, 2, 4), add(2)), divideBy(2))) // [1 2 3]
}

Generic methods, like other generics in Go, must be instantiated (either explicitly or implicitly) before they are used (called or converted to a function).

Decoupling things

If one views methods also as an organizational tool, then Go 1.18’s reasoning appears overly restrictive. While a generic concrete method can’t help implement an interface (without generic interface methods), it can still be useful for code organization. In other words, these concerns can be decoupled.

To elaborate, let’s consider a simple interface:

type I interface {
    M()
}
type T struct{}                   // a struct, not an interface
func (T) M[P any]() { /* ... */ } // a generic *concrete* method

Here, T.M is parameterized by P . Any instantiation of T.M would result in a method signature identical to that of I.M :

func main() {
    T{}.M[int]()
}

Both T.M[int] and I.M have the signature func M() . However, this doesn’t mean T implements I . Interface implementation is a property of a (possibly instantiated) type, not of any particular method. Importantly, T does not declare T.M[int] , but rather its generic (and thus uninstantiated) counterpart T.M .

For T.M to participate in interface implementation, there would need to exist a suitable generic method on I.M :

type I interface {
    M[P any]() // a generic *interface* method
}
type T struct{}
func (T) M[P any]() { /* ... */ }

Since the Go 1.27 syntax doesn’t allow interface methods to declare type parameters, this code is impossible to write.

But why can’t Go have generic interface methods? To understand, a bit of a detour is needed.

The trouble with generic interface methods

An interface value is a box that can hold some other value—the boxed value can be of any type, as long as that type implements the interface. This means that the declared methods on the type are a superset of those declared on the interface.

To illustrate, T implements I below:

type I interface {
    M()
}
type T struct{}
func (T) M() { /* ... */ }

One can call methods on interface values:

func main() {
    F(T{})
}

func F(i I) {
    i.M() // "backed" by T.M
}

Above, it’s easy to observe that the call to i.M will be routed to T.M . But in more complex programs, the relation between an interface value method call and its possible targets is significantly less obvious. This relation typically spans across packages, making it difficult or impossible to deduce in the general case.

To illustrate, let’s introduce a package boundary:

// -- package main --
import "p"

func main() {
    p.F(T{})
}
type T struct{}
func (T) M() { /* ... */ }

// -- package p --
func F(i I) {
    i.M()
}
type I interface {
    M()
}

Because the two packages are compiled separately, the main package won’t know how p.F uses T{} . To ensure the existence of any method that p.F might call, the compiler generates code for all non-generic methods of a type at its declaration (or instantiation). That way, regardless of what p.F does with T{} , the necessary code will exist at runtime.

Now, suppose that I.M were generic:

// -- package main --
import "p"

func main() {
    p.F(T{})
}
type T struct{}
func (T) M[P any]() { /* ... */ }

// -- package p --
func F(i I) {
    i.M[int]()
}
type I interface {
    M[P any]()
}

Again, the main package won’t know how p.F uses T{} —including how it might instantiate T.M . To handle any usage of T{} inside p.F , the compiler would need to instantiate T.M with every possible type argument .

This is impractical with Go’s approach to instantiation, wherein the compiler generates specific code for each method based on the type arguments. If method arguments were “boxed” (i.e. passed as values of their constraint interfaces), each instantiation would share the same code. This would avoid having too many instantiations at the cost of indirect call overhead—even for direct calls to instantiated methods.

Conclusion

Go 1.27 introduces type parameters on concrete methods—this feature has been highly desired by the Go community, as it permits more ergonomic and readable code. Although we can’t support generic interface methods, we decided that allowing type parameters for concrete methods was still worthwhile.

We hope you enjoy using Go’s generic methods and find helpful ways to use them in your projects!

Why 9 to 5 Still Resonates Today

Portside
portside.org
2026-08-26 23:58:20
Why 9 to 5 Still Resonates Today Mark Brody Wed, 08/26/2026 - 23:58 ...
Original Article

Lily Tomlin, Dolly Parton, and Jane Fonda in 9 to 5. | (20th Century Fox)

When Dolly Parton first tapped out the beat to her iconic song 9 to 5 more than forty years ago, a movement of working women was taking off. 9 to 5 the movie catapulted those women’s demands for rights and respect into the public debate, legitimizing the often-unspoken grievances of the growing women’s workforce.

We’ve seen some progress. Women are no longer restricted to a handful of occupations, and sexual harassment is no longer a personal shame but a public scandal. But the sensible reforms mentioned in the film — equal pay, childcare, flexible hours — are still out of reach. As Dolly says in the new documentary, Still Working 9 to 5, “It’s forty years later, and it’s still important.”

I know 9 to 5 well. I was friends with Jane Fonda from the antiwar movement, and my stories about organizing women office workers in our national association 9to5 and our union SEIU 925, inspired her to make the film, as she describes in the documentary made by Camille Hardman and Gary Lane. The documentary has delightful information about the film I didn’t know, along with insights on the fight for women’s equality.

A few highlights: It turns out that Lily Tomlin backed out twice because she didn’t think the script was funny; she eventually decided the opportunity to work with Fonda was too important to pass up. The studio was nervous because the film had three female leads and wanted a movie star as the boss; Bruce Gilbert, the producer and Fonda’s business partner, prevailed in casting Dabney Coleman in that role.

Lilly Ledbetter, who sued Goodyear Tire for sex discrimination in 1998 and for whom the 2009 Fair Pay Act is named, saw 9 to 5 when it came out. When she became a supervisor, some men resented taking orders from a woman and made her job difficult. She even feared for her life at times on the dangerous factory floor. She took comfort in the film. “I think back,” she says, “and Jane and Dolly and Lily encouraged me.”

And in a moment of bizarre self-awareness, Harvey Weinstein, an investor and producer of the 9 to 5 musical, explains why the production is a success: “It’s women’s emancipation. Secondly, it’s about women wanting to kill their boss. And third of all, I know that everyone in my company wants to kill me.”

Weinstein’s screen time aside, Still Working 9 to 5 is fun, including when the stars of the film, TV show, and musical deliver the messages: “Don’t put up with shit,” Allison Janney says. “Stand up for yourselves,” says Rita Moreno. “I’m not going to take it anymore!” Jane Fonda cries. Dolly summed it up: “It touched a nerve. It resonated with enough people that right out of the box it kept getting bigger and bigger.”

Jane Fonda, Lily Tomlin, and Dolly Parton in Still Working 9 to 5 (Still Working 9 to 5 LLC).

Why does it resonate today?

Far fewer women are actually still working 9-to-5 these days. Secretaries and administrative assistants were the top occupation for women by a mile in 1980, and the occupation is still overwhelmingly women — 95 percent. But it now comes in fourth after teachers, nurses, and health aides as the top occupations for women, according to the US Department of Labor Women’s Bureau. More women may be working 7 AM to 3 PM, the evening shift, or have no fixed hours at all, while many office workers and professionals are on call long after the work day ends. But while the jobs and hours may have changed, the issues haven’t gone away.

In 2019, I met with about fifty working women in Milwaukee, Chicago, and Washington, DC, to get their thoughts on a possible sequel to 9 to 5 . “We’re working more like 24-7, but I had to stand up and shout ten minutes into this film,” a woman named Brenda told me. “I couldn’t believe how many of the problems are still with us.”

“Childcare center? I feel like I have to hide the fact that I have kids,” said Sheila. One woman captured the anger of the Lily Tomlin character: “I have to swallow all the fury and frustration in order to just show up to the bullshit at work, because the bullshit pays the bills.”

Social scientists confirm that the agenda is unfinished. The Harvard Business Review reports that, since the 1990s, the move toward workplace gender equality has slowed:

Sociologist Paula England has called this phenomenon an uneven and stalled gender revolution, and there have been dozens of studies showing how the progress in gender equality experienced during and immediately after the feminist movement of the 1970s has not been sustained.

With the pandemic, the problem is not just a stalled agenda but a major setback . And with a supermajority of conservative judges on the Supreme Court, we’ll see the end of abortion rights and a likely erosion of workplace and civil rights for women and people of color.

This isn’t the first time American women have had to start over. Louis Menand, in his book The Free World: Art and Thought in the Cold World , writes, “By many measures, American women were worse off in 1963 than they had been in 1945 or even in 1920. In 1920, 20 percent of PhDs were awarded to women; in 1963, it was 11 percent. Forty-seven percent of college students were women in 1920; in 1963, 38 percent.” Women were largely absent in professions and public life. And even the gender pay gap was greater in 1963 than it had been in 1951.

It took social movements in the 1960s and 70s to restore progress to women who had lost so much ground and leap forward. The success of 9 to 5 in 1980 captured that momentum and promised a future of positive change — a promise that, as Still Working 9 to 5 will remind you, still hasn’t been fulfilled.

Karen Nussbaum was a cofounder of the women’s labor organization 9to5 and the founding director of Working America.

If I release it, you won’t get the same experience I get

Lobsters
notes.highlysuspect.agency
2026-08-26 23:47:52
Comments...
Original Article

In my minecraft modding repo I was doing some build-tooling refactoring, and to give myself confidence I didn’t break anything I wrote a program called jardiff . It takes two files or directories as arguments and does the following:

  • if it’s a directory, it checks they have the same file listing, and then recurses into each file
  • it also does that for the files inside .zip s and .jar s
  • if it’s a .json , it parses the json and standardizes the formatting before diffing
  • if it’s a .class , it runs it through a Java disassembler (objectweb asm textifier) before diffing
    • because you deserve better than “Binary files differ”
  • otherwise it does a normal diff and displays the results if it’s text
    • I implemented the meyers diff algorithm by hand. Totally unnecessary but a fun yak shave

So it’s like a more lenient diffoscope ; I wanted to make sure that the new build tooling creates artifacts which function the same as the old artifacts, but I don’t care if they’re byte-for-byte (hence the json reformatting).

For example, in the old tooling I had a Java 8-compatible sourceset and three of the mods I built contained classes harvested from it. In the new tooling I decided to remove this sourceset and just paste the classes into each mod, so they are now compiled alongside the rest of the mod, using Java 25. jardiff uncovered this difference because a class file’s version number is visible in its disassembly.

However I decided that this change was acceptable. I don’t support minecraft versions which require java 8 anymore and removing the sourceset made things simpler enough to justify a little cut-pasting.

So what I did was: I went into the sourcecode of jardiff and modified the disassembler to always output the same class file version number. When I ran jardiff again those particular differences were gone and I could easily look for more.

something abt having the code of the tool right there in front of you at the time you use the tool. something about how you don’t have to bake in choices or make things configurable when you can just splice in the code you need and skip the parts you don’t

I can get a lot done quickly with jardiff because its sourcecode exists in my editor when I use it. I can ignore or exacerbate changes I’m looking for; I can decide whether the order of entries in the zip file matters, I can splice in a custom ClassVisitor which always reports the same version number, etc. I’ve done this countless times when working on the new build tooling to focus in on exactly the differences I’m looking for.

If I package this up into a single binary, then the sourcecode to the tool is not in front of you when you use it, and this flexibility is lost. I could readd them as configuration options, but will I enjoy plumbing them through the entire codebase? will I even remember what they all are when I need one?

I could add a regex filter but my brain is in class-parsing mode; I know exactly what to change in order to make the disassembler report the same version number, but I would have to shift into regex mode to phrase that in terms of textual regex find-and-replace; of course there’s more of a risk of false-negatives too where I accidentally find-and-replace out text which should be different but just happens to look like a class file version number (…contrived, I guess, but I wrote jardiff for peace of mind)

What’s the chance that the next difference I find would be something covered by an existing flag, rather than a new type of difference I wasn’t expecting (and therefore I need to write code anyway?) If I add a domain-specific language to let you program your own filters, would you even bother to learn it? would it be as easy to use as the one already built into my editor that already understands the sourcecode of the tool extremely well?

compiling it as a binary freezes it in amber, there is always a power imbalance between the Developer and the User signified by who’s code gets to be part of the binary and who’s doesn’t, who gets the real language and who gets the DSL, …

!!!!!!!download today!!!!

Just copy and paste these two classes somewhere and figure it out yourself lol

How Dolphin deals with the anti-piracy of "The Smurfs Dance Party"

Lobsters
www.youtube.com
2026-08-26 23:12:21
Comments...

Humanity has the debate about AI consciousness backwards

Hacker News
economist.com
2026-08-26 22:37:07
Comments...

Kusama Yayoi Dies at 97

Hacker News
news.jp
2026-08-26 22:21:18
Comments...
Original Article
アトリエで絵筆を握る草間弥生さん=2017年11月、東京都内

カラフルな水玉や網目模様を描いた作品で世界的に評価され、カボチャのオブジェでも知られる前衛芸術家で文化勲章受章者の草間弥生(くさま・やよい)さんが14日、多臓器不全のため東京都の病院で死去した。97歳。長野県出身。葬儀は近親者で行った。後日お別れの会を開く予定。

1957年に渡米し、73年に帰国するまで主にニューヨークを拠点に活動。ベトナム反戦を訴え、裸の男女に水玉を描くなどの街頭パフォーマンスで注目され「ハプニングの女王」と呼ばれた。

トレードマークの無数の水玉や網目は、幼い頃から悩まされてきた幻覚に由来。恐怖や不安を逃れようとして、それらを描き始めたという。絵画や版画のほか、柔らかい布に詰め物をした「ソフトスカルプチャー」や、香川県・直島に設置された「南瓜」など多彩な作品を発表した。

93年のベネチア・ビエンナーレ国際美術展に日本代表として参加し、98年にニューヨーク近代美術館で個展が開かれるなど、90年代以降に国内外で評価が高まり、2011~12年には欧米の主要美術館が大規模な回顧展を行った。

草間弥生さんの作品「南瓜」=2022年10月、香川県直島町

Kusama Yayoi has died

Hacker News
www.nytimes.com
2026-08-26 22:21:18
Comments...
Original Article

Please enable JS and disable any ad blocker

Why Free Software usability tends to suck

Lobsters
web.archive.org
2026-08-26 21:55:20
Comments...
Original Article
Timed out getting readerview for https://web.archive.org/web/20030201183139/http://mpt.phrasewise.com/discuss/msgReader$173

Getting video models to learn better, faster

Hacker News
www.linum.ai
2026-08-26 21:53:34
Comments...
Original Article

Image and video models have gotten a lot better over the last few years, even though the internals of these models haven't changed much since Stable Diffusion 3. Of course, there have been small variants like the auto-regressive diffusion that GPT-Image popularized. But at a high level, it's pretty much all flow matching with a transformer backbone and a v-prediction objective. In our experience, most of the gains are directly attributable to 3 flavors of data improvements: RL has driven some improvement, but it's only started truly working for image and video in the past few months.

  1. Data Filtering & Rebalancing : Remove noisy data and resample your data strategically so your model learns more effectively
  2. Data Annotation : Gather better annotations like richer captions, bounding boxes, and font details so that it's easier for your model to disambiguate visual concepts LLMs have gotten infinitely better at image captioning in the last 12 months. Less so for video, but that's for another time.
  3. Synthetic Data Generation : Finetune an ensemble of existing generative models to create training data for which there is little-to-no naturally occurring data (e.g. image editing / reference-conditioning for Nano-Banana style models) Often a collection of brittle LoRAs trained for very specific tasks and an LLM finetuned to filter out bad synthetic data.

A couple of years ago, the prevailing wisdom across all generative models (be it text, image, audio) was to aggregate as much data as humanly possible for pre-training. Luckily, the field has gotten a lot smarter about this. If you throw a bunch of low-quality data (e.g. heavily compressed JPEGs) into pre-training, your model is going to waste a significant amount of its capacity learning how to mimic this slice of data. If you filter your dataset well, your model will have a lot easier time learning what you want it to learn.

We know this sounds obvious, but it's a lot harder to do in practice. Then again, all good advice should seem obvious in retrospect.

Today we're going to walk you through how our approach to data filtering has evolved since 2024. And, hopefully we'll save you from a couple of headaches if you end up training your own generative models down the line.

  1. 2024 Old-school CV on CPUs

    CPU

  2. Early 2025 Finetuned LLMs on GPUs

    GPU

  3. Late 2025 Reinforcement Learning

    GPU

  • kept
  • thrown out
  • thrown out by mistake
  • kept but should be thrown out
  • RL rubric

[2024] Filtering on a budget — Traditional CV on CPUs

On the first go around, we decided to push our raw dataset through old-school computer vision algorithms. This way we could get away with a cluster of cheap CPU instances instead of an unholy number of GPUs running a multimodal LLM. Or, spending several million in GPT-4 tokens.

Scene detection

We need to filter down tens of billions of images and videos to create our pre-training dataset. Images don't really require any specific pre-processing, but raw videos do. When you train a generative video model, you first need to pre-train on image generation. If the model learns nouns before it learns verbs, it tends to converge better (and faster).

Next time you watch a television show or movie, track how often the camera cuts. If you're watching something made in the last twenty years, more likely than not you'll see a cut every 5 seconds. When to cut and how to cut is an authorial decision, not something a generative video model should do arbitrarily. So, we need to slice n' dice our videos on shot boundaries into video clips before we can filter them down.

With our cheapskate CPU-only agenda, we picked up PySceneDetect . At a high level it maintains a rolling window of K-frames and if the K+1 frame has significantly different image statistics, it categorizes the frame as a cut. There's no underlying machine learning model. It runs really fast but struggles with common transitions like dissolves, fades, and jitter cuts (which low key is a huge issue).

Getting to know your data

Whenever you get new data, you should spend a few days reviewing random samples, listing what you'd like to keep and what you'd like to throw out. Ideally, you take the time to draft an ontology of categories within "good" and "bad" and track the relative sizes of these categories.

At some point during the data filtering process, your engineer brain will take over, and you'll spend way too much time tuning the knobs of your heuristics (or LLMs), chasing that "perfect" decision boundary. These notes are going to save you from yourself down the line. They'll give you the facts you'll need to talk yourself out of trying "one more idea", when the answer is clearly "no".

Plus, understanding the shape of the data distribution will really help with dataset rebalancing. Certain categories are overrepresented in the natural distribution of all videos. We need to subsample and suppress this signal, otherwise it will dominate training and our model will struggle to learn the long-tail of people/places/things/actions that we need in order to generate anything.

Sieving out the un-captionable

Generative video models are primarily limited by what we can describe correctly and consistently in words. Or more precisely, what LLMs can annotate for us cheaply. Text provides a pretty good scaffold to understand the visual world, but it's by no means the correct conditioning mechanism for all aspects of video generation. Details like camera trajectories in space-time and the nuances of an actor's performance are simply indescribable in natural language. Reference-driven video generation is currently in-vogue. It's the first articulation of a control for these ineffable properties of videos, but we don't think it's a very good control per se. It's sufficient for autogenerated and remixed content like memes and brainrot, but it doesn't allow for the level of fine-grained direction necessary to convey authorial intent. It doesn't enable us to create the compelling stories that this technology should herald.

For now, we need to filter out clips where the primary "thing" that makes the video clip interesting is un-captionable. Without a crystal clear text description, it's just noise to our text-to-video model.

Text-heavy

For example, we want to filter out text-heavy videos. It's still hard for LLMs to caption motion graphics that are constantly changing on screen. Reading the screen isn't the hard part, it's establishing a clear description of when and how the text changes on screen. We don't want to waste capacity in our 2B parameter model learning motion graphics when it could be allocated instead to learning actions. Zooming out, our goal is creative tools for animation. Text and motion graphics aren't a priority right now.

To do this, we sampled frames from each video and ran a tiny EAST Detector to extract bounding boxes for text. From there, we filtered out text heavy videos based on the percentage of the frames that had text and the percentage of each frame covered in text.

Using a CNN for this task was a good idea, but the specific choice was wrong. In order to run tens of billions of frames on CPUs, we had to resize the frames aggressively. So, a lot of text-heavy samples with small fonts fell through the cracks.

EAST is a pretty old model from 2017. It's small and far from the state of the art on text detection. Getting it to run efficiently on CPUs without cache-thrash and thread oversubscription was a challenge. Even after performance optimizations, it was still the largest bottleneck for this version of the data pipeline. It took us weeks to run EAST on our dataset, across a massive cluster of CPUs.

Indescribable actions

When there's not much happening on the screen (e.g. close-up on a person's face), it's hard to describe the specific action taking place. If there's too much happening (e.g. extremely shaky camera, a soccer match with a bunch of folks moving across the pitch at once), LLMs struggle to caption the clip correctly. We lumped these categories of videos together as "indescribable action" clips to be thrown out.

Videos are typically serialized on disk in a compressed format. Codecs like H.264 reduce file size by storing keyframes and motion vectors that describe how the keyframes change over time, rather than RGB values for each pixel over time. We're eliding a bunch of specifics here. In H.264, the encoder computes the residual between two frames (the frame difference) and then applies the DCT (Discrete Cosine Transform) to the residual. This way we get a heavily quantized motion vector that gives us lossy frame reconstructions in exchange for a smaller file size on disk.

We used the motion vectors stored within the mp4 files themselves to isolate and filter out the "indescribable action" videos. In 2024, we also tried running traditional optical flow algorithms like Lucas-Kanade on CPUs. They're extremely brittle and didn't transfer well to open world video. Specifically, we used mv-extractor and computed two heuristics per clip:

  • average_frame_energy : L2-norm of all motion vectors averaged across the video
  • min(sub_clip_average_frame_energy) : Split each clip into a variable number of chunks depending on the video's length, calculate average frame energy for each chunk, and take the minimum across these L2-norms

Then came the decision tree:

  • average_frame_energy < 0.1: Throw the clip away. These were essentially static videos (e.g. slideshows, still frames, freeze-frames).
  • average_frame_energy > 25: Throw the clip away. The footage was incredibly chaotic.
  • min(sub_clip_average_frame_energy) < 0.03: Throw the clip away. A portion of the clip has nothing happening (e.g. a fade, transition to a still image in a documentary).
  • Keep everything else.

This works well as a cheap first filter, but it has mediocre recall (i.e., a lot of indescribable action clips are kept in the dataset).

Subsampling talking head video clips

From our initial review of the raw data distribution, it was pretty obvious that talking head clips where folks talk straight to camera were dramatically over-represented. If we let the dataset be, it would have been significantly biased towards this sort of clip. Our model would get disproportionately good at creating them (likely at the expense of others), so we needed to find them and subsample them. Remember the VEO-3 videos that went viral in early 2025 ? A LOT of them were "man on the street" videos. The fact that it could generate these so much better than other styles of videos is indicative of a significant bias in the underlying training dataset.

Living in an old-school CV world, we naturally burrowed deeper down the engineering tunnel and introduced additional heuristics . We sampled frames from each video clip and ran a Haar-cascade face detector to extract bounding boxes for faces and calculated two numbers: Haar-like features typically fail to detect faces that are positioned at an angle relative to the camera. For us, that was a good thing. This way we could separate true talking head videos from videos of people taking actual actions.

  • average_face_frame_energy : L2-norm of motion vectors within face bounding boxes
  • average_background_frame_energy : L2-norm of motion vectors, just in the corners of the frame (as a proxy for background motion)

And from there, another decision tree:

  • Moderate average_frame_energy + average_face_frame_energy >= average_background_frame_energy : Keep the clip. Usually a really good close-up.
  • Low/Moderate average_frame_energy : Subsample these.

[Early 2025] rm -rf — Replacing hand-crafted heuristics with finetuned LLMs

We're starting to sketch a rather complicated decision tree. It's full of lossy proxies that only kind of work, and it's very incomplete. We have omitted a bunch of the categories we tried to filter. For example, clips with the Ken Burns Effect . Plus, we haven't opened the can of worms that is quality-based filtering (e.g. identify and throw out pixelated content).

This approach simply doesn't scale. Every time you have a new idea for a filter you have to re-examine how the new node in the decision tree impacts all the other branches. Everything is intertwined and eventually you end up with a pipeline that's both un-interpretable and uneditable.

When we started in 2024, we were staring down the barrel of tens of billions of samples. Given our limited budget, our gut was to construct the cheapest filters possible. This was fundamentally wrong. Our video model struggled to learn basic motions like guitar strumming after training for several weeks on our 2024 dataset but was able to learn these very actions in less than 24 hours of training, after applying our 2025 filters. Instead of looking for the cheapest filters possible, you should optimize for the best possible filters you can afford.

Migrating to 1000s of GPUs

This brings us to our second takeaway: throw away your "principled" computer vision techniques and adopt black box neural networks wherever you can. There are patterns that humans simply can't describe well, no matter how hard we try. Old school CV methods were the best hand-crafted approximations of their era. They're truly impressive feats of engineering, but a well-trained neural network will learn a non-linear function that will win on precision and recall in 99% of cases.

Once you re-orient yourself around this reality, your job should shift from crafting cheap heuristics to optimizing models for GPU throughput and engineering resilient, parallelizable workloads to run on SPOT instances across providers. In his YC talk from summer 2025 , Karpathy discusses a similar realization in his work at Tesla AutoPilot. He describes it as the transition from "software 1.0" to "software 2.0".

Concretely, we replaced PySceneDetect's heuristics with AutoShot and TransNetV2 , accelerating inference with custom CUDA kernels. These models still struggle with capturing 100% of shots. For example, they still miss frame jitter cuts. Good enough for now. But, in the future we'll have to train these models with new data to fill in these gaps. We stopped running the ancient EAST Detector on CPUs. Instead, we deployed PaddleOCR with TensorRT across thousands of Nvidia A10Gs and L4s. It only took ~36 hours to rip through tens of billions of samples on GPUs. Less than $10K USD for faster, better results. And, we ripped out the tangled web of computer vision algorithms (Haar Face Detectors, Lucas-Kanade, monocular depth estimators, etc.), replacing them with a set of fine-tuned LLMs. We still use H.264 motion vectors as a cheap initial filter for extremely low and high motion clips.

Iterative dataset labeling (aka self-consistency is harder than you think)

Finetuning is pretty straightforward thanks to the folks at Unsloth . Serving these models is slightly more tricky. We use vLLM like everyone else. But, it's almost impossible to guarantee exact bit-wise compatibility between Unsloth and vLLM. Every time we've had to deploy with vLLM it's eaten up a week or so, tracing through vLLM code and modding the exact ops for image/video patchification (or fixing small bugs in vLLM) so that we can match the accuracy of the results we get out of the box from our LoRAs or fine-tuned LLMs. This means the labeling is the work.

The hard part of training LLMs for data filtration is that the categories are always somewhat fuzzy. You'll have to answer questions like:

  • If a sample fits several categories to different degrees, which label do I assign it?
  • Should I simplify my categories, so I can label the data more quickly and consistently? Or, do I need to split my category into pieces to make it clearer?
  • How easy is this concept for the LLM to learn? How much data do I need for each category?

More often than not, the biggest problem you'll run into is one of self-consistency. Over the course of labeling a couple hundred samples, it's only natural that you'll relax your criteria, mislabel samples, and muddy the signal in your dataset.

  1. 1 Define your categories

    Write clear definitions. Be as specific as humanly possible. You should already have a draft ontology from your dataset study.

  2. 2 Label ~2K samples

    Draw random samples from your dataset and label them. Revise categories as you see fit.

  3. 3 Split train and validation

    Hold out a validation set. You'll use it once at the very end to make sure your model generalizes. Don't use it to steer the iterative labeling.

  1. 4 Finetune the LLM

    LoRA or fully-finetune. We used Qwen-2-VL-2B for our initial filters; smaller models are sufficiently intelligent for these tasks.

  2. 5 Evaluate on the training set

    Find the categories the model struggled with the most. Either you need more data for the category or more likely than not, the category is poorly constructed and needs to be redefined. For aesthetic scoring, mislabeled samples are usually indicative of inconsistent grading on your part.

  3. 6 Refine categories and re-label

    Add, drop, or merge categories. Then label again. Stop when you can no longer induce a better decision boundary within your LLM.

In a CMU study from 2025 , researchers hired cinematography experts to annotate camera motion in online video clips and train other laypeople to make similar annotations. Even with the criteria in hand, the experts disagreed with "ground truth" ~24% of the time. Only through repeated trials were they able to converge on 96% agreement. It's painful to spend days labeling and re-labeling a dataset, but them's the breaks. At least, we're lucky to live in an era where you only need 2-3K samples to train a good filter. And, not the early deep learning days where you'd need at least tens of thousands of samples to train a CNN from scratch.

If you find yourself working on data filtration, we'd recommend you hack together a simple labeling tool like the one we show below. We just slapped together a super simple React app with Supabase to store labels and R2 to store the samples.

Labeling Pro-tips

  • Use Hotkeys : You'll want to label as fast as possible (or you'll go crazy). Make sure you can label via hotkeys and that you can edit hotkey mappings easily within the app itself.
  • Make Datasets Forkable : You'll be taking several turns on your dataset, so it's helpful to have a fork feature, where you seed a new dataset from your old labels. Even better if you can quickly drill down to the training samples your model misclassified. These are especially problematic. You'll need to review them to iterate on your criteria effectively. Plus, you'll want to relabel them first.
  • Add tools for label mapping : As you iterate on your ontology, categories will come and go. So, you'll need to make it easy to assign samples that were labeled A to another category B , as you add, merge, and delete groupings.

Turning LLMs into categorical classifiers

Ultimately, we supervise-finetuned (SFT) Qwen-2-VL-2B to tag:

  • Image Categories : Ugly Product Image , Diagram / Screenshot , Collage , Watermarked , Bad Lighting , Pixelated , Drawing / Illustration , Keep
  • Video Categories : Animation , PoV , Bars , Motion Graphics , Ken Burns , Shaky Camera , Little to No Motion , Weird Transition , Keep

We only kept images that our filter predicted as Drawing / Illustration or Keep . For videos, we retained Animation and Keep clips wholesale, while subsampling PoV .

[Late 2025] Reinforcement Learning with Verifiable Rewards (RLVR) for aesthetic filtering

At the start of the data labeling process, we tried to get extremely specific about the properties of the images and videos that divvied up samples into ugly vs. pretty (e.g. overexposed lighting, muted color grades). We thought it would be easier for the LLM to learn the precise reasons why we considered an image ugly than learn an arbitrary "ugliness score".

Once again, our initial intuition turned out to be wrong. The properties that make a particular sample ugly tend to be correlated; you end up assigning K different aesthetic tags to the same sample. And in turn, this poses two significant challenges:

  • Sparse Data Signal : The combinatorial explosion of tags makes it harder for the model to disentangle the categories, especially with a small dataset of a few thousand labels.
  • Slow, Inconsistent Labeling : It takes a lot longer to label samples (and it's a lot harder to be self-consistent) when you have the cognitive load of weighing several possible tags per sample.

We ended up grading the samples on a scale from 1 to 4 and keeping the samples that our models labeled 3 or 4. This isn't an original idea by any means. LAION Aesthetic Predictor was used to filter data for the original Stable Diffusion. That model took CLIP embeddings and trained a small linear layer to predict an aesthetic score. While useful, it was pretty brittle. If you dig into the predictions, you'll find an abundance of weird ratings. For example, specific types of watercolor illustrations all get a very high score regardless of noticeable JPEG degradation.

1 · Disgusting Over-exposed lighting, pixelated skies, foliage has no detail (just a blurry mess).

Fine-grained aesthetic scorers

Hang with us, as we work through a short history lesson.

The primary way that folks traditionally finetuned LLMs is supervised-finetuning (SFT). Either you can update all the parameters in the network, or train a LoRA where you insert a small number of parameters throughout the network and only train this new set of parameters. We used this approach when training our categorical classifiers. We fed Qwen-2-VL-2B triplets of (image/video frames, prompt Categorize this as A, B, or C , true label) and used the same objective from pre-training (next-word-prediction-with-cross-entropy) to update the model. With SFT, you're essentially extending pre-training, so your model learns your new task.

At the start of 2025, DeepSeek popularized a different finetuning technique called "Reinforcement Learning with Verifiable Rewards" (RLVR) in their R1 paper . Instead of using next-word prediction, they used reinforcement learning (RL) where the model's response is graded for accuracy using a rubric.

It turns out that if your LLM is able to solve a problem even 1 in 1,000 times, we can nudge the network towards finding this solution more consistently. These network updates are much smaller than those provided during SFT, so RLVR allows us to exert much finer grained control on extending the LLM to our tasks. Bluntly put, SFT is model surgery with a butcher knife, while RLVR is model surgery with a scalpel.

Please grade the image on a scale of 1 to 4, where 1 is the lowest quality and 4 is the highest quality:

  1. 1 Disgusting ( Lowest Quality )
  2. 2 Ugly ( Bad Quality )
  3. 3 Good ( Acceptable Quality )
  4. 4 Beautiful ( Highest Quality )

Disgusting images are often blurry (out of focus) or pixelated (old image, grainy). The details are hard to see. These images are often overexposed (so much light that details are washed out) or underexposed (too dark to see details). Infographics are disgusting.

Ugly images suffer from the same problems as disgusting images, but are qualitatively not as bad. They have low contrast, are poorly lit, or have "flat" looking subjects that do not stand out much from their backgrounds. Small watermarks are ugly if they go across the entire image (e.g. in center).

Good images are well lit, have clear contrast, and clear subjects.

Beautiful images have high dynamic range (crisp, colorful, sharp contrast, or stylized). They are often portraits or action shots.

what the model answered (ŷ)

what we labeled it (y)

1 2 3 4 non-numeric
1 +1 −1 −2 −3 4
2 −1 +1 −1 −2 4
3 −2 −1 +1 −1 4
4 −3 −2 −1 +1 4
Instead of having the LLM learn the individual aesthetic properties as their own categories, we enumerated them in the prompt. This way we could steer the LLM to focus on these particular characteristics when learning its decision function.

By the time we had our aesthetic dataset ready to go, RLVR was gaining adoption by the major labs; so we gave it a go for our aesthetic scorers and it smoked its SFT counterparts. If you look at all the practical progress made in LLMs in the past 18 months (Claude Code, cybersecurity, etc.), you can directly attribute the gains to RLVR. Math and coding rely heavily on reasoning to search the solution space effectively, before issuing an answer. Previously, OpenAI's o-series models were bottlenecked by the amount of data they could gather from humans. With RLVR, a lot less human data is necessary. The rubric stands in for tens of thousands of human-written reasoning traces. It's such an effective method, that some models are able to learn how to reason with zero human traces. Our prompt explicated the different reasons why we'd grade a sample from 1-4, while our rubric penalized the model on the absolute difference between the ground truth and predicted labels. Specifically, we used Group Sequence Policy Optimization (GSPO) as the RLVR algorithm on Qwen-2.5-VL-3B. This is just a small tweak on the GRPO (Group Relative Policy Optimization) algorithm that DeepSeek proposed in their R1 paper.

Reasoning traces didn't help our aesthetic scorers

When you introduce reasoning to an LLM, it's somewhat standard to first SFT the model with human-written reasoning traces, so it understands how to use the logic before learning to generate its own reasoning. We struggled to explain our aesthetic grades succinctly. So, we nixed the SFT phase altogether and jumped straight to DeepSeek-R1-Zero's techniques for training LLMs how to reason with zero human traces. That didn't work either. Turns out, it's just really hard to describe in words why something is 2 vs. 3 aesthetically.

Filtering end-to-end

After RLVR, we adopted WAFT (a SOTA optical flow predictor) to filter out even more of the long tail of low-motion videos. Instead of relying on heuristics like Haar-cascades, we converted our video captions into tags and used these to edit our training data distribution (e.g., subsample talking heads, oversample animal videos).

  1. 01 Candidate pool ~15 billion images

    ~15B 100 %

  2. 02 Aspect ratio + min size (256px+) keep images that match 5 target aspect-ratios

    ~7.2B 48 %

  3. 03 Solid color backgrounds drop low quality product images

    ~5.0B 33 %

  4. 04 PaddleOCR on TensorRT drop text-heavy images

    ~3.3B 22 %

  5. 05 SFT Filters categorical Qwen-2-VL-2B classifiers

    ~950M 6.3 %

  6. 06 P-Hash Deduplication cache perceptual hashes in FAISS, drop duplicates with hamming < 5

    649M 4.3 %

  7. 07 RLVR Filters fine-grained aesthetic Qwen-2.5-VL-3B scorers

    ~250M 1.7 %

  • kept
  • thrown out
  1. 01 Candidate pool ~250 years of footage (~1 billion clips)

    ~1B * 100 %

  2. 02 Aspect ratio retain 16:9 only

    ~800M * 80 %

  3. 03 TransNetV2 & AutoShot shot detection drop clips under 2s or over 10s

    ~700M 70 %

  4. 04 H.264 motion vectors drop low motion clips

    ~520M 52 %

  5. 05 PaddleOCR on TensorRT drop text-heavy clips

    ~375M 37.5 %

  6. 06 SFT Filters categorical Qwen-2-VL-2B classifiers

    ~150M 15 %

  7. 07 RLVR Filters fine-grained aesthetic Qwen-2.5-VL-3B scorers

    ~65M 6.5 %

  8. 08 WAFT optical flow drop long tail low motion clips

    ~50M 5 %

  • kept
  • thrown out

* Extrapolated from the clip count, before we throw out clips that are too long or too short.

Nowadays, there is a lot of jargon being tossed around the internet when it comes to "pre-training", "mid-training", and "post-training". The existence of distinct pre-training and mid-training phases is just a function of the impossibility of creating the perfect filter.

During pre-training, folks are more permissive. They're open to letting some low-quality data into the stack, so that they can guarantee that they cover all the necessary modes of their target data distribution. And by the time they get to mid-training, they're willing to tighten the distribution, even if it means throwing away some good stuff.

Regardless, data filtering is the single biggest lever you can pull outside of scaling to improve the quality of your model. If you take one thing away from this journey, never skimp on your data filtering pipeline. These things are what they eat after all.

Who are we?

We're two brothers training text-to-video models from scratch, trying to make animation accessible to everyone. Stay tuned for more blogs on captioning, synthetic data generation, and our ongoing work exploring better manifolds for pixel-space generative models.

Get Field Notes

Technical deep dives on building generative video models from the ground up, plus updates on new releases from Linum.

Laion Big Video Dataset

Hacker News
projects.laion.ai
2026-08-26 21:50:26
Comments...
Original Article

Open Research Dataset

· Marianna Nezhurina 2,3,* · Mehdi Cherti 2,3 · Andrej Radonjic 4 · Thaddäus Wiedemer 5,1 · Christoph Schuhmann 2 · Romain Beaumont 2 · Wieland Brendel 5 · Bernhard Schölkopf 5 · A. Sophia Koepke 1,6,◇ · Jenia Jitsev 2,3,◇ · Matthias Bethge 1,◇

Read Paper Download Dataset GitHub

* Shared first authors Shared last authors

1 Tübingen AI Center, University of Tübingen 2 LAION 3 JSC, FZJ 4 Wynd Labs 5 MPI for Intelligent Systems, ELLIS Institute Tübingen 6 MCML, Technical University Munich

Affiliated Institutions

Overview

Abstract

We present LAION-BVD (LAION — Big Video Dataset), a large-scale open video dataset for multimodal learning, containing 1.3B platform-specific video URLs collected from CommonCrawl. From these, we download 80M videos with a total duration of 10 million hours . The dataset is designed for multimodal pre-training across video, audio, and image modalities. Using content-aware scene detection, we extract clips for which we synthetically generate video and audio captions. Models trained on these data achieve competitive performance on standard video-text and audio-text benchmarks, with consistent improvements as training or model scale increases. Additionally, we explore video frames as an alternative source of image-text data by extracting scene-changing frames. These frames exhibit a visual distribution distinct from standard web image corpora, and models trained on this dataset achieve strong image-text retrieval performance. We release LAION-BVD to the research community. It significantly expands open access to multimodal videos at an unprecedented scale.

By the Numbers

Unprecedented Scale

The largest openly accessible video corpus for multimodal learning research

🔗

0

Video URLs

Platform-specific URLs collected from Common Crawl

🎬

0

Downloaded Videos

Successfully downloaded and processed videos

⏱️

0

Total Duration

Combined video content across all downloads

✂️

0

Annotated Clips

Clips with generated video captions

🖼️

0

Extracted Frames

Video frames for image-text pre-training

Benchmarks

Experimental Results

Models trained on LAION-BVD achieve competitive performance across video, audio, and image-text benchmarks

Video-Language Benchmarks

ViCLIP models trained on LAION-BVD match or exceed InternVid-trained models by up to 2.1% on standard video-text benchmarks, with consistent improvements as training scale grows from 10M to 50M clips.

  • Up to +2.1% over InternVid (FLT) baseline
  • Consistent gains across 10M-50M clips
  • 55M clips with synthetic video captions

Audio-Language Benchmarks

CLAP models trained on LAION-BVD achieve competitive performance against other large-scale uncurated audio datasets, leveraging rich in-the-wild soundscapes extracted directly from video.

  • Competitive with uncurated audio datasets
  • Audio-text pairs from diverse video
  • Good scaling trends on when increasing model and data scale

Image-Text Benchmarks

Frame-based CLIP models achieve strong image-text retrieval performance on standard benchmarks. Video frames exhibit a visual distribution distinct from typical web corpora, complementing existing image pre-training sources.

  • Strong retrieval on standard benchmarks
  • 300M frames with unique visual distribution
  • Complements standard web image datasets

Responsible Use

Ethics & Release Statement

LAION-BVD is released to support open and reproducible multimodal research at scale. Large-scale video datasets and the models trained on them are increasingly concentrated within a small number of predominantly proprietary technology companies, limiting independent scientific investigation and reproducibility. By providing an open resource for academic research, we aim to broaden access to multimodal training data and enable more transparent evaluation of large-scale video, audio, and image models.

LAION-BVD is released exclusively for research purposes and not for commercial use . The dataset is intended to support scientific research, reproducibility, safety analysis, and the study of multimodal foundation models and related systems. We encourage users to respect the rights and copyright of content creators and to use the dataset responsibly and in accordance with applicable laws and platform terms.

Like other large-scale web datasets, LAION-BVD may contain biases, stereotypes, and uneven representation across languages, regions, and topics. Models trained on this data may inherit such biases. Researchers using the dataset should be aware of these limitations and, where relevant, evaluate and report them alongside model capabilities.

Reference

Citation

@misc{laionbvd2026,
      title={LAION-BVD: A 10-Million-Hour Open Video Dataset for Multimodal Pre-training}, 
      author={Andreas Hochlehnert and Marianna Nezhurina and Mehdi Cherti and Andrej Radonjic and Thaddäus Wiedemer and Christoph Schuhmann and Romain Beaumont and Wieland Brendel and Bernhard Schölkopf and A. Sophia Koepke and Jenia Jitsev and Matthias Bethge},
      year={2026},
      eprint={2608.24845},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2608.24845}, 
}

CEO fired developers to make room for AI. Developers create open source AI CEO

Hacker News
github.com
2026-08-26 21:46:22
Comments...
Original Article

Open Executive

CI License: Apache 2.0 Python 3.11+ Next.js 15

An AI system that acts as your company's virtual executive team — a senior advisor with Harvard MBA-level knowledge, customized for your specific business.

Demo

Open Executive demo video

A walkthrough of Open Executive in action — watch on YouTube .

What It Does

Developed by sentelabs.ai Open Executive provides a single coherent executive voice backed by eight specialist AI agents:

  • Chief Strategy Officer — competitive analysis, M&A, market positioning, OKRs
  • Chief Financial Officer — financial modeling, fundraising, unit economics, cash flow
  • Chief HR/People Officer — hiring, compensation, performance, culture
  • General Counsel — contracts, IP, employment law basics, compliance
  • Chief Operating Officer — process design, vendor management, operational scaling
  • Chief Marketing Officer — GTM strategy, brand, communications, PR
  • Chief Product Officer — roadmap, prioritization, product strategy
  • Board Communications Director — board decks, investor relations, governance

All responses come from one consistent executive voice. The internal agent architecture is never exposed to the user. Beyond Q&A, the system maintains episodic memory of past decisions and initiatives across sessions, and a built-in scheduler can proactively surface follow-ups and time-sensitive actions.

Architecture

User message
    ↓
Executive Orchestrator (claude-sonnet-4-6)
    ↓ tool use → parallel specialist calls
CSO / CFO / CHRO / GC / COO / CMO / CPO / Board
    ↓ each specialist retrieves relevant context from ChromaDB
Built-in MBA knowledge + Your company documents
    ↓
Synthesized executive response

Knowledge — Two retrieval layers per specialist call: (1) built-in MBA-level Markdown ( knowledge/builtin/ , git-tracked) seeded into ChromaDB at startup, and (2) your uploaded company documents chunked and stored in a separate company_docs collection. RAG context is injected into the user turn, never the cached system prompt.

Episodic memory — After every response, a background claude-haiku-4-5 pass extracts key decisions, initiatives, and advice into SQLite. The next session opens with a <past_decisions> block so the Executive remembers what it recommended last month.

Scheduler — A built-in job runner claims due actions via UPDATE … RETURNING to prevent double-firing. The API must run as a single instance; do not horizontally scale it without gating the scheduler first.

Prompt caching — The system prompt is structured so the Executive persona, company profile, and knowledge index are cached separately (up to 85% cache hit rate after the first few turns). No dynamic content ever goes in a cached block.

See docs/architecture.md for the full design.

Tech Stack

Layer Choice
LLM backbone Anthropic Claude API
Default model claude-sonnet-4-6 (Executive + most specialists)
Deep reasoning claude-opus-4-7 (CSO, CFO, GC, Board — with extended thinking)
Backend Python 3.11 + FastAPI
Package manager uv
Vector store ChromaDB (local, embedded)
Episodic memory SQLite
Web UI Next.js 15 (App Router) + Tailwind
License Apache 2.0

Repo Layout

openexecutive/
├── packages/
│   ├── core/
│   │   └── openexecutive/
│   │       ├── orchestrator/     # Executive persona + routing loop
│   │       ├── agents/           # 8 specialist agents
│   │       ├── knowledge/        # ChromaDB store + RAG pipeline
│   │       ├── memory/           # Company profile + episodic memory
│   │       ├── onboarding/       # Wizard state machine + profile builder
│   │       ├── prompts/          # Persona + domain prompts + cache manager
│   │       ├── api/              # FastAPI app + routes
│   │       ├── integrations/     # Slack, Email, Telegram, Google Chat, Discord
│   │       ├── scheduler/        # Background job runner (single-instance)
│   │       ├── alerts/           # Proactive alert system
│   │       ├── audit/            # Audit logging
│   │       ├── architecture/     # Internal architecture utilities
│   │       ├── workflows/        # Multi-step workflow definitions
│   │       └── cli.py            # Click CLI
│   └── ui/                       # Next.js 15 web UI
├── evals/                        # Eval scenarios + LLM-as-judge runner
├── fixtures/                     # Demo company fixtures (profiles, docs, rosters)
├── scripts/                      # Operator scripts (Fly secrets, Google auth)
├── docker/                       # Dockerfile(s) + docker-compose.yml
├── fly.api.toml / fly.ui.toml    # Fly.io configs — dev API + UI apps
├── fly.api.qa.toml / fly.ui.qa.toml  # Fly.io configs — QA API + UI apps
├── fly.honcho.toml               # Fly.io config — Honcho memory app (optional)
└── docs/                         # Architecture + deployment docs

Quick Start

# Clone the repo
git clone https://github.com/SenteLabsAI/OpenExecutive.git
cd OpenExecutive

# Set your Anthropic API key
cp .env.example .env
# Edit .env and add ANTHROPIC_API_KEY=sk-ant-...

# Start everything
make dev

Open http://localhost:3000 to start chatting with your executive. The API runs on port 8000 and the UI on 3000.

First run: requires Python 3.11+ and Node 22+. The initial uv sync pulls heavy ML dependencies (ChromaDB + sentence-transformers/PyTorch), and the first boot downloads a small embedding model (~90 MB) to build the local vector index — so the first make dev takes a few minutes before the app is ready. Subsequent starts are fast.

For contributors not using make :

cd packages/core
uv sync
source .venv/bin/activate
uvicorn openexecutive.api.main:app --reload --port 8000

# In a second terminal
cd packages/ui && npm install && npm run dev

Run the Discord Bot

  1. Create a Discord application at https://discord.com/developers/applications
  2. Enable the Message Content privileged intent (Bot → Privileged Gateway Intents)
  3. Invite the bot with bot + applications.commands scopes
  4. Set env vars in .env : DISCORD_BOT_TOKEN , DISCORD_APP_ID , DISCORD_GUILD_IDS
  5. Run the API normally — the bot starts as part of the FastAPI lifespan when DISCORD_BOT_TOKEN is set:

The bot is embedded in the API process (alongside the email poller, scheduler, and resumer) so it shares the same SQLite database and ChromaDB vector store under /data in production. Skip the token to disable.

For iterating on bot-only code without restarting the API, make discord runs the bot as a standalone process against the same local DB.

Users can DM the bot, @mention it in a channel (replies in a thread), or use /ask and /today slash commands. Slash commands sync to DISCORD_GUILD_IDS instantly on startup; leave blank for global registration (up to 1-hour propagation delay).

Deploying to production

Just set the secrets on the existing API app — no new Fly app required:

flyctl secrets set -a openexec-api-dev \
  DISCORD_BOT_TOKEN=... \
  DISCORD_APP_ID=... \
  DISCORD_GUILD_IDS=...

Discord user access is managed via the /people UI — add a Person row with discord_user_id set.

The machine restarts and the bot starts on the next lifespan boot. To disable in prod: flyctl secrets unset -a openexec-api-dev DISCORD_BOT_TOKEN .

Onboarding Your Company

The first time you visit the app, you'll be guided through a wizard to set up your company profile:

  • Company basics (name, industry, stage, team size)
  • Business model and revenue
  • Competitive landscape
  • Strategic priorities
  • Culture and values
  • Optional: financial position, document upload

After onboarding, the Executive will reference your specific company context in every response.

Interfaces

Interface How to Use
Web UI http://localhost:3000
Slack Mention @OpenExecutive or DM the app
Email CC or email the configured address (IMAP/SMTP poller)
Telegram Message the configured bot
Google Chat Mention the app in a space
Discord DM the bot, @mention it in a channel, or use /ask / /today slash commands
CLI openexecutive chat

Document Upload

Upload your pitch deck, financial model, strategy docs, or any company documents via the web UI or API. The Executive will reference them when relevant.

# Via CLI
openexecutive upload deck.pdf model.xlsx strategy.md

# Via API
curl -X POST http://localhost:8000/documents \
  -F "file=@deck.pdf" \
  -F "domain=strategy"

Deployment (Fly.io)

Two environments, each a separate set of Fly apps, driven by branch:

Environment Trigger Workflow Apps
dev push/merge to main (continuous) .github/workflows/deploy.yml openexec-api-dev , openexec-ui-dev
qa push/merge to qa (deliberate promotion) .github/workflows/deploy-qa.yml openexec-api-qa , openexec-ui-qa

Both workflows use dorny/paths-filter to deploy only the changed app (API, UI, or both). QA is a stable twin of dev — same image and runtime, only the app name differs ( fly.api.qa.toml / fly.ui.qa.toml ) — so it lags main and stays vetted. An optional Honcho memory app ( fly.honcho.toml ) deploys independently.

Topology

App Purpose State
openexec-api-{dev,qa} FastAPI + scheduler Persistent volume executive_data at /data
openexec-ui-{dev,qa} Next.js 15 Stateless
openexec-honcho-dev Honcho per-person memory (optional) Postgres-backed

⚠️ Single-instance only : The scheduler claims rows via UPDATE … RETURNING . Running two API machines would double-fire scheduled actions. max_machines_running = 1 is set in fly.api.toml / fly.api.qa.toml — do not override it.

Required GitHub Actions secrets

Deploys authenticate with per-app Fly deploy tokens stored as repo (or org) Actions secrets. Generate each with flyctl tokens create deploy -a <app> -x 999999h :

Secret App Used by
FLY_API_TOKEN_API openexec-api-dev dev
FLY_API_TOKEN_UI openexec-ui-dev dev
FLY_API_TOKEN_HONCHO openexec-honcho-dev dev (honcho job)
FLY_API_TOKEN_API_QA openexec-api-qa qa
FLY_API_TOKEN_UI_QA openexec-ui-qa qa

Per-app runtime secrets ( ANTHROPIC_API_KEY , BACKEND_SHARED_SECRET , the AUTH_* set, integration tokens) are set directly on each Fly app — see scripts/fly-secrets.sh.example .

One-time bootstrap (dev)

# 1. Create apps and volume
flyctl apps create openexec-api-dev
flyctl apps create openexec-ui-dev
flyctl volumes create executive_data --region iad --size 1 -a openexec-api-dev

# 2. Set the required secret
flyctl secrets set -a openexec-api-dev ANTHROPIC_API_KEY=sk-ant-...

# 3. Create deploy tokens and add as GitHub secrets FLY_API_TOKEN_API and FLY_API_TOKEN_UI
flyctl tokens create deploy -a openexec-api-dev -x 999999h
flyctl tokens create deploy -a openexec-ui-dev  -x 999999h

# 4. First deploy
gh workflow run "Deploy (dev)" -f target=both

QA bootstraps the same way against the -qa app names (push to the qa branch, or gh workflow run "Deploy (qa)" ). See docs/deployment.md for the full runbook (operations, rollback, common failure modes, why .flycast isn't used).

Access control

The deployed UI is gated behind Google sign-in with an email allow-list, and the public API is protected by a shared-secret header between the UI proxy and the FastAPI backend. See docs/auth.md for the full setup (Google Cloud Console steps, required Fly secrets, adding/removing users, rotating secrets, and a debugging table).

Configuration

All settings via environment variables. Minimum required: ANTHROPIC_API_KEY unless you configure a local or OpenRouter backend instead (see Running on Local Models ). At least one provider must be set or the app refuses to start.

Variable Required Default Description
ANTHROPIC_API_KEY Yes¹ Anthropic API key
DEFAULT_MODEL No claude-sonnet-4-6 Executive + most specialists
DEEP_REASONING_MODEL No claude-opus-4-7 CSO, CFO, GC, Board
VECTOR_STORE_PATH No ./chroma_db ChromaDB directory
EPISODIC_DB_PATH No ./episodic_memory.db SQLite for episodic memory
COMPANY_PROFILE_PATH No ./company/profile.yaml Company profile
ENABLE_CACHING No true Anthropic prompt caching
ROUTING_MODEL No claude-haiku-4-5-20251001 Model for intent routing
SLACK_BOT_TOKEN No Slack bot OAuth token
SLACK_APP_TOKEN No Slack socket mode token
EXEC_EMAIL_ADDRESS No Executive Gmail address (Gmail MCP OAuth)
EMAIL_POLL_INTERVAL_SECONDS No 60 How often to poll for new email
TELEGRAM_BOT_TOKEN No Telegram bot token (from @BotFather)
TELEGRAM_WEBHOOK_SECRET No Random string for webhook validation
DISCORD_BOT_TOKEN No Discord bot token (Developer Portal → Bot tab)
DISCORD_APP_ID No Discord application ID (General Information tab)
DISCORD_GUILD_IDS No Comma-separated guild IDs for dev slash-command registration
DISCORD_NOTIFY_CHANNEL_ID No Default channel ID for outbound notifications
GOOGLE_CHAT_PROJECT_NUMBER No GCP project number for Google Chat
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE No Path to service account JSON key
GOOGLE_OAUTH_CLIENT_ID No Google OAuth client ID (Gmail MCP)
GOOGLE_OAUTH_CLIENT_SECRET No Google OAuth client secret (Gmail MCP)
OPENROUTER_ENABLED No false Route Claude calls through OpenRouter and unlock non-Anthropic models per-agent in the Council UI
OPENROUTER_API_KEY No Required when OPENROUTER_ENABLED=true
LOCAL_MODELS_ENABLED No false Route selected slugs to a local OpenAI-compatible server (Ollama, LM Studio, vLLM, llama.cpp)
LOCAL_BASE_URL No Local server URL incl. version path, e.g. http://localhost:11434/v1 . Required when LOCAL_MODELS_ENABLED=true
LOCAL_API_KEY No Optional bearer token (vLLM / gateways); Ollama & LM Studio need none
LOCAL_MODELS No Comma-separated local model slugs to surface in the Council UI and route locally, e.g. llama3.3,qwen2.5
LOCAL_TIMEOUT_S No 300 Per-call timeout for local generation, in seconds
HONCHO_ENABLED No false Per-person memory layer ( honcho.dev ) — a peer card shared across all channels
HONCHO_API_KEY No Required when HONCHO_ENABLED=true
HONCHO_BASE_URL No Self-hosted Honcho endpoint

See .env.example for the full list.

¹ ANTHROPIC_API_KEY is required only when you serve Claude models directly. It can be omitted entirely if you run on local models ( LOCAL_MODELS_ENABLED ) or route through OpenRouter ( OPENROUTER_ENABLED ).

Running on Local Models

Open Executive can run against any OpenAI-compatible local server — Ollama, LM Studio, vLLM, or llama.cpp — instead of (or alongside) the Anthropic API. Local model slugs route to your server through the same provider abstraction the hosted models use; no agent or orchestrator code changes.

# 1. Pull a capable, tool-use-friendly model (example: Ollama)
ollama pull llama3.3

# 2. In .env — point at the local server and list the slugs to expose
LOCAL_MODELS_ENABLED=true
LOCAL_BASE_URL=http://localhost:11434/v1   # Ollama default
LOCAL_MODELS=llama3.3

# 3. (Optional) run with NO Anthropic key — make local the default everywhere
DEFAULT_MODEL=llama3.3
DEEP_REASONING_MODEL=llama3.3
ROUTING_MODEL=llama3.3
# ...and leave ANTHROPIC_API_KEY unset

The listed slugs appear in the Council UI model dropdown, so you can also run a hybrid setup — keep the Executive on Claude while flipping individual specialists to a local model per-agent.

Caveats. Server-side web search ( ENABLE_WEB_SEARCH ) and Anthropic prompt caching / extended thinking have no local equivalent and are automatically disabled for local models. Multi-agent routing leans heavily on tool use, so pick a model that's strong at it (e.g. Llama 3.3 70B, Qwen2.5) — small models may route poorly. LOCAL_API_KEY is only needed if your server (vLLM, or a gateway) requires a bearer token; Ollama and LM Studio need none.

Adding a New Specialist Agent

  1. Create packages/core/openexecutive/agents/your_agent.py extending BaseAgent
  2. Add a system prompt constant in packages/core/openexecutive/prompts/domain_prompts.py
  3. Register in packages/core/openexecutive/orchestrator/router.py — add to SPECIALIST_REGISTRY and the specialist enum in SPECIALIST_TOOLS
  4. Add domain alias to DOMAIN_ALIASES in packages/core/openexecutive/knowledge/retriever.py
  5. Add knowledge docs to knowledge/builtin/your_domain/
  6. Add at least 2 eval scenarios to evals/scenarios/
  7. Submit a PR — CI requires all of the above

Development

make dev          # Start FastAPI + Next.js
make test         # Run Python tests
make eval         # Run eval suite
make lint         # Run ruff + mypy
make docker       # Build and run Docker stack

# Unit tests only (no API calls required)
pytest packages/core/tests/unit/ -v

Evaluation System

evals/ contains 29 scenarios covering all 8 domains, scored by claude-opus-4-7 as an LLM-as-judge. Each scenario defines a query, simulated company context, expected topics, required specialist routing, and a domain-specific rubric. Five scoring dimensions (persona coherence, domain accuracy, company context utilization, routing quality, actionability) are each rated 1–5. The CI gate requires ≥ 3.5/5 average; any dimension dropping > 10% vs main fails the PR.

Privacy

Everything in company/ is gitignored — the profile YAML, uploaded documents, and the ChromaDB vector store. None of this leaves your local machine (or your own Fly volume in cloud deployments) except as part of prompts sent to the Anthropic API. Anthropic does not train on API data.

Contributing

See .github/CONTRIBUTING.md . All PRs must include:

  • Working implementation (no stubs)
  • Tests for new behavior
  • Eval scenarios for new agents or prompt changes

License

Apache 2.0 — free to use commercially, requires attribution.

Dissectingthe Apple M1 GPU, the end

Lobsters
alyssarosenzweig.ca
2026-08-26 21:32:03
Comments...
Original Article

26 Aug 2025

In 2020, Apple released the M1 with a custom GPU. We got to work reverse-engineering the hardware and porting Linux. Today, you can run Linux on a range of M1 and M2 Macs, with almost all hardware working: wireless, audio, and full graphics acceleration.

Our story begins in December 2020, when Hector Martin kicked off Asahi Linux . I was working for Collabora working on Panfrost, the open source Mesa3D driver for Arm Mali GPUs. Hector put out a public call for guidance from upstream open source maintainers, and I bit. I just intended to give some quick pointers. Instead, I bought myself a Christmas present and got to work. In between my university coursework and Collabora work, I poked at the shader instruction set .

One thing led to another. Within a few weeks, I drew a triangle .

In 3D graphics, once you can draw a triangle, you can do anything .

Pretty soon, I started work on a shader compiler . After my final exams that semester, I took a few days off from Collabora to bring up an OpenGL driver capable of spinning gears with my new compiler.

Over the next year, I kept reverse-engineering and improving the driver until it could run 3D games on macOS .

Meanwhile, Asahi Lina wrote a kernel driver for the Apple GPU. My userspace OpenGL driver ran on macOS, leaving her kernel driver as the missing piece for an open source graphics stack. In December 2022, we shipped graphics acceleration in Asahi Linux .

In January 2023, I started my final semester in my Computer Science program at the University of Toronto . For years I juggled my courses with my part-time job and my hobby driver. I faced the same question as my peers: what will I do after graduation?

Maybe Panfrost? I started reverse-engineering of the Mali Midgard GPU back in 2017, when I was still in high school. That led to an internship at Collabora in 2019 once I graduated, turning into my job throughout four years of university. During that time, Panfrost grew from a kid’s pet project based on blackbox reverse-engineering, to a professional driver engineered by a team with Arm’s backing and hardware documentation. I did what I set out to do, and the project succeeded beyond my dreams. It was time to move on .

What did I want to do next?

  • Finish what I started with the M1. Ship a great driver.
  • Bring full, conformant OpenGL drivers to the M1. Apple’s drivers are not conformant, but we should strive for the industry standard.
  • Bring full, conformant Vulkan to Apple platforms, disproving the myth that Vulkan isn’t suitable for Apple hardware.
  • Bring Proton gaming to Asahi Linux. Thanks to Valve’s work for the Steam Deck, Windows games can run better on Linux than even on Windows. Why not reap those benefits on the M1?

Panfrost was my challenge until we “won”. My next challenge? Gaming on Linux on M1.

Once I finished my coursework, I started full-time on gaming on Linux. Within a month, we shipped OpenGL 3.1 on Asahi Linux . A few weeks later, we passed official conformance for OpenGL ES 3.1 . That put us at feature parity with Panfrost. I wanted to go further.

OpenGL (ES) 3.2 requires geometry shaders, a legacy feature not supported by either Arm or Apple hardware. The proprietary OpenGL drivers emulate geometry shaders with compute, but there was no open source prior art to borrow. Even though multiple Mesa drivers need geometry/tessellation emulation, nobody did the work to get there.

My early progress on OpenGL was fast thanks to the mature common code in Mesa. It was time to pay it forward. Over the rest of the year, I implemented geometry/tessellation shader emulation. And also the rest of the owl. In January 2024, I passed conformance for the full OpenGL 4.6 specification, finishing up OpenGL.

Vulkan wasn’t too bad, either. I polished the OpenGL driver for a few months, but once I started typing a Vulkan driver, I passed 1.3 conformance in a few weeks.

What remained was wiring up the geometry/tessellation emulation to my shiny new Vulkan driver, since those are required for Direct3D. Et voilà, Proton games .

Along the way, Karol Herbst passed OpenCL 3.0 conformance on the M1, running my compiler atop his “rusticl” frontend.

Meanwhile, when the Vulkan 1.4 specification was published, we were ready and shipped a conformant implementation on the same day .

After that, I implemented sparse texture support, unlocking Direct3D 12 via Proton.

…Now what?

  • Ship a great driver? Check .

  • Conformant OpenGL 4.6, OpenGL ES 3.2, and OpenCL 3.0? Check .

  • Conformant Vulkan 1.4? Check .

  • Proton gaming? Check .

That’s a wrap.

We’ve succeeded beyond my dreams. The challenges I chased, I have tackled. The drivers are fully upstream in Mesa. Performance isn’t too bad. With the Vulkan on Apple myth busted, conformant Vulkan is now coming to macOS via LunarG’s KosmicKrisp project building on my work.

Satisfied, I am now stepping away from the Apple ecosystem. My friends in the Asahi Linux orbit will carry the torch from here. As for me?

Onto the next challenge!

Retourner à l’acceuil

High-Resolution Imaging for Statistical Validation of TESS Planet Candidates

Hacker News
arxiv.org
2026-08-26 21:26:25
Comments...
Original Article

View PDF HTML (experimental)

Abstract: High-resolution imaging is widely used to constrain false-positive scenarios in exoplanet validation, but it is a finite follow-up resource that reaches only a subset of candidates, and its population-level impact on validation outcomes has not been quantified through controlled removal experiments. Using an automated pipeline built on TRICERATOPS, we compute the false-positive probability (FPP) of 443 TESS planet candidates. For the 264 planet candidates with high-resolution imaging observations, we compute FPP with and without the corresponding contrast curves, allowing us to quantify the impact of the additional data. We find that 72% of 68 contrast-curve bearing validated planets would fail validation without their adopted contrast curves. The fraction requiring imaging decreases with increasing planet size, from 100% below $1.7~R_\oplus$ to $33\%$ above $4~R_\oplus$: within our sample and TRICERATOPS-based analysis, the availability of high-resolution imaging directly limits the yield of small-planet validation and the supply of validated targets for atmospheric characterization. Our analysis statistically validates 64 new TESS planets with sizes spanning 0.94 to 7.83 $R_\oplus$ across hosts of spectral type M through F. Four of these are highly amenable to JWST observations based on the transmission and emission spectroscopy metrics, and each achieves validation only with its imaging constraint.

Submission history

From: Steven Giacalone [ view email ]
[v1] Fri, 21 Aug 2026 18:51:06 UTC (570 KB)

The Performance Inequality Gap, 2026

Hacker News
infrequently.org
2026-08-26 21:17:47
Comments...
Original Article

The Performance Inequality Gap, 2026

Have we finally rounded the corner? A look at the device and network landscape.

The Budget, 2026 Edition

Let's cut to the chase, shall we? Updated network test parameters for 2026 are:

  • 9 Mbps downlink
  • 3 mbps uplink
  • 100 millisecond RTT

Regarding devices, my updated recommendations are the Samsung Galaxy A24 4G (or equivalent) and the HP 14 . The goal of these recommendations is to emulate a 75th percentile user experience, meaning a full quarter of devices and networks will perform worse than this baseline.

Plugging these parameters into the updated budget calculator , we can derive critical-path resource thresholds for three and five second page load targets. Per usual, we consider pages built in two styles: JS -light, where only 15% of critical-path bytes are JavaScript, and JS -heavy, comprised of 50% JavaScript:

Time JS-light (MiB) JS-heavy
Total JS Other Total JS Other
3 sec 2.0 0.3 1.7 1.2 0.62 0.62
5 sec 3.7 0.57 3.2 2.3 1.15 1.15

Note: Budgets account for two TLS connections.

Many sites initiate more early connections, reducing time available to download resources. Using four connections cuts the three-second budget by 350 KiB , to 1.5 MiB / 935 KiB . The five-second budget loses nearly half a megabyte, dropping to 3.2 / 1.9 MiB .

It pays to adopt H/2 or H/3 and consolidate connections.

These budgets are extremely generous. Even the target of three seconds is lavish; most sites should be able to put up interactive content much sooner for nearly all users.

Meanwhile, sites are ballooning. The median mobile page is now 2.6 MiB , blowing past the size of DOOM (2.48 MiB ) in April. The 75th percentile site is now larger than two copies of DOOM. P90+ sites are more than 4.5x larger, and sizes at each point have doubled over the past decade. Put another way, the median mobile page is now 70 times larger than the total storage of the computer that landed men on the moon.

Median page weights are more than 2.5x larger for mobile sites than a decade ago, and sites at the 75th percentile are now 4x their 2015 weight.
Median page weights are more than 2.5x larger for mobile sites than a decade ago, and sites at the 75th percentile are now 4x their 2015 weight.

An outsized contributor to this bloat comes from growth in JavaScript. Mobile JavaScript payloads have more than doubled since 2015, reaching 680 KiB and 1.3 MiB at P50 and P75 (respectively). This compositional shift exacerbates latent inequality and hurts businesses trying to grow.

When JavaScript grows as a proportion of critical-path resources, the impact of higher CPU cost per byte reduces budgets. This coffin corner effect explains why image and CSS -heavy experiences perform better byte-for-byte than sites built with the failed tools of frontend's lost decade.

Indeed, the latest CrUX data shows not even half of origins have passing Core Web Vitals scores for mobile users. More than 40% of sites still perform poorly for desktop users, and progress in both cohorts is plateauing:

This is a technical and business challenge, but also an ethical crisis. Anyone who cares to look can see the tragic consequences for those who most need the help technology can offer. Meanwhile, the lies, half-truths, and excuses made by frontend's influencer class are in defence of these approaches are, if anything, getting worse.

Through no action of their own, frontend developers have been blessed with more compute and bandwidth every year. Instead of converting that bounty into delightful experiences and positive business results, the dominant culture of frontend has leant into self-aggrandising narratives that venerate failure as success. The result is a web that increasingly punishes the poor for their bad luck while paying developers huge salaries to deliver business-undermining results.

Nobody comes to work wanting to do a bad job, but low-quality results are now the norm. This is a classic case of under-priced externalities created by induced demand from developers and PMs living in a privilege bubble.

The interactive budget calculator has been updated and revised for 2026, allowing you to see the impact of networks, devices, connections, and JavaScript on site performance.
The interactive budget calculator has been updated and revised for 2026, allowing you to see the impact of networks, devices, connections, and JavaScript on site performance.

Embedded in this year's estimates is hopeful news about the trajectory of devices and networks. Compared with early 2024's estimates, we're seeing budget growth of 600+ KiB for three seconds, and a full megabyte of extra headroom at five seconds. 1

While this is not enough to overcome continued growth in payloads , budgets are now an order of magnitude more generous than those first sketched in 2017. It has never been easier to deliver pages quickly, but we are not collectively hitting the mark.

To get back to a healthy, competitive web, developers will need to apply considerably more restraint. If past is prologue, moderation is unlikely to arise organically. It's also unhelpful to conceive of ecosystem-level failures as personal failings. Yes, today's frontend culture is broken, but we should not expect better while incentives remain misaligned.

Browsers, search engines, and developer tools will need to provide stronger nudges, steering users away from bloated sites where possible, and communicating the problem to decision-makers. This will be unpopular, but it is necessary for the web to thrive.

Recommended Test Devices and Settings

This series has continually stressed that today's P75 device is yesterday's mid-market Android, and that trend continues.

The explosive smartphone market growth of the mid 2010s is squarely in the rear-view mirror, and so historical Average Selling Prices ( ASPs ) and replacement dynamics now dominate any discussion of fleet performance.

Hardware upgrade timelines are elongating. Previous estimates of 18 months for replacement on average is now too rosy, with the median smartphone now living longer than two years. P75 devices may be nearly 3 years old, and TechInsights estimates a 23.7% annual replacement rate.

With all of this in mind, we update our target test device to the Samsung Galaxy A24 4G , a mid-2023 release featuring an SoC fabbed on a 6 nm process; a notable improvement over previous benchmark devices.

Readers of this blog are unlikely to have used a phone as slow as the A24 in at least a decade.
Readers of this blog are unlikely to have used a phone as slow as the A24 in at least a decade.

The A24 sold for less than the global Average Selling Price for smartphones at launch ($250 vs. $353). Because that specific model may be hard to acquire for testing, anything based on the MediaTek Helio G99 or Samsung Exynos 1330 will do; e.g.:

Teams that are serious about performance should track the low-end cohort instead, sticking with previously acquired Samsung Galaxy A51's, or any late-model device from the Moto E range. 2

For link-accurate network throttling, I recommend spending $3 for Throttly for Android. It supports custom network profiles, allowing you to straightforwardly emulate a 9/3/100 network. DevTools throttling will always be inaccurate, and this is the best low-effort way to correctly condition links on your primary test device.

Desktops are not currently the limiting factor in the ecosystem, but it's still helpful to have physical test devices. Do not spend more than $250 (new) on a low-end test laptop. It should have a Celeron processor, eMMC storage, and run Windows. The last point is not an effort to sell more licences, but rather to represent the nasty effects of defender, NTFS, and parasitic background services on system performance. Something like the HP 14 dq3500nr.

Behold, the HP 14! A Celeron N4500 laptop, sporting a 4-core chip first released in 2021. This CPU packs less than a quarter the cache of a late-model iPhone.
Behold, the HP 14! A Celeron N4500 laptop, sporting a 4-core chip first released in 2021. This CPU packs less than a quarter the cache of a late-model iPhone.

Desktop network throttling remains fraught, and the best solutions are still those from Pat Meenan's 2016 article announcing winShaper.

The Big Story Is Still Low-End Android

What we see in our recommended test setups is an echo of the greatest influence of the past decade on smartphone performance: the spread of slow, ever-cheaper Androids with ageing chipsets, riding the cost curve downward, year-on-year.

The explosive growth of this segment drove nearly all market growth between 2011 and 2017. Now that smartphones have reached global saturation, flat sales volumes mirror the long-term trends in desktop device ownership:

At no point in the past dozen years has iOS accounted for more than 20% of new-device shipments. Quarterly fluctuations have pushed that number as high as 25% when new models are released, but the effect never lasts.

Most phones — indeed, most computers — are 24+ month old Androids. This is the result of a price segmented market: a preponderance of smartphones sold for more than $600USD (new, unlocked) are iPhones, and the overwhelming majority of devices sold for less than that are slow Androids.

The “i” in “iPhone” stands for “inequality.”

Global ASPs show the low-end isn't just alive-and-well, it's many multiples of high-end device volume. To maintain a global ASP near $370, an outsized number of cheaper Androids must be sold for every $1K (average) iOS device.

The Landscape

To understand how the payload budget estimate is derived, we need to peer deeper into the device and network situation. Despite huge, unpredictable shocks in the market (positive: Reliance Jio; negative: a pandemic), the market trends this series tracks have allowed us to forecast accurately.

75th+ percentile users are almost always on older devices, meaning we don't need to divine what will happen, just remember the recent past.

Mobile

The properties of today's mobile devices define how our sites run in practice. From the continued prevalence of 4G radios, to the shocking gaps in CPU performance, the reality of the modern web is best experienced through real devices. The next best way to understand it is through data.

Per usual, single and multicore CPU performance charts track four market segments:

  • Fastest iOS device
  • Fastest Android
  • Mid-range Android ($300-350)
  • Low-end Android ($100-150)

The last two cohorts account for more than 2/3 of new device sales:

The performance of JavaScript-based web experiences is heavily correlated with single-core speed, meaning that the P75 device places a hard cap on the amount of JavaScript that is reasonable for any website to rely on.

Depressingly, budget device CPUs have not meaningfully improved since 2022. But the nearly-identical SoCs in each year's device are getting cheaper. Reduced bill-of-materials costs mean declining retail prices for low-spec phones.

Meanwhile, the high end continues to pull away. As previewed in prior instalments of this series, top-end Androids are beginning to close the massive performance lead that Apple's A-series chips have opened up over the past decade. This is largely thanks to Qualcomm and MediaTek finally starting to address the cache-gap I have harped on since 2016:

Some sizings are estimates, particularly in the Android ecosystem, where vendor documentation is lacking. Android SoC vendors have a habit of implementing the smallest values ARM allows for a licensed core design.

Meanwhile, Apple parts continue to blow past all data-sheet maximums with the latest A19 Pro featuring truly astonishing amounts of cache. For a sense of scale, the roughly 50 MiB of L1, L2, and L3 cache in an iPhone 17 Pro provides 8.3 MiB of cache per core. This is more than double the per-core cache of Intel's latest high-end desktop part, the 285K, which provides a comparatively skimpy 3.3 MiB per core.

The gobsmacking caches of A-series parts allow Apple to keep the beast fed, leading to fewer stalls and more efficient use of CPU time. This advantage redounds to better battery life because well-fed CPUs can retire work faster, returning to lower-power states sooner.

That it has taken this long for even the top end of the Android ecosystem to begin to respond is a scandal.

Single-Core performance per $

Source: GSMArena, Geekbench, and vendor documentation.
Geekbench 6 points per dollar at each price point over time. Prices are MSRP at date of launch.

If there's good news for buyers of low-end devices, it's that performance per dollar continues to improve across the board.

Frustratingly, though, low-end single core performance is still 9x slower than contemporary iPhones, and mid-tier devices remain more than 3.5x slower:

Multicore performance tells a similar tale. As a reminder, this metric is less correlated with web application performance than single-core throughput:

Geekbench 6 Multi-Core scores

Source: GSMArena, Geekbench.
When Geekbench reports multiple scores for an SoC , recent non-outlier values are selected.

Performance per dollar looks compelling for the lower tier parts, but recall that they are 1/3 to 1/5 the performance:

What makes iPhones so bloody fast, while Androids have languished? Several related factors in Apple's chip design and development strategy provided a commanding lead over the past decade:

  • In-house tuning of all ARM-designed cores, thanks to a long-ago negotiated Architecture licence, leading to aggressive cache sizings.

  • Concentration in fewer SoC SKUs enabled focused yield optimisation.

  • Large, early orders with TSMC secured exclusive access to the latest fabrication nodes.

Android vendors, meanwhile, have spread their SoC development budgets in penny-wise, pound-foolish fashion. Even Google and Samsung's in-house efforts have failed to replicate the virtuous effects of Apple's disciplined CPU designs.

Feature sizes are a fudge below 10 nanometres, but marketing names usually reflect real increases in transistor density and frequencies, along with reductions in power use. High-end Android and iOS parts have generally been produced on comparable nodes, with Apple's lead lasting less than a year. But that's less than half the story. Android SoC vendors have avoided adding competitively sized caches, dedicating the same mm^2 on die to higher core counts and on-die radios. From a performance perspective, this has been catastrophic:

Core counts are a headline fixture of device marketing, but even the cheapest phones have featured eight (slow, memory-starved) cores since 2019. Speed comes from other properties; namely appropriate cache sizing, memory latency, frequency scaling, and chip architecture. Apple's core-count restraint and focus on other aspects should have been a lesson to the entire industry long before 2024.

Smaller transistors also allow for higher peak frequencies, giving Apple a perennial advantage thanks to early access to TSMC's latest, smallest, power-sipping processes:

Maximum CPU Frequency (gHZ)

Source: GSMArena, Wikipedia, and vendor documentation.
Maximum advertised frequency of the fastest on-package core.

These trade-offs have allowed Apple to charge a premium for devices which no other vendor can justify:

Global ASPs are conservative estimates; some research groups estimate values 10-15% higher, but the trends are consistent. The premium end continues to pull away in both price and performance, dragging ASPs slightly upward. Meanwhile, high-end devices continue to be outsold more than 3:1 by low-end phones that aren't getting faster. Those slow devices are, however, getting increasingly inexpensive, dropping below $100 in the last two years. That's 1/10th the price of the cheapest iPhone with Apple's fastest chip.

Rise of the Refurbs

Thanks to market trends, the recent-spec iPhones many web developers carry don't even represent the experience of most iOS users.

It may seem incongruous that the ASP of iOS devices is bumping up against the $1K mark while most developed countries experience bouts of slow growth post-pandemic, along with well-documented cost-of-living crises among middle-class buyers.

One possible solution to this riddle is that Android sales remain strong, as Apple is cordoned into the segment of the market it can justify to shareholders with a 30% net margin. Another is growth in the resale market, particularly for iOS devices. Thanks to premium components and better-than-Android software support lifetimes, the longevity of iPhones has created a vibrant and growing market below the $400 price point.

This also helps to explain the flat-to-slightly-declining market for new smartphones, as refurbished devices accelerate past $40BN/yr in sales.

What does this mean? We should expect, and see, higher-than-first-sale volumes of iOS use in various aggregate statistics. Wealth effects have historically explained much of this, but the scale is growing. Refurbishment and resale are now likely to be driving growing discontinuity in the data:

Wikimedia reports more than 40% of mobile site visits come from iOS devices over the past decade, despite global sales ratios never breeching 20% annually.
Wikimedia reports more than 40% of mobile site visits come from iOS devices over the past decade, despite global sales ratios never breeching 20% annually.

Not only is an iPhone 17 Pro not real life in the overall market, it isn't even real life in the iOS market any more.

Desktop

The situation on desktop is one of overwhelming stasis, modulo the Windows 11 upgrade cycle resulting from Windows 10's EOL at the end of 2025. That has driven an unusually strong one-off cycle of upgrades that will reverberate through the data in coming years.

IDC's recent sales analysis shows that only 20% of 'desktop' devices are fully wired, with performance of the vast majority subject to power and thermal limits arising from battery power.
IDC's recent sales analysis shows that only 20% of 'desktop' devices are fully wired, with performance of the vast majority subject to power and thermal limits arising from battery power.

This impetus to upgrade is cross-pressured by pricing headwinds. Economic uncertainty, tariffs, scrambled component pricing from AI demand for silicon of all sorts, and ever-longer device replacement cycles all mean that new PCs may not provide more than incremental performance gains. As a result, an increase in recent worldwide PC Average Selling Prices from ~$650 in our previous estimate to ~$750 in 2025 (per IDC) may not indicate premiumisation. In a globally connected economy, inflation comes for us all.

Overall, the composition and trajectory of the desktop market remains stable. Despite 2025's device replacement boomlet, IDC predicts stasis in “personal computing device” volumes, with growth bumping along at ±1-2% a year for the next 5 years, and landing just about where things are today. The now-stable baseline of ~410MM devices per year is predicted to be entirely flat into 2030.

Top-line things to remember about desktops are:

  • 80% of “desktop” devices are laptops, tablets, and other battery-powered form-factors. The performance impact of thermal and power envelopes for these devices is drastic; many cores are spun down to low power states most of the time; symmetric multiprocessing is now a datacentre curio.

  • Flaky Wi-Fi, rather than wired Ethernet, is now the last mile to most desktops.

  • Desktops (including laptops) are only 15-18% of web-capable device sales; a pattern that has been stable for a decade.

Put another way: if you spend a majority of your time in front of a computer looking at a screen that's larger than 10", you live in a privilege bubble.

Evidence From the Edge User Base

Per previous instalments , we can use Edge's population-level data to understand the evolution of the ecosystem. As of late 2025, the rough breakdown looks like:

Device Tier Fleet % Definition
Low-end 30% Either:
<= 4 cores, or
<= 4GB RAM
Medium 60% HDD (not SSD), or
4-16 GB RAM, or
4-8 cores
High 10% SSD +
> 8 cores +
> 16GB RAM

Compared with the data from early 2024, we see some important shifts:

  • Low-end devices have fallen from ~45% to ~30% of the fleet.

  • Most growth is in the middle tier, growing from 48% to 60%.

  • The high-end is growing slowly.

Because the user base is also growing, it's worth mentioning that the apparent drop in the low-end is a relative change. In absolute terms, the ecosystem is seeing a slower absolute removal of low-spec machines. This matches what we should intuitively expect from incremental growth of the Edge user base, which is heavily skewed to Windows 11.

Older and slower devices likely constitute an even larger fraction of the total market, but may be invisible to us. Indeed, computers with spinning rust HDDs , <= 4GB of RAM , and <= 2 cores still represent millions of active devices in our data. Alarmingly, they have dropped by less than 20% in absolute terms over the past six months. And remember, this isn't even the low end of the low end, as our stats don't include Chromebooks.

Building to the limits of ”feels fine on my MacBook Pro” has never been realistic, but in 2025 it's active malpractice.

Networks

The TL;DR for networks for 2026 is that the P75 connection provides 9Mbps of downlink bandwidth, 3Mbps upload, with 100ms of RTT latency.

This 9Mbps down, 3Mbps up configuration represents sizeable uplift from the 2024/2025 guidance of 7.2Mbps down, 1.4Mbps up, with 94ms RTT , but also a correction. 2024's estimate for latency was probably off by ~15%, and should have been set closer to 110ms.

Global or ambitious firms should target networks even slower than 9/3/100 in their design parameters; the previous 5/1/28 “cable” network configuration is still worth building for, but with an upward adjustment to latency (think 5/1/100). Uneven service has the power to negatively define brands, and the way to remain in user's good graces digitally is to build for the P95+ user. Smaller, faster sites that serve this cohort well will stand out as being exceptional, even on the fastest networks and devices.

Looking forward into 2026 and 2027, the hard reality is that networks remain slower than developers expect and will not improve quickly.

Upload speeds, in particular, remain frustratingly slow, as wider upload channels correlate with faster early-session downloads. Only users on the fastest 10% of networks see downlink:uplink bandwidth rising above 2.5:1 ratios, even under ideal conditions. 3

Owing to physics, device replacement rates, CAPEX budgets of mobile carriers, inherent variability in mobile networks (vs. fixed-line broadband), and worldwide regulatory divergence, we should expect experiences to be heavily bottlenecked by networks for the foreseeable future.

Previous posts in this series have documented improvements, but as we have been saying since 2021, 4G is a miracle, and 5G is a mirage.

According to the GSMA's 2025 State of Mobile Internet Connectivity report, nominal 5G penetration coverage just crossed the 50% mark in 2025, and the rate of progress is predicted to slow as the attractive economics of dense rural areas give way to rural build outs. But coverage is not the same as service; many users will need newer, more expensive devices to unlock 5G speeds.
According to the GSMA 's 2025 State of Mobile Internet Connectivity report, nominal 5G penetration coverage just crossed the 50% mark in 2025, and the rate of progress is predicted to slow as the attractive economics of dense rural areas give way to rural build outs. But coverage is not the same as service; many users will need newer, more expensive devices to unlock 5G speeds.

This will remain true for at least another three years, with bandwidth and latency improving only incrementally. Sites that want to reach their full potential, if only to beat the competition, must build to budgets that are inclusive for folks on the margins. When it comes to web performance, doing well is the same as doing good.

Bandwidth

Bandwidth numbers are derived from Cloudflare's incredible Radar dataset. 4 Looking at (downlink) bandwidth trends over the past year, we see stasis:

November 2024-November 2025 downlink bandwidth. Note that percentiles are inverted in this chart (we take their P25 as our P75 and vice versa). The trend line is remarkably stable; median and slower connections have not improved over the past year.
November 2024-November 2025 downlink bandwidth. Note that percentiles are inverted in this chart (we take their P25 as our P75 and vice versa). The trend line is remarkably stable; median and slower connections have not improved over the past year.

So where does the improvement in our estimate come from? Looking back to 2024, we see (predicted) gains emerge, but note their small absolute size:

November 2023-November 2024 downlink bandwidth. Connections representing the slowest quartile improved from ~6 to ~9 Mbps over the year, while median downlinks improved from ~12 to ~17 Mbps. They have not moved since.
November 2023-November 2024 downlink bandwidth. Connections representing the slowest quartile improved from ~6 to ~9 Mbps over the year, while median downlinks improved from ~12 to ~17 Mbps. They have not moved since.

The gap between P25 and P75 downlinks was 15 Mbps at the start of 2024 and has grown to 21 Mbps at the end of 2025; an increase of 40%. Meanwhile, bottom quartile are only 28% faster, improving from ~7 to 9 Mbps. In absolute terms, wealthier users saw 3x as much absolute gain.

The performance inequality gap is growing at the network layer too.

Latency

Latency across networks ( RTTs ) is improving somewhat, with a nearly 10% decrease at P75 over the past year, from ~110ms to ~100ms. Small improvements on faster links (P50, P25) look to be in the 5% range:

November 2024-November 2025 RTT. Percentiles align with our usual intuition, with P75 representing the value at which 25% of connections are slower.
November 2024-November 2025 RTT . Percentiles align with our usual intuition, with P75 representing the value at which 25% of connections are slower.

Given the variability at higher percentiles, we'll stick with a 100ms target for the 2026 calendar year, although we should expect slight gains.

Underlying these improvements are datacentre build outs in traditionally underserved regions, undersea cable completions, and cellular backhaul improvements from the 5G build out. Faster client CPUs and radios will also contribute meaningfully and predictably. 5

All of these factors will continue to incrementally improve, and we predict another ~5% improvement (to 95ms) at P75 for 2027.

Looking Forward

Gains will be modest for both bandwidth and latency over the next few years. The lion's share of web traffic is now carried across mobile networks, meaning that high percentiles represent users feeling the confounding effects of cellular radios, uneven backhaul, coverage gaps, and interference from the built environment. Those factors are hardest and slowest to change, involving the largest number of potential long tent poles.

As discussed in previous instalments, the world's densest emerging markets reached the smartphone tipping point by 2020, displacing feature phones for most adults. More recently, we have approached saturation; the moment at which smartphone sales are dominated by replacements, rather than first-time sales in those markets. Affordability and literacy remain large challenges to get the residually unconnected online. The 2025 GSMA State of Mobile Internet Connectivity report has a full chapter on these challenges (PDF) , complete with rich survey data.

What we see in now-stable smartphone shipment volumes primes the pump for improvements in device performance. First-time smartphone users invest less in their devices (relative to income) as the value may be unclear; users shopping for a second phone have clearer expectations and hopes. Having lived the frustration of slow sites and apps, an incrementally larger set of folks will be willing to pay a bit more to add 5G modems to their next phone.

This effect is working its way down the price curve from the ultra-high-end in 2020 to the mid-tier in 2024 , but it has yet to reach the low end. Our latest low-end specimen — 2025's Moto E15 — still features a 4G radio. Because of the additional compute requirements that 5G places on SoCs , we will expect to see process node and CPU performance increases as 5G costs fall far enough to impact the low-price band.

Today, devices with otherwise similar specs and a 5G radio still command a considerable premium. The Galaxy A16 5G was introduced at a 20% premium over the 4G version, mirroring the mid-market dynamic from 2022 and 2023 where devices were offered in “regular” and (pricier) 5G versions. It will take a transition down the fab node scale like we saw for mid-market SoCs in 2022 and 2024 to make 5G a low-end table-stakes feature. I'm not holding my breath.

Given the current market for chips of all types, we may be seeing low-spec SoCs produced at 12 nanometres for several more years, reprising the long-term haunting of Android by huge volumes of A53 cores produced at 28 nm from 2012 to 2019.

The budget estimates generated in this series may seem less relevant now that tools like Core Web Vitals provide nuanced, audience-specific metrics that allow us to characterise important UX attributes. But this assumption is flawed thanks to the effects of deadweight losses and the biases inherent in those metrics.

Case-in-point: last year CWV deprecated FID and replaced it with the (better calibrated) INP metric. This predictably dropped the CWV pass rates of sites built on desktop-era JavaScript frameworks like React, Angular, and Ember:

2024's Frontend Sadness Index shows that CWV scores for sites based on legacy JS frameworks like React and Angular not only started off in trouble, but dropped more as INP replaced FID.
2024's Frontend Sadness Index shows that CWV scores for sites based on legacy JS frameworks like React and Angular not only started off in trouble, but dropped more as INP replaced FID .

RUM data, in isolation, undercounts the opportunity costs of slow and bloated experiences. Users have choices, and lost users do not show up in usage-based statistics.

A team I worked with this year saw these effects play out directly in their CrUX data :

Form-factor ratios can show what use statistics for high-growth sites obscure.
Form-factor ratios can show what use statistics for high-growth sites obscure.

This high-profile, fast-growing site added nearly 100 KiB of critical-path JavaScript per month from January to June. The result? A growing share of visits from desktop devices, and proportionally fewer mobile users every month. Once we began to fumigate for dead code and overeager preloading, mobile users returned.

These effects can easily overcome other factors, particularly in the current era of JavaScript bundle hyper-growth:

Median page weights are more than 2.5x larger for mobile sites than a decade ago, and 4x larger at the 75th percentile.
Median page weights are more than 2.5x larger for mobile sites than a decade ago, and 4x larger at the 75th percentile.
Growth in JavaScript bytes over the wire mirrors that of overall content despite the continuing Performance Inequality Gap crisis.
Growth in JavaScript bytes over the wire mirrors that of overall content despite the continuing Performance Inequality Gap crisis.

Are SPAs Working?

Perhaps the most important insight I spotted while re-immersing myself in the data for this post were the implications of these charts from the RUM Archive:

The RUM Archive reports that SPAs are, on average, only generating a one (1) soft navigation per hard navigation, undermining the case for SPAs .

The top-line takeaway is chilling: sites that are explicitly designed as SPAs , and which have intentionally opted in to metrics measurement around soft-navigations are seeing one (1) soft-navigation for every full page load on average.

The rinky-dink model we discussed last year for the appropriateness of investing in SPA -based stacks is a harsh master, defining average session performance as the sum of interaction latencies, including initial navigation, divided by the total number of interactions (excluding scrolling):

L avg = latency ( navigation ) + i = 1 I latency ( i ) N

If the RUM Archive's data is directionally correct, at an ecosystem level, N =~2 for both mobile and desktop. Sessions this shallow make a mockery of the idea that we can justify more up-front JavaScript to deliver SPA technology, even on sites with reason to believe it would help .

In private correspondence, Michal Mocny shared an early analysis from data collected via the Soft Navigations API Origin Trial. Unlike the Akamai mPulse data that feeds the RUM Archive, Chromium's data tracks interactions from all sites, not only those that have explicitly opted-in to track soft navigations, providing a much wider aperture. On top-10K origins, Chrome is currently observing values for N between 1.6 and 2.2, depending on how the analysis is run, or 0.8-1.1 additional soft navigations per initial page load.

It's difficult to convey the earth-shattering magnitude of these congruent findings. Under these conditions, the amount of JavaScript a developer can justify up-front to support follow-on in-page navigations is de minimis . 6

This should shake our industry to the bone, driving rapid reductions in emitted JavaScript. And yet:

Growth in JavaScript bytes is driving growth in overall payloads.
Growth in JavaScript bytes is driving growth in overall payloads.

Analysis and Conclusions

This series has three main goals:

  1. Provide a concrete set of page-weight targets for working web developers.

  2. Arm teams with an understanding of how the client-side computing landscape is evolving.

  3. Show how budgets are constructed, giving teams tools to construct their own estimates from their own RUM and market data.

This is not altruism. I want the web to win. I began to raise the alarm about the problems created by a lack of adaptation to mobile's constraints in 2016, and they have played out on the same trend-line I feared. The web is now decisively losing the battle for relevance.

To reverse this trend, I believe several (currently unmet) conditions must be fulfilled:

  • Reaching users via the web must be cost-competitive with other digital channels, meaning that re-engagement features like being on the home screen and in the notification tray must work correctly.

  • The web must deliver the 80/20 set of critical capabilities for most of the important JTBDs in modern computing, but in a webby (safe, privacy-respecting by default) way.

  • Web experiences, on average, have to feel responsive enough that the idea of tapping a link doesn't inspire dread.

But the web is not winning mobile. Apple, Google, and Facebook nearly extinguished the web's potential to disrupt their cosy arrangement . Preventing the web from breaking out — from meaningfully delivering app-like experiences outside an app store — is essential to maintaining dominance. But some are fighting back , and against the odds, it's working.

What's left, then, is the subject of this series. Even if browser competition comes to iOS and competitors deliver the features needed to make the web a plausible contender, the structure of today's sites is an impediment to a future in which users prefer the web.

Most of the world's computing happens on devices that are older and slower than anything on a developer's desk, and connected via networks that contemporary “full-stack” developers don't emulate. Web developers almost never personally experience these constraints, and over frontend's Lost Decade , this has created an out-of-touch privilege bubble that poisons the products of the teams that follow the herd, as well as the broader ecosystem.

That's bleak, but the reason I devote weeks to this research each year isn't to scold. The hope is that actionable targets can help shape choices, and that by continuing to stay engaged with the evolution of the landscape, we can see green shoots sprout.

If we can hold down the rate of increase in critical-path resource growth it will give hardware progress time to overtake our excesses. If we make enough progress in that direction, we might even get back to a place where the web is a contender in the minds of users.

And that's a future worth working for.

  1. I really do try to avoid being an unremitting downer, but the latest device in our low-cost cohort — the Motorola E15 — is not an improvement in CPU benchmarks from last year.

    More worrying, no device in that part of the market has delivered meaningful CPU gains since 2020. That's five years of stasis, and a return to a situation where new low-end devices are half as fast as their mid-tier contemporaries. Even as process node improvements trickle down to the $300-350 price bracket, the low end is left further and further behind.

    As the wider Android ecosystem experienced from 2015-2020, devices with the same specs are getting cheaper, but not better. This allows them to open new markets and sell in massive numbers, helping to prop up overall annual device sales, even as devices last longer and former growth markets (India, Indonesia, etc.) hit smartphone saturation. This is reflected in the low-end models finally sinking below $100USD new, unlocked, at retail. But to hit this price-point, they deliver performance on par with 2019's mid-tier Galaxy A50 ; a phone whose CPU was fabbed on a smaller process node than today's latest low-end phones.

    Services trying to scale, and anyone trying to build for emerging markets, should be anchoring P90 or P95, not P75 . For serious shops, the target has not moved much at all since 2019.

    This reality alone is enough to justify rejection of frameworkist hype-shilling, without even discussing the negative impacts of JS -first stacks on middle-distance team velocity and site maintenance costs.

  2. Because low-end and medium-tier devices were so similar until very recently, this differentiation wasn't necessary. But progress in process nodes does eventually trickle down. The mid-tier began to see improvement away from the (utterly blighted) 28 nm node in 2017, a mere 4 years after the high-end decamped for greener pastures. The low-end, meanwhile, was trapped in that register until 2020, nearly a decade after 28nm was first introduced. Since then, the mid tier has tracked process node scaling with a 2-3 year delay, while the low end has gotten stuck since 2021 at 12 nm.

    The failure to include meaningful amounts of cache in Android SoCs levelled out low-end and medium tier performance until 2023, but transistor shrinkage and architecture improvements at ~$350 are now decoupling the performance of these tiers once again, and we should expect to see them grow further apart in coming years, creating a worrying gap between P90+ and P75 devices.

  3. Cloudflare's worldwide bandwidth data only provides downlink estimates, and so to understand the downlink:uplink bandwidth ratio, I turned instead to their API and queried CF's speed test data, which provide fuller histograms.

    These tests are explicitly run by users, meaning they occur under synthetic conditions and likely with a skew towards best-case network performance. They also report maximums over a session, rather than loaded network behaviour, which explains the divergence between the higher speed values reported there than the more realistic "Internet Quality Index" dataset we use for primary bandwidth and latency analysis.

    The data we can derive from it is therefore much rosier, but it does give us a sense for downlink/uplink ratios (bitrates are in Mbps):

    %-ile Download Upload Ratio
    20th 15 5 3
    25th 25 10 2.5
    30th 10 30 3
    40th 20 50 2.5
    median 85 35 2.4
    60th 125 50 2.5
    70th 220 85 2.6
    75th 280 100 2.8
    80th 345 140 2.5
    90th 525 280 1.9

    Because the data is skewed in an optimistic direction (thanks to usage biases towards wealth, which correlates with high-performance networks), we pick a 3:1 ratio in our global baseline.

    Despite variance in the lower percentiles, it is reasonable to expect tough ratios in the bottom quartile given the build-out properties of various network types. These include:

    • Asymmetries in cable and DSL channel allocations.
    • Explicit frequency/bandwidth allocation in cellular networks.
    • Radio power lopsidedness vs. the base stations they connect to, particularly for battery-powered devices.

    Even new networks like Starlink are spec'd with 10:1 or greater ratios. Indeed, despite being "fast", the author's own home fixed-line connection has a ratio grater than 30:1. We should expect many such discrepancies up and down the wealth spectrum.

    A 4:1 or 5:1 ratio is probably justified, and previous estimates used 5:1 ratios for that reason. Lacking better data, going with 3:1 is a judgement call, and I welcome feedback on the choice.

  4. Why am I relying on Cloudflare's data?

    Google, Microsoft, Amazon, Fastly, Akamai, and others obviously have similar data (at least in theory), but do not publish it in such a useful and queryable way. That said, these estimates are on trend with my priors about the network situation developed from many sources over the years (including non-public datasets).

    There is a chance Cloudflare's data is unrepresentative, but given their CDN market penetration, my primary concern is that their data is too rosy, rather than too generous. Why? Geographic and use-based bias effects.

    The wealthy are better connected and heavier internet users, generating more sessions. Better performance of experiences increases engagement, so we know CF's data contains a bias towards the experiences of the affluent. This potentially blinds us to large fraction of the theoretical TAM and (I think) convincingly argues that we should be taking a P90 value instead of P75 . However, we stick with P75 for two reasons:

    • It would be incongruent to cite P90 this year without first introducing it in previous installations.
    • A lack of explicitly triangulating data from the current network environment makes it challenging to judge the magnitude of use-based biases in the data.

    Thankfully, Cloudflare also produces country-level data. We can use this to cabin the scale of potential issues in global data. Here, for instance, are the P75 network situations for a few populous geos that every growth-oriented international brand must consider in descending downlink speed:

    Geo @ P75 Down Up RTT Pop (MM)
    UK 21 7 34 69
    USA 17 5.5 47 340
    Brazil 12 4 60 213
    Global 9 3 100
    Indonesia 6.4 2.1 75 284
    India 6.2 2.1 85 1,417
    Pakistan 4 1.3 130 241
    Nigeria 3.1 1 190 223

    Underweighting the less-affluent is a common bias in tech, and my consulting experience has repeatedly reconfirmed what Tammy Everts writes about when it comes to the opportunities that are available when sites push past performance plateaus.

    There is no such thing as “too fast”, but most teams are so far away from minimally acceptable results that they have never experienced the huge wins on the other side of truly excellent and consistent performance. Entire markets open up when teams expand access through improved performance, and wealthy users convert more too.

    It's this reality that lemon vendors have sold totally inappropriate tools into, and the results remain shockingly poor.

  5. As we mentioned in the last instalment, improvements in mid-tier and low-end mobile SoCs are delivering better network performance independent of protocol and spectrum improvements .

    Modern link-layer cell and Wi-Fi stacks rely heavily on client-side compute for the digital signal processing necessary to implement advanced techniques like MIMO beam forming.

    This makes the device replacement rates doubly impactful, even within radio generations and against fixed channel capacity. As process improvements trickle down (glacially) to mid-tier and low-end SoCs , the radios they contain also get faster processing, improving latency and throughput, ceteris paribus .

  6. The RUM Archive's soft-to-hard navigations ratio and the early data from the Chromium Soft Navigations Origin Trial leave many, many questions unanswered including, but not limited to:

    • What's the distribution?
      • Globally: do some SPA -premised sites have many more or many fewer soft-navigations? Are only a few major sites pushing the ratios up (or down)?
      • Locally: can we characterise user's sessions to understand what fraction trigger many soft-navigations per session?
    • Do other data sources agree?
    • What about in-page changes not triggering URL updates?
      • How should infinite-scrolling be counted?
      • We should expect Chromium histogram data to capture more of this vs. the somewhat explicit instrumentation of mPulse, driving up soft-navigations per hard navigation. Do things stay in sync in these data sets over time?

    Given the scale of the mystery, a veritable stampede of research in the web performance community should follow. I hope to see an explosion of tools to guide teams toward the most appropriate architectures based on comparative data within their verticals, first-party RUM data about session lengths, distribution mono/bi/tri/multi-modality of sessions, and other situated factors.

    The mystery I have flicked at in the past is now hitting us smack in the face. Will we pay attention?

Cyborg cockroaches with tiny syringes designed to join search and rescue teams in major disasters

Guardian
www.theguardian.com
2026-08-26 21:16:21
Giant burrowing cockroaches with added cameras and medical injectors are being tested as potential ‘first responders’ in earthquakesFollow our Australia news live blog for latest updatesGet our breaking news email, free app or daily news podcastFor people trapped under rubble in an earthquake or sim...
Original Article

For people trapped under rubble in an earthquake or similar disaster, the arrival of a fleet of cockroaches could one day be the difference between life and death.

Biorobotics engineers have been working on the design of six-legged cyborg insects with cameras and miniature medical injectors for search and rescue missions.

The roaches are designed to deliver emergency aid to people trapped in collapsed buildings, caves or other places too dangerous for rescuers to reach.

The “paraborgs” have been developed by University of Queensland biorobotics researchers, working with biomedical engineers at the University of New South Wales (UNSW).

Sign up for the Breaking News Australia email

UQ biorobotics engineer Thang Vo-Doan said their research transforms the cyborg insect from a mobile sensor into a tiny first responder, while critical medical decisions remain under human control.

“Cyborg insects have been designed for search and explore missions for the past couple of decades,” Vo-Doan said.

“We wanted to take the next step. Once they find someone, can they actually help?”

Giant cyborg cockroaches designed to provide aid in search and rescue operations - video

The research involved fitting a far north Queensland species, the giant burrowing cockroach ( Macropanesthia rhinoceros ), with lightweight electronics and cameras.

They were also fitted with remotely activated auto-injection systems custom-made for the species.

“Augmenting their natural biomechanics could allow these cyborg insects to deliver timely emergency assistance when direct access to people trapped in narrow, debris-filled spaces isn’t possible,” Vo-Doan said.

two cyborg cockroaches
The cockroaches, like the team’s previous cyborg insect models, are anaesthetised during electrode and microchip fitting and live for as long as other cockroaches once the harnesses are removed. Photograph: PR image

In proof-of-concept testing, the paraborgs achieved 95% success with close-range injection (positioned within 15cm of the target).

The complete navigation-and-injection task succeeded in 72% of trials.

skip past newsletter promotion

PhD candidate Hai Nhan Le said accurate positioning of the paraborgs was one of the key engineering challenges.

“The cyborg insect has to navigate to the target, position itself accurately and remain stable enough to perform the injection,” Le said.

“A lot of people might not like the sight of a giant cockroach scurrying towards them, but if you’re trapped in rubble or stuck in a cave and need help, it could make a real difference between life and death.”

The cockroaches, like the team’s previous cyborg insect models, are anaesthetised during electrode and microchip fitting and live for as long as other cockroaches once the harnesses are removed.

Fire and Rescue NSW Supt Tim Hassiotis said the technology could extend the reach of rescue teams.

“If cyborg insects can safely enter spaces we can’t, locate casualties and ultimately help deliver emergency care, they could become another valuable tool in the future of urban search and rescue,” he said.

Vo-Doan said the longer-term vision was to deploy swarms of specialised cyborg insects, with individuals performing complementary roles.

“Hopefully, within the next five to 10 years, we could see cyborg insect rescue teams deployed to help people in real emergencies,” he said.

Nvidia agrees to acquire Hugging Face for $13B

Hacker News
www.businessinsider.com
2026-08-26 21:12:55
Comments...
Original Article

Nvidia CEO Jensen Huang in profile

Nvidia CEO Jensen Huang Bloomberg/Getty Images

Nvidia has been in talks to acquire Hugging Face, the popular AI platform for sharing and building with open-source models, in what could be one of the chip giant's biggest deals yet.

The two parties have had acquisition conversations in recent weeks about a deal that would value Hugging Face at more than $13 billion , according to a person familiar with the matter. The companies have not yet reached a deal, and the talks could still fall apart, the person said. Business Insider on Sunday was the first to report that Hugging Face was fielding takeover interest.

Nvidia and Hugging Face did not respond to requests for comment.

Nvidia has increasingly ramped up dealmaking with its enormous cash pile. The company said Wednesday that it has $18 billion committed to equity investments for the rest of its fiscal year, on top of $47.9 billion it already holds in private companies.

Microsoft also met with Hugging Face, but the person familiar and a second person said talks are not ongoing.

Nvidia already has a relationship with Hugging Face. The chipmaker participated in its $235 million funding round in 2023 that valued it at $4.5 billion.

Hugging Face turned down a $500 million investment offer from Nvidia late last year that would have valued it at $7 billion, the Financial Times previously reported . Hugging Face said at the time it did not want a dominant investor that could sway decisions.

Hugging Face sits at the center of the open-source AI ecosystem, hosting millions of AI models and datasets that developers can build on. Owning the platform could give Nvidia a bigger foothold with those developers — and potentially drive more workloads onto its chips.

But Nvidia ownership could also complicate one of Hugging Face's strengths: its neutrality. The platform supports models and hardware from across the industry, including Nvidia competitors such as AMD and Intel.

Have a tip?

Contact Katie Roof via email at kroof@businessinsider.com or Signal at @kroof.26

Contact Geoff Weiss via email at gweiss@businessinsider.com or Signal at @geoffweiss.25.

Contact Ashley Stewart via email at astewart@businessinsider.com or Signal at +1-425-344-8242.

Use a personal email address and a nonwork device; here's our guide to sharing information securely .

Read next

Geoff Weiss is a senior reporter on Business Insider’s tech team, where he writes about AI startups and Y Combinator, the intersection of AI and the media industry, and workplace dynamics within top AI labs and chip companies. Previously, Geoff was on the media desk, covering YouTube and Netflix, and themes like the intersection of Hollywood and the creator economy. His work on Netflix’s video podcasting ambitions and Mr Beast’s lessons for Hollywood won second and first prize, respectively, at the 2025 LA Press Club Awards. Prior to joining Business Insider, Geoff was the senior editor of Tubefilter and a staff writer at Entrepreneur. He graduated from New York University with a degree in English Literature. He can be reached at gweiss@businessinsider.com , on Signal @geoffweiss.25, and on LinkedIn . Have a tip? Use a personal email address and a nonwork device; here's our guide to sharing information securely . Selected stories: Nvidia crushed its quarter — and CEO Jensen Huang said in a leaked all-hands that 'the market did not appreciate it' Nvidia will foot the bill for Trump's new visa fees. Here's what CEO Jensen Huang told staff. Massive AI salaries and RTO are fueling a real estate boom in San Francisco: 'It's going to rain money' The AI talent wars are ricocheting across startups. Here's how they're competing with Big Tech.