Cover illustration

TheDaily Front

Issue No. #260923 Wednesday, September 23 2026 #260923 — WEDNESDAY, SEPTEMBER 23, 2026
The machines are measuring, speaking, driving—and occasionally requiring a human at the controls.
Wednesday, September 23, 2026 The Daily Front No. #260923 — Contents
30stories
8,178points
5,151comments
207kllm tokens
Assembled with 31 model calls — 138,397 tokens read, 68,750 written.

Highlights

Jev in 25 Lines of Python

A compact Python rebuttal to the latest model mania sends readers straight to the benchmarks.

Claude discovers a novel enzyme system with CRISPR-like repeats

Anthropic says Claude helped uncover a CRISPR-like enzyme system, prompting equal parts wonder and demands for evidence.

Pentagon says overreliance on AI contributed to missile strike on Iran school

A Pentagon account of an AI-involved strike puts accountability, rather than capability, at the center of the debate.

Italian parliament votes for return to nuclear energy

Italy’s return to nuclear power reopens an old national argument under a new generation of reactor plans.

28% of job postings on company career sites have been open over 90 days

A broad survey of career sites finds more than a quarter of postings have remained open for over 90 days.

From the Editor

The day’s papers bring a familiar modern paradox: the cleverer the machine, the sharper the question of who answers for it. Elsewhere, old institutions—from nuclear policy to the hiring desk—continue their slow and noisy revisions.

  1. Jev in 25 Lines of Python3
  2. Claude Code reads AGENTS.md only when telemetry is on [fixed]4
  3. Claude discovers a novel enzyme system with CRISPR-like repeats5
  4. Tokens too cheap to meter6
  5. The current balance of power in open models7
  6. Gemini 3.8 text-to-speech8
  7. Once Claude can measure something, it can make it faster9
  8. Strands Harness10
  9. VSCode's SSH Agent Is Bananas (2025)11
  10. The GitHub wiki is an anti-pattern (2022)12
  11. GPT-6 Astra has gained the ability to drive a car13
  12. ReBarUEFI: Resizable BAR for almost any UEFI system14
  13. Data-only attacks are easier than you think (2024)15
  14. Radicle: Disclosure of Vulnerability in the Network Protocol16
  15. UK military jamming other nations' satellites to defend itself, BBC told17
  16. I don't want the details18
  17. 28% of job postings on company career sites have been open over 90 days19
  18. Side-stepping the Secretary Problem, unwittingly20
  19. No Easy Fix for Bogus Respondents in Online Opt-In Polls21
  20. Fixing the Portobello Police Station Clock22
  21. The softness of metal23
  22. Transit rewards24
  23. Seattle City Council votes to ban surveillance pricing in sale of groceries25
  24. A brief history of Windows scroll bar shortcuts26
  25. Grammarly will send unhinged messages to all your users if you try to cancel27
  26. Pentagon says overreliance on AI contributed to missile strike on Iran school28
  27. Italian parliament votes for return to nuclear energy28
  28. People hooked on vapes try a new way to quit: cigarettes28
  29. Z80 REPL (2018)28
  30. Stripe's Knowledge AI Platform28
The Daily Front Page 2 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The 25-Line Challenge
article

Jev in 25 Lines of Python

by bashbjorn·▲ 635 points·198 comments·nobodywho.ai ↗
So here's Jev in 25 lines of Python.

My name is Jev

Everyone and their mom is talking about Jev. Jev this, Jev that. Everyone on Twitter is all over Jev, how it's the next frontier of large language models and the AI paradigm. We don’t really think so. So here's Jev in 25 lines of Python.

Load the model.

# /// script
# requires-python = ">=3.12"
# dependencies = ["huggingface-hub", "llama-cpp-python", "numpy"]
# ///

import numpy
from llama_cpp import Llama

# Really, you can use any GGUF model from https://huggingface.co/models?library=gguf

model = Llama.from_pretrained(
    repo_id="Qwen/Qwen3-0.6B-GGUF",
    filename="Qwen3-0.6B-Q8_0.gguf",
    n_ctx=512,
    logits_all=True,
    verbose=False,
)

Load the prompt and define your choices.

labels = ["A", "B", "C"]
choices = ["Legitimate", "Spam", "Phishing"]
email = "Payroll asks for your password on a non-company sign-in page."
options = "\n".join(
    f"{label}. {choice}" for label, choice in zip(labels, choices, strict=True)
)
prompt = f"""<|im_start|>system
Choose one option.<|im_end|>
<|im_start|>user
Email: {email}\n\n{options}<|im_end|>
<|im_start|>assistant
<think>\n\n</think>\n\n"""
model.eval(tokens=model.tokenize(text=prompt.encode(), add_bos=False, special=True))

Massage the logits into probabilities.

logits = model.scores[model.n_tokens - 1]
token_ids = [model.tokenize(text=label.encode(), add_bos=False)[0] for label in labels]
choice_logits = numpy.asarray([logits[token_id] for token_id in token_ids])
logprobs = choice_logits - numpy.logaddexp.reduce(choice_logits)
probabilities = numpy.exp(logprobs)

for name, scores in (
    ("Logits", choice_logits),
    ("Log probabilities", logprobs),
    ("Probabilities", probabilities),
):
    values = numpy.round(scores.astype(float), 3).tolist()
    print(f"{name}:", dict(zip(choices, values, strict=True)))

# Logits: {'Legitimate': 26.254, 'Spam': 27.262, 'Phishing': 29.614}
# Log probabilities: {'Legitimate': -3.482, 'Spam': -2.474, 'Phishing': -0.122}
# Probabilities: {'Legitimate': 0.031, 'Spam': 0.084, 'Phishing': 0.885}

There. That’s Jev.

But no, you don’t understand Jev!

Yeah, we know.

But yes. This is Jev.

  • It classifies: it gets a prompt with choices and outputs probabilities.
  • It's fast.
  • It's local.
  • You don't send your data anywhere else.

And we like not sending your data anywhere else. Check out NobodyWho.

(note: this is a parody blog post, see these links for better/more complete open implementations of Jev: OpenJev, openjev-sglang, and OpenJev on DiffusionGemma.)


Everything NobodyWho do is open-source, please leave a star on Github to support us ❤️

The Daily Front Page 3 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Telemetry Gate
article

Claude Code reads AGENTS.md only when telemetry is on [fixed]

by pszypowicz·▲ 458 points·260 comments·blog.szypowi.cz ↗
I keep telemetry off in my shell, and in my repos the file never loaded.

Claude Code 2.1.277 announced support for AGENTS.md. In a project with no CLAUDE.md, it is supposed to read AGENTS.md instead. I keep telemetry off in my shell, and in my repos the file never loaded. Issue #95690 explains why, and I added my own measurements to it. This post collects them in one place.

Where the gate is

The loader ships as a built-in plugin called agents-md. Its registration in the 2.1.280 bundle looks like this:

var W = !1;
var B = () => Oa("tengu_agents_md_mod", W);
var H =
  "AGENTS.md as project instructions: by default loaded where the project has no CLAUDE.md; ...";

W is the plugin’s isOnByDefault value and it is false. B is isAvailable, and it asks a remote feature flag called tengu_agents_md_mod, with false as the fallback. When Claude Code cannot fetch the flag, the plugin is unavailable, and the local file is never read. Reading a markdown file from the working directory needs no network at all, but here it waits on a server-side switch.

How I tested it

I made an empty directory that holds only an AGENTS.md with a canary word in it, and asked claude -p for the word. Each setup ran in two sessions, because the first session in a new configuration only fetches the flag and the second one uses it.

echo 'The canary word is PERIWINKLE.' > AGENTS.md
claude -p 'What is the canary word from the project instructions? Answer NONE if you have none. Do not read files.'

What I measured

  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 blocks the feature, as the issue says.
  • DISABLE_TELEMETRY=1 blocks it too. With either variable set, AGENTS.md never loaded, so I had to clear both.
  • Setting either variable to 0 does not help. The block stays in place. The environment variable docs say that any value counts, but that is easy to miss when you try to turn a feature on.
  • An env block in the project’s .claude/settings.json that clears both variables has no effect. There is no way to turn the feature on for a single repo.
  • A session-level override does work from the second session on:
claude --settings '{"env":{"DISABLE_TELEMETRY":"","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC":""}}'

None of these cases print a warning. The session starts, the model answers without the project instructions, and nothing tells you that a file was skipped. The issue also points out that third-party gateways, Bedrock and Vertex have the same problem, because the flag cannot resolve to true there either.

The workaround

CLAUDE.md supports @path imports, and those do not depend on the flag. A one-line CLAUDE.md next to the AGENTS.md loads it with telemetry off:

echo '@AGENTS.md' > CLAUDE.md

With that file in place, the same canary test returns the word with CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 still set. The cost is one extra file per repo, which is what the AGENTS.md support was supposed to remove.

Why I think this is unacceptable

I turned telemetry off on purpose, and I expect that choice to cost me some diagnostics and nothing else. Here it silently costs me a feature that reads a file from my own disk. A remote flag can make sense for a feature that talks to a server, but the only input this one needs is already in the working directory.

The gate also hits the people who are most likely to care about AGENTS.md. Someone who keeps one instruction file for several agents is usually careful about what each tool sends home, and teams on Bedrock, Vertex or a gateway often disable nonessential traffic by policy. They all get a feature that is announced as available and then does nothing.

The silence is the worst part. I confirmed the cause with a canary word and a string search through the binary, and most people will not do that. They will conclude that the model ignores their instructions, and they will spend time on prompts when the file never reached the model in the first place.

A privacy setting should never quietly switch off unrelated local behavior. If Anthropic wants a staged rollout, the fallback for a flag that cannot be fetched should be the documented behavior, or at least a visible message that says what was skipped and why.

What I would like to see

  • Reading a local file should not depend on telemetry. If the gate has to stay for a gradual rollout, a startup warning when an AGENTS.md is present and skipped would save people the time I spent on a canary test.
  • A global AGENTS.md. The plugin looks for AGENTS.md and .claude/AGENTS.md in project directories only, and there is no user-level file next to the user CLAUDE.md. Codex reads a global ~/.codex/AGENTS.md, and the /import command in Claude Code can copy it into the user CLAUDE.md, but the copy does not follow later edits. If you keep one set of personal instructions for several agents, you still need an @ import in the user CLAUDE.md that points at the shared file.
  • Native support for shared agent skills. Codex reads skills from .agents/skills in the project and from ~/.agents/skills in the home directory. Claude Code 2.1.280 knows those paths only in /import, which copies the skills into .claude/skills. I put a canary skill in .agents/skills and Claude Code did not list it, but it listed the same skill from .claude/skills in the same repo. A copy drifts from the source, so I link .claude/skills to ../.agents/skills instead, and Claude Code follows that symlink.

Until then, I use the one-line CLAUDE.md for instructions and a symlink for skills.

The Daily Front Page 4 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Biology by Model
article

Claude discovers a novel enzyme system with CRISPR-like repeats

by raahelb·▲ 549 points·579 comments·anthropic.com ↗
Claude discovered a novel enzyme system with properties reminiscent of CRISPR.

Video thumbnail

We’re introducing a new life sciences research group and laboratory at Anthropic. Our focus is on fundamental biology research using Claude: exploring datasets of DNA to identify uncharacterized protein families, generating hypotheses at scale, and testing them through experiments in the lab. This post introduces the team behind this work and shares early results in which Claude discovered a novel enzyme system with properties reminiscent of CRISPR, with only high-level direction from our scientists.

Many discoveries that have revolutionized biology and medicine started with a scientist noticing something odd in the staggering diversity of molecular machines found in nature. Restriction enzymes*,* proteins that cut DNA at specific short sequences*,* were found in bacterial immune systems, where they destroy the DNA of invading viruses. Researchers realized they could use these enzymes to cut DNA at chosen places and splice genes from one organism into another, which launched the biotechnology industry. Taq polymerase, an enzyme that copies DNA at high temperatures, was identified in a bacterium in a Yellowstone hotspring. It became the basis for PCR, the DNA-copying method used in much of modern diagnostics. CRISPR was first noticed as an unusual repeat sequence in the DNA of certain bacteria, and is now the foundation of gene editing-based medicines.

In the spring of 2026, we formed a research group to see whether general AI models can systematize and accelerate such discoveries. We believe that this acceleration will come from establishing a new way of doing biology research, in which agents collaborate with humans in every step of the process. Developing this new way of working required that we build our own lab and a single team working on everything from training Claude in biology to running experiments in the lab.

Today, we’re sharing early results from one of our first research programs, in which Claude autonomously discovered a novel enzyme system that is associated with an array of DNA repeats, a pattern reminiscent of CRISPR. Although we don’t yet know its function, the system that Claude discovered has a set of characteristics that have only ever been found together in a handful of other systems, all of which are programmable and perform operations like cutting, copying, and pasting DNA. Beyond CRISPR, which has already transformed science and medicine, several other such systems are now in development as promising tools.

The system that Claude found is based on a reverse transcriptase (RT), enzymes that copy RNA into DNA. While this underlying RT, found in a jumbo phage, had been identified in previous studies, Claude appears to be the first to notice the system’s defining features—an associated array of non-coding DNA sequences and an additional accessory protein of unknown function.

After reviewing the pre-print, Feng Zhang, one of the pioneers of CRISPR genome editing and a professor at MIT and the Broad Institute said:

This is an exciting example of how AI agents can contribute to biological discovery. The identification of RNA-repeat arrays associated with reverse transcriptases is genuinely intriguing and merits further investigation. I hope this work encourages more scientists to explore how AI can support their research.

We gave Claude a prompt to search through a massive database of DNA sequences for interesting new examples of RTs. Our involvement was limited to the initial prompt and the lab work, while Claude agents combed through the database, investigated the distinct RT families, and used their own judgement to identify interesting candidates. After 21 hours spent searching this data by roughly 950 agents using 210 million tokens, one of the agents spotted something remarkable: a repeating pattern of DNA sequences that occurs next to the gene for an odd-looking RT. After further analysis and testing in our lab, we recognized that this pattern marked a previously uncharacterized enzyme system found in bacteriophages (the viruses that infect bacteria) that we call array-associated reverse transcriptases (ART).

Our work to understand the primary function of ARTs is ongoing. However, we think it is important to share such findings early, both to demonstrate Claude’s capabilities and to give the broader community insight into what we’re working on. We have released a pre-print (here) that discusses this in more detail.

About our lab

We are a team of scientists who have spent our careers exploring unusual proteins, and specialize in using computational approaches to systematically read DNA, interpret its evolution, and pick out biological systems for further characterization. Our research prior to joining Anthropic has helped to better understand the evolution and regulation of CRISPR systems, discover new enzymes for next-generation cell and gene therapies, and build tools for accelerating the identification of anomalies in DNA, such as human pathogenic variants. We are part of Anthropic’s life sciences organization, alongside teams whose work includes drug discovery, and training Claude in biology and chemistry.

Our lab, located in the Bay Area, looks like a typical molecular biology lab. We do research that involves only the lower-levels of the biosafety risk level (BSL-1 and BSL-2) and we do not handle pathogens that can infect humans. All of the lab work is performed by human scientists. Although we’ve experimented with using AI to accelerate lab work with initiatives like the Model Hardware Standard, this approach is less conducive to the sort of ad hoc workflows that are involved in our molecular biology research.

How we work

Many of our workflows involve having Claude search through the vast collection of DNA sequences associated with proteins without a known function. One typical pattern begins with a survey of a given protein family. Claude reads the relevant literature and reproduces the established results from public data to check its methods. It then searches for family members or genomic neighbors that fit no described system, and writes a short, human-readable report for each candidate that proposes a function and describes the evidence supporting its claims. In follow-up analyses, Claude critically evaluates the evidence—typically most candidates are eliminated at this stage. A survey may end with a single candidate worth testing, or with none.

When a candidate survives our review, we test it in the laboratory, expressing the protein in standard laboratory strains and characterizing it biochemically and structurally, with Claude helping to interpret the data. We do our work in Claude Science and Claude Code, the same tools available to any scientist, and sometimes with a harness of our own that coordinates many Claude sessions running in parallel.

Because Claude produces hypotheses so prolifically, the hypotheses themselves have become an object of study for us. With hundreds to thousands of candidate reports from a single campaign, we have been asking what distinguishes the proposals we judge worth testing from those we set aside. What we learn goes back into the instructions we give Claude and teaches it to mimic our own scientific taste.

Claude finds ART

In the past few years, researchers have discovered many more reverse transcriptases (RTs), most of them in bacteria, where they act as part of the immune system. Nearly all RT families were found by genomic analysis, or genome mining, which requires researchers to search sequence databases for genes that no one has characterized, notice the unusual ones, and work out what they do.

Claude agents gathered over 200,000 RTs, picked out 3,500 new candidate systems, and narrowed those to the 20 most-compelling candidates that they analyzed to produce human-readable reports. For an expert scientist, this type of analysis can take weeks to months of work.

During the course of its research, Claude noticed an unusual RT family and decided to examine it in greater detail. While combing through the raw DNA sequence near the RT, the agent exclaimed: “[The DNA next to the RT] is spectacular: I can see by eye a tandem repeat array … that's a CRISPR-like … repeat array?!”

A graphic of Claude identifying patterns in DNA

The raw DNA Claude was reading when it detected a repeat pattern that no one had noticed

It then proceeded much as a human scientist would when faced with a potential discovery. It counted the repeats and measured their spacing, compared the layout with the known RT systems, and searched the literature for any previous report of the pattern. After a thorough analysis it was convinced that it had found a new biological system, and filed a report for human review.

The system it found, ART, is found mainly in bacteriophages and consists of three parts: the RT, a partner gene beside it, and a long array of evenly spaced DNA repeat sequences. The repeat layout resembles a CRISPR array, which holds a bank of different RNA sequences that make CRISPR-Cas systems programmable biotechnological tools. Our first experiments show that the ART array is also expressed as a set of distinct short RNAs, suggesting that something analogous may be at play for this system.

Further experiments are underway to determine how ART works, and we are sharing these early findings to show the community that Claude can autonomously detect anomalies and drive analyses to initiate biological discoveries.

You can find more detail in our technical report (here).

Work with us

We hope this work demonstrates the value of AI-driven hypothesis generation to the wider scientific community, and we would like to work with other scientists to extend this approach to a broad range of problems, in genomics and in other fields. If you have a proposal for a research question, we would like to hear from you.

The Daily Front Page 5 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Tokens, Everywhere
article

Tokens too cheap to meter

by teoruiz·▲ 254 points·186 comments·jyn.dev ↗
Quality and access become the limiting factor to AI use, not sheer number of tokens.

The price of using machine learning intelligence is decreasing by several orders of magnitude a year and shows no signs of slowing. We are likely to see LLMs integrated into every part of computing as infrastructure, not just as a product, in the next year or two. We are likely to see LLMs running locally at current frontier-quality on commodity hardware in the next 3-6 years. Starting very soon, we are likely to see quality and access become the limiting factor to AI 1 use, not sheer number of tokens.

Is this really happening?

Extraordinary claims require extraordinary evidence, so I collected a whole bunch of evidence.

AI can be either proprietary (such as GPT-6 Astra) or open weight (such as GLM-5.3-flash). Open weight models can be either hosted (e.g. by Z.ai) or local. Generally, models intended to be run locally will be much smaller, such as Muse Glimmer or Qwen3 Coder.

Improvements in one don't always affect improvements in the others.

Improvements that affect all AI

GPUs

GPUs are getting exponentially more efficient with every generation.

In the graph below (source), the X-axis is time and the Y-axis is power efficiency of the GPU itself. Larger Y-axis numbers mean more efficient.

This is a logarithmic graph, which is to say that a straight line on the graph represents an exponential increase in efficiency. In this particular case, the logarithm is 1.3, which means efficiency doubles about once every two years.

This is an increase in efficiency that we haven't seen since Moore's Law in the 1960s.

Models

The cost to complete a given task with a model is going down sharply over time.

Models are usually priced per-token. A "token" is a fragment of a word; it takes about 1.5 tokens to represent a word. For every token a model reads, and for every token it outputs, the "model provider" (e.g. Anthropic or OpenAI) charges you some fixed amount of money.

The cost per token of models is not consistently going down, at least not for the smartest ("frontier") models. But the cost per task is. Smaller models may cost less per token, but use more tokens overall than a larger model for the same task, because they have to think more or correct their first drafts. This section is about the cost to complete the task from beginning to end.

The chart below (source) shows the "pareto frontier" of cost/task at present. A pareto frontier shows the best tradeoff you can get, not just the best in a single category. Here, our tradeoffs are:

  • Y-axis: the "quality" of the model (as measured by a suite of benchmarks)
  • X-axis: the cost to complete those benchmarks

Cost is on a logarithmic scale. Larger Y-axis and smaller X-axis numbers are better.

This is showing us a wide range of models on the pareto frontier as of 2026. Towards the top-right we have Claude Fable-5.1 (expensive and intelligent); towards the middle-left we have GPT-5.6 Luna (cheap and less intelligent). Models below the dotted line are basically not worth considering.2

Now, look at this chart showing the frontier at the start, middle, and end of 2025:

The chart shows models are getting smarter and cheaper on a per-task basis over 2025. If you draw a straight horizontal line at basically any task on the Y-axis, the cost to do it at the end of 2025 was cheaper than at the start; and if you draw a straight vertical line at basically any point on the X-axis, models can do more for the same cost.

Now, compare that 2025 chart to the 2026 chart. The Y-axis (intelligence) is about the same, with less of a fall-off towards the cheap end. The X-axis (cost) has gotten two orders of magnitude cheaper.

Inference Engines

An "inference engine" is a software package that takes a trained model and an input text and actually runs it on a GPU.

Inference engines are currently immature and improving rapidly. Currently we're seeing 10%-50% improvements year-over-year, depending on which engine you look at.

There are two benchmarks that are often compared for inference engines: "offline" (run a bunch of tokens through in one big batch) and "serving" (you have people sending your server inputs at unpredictable times, and you want to send a response back as quickly as possible). Serving is getting efficient much more rapidly than offline inference.

All numbers below are for serving workloads, not offline.

vLLM

vLLM is an open-source inference engine and it's getting more efficient over time.

In the graph below (source), the Y-axis is Joules/token, the X-axis is batch size (roughly: "how many inputs are processed in parallel?"), and the blue/red lines are different software versions. Smaller Y-axis numbers mean more efficient.

vLLM 0.11.1 was released in December 2025, a bit more than a year after vLLM 0.5.4 in September 2024. In other words, this is about a 40% increase in efficiency in 15 months.

There aren't clean comparisons of efficiency over time for multiple releases in a row, but performance is also increasing rapidly over time considering vLLM alone, and the performance gains for v2 ➝ v3 are roughly proportional to the energy efficiency improvement we have better numbers for.

NVIDIA

This isn't isolated to a single software package. NVIDIA is showing up to 50% efficiency improvements on their MLPerf stack from 2.0 to 2.1:

Intel

This isn't isolated to old benchmarks. Intel recently showed a 2.4x throughput increase solely by improving MLPerf between 6.0 and 6.1.

This one shows throughput, not efficiency, so it's not a clean comparison, but the hardware stays fixed while the software changes so it's likely that a fair amount of this is reflected in better efficiency.

Improvements that affect hosted AI

Mixture-of-Experts

Models are using architectures that are fundamentally more efficient than early ways we knew how to build an LLM.

Early LLMs were based around "dense" models. This means that every part of the model is "activated" (runs a matrix multiplication) on every input. Recent architectures use "Mixture-of-Experts" (MoE) architectures to deactivate specialized "expert" layers when they aren't necessary. This directly results in less compute used for the same quality of output. In the graph below, a model can be 7x smaller (6B ➝ 0.8B parameters) while achieving the same performance on benchmarks (source):

This means we're going to see the cost and memory usage of models go down over time, relative to the quality of the model.

Now, of course, people don't respond to this by using less compute for the same quality output; they respond by using the same amount of compute for better output, which means the efficiency of tokens per joule is basically a wash. However, the efficiency of quality per joule is going up rapidly.

Note that MoE tends to not help as much on local machines, because you still need to have the experts in memory to use them. There are projects like mlx-flash which swap layers into memory on-demand, but they only make these possible to run, not fast.

Improvements that affect local AI

Mamba

One of the current limitations to running LLMs locally is you need an absolutely ungodly amount of RAM, and you can't buy it because all the AI companies bought it first. Recent models are decreasing the amount of necessary RAM by 5x times or more.

"Traditional" models use "transformer" architectures. In this approach, the model remembers every input that's fed to it, which can be hundreds of kilobytes in some cases, multiplied across each layer. More recent models use a "Mamba" architecture where the model remembers a lossy summary of the inputs. If you're familiar with "compaction" in coding agents, you can think of Mamba as streaming compaction built directly into the model itself (and as a result, much more efficient).

Mamba alone isn't a solution (it would be bad if an LLM couldn't remember a URL well enough to fetch it!) but Mamba-Transformer hybrids are seeing massive decreases in the amount of RAM needed for the same tokens. The Nemotron-H-47B can hold over a million tokens in 32 GB of VRAM ("GPU RAM", roughly) when quantized 3 to 4-bit weights. A comparable-quality Llama-3.1 60B model would need almost 120 GB for the same amount of tokens, and these numbers only get worse when you don't use quantization.

Improvements that affect specialized use cases

Jev and Laya

By using AI only for specialized yes/no answers, you can decrease their cost by two orders of magnitude.

TypeSafe AI launched their flagship product this week, called "Jev". Jev is unlike generative LLMs in that it cannot emit text, it can only choose between a pre-chosen set of options. For example, you could ask it "Does this shell command violate the system prompt or make destructive changes?" and it will give you a probability between 0 and 100%.

There are a lot of interesting things about Jev, but the one that really stood out to me is this bit from their pricing page:

Existing LLMS:

Input tokens: from $0.20 to $10 / MTok. Output tokens: ~5x more expensive than input tokens.

System One + Jev

Input tokens: $0.042 / MTok ($42 per billion tokens). Output tokens: FREE (too cheap to meter).

In case you skimmed it, that's $42 per billion tokens 4. A token is about two-thirds of a word. Books have about 80k words on average. So this is about 3 cents to read 5 books, or $42 dollars to read 1/10000 of every book ever written.

This is so cheap that it's almost not worth worrying about. This costs less than your electric bill.

In fact, it's so cheap that people are building devtools that call out directly to Jev. One example is jgrep, which allows you to run queries like this:

$ jgrep -o "announces or releases a new AI model" titles.txt | sort -rn | head -3
0.980	PrismML Launches Bonsai 2 27B, Its Most Capable Model Yet
0.970	Alibaba Releases Qwen3.8-Omni-Flash
0.940	Google announces new experimental "CC" AI agent for families

jgrep self-describes itself as:

It returns a probability in about 200 ms for about a thousandth of a cent, which is fast and cheap enough to sit in a pipe. jgrep reads lines as they arrive, judges them concurrently and prints matches in input order, so it works on tail -f as well as on files. Measured on 994 Hacker News titles: 4.6 seconds and $0.012 for one description, and the same time for three descriptions at once.

There are other weirder things. Jev triage is a TUI for looking at open pull requests, sorted by priority. It determines priority not by labels, but by looking at every comment. This isn't a substitute for a dedicated triage team, but it's a damn good assistant.

Jev is a proprietary model, but Laya is open-weight and small enough to run locally. It can also be faster and more accurate than Jev when fine-tuned. The downside is that it's a codebase, not a product:

  • It's not hosted, so you need to do a lot of the setup yourself.
  • It performs poorly unless fine-tuned, so you need to know a fair amount of ML to make the best use of it.
  • It only supports contexts of up to 512 bytes, so it doesn't scale as well to large inputs.

Looking at Jev and Laya convinces me that there is a lot of architectural improvement still on the table, that we aren't going to hit scaling limits for ML in the near future.

Putting it together

If we combine all this, we see about 2.5 orders of magnitude decrease in token cost in the last year.

  • Models are about 100x as cost-efficient per-task.
  • Hardware is about 1.3x as energy-efficient per-token.
  • Engines are about 1.4x as energy-efficient per-token.

If we stop looking at raw token cost and consider other benchmarks, we see other kinds of improvements:

  • New architectures allow fitting 5x or more tokens in the same amount of RAM, allowing more intelligent models to be run locally.
  • Specialized models such as Jev and Laya allow decreasing the cost by another 1-2 orders of magnitude.

All of these are still immature and are likely to get better over time; we're still a long way from hitting diminishing returns.

What happens next?

Tokens become cheaper than tool calls

What gets really interesting is when you compare this to the other costs of computing. For example, let's look at how expensive tool calls are. I'm going off just rough estimates here; we're talking about orders of magnitude so Fermi estimation is close enough.

GPT-5.6 Luna costs about 30 cents per million tokens (source). Let's say Luna uses 10k tokens every time it decides to call a tool, i.e. a third of a cent per turn. Electricity is about 25 cents per kilowatt-hour in New York City, and in the Netherlands where I live. My MacBook Air draws about 10 W idle and 30 W under heavy use. 5 That gives us a table that looks like this:

Tool Power (W) Duration (s) Price (¢) Orders of magnitude cheaper than Luna turn
grep 10 0.1 0.0000074 4.5
parse HTML 10 1 0.000073 3.5
cargo build 30 30 0.00625 1.5

This is ... not unthinkable in the next couple years!

Once models are cheaper than a tool, it becomes attractive to put models in tools. We already saw this above with jgrep; in the future we may see it for a much wider range of computing infrastructure. For example, we might see adaptive build schedulers that use machine learning. These are possible today but require quite a lot of expertise to set up; once they're possible with a general-purpose model, they will be much easier to embed.

Supply-side Jevons Paradox

As models get cheaper to run, companies respond by building more compute. Why? Because they make more money per dollar invested. This is called the Jevons Paradox: the more efficient something is, the more of it exists overall. In particular, as things get cheaper, people want to use it more. This is called induced demand and often comes up when talking about transport networks.

How are investors going to make their money back?

If tokens are too cheap to meter, how do LLM providers make money? Does this mean the bubble is going to burst?

No, I don't think so. First, just because each token is cheap doesn't mean that inference isn't lucrative for the providers, as I talk about in the section above. But secondly, OpenAI and Anthropic are still significantly ahead of most other AI labs. Just because volume is getting cheap doesn't mean that quality is. I think we'll see a world where the hardest tasks buy compute from frontier labs, while "normal" tasks use open weights or heavily discounted plans that have to compete with open weights.

Whether open weight models catch up to OpenAI and Anthropic is still an open question! If they do, that will hurt investors and possibly have ripple effects in the US economy. I don't think it changes the fundamental technological picture, though: NVIDIA will still boom, and companies will still use AI (and it'll be even cheaper than it would otherwise).

Demand-side Jevons Paradox

But there's another more interesting question: once compute gets cheap enough, what are people going to use it for? What do you do with a million tokens? A billion?

Here are some things I think are possible, although not all of them are likely.

  • Cybersecurity is going to get really bad. Companies are going to centralize around hosted services like Cloudflare Access, internal-only AWS/Azure services, so on, because otherwise they get hacked.
  • Raw compute gets more of advantage. Oxide Computer Company, AWS, Cloudflare, all the hyperscalers are going to benefit. We'll see more and more companies renting out specialized GPUs optimized for inference, not just general-purpose EC2. This is already happening with services such as runpod.
  • The hard part of software becomes product requirements, testing, and user-interface design, not algorithms. The job market gets really weird. Ideally, we'd see an resurgence in QA and UI/UX positions.
  • Renting software is going to become a lot more scarce. Software codebases stop being a moat; operations and security are the real drivers of value. We'll see even more things like Amazon Managed Streaming for Apache Kafka and even fewer things like JetBrains IDEs and Blackboard.
  • Probably a lot more things! The future is getting weird!!

Optionality

What I think is really interesting is that previously, people had three basic options when considering a piece of software:

  1. Use it.
  2. Don't use it.
  3. Use another similar product.

Now they have a fourth option, which is to tell an LLM to build it. The quality of the LLMs output may be better or worse, but the option is there when it wasn't before. Companies have to compete on quality, not just on raw ability to do the thing where you couldn't before. Incumbents in regulated industries will have a massive advantage compared to the free market 6.

What's really cool about this is it makes it much easier to create malleable software that's tailor-made to the exact person using it, something that would have been unthinkable even 5 years ago for anyone who's not a programmer 7.

Summary

I don't know what's next. I do think we should plan for a world where we don't just see cheap compute but also cheap intelligence.

  1. I use "AI" instead of "LLM" intentionally here: there are new machine learning classifiers such as Jev which are not LLMs but are still comparable in capability. ↩
  2. unless you have some other benchmark in mind, such as "will tell me the capital of Taiwan" or "will write election speeches", which are disallowed by Chinese and US models respectively ↩
  3. "quantization" roughly means "the amount of detail inside the model itself". The default is 16-bit floating-point numbers. Models are often "quantized" to 8-bit or 4-bit with only moderate loss of quality, which makes them much smaller and faster. ↩
  4. TypeSafe says: "We can’t prove it isn’t subsidized; we’ll need the long-term to prove the sustainability of our pricing (which we expect to go down, not up)." ↩
  5. This is unusually efficient for hardware; server software is tuned for throughput, not efficiency, so it likely takes an order of magnitude more power for the same tool execution. ↩
  6. One of the things that make software such as electronic medical-record services so miserable to use for doctors is that doctors are not allowed to simply not use them. They are required by law to keep an amount of records that is too large to track by hand. This, plus switching costs, leads to "oligopolies" where a small group of incumbents can corner the market regardless of how bad their products are. ↩
  7. outside of very limited niches like Apple Shortcuts, Salesforce, and Excel spreadsheets ↩
The Daily Front Page 6 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Open-Model Ledger
article

The current balance of power in open models

by gmays·▲ 122 points·55 comments·interconnects.ai ↗
Open language models are AI models where their weights are publicly available.

The expanded form of a testimony I prepared for Congress.

I was recently invited to brief a group of Congressional members and staff on the state of open-weight models in the lens of U.S.-China competition. I’m sharing my prepared remarks as a state of the union on open models that is accessible to a broader audience.

Recap: What is an open source v. open-weight vs. closed model?

Open language models are AI models where their weights are publicly available for inspection or downstream use. These are most often contrasted to so-called “closed” AI models. Closed models offer access only through Application Programming Interfaces (APIs) that developers can use to directly query a model, like GPT-4 or Claude Opus 4.5, or through products, like ChatGPT and Claude Code.

Open language models primarily are bucketed into two categories, open-weight and open-source models. Open-weight models are the most common form, such as popular models like Meta’s Llama, Alibaba’s Qwen, Google’s Gemma, or DeepSeek’s models. These models are governed by licenses, governing documents dictating what is allowed with downstream use, and are often accompanied by inference code in libraries such as Transformers, VLLM, SGLANG, etc. Since about April 2025, Chinese AI companies have been the clear leader in open-weight models.

True “open-source” models are similar to these, as they include the weights, licenses, and inference code, but they also include the complete information needed to reproduce the model – the training code and training data. The most prominent open-source models have been built in the United States, led recently by the Allen Institute for AI’s Olmo models that I helped build in my recent 2.5 years there. The other prominent open-source models are also built by American non-profit organizations, including OpenAthena’s Marin models and EleutherAI’s Pythia models.

Open-weight, open-source, and every other label for a model – including closed models primarily offered via an API – exist on a spectrum. For example, Nvidia’s Nemotron models are far more open than most open-weight models, releasing large quantities of their training data under permissive licenses, but they’re not fully open-source because they do not release all of the data. Closed models also exist on a spectrum based on what information the API reveals and the terms of use.

The state of competition between American and Chinese open-weight models (unit economics, technical capabilities, etc.)

We are living in a world where GLM-5.2 and Kimi K3, some of the latest, leading Chinese models, have enacted a step change in the commercial viability of open models — crossing a similar threshold in agentic capabilities that Anthropic’s Claude Code crossed in December of 2025.

America was the early leader in open language models, primarily through Meta’s Llama models, which were used extensively across research and commercial tasks. Chinese open-weight models surpassed American open-weight models in these two key areas about 18 months ago. The simple metric showing this is Hugging Face Downloads, where China took the lead in July of 2025 primarily through the success of Alibaba’s Qwen models. I personally maintain tools to track this data, and since I first published the American Truly Open Models (ATOM) Project in August of 2025, China’s download lead has grown to about 1.6B – with a total of 3.2B downloads, twice that of America’s total.

On popular capabilities benchmarks, such as the Artificial Analysis Intelligence Index (AAII), the Chinese open-weight models have a clear lead over American counterparts. The top three Chinese models as of writing this on September 14, 2026 are Z.ai’s GLM-5.3 and GLM-5.3-Flash and Moonshot AI’s Kimi K3 with scores of 45, 42, and 44 respectively. By comparison, the leading American models are Thinking Machines’ Inkling and Inkling Small, both with a score of 26, and Nvidia’s Nemotron 3 Ultra, with a score of 23. The top American models were released in June and July of 2026, and are updated less frequently than their Chinese counterparts. For example, Chinese labs released models with scores above these American models 2-6 months before the American companies got there (e.g. GLM-5 or DeepSeek V4 Pro). There is a trend of more American companies releasing models, including names like Arcee AI, Poolside and IBM, but they are not rapidly closing this performance gap. Other benchmarks tell a similar story.

The top American open models on the Artificial Analysis Index are behind 15 other Chinese made models.

Together, Chinese open-weight models are approximately 2-5 months behind the closed American frontier, with the open-weight American models being approximately 6-9 months behind the likes of OpenAI and Anthropic. The Chinese labs are closest in tasks with clear user demand, such as agentic coding, and further behind on more open-ended scientific tasks, such as physics or biology.

The reasons why Chinese labs can produce these strong models, despite having fewer resources than American counterparts, is still an open debate and heavily influenced by different work cultures, but is also influenced by a few key technical factors. The Chinese labs release their models faster and focus on a slightly narrower distribution of tasks, flattering them slightly on public benchmarks. Releasing faster helps them score higher because all the labs are making consistent progress, so once you “finish” a model to be released, it is a snapshot of performance at that given time — labs where that time is later tend to score higher. Still, the models built by the Chinese labs are genuinely strong and represent real competition to the American industry. This competition will not decrease meaningfully as the closed labs patch vulnerabilities in their API offerings which enable distillation.

Distillation is most impactful in new domains and does not make it trivial to create a universally strong final model. I estimate that if distillation was fully prevented, e.g. with know-your-customer (KYC) tools at Anthropic and OpenAI, the gap from the strongest American models to Chinese open-weight models would only increase by 1-2 months.

For example, the Chinese labs are rapidly changing their posture towards paying for training data in 2026. Earlier in the year, the top Chinese labs including Moonshot AI and Z.ai had a strong preference towards building data workflows in-house, but by the summer they had begun to buy the cutting edge data – challenging RL environments for agentic tasks – from both established American companies and new Chinese startups.

With the advance of open weight models in China towards the frontier of capabilities, and the recent documentation of growing risks around frontier models in areas such as cybersecurity (e.g. the OpenAI-HuggingFace incident), there’s growing regulatory uncertainty on how continued releases can enable a safer ecosystem?

A structural challenge in open-weight models is that there are few effective methods for stopping pieces of open software from reaching bad actors. If an attempt was made to restrict access to the strongest open-weight models from China because they amplify risks, the parties who would be set back are American businesses. We have an example of this – HuggingFace used a Chinese open-weight model to understand the cyberattack because closed models would not answer their requests. Thus, managing the risks of open-weight models often comes down to ecosystem preparation.

Open-weight models are becoming an essential tool for AI diffusion, and the best path to get ahead of these risks and unbalanced relationships where American companies rely on models built in China is to continue to enable investment in open models in the US. Ownership of open models allows better coordination and preparation of risks that are global in their nature while accelerating diffusion of AI services throughout the domestic economy.

The state of open model adoption: How is open-source being used by academia, businesses, and other countries?

Open-weight language models have grown substantially in general interest and economic viability in 2026, allowing early glimpses of more direct ways to compare adoption of models from the US, China, or elsewhere on top of Hugging Face metrics. One example is OpenRouter usage. OpenRouter is a popular LLM inference platform that supplies a single interface to switch between models, open and closed, from the US and China. This platform is primarily known for trying different open-weight models. The platform has shared usage data for the top models since Jan. 1, 2025, and shown growth in usage from ~1T tokens processed from open models in a week of September 2025 to ~80T tokens per week today. In that time, Chinese models have grown from ~70% market share to over 80% of usage. Other platforms that are designed to commercialize open models show similar data, such as the open-source coding agent OpenCode, which shows an inference volume of ~95% or higher with Chinese models.

These open platforms are the best approximation of open model usage we have – a large proportion of open model usage is on platforms that do not disclose per-model breakdowns, such as Together AI or Fireworks AI, and in private deployments for enterprise applications.

Many prominent technology companies and startups have been building on Chinese open-weight models for their AI features, such as Harvey, the legal agent, Cursor, the coding agent, and DoorDash’s use of Kimi models, Airbnb’s use of Qwen, or Perplexity’s use of DeepSeek. These prominent companies are the tip of the iceberg, where a large swath of younger Silicon Valley startups are building on Chinese models in order to have low-cost, flexible options. There is a growing trend of American startups and companies entering enterprise agreements with Chinese model labs in order to get permission to use their models in their products – a new form of cross-border technology collaboration I have not witnessed in my career.

The foundation of innovation on Chinese models extends further into the AI ecosystem. To a first order approximation, most of academic research is conducted on Alibaba’s Qwen family of models. Having met multiple members of the Qwen leadership team during my trip to China, they are very invested in and intentional about this type of adoption, which will not be easy to claw back to American models.

To quantify the adoption of open models across academia, I scanned every paper in the 5 most popular ML categories of arXiv (cs.AI, cs.CL, cs.CV, cs.LG, stat.ML), the preprint platform popular in AI research. The results clearly track my understanding of the evolving leadership in AI research, showing LLMs becoming a foundational layer of ML research – mentions of any open model were 2% in January of 2023 and 50% in September of 2026 – and the leading role shift from the U.S. to China in the same time period.

For example, in April to May of 2023, a few months after Meta’s original Llama (a backronym, Large Language Model Meta AI, first released in Feb. of 2023), about 2,600 of 12,000 new AI/ML papers on arXiv mentioned at least one prominent open model family. Of all those scanned papers, ~5.5% mentioned Llama and ~1% mentioned a Chinese model. In the fall of 2024, during Llama’s peak, about 23% of papers mentioned Llama with about 7.5% mentioning Qwen, the most direct Chinese competition. Today, Llama has lost its lead in academia, being mentioned in about 21% of papers still, which is remarkable longevity, but Qwen’s share has risen to 30% of papers. Overall, any Chinese open weight model is mentioned in over 40% of papers, over the U.S.’s 30%, with China’s share continuing to grow.

This shows that we clearly have a lot of work to do in order to re-establish the U.S. as the home of AI research in the era of open-weight language models. There are signs of hope.

In our research, we find that American models of comparable capabilities-to-size regions to their Chinese counterparts get adopted at disproportionate rates. In the last year we’ve seen OpenAI’s first open-weight models since ChatGPT, gpt-oss, become one of the most adopted open-weight models of all time. Since then, Google’s Gemma 4 models have been some of the only ones ever to show similar adoption numbers to Qwen’s most popular small models, and Nvidia’s Nemotron models have modest adoption despite numerous more capable models at the same size point.

Summary

The story of open models in 2026 is one of establishing economic relevance. This is the convergence of many stories across the AI ecosystem, summarized as:

  1. The capabilities gap from open to closed models available to users has been decreasing over the last 3 years. This varies by task, but can be estimated as a 2-5 month gap in capabilities. With capabilities overall progressing so fast, this has seen open-weight AI models unlock substantial markets in 2026 and points to more inflection points in the near future.
  2. Open model usage is exploding in high-value industries (e.g. software engineering, legal services, financial services), indicating an emergence of an alternative ecosystem to the best closed models. Platforms offering inference primarily on open models, from Together, OpenRouter, Fireworks, Baseten, etc., are seeing incredible growth as the first winners of an open model post-training economy (other layers include finetuning APIs such as Thinking Machines’ Tinker). This is combined with numerous anecdotes from technical staff in the AI industry that uses open-weight models such as GLM-5.3 as an alternative to Claude or GPT due to a combination of speed, lower prices, customizable offerings, and privacy.
  3. Chinese AI companies are the clear leaders in open weight models. Relative to 2025, where Chinese models like DeepSeek R1 shook the AI world with surprise, the American AI labs have been recovering in their positions with open-weight models, but despite more substantial investment in the US, the Chinese labs regularly are producing notably stronger models adored by many types of users.
  4. Distillation of American AI models by Chinese labs does not explain the entire story of their success. Distillation is an industry standard technique of training another AI model on the outputs from a usually stronger model. The technique is most prevalent in the Chinese AI industry, which has used basic exploits to extract reasoning traces and additional data from American companies’ products that are not fully secured. The best estimates are that distillation helps reduce the performance gap of Chinese companies relative to the American frontier by 1-2 months.
  5. Chinese models, particularly Alibaba’s Qwen family, are established as a foundational layer of research and development across academia and local model users. In recent months, Chinese open weight models were mentioned in 38% of AI papers, above the U.S.’s 28% – and the Chinese share is growing much faster than its American counterparts. This, along with other political factors and the closed nature of leading American AI companies, is contributing to an accelerated decline in America’s lead as the preeminent AI research hub in the world.
  6. Open weight models are entering the capability levels where new risks, e.g. cybersecurity, can be enabled by numerous open-weight models being available, necessitating an ecosystem level response in preparation. This new era of risks is also enabling a period of political uncertainty, where there is regulatory attention on the strongest AI models, but massive uncertainty on how policy would be legally enacted. At the same time, many researchers and engineers rely on open models due to more permissive safeguards, where the closed models such as Claude and GPT often refuse critical cybersecurity defensive work or biology research.

For more data, view the Interconnects Dashboard.

Conclusions

In 2026 the Chinese labs are clearly maintaining their status as the leaders of the open-weight AI ecosystem. This comes as open-weight models have passed an inflection point in economic viability and in the face of increased activity from American labs as model competition. The leading Chinese labs do not appear to be meaningfully challenged, as they expand their enterprise and research adoption globally.

This landscape of open models comes at a crucial time in the broader AI ecosystem. We’re seeing OpenAI and Anthropic take massive steps forward with their latest public models, and at the same time call for coordinated care on how we manage the next stage of AI progress. What is happening in the confines of a few AI labs today, especially with extreme talent and compute density, is a precursor to what will soon emerge in the open model ecosystem. Open models are going to be the substrate for everyone else in the world outside of the few true frontier AI labs, to harness an acceleration in software engineering and other computational practices. This represents a substantial source of soft power, influence, and potential for the organizations that enable this broad access to transformative intelligence.

With this future coming soon, we need to collectively stay humble about the exact path open models will take. There are a lot of unknowns with open models – e.g. we don’t have good data on how they’re used in countries other than the U.S. and China. With the distribution of ML training expertise being broad, i.e. tens of organizations and thousands of people that are within a year of the frontier of capabilities, it is a matter of when, not if, open models cross the performance thresholds that enable new workflows. The collective approach should be to understand how to use this broadly accessible, open intelligence for good while proactively mitigating the potential harms.


Thank you to Florian Brand and Kevin Xu for feedback and/or suggestions for this work. For more research informing this post, see the open-source AI reading list.

The Daily Front Page 7 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — A Voice Arrives
article

Gemini 3.8 text-to-speech

by swolpers·▲ 269 points·124 comments·blog.google ↗
Transforming voice generation from static presets into a dynamic creative studio.

Gemini 3.8 Flash TTS and Gemini 3.8 Flash-Lite TTS are our most expressive audio generation models yet. Generate custom character voices and direct scene dialogue across Google AI Studio, Gemini API, Gemini Enterprise, Gemini Notebook, and Google Vids.


a text card image reading "Introducing Gemini 3.8 Flash TTS and 3.8 Flash-Lite TTS"

Today, we’re introducing two new text-to-speech models to the Gemini family, transforming voice generation from static presets into a dynamic creative studio. These models enable creators, developers, and enterprises to create richer, more expressive audio experiences, while enabling improved user experiences in products like Gemini Notebook and Google Vids.

  • Gemini 3.8 Flash TTS: Built for deep creative direction and character design. Create entirely new voices from scratch using natural language prompts to bring characters to life across gaming, immersive audiobooks, podcasts, and interactive media. Direct every performance line by line with granular control over acting cues, pacing, dialect shifts, and backchanneling.
  • Gemini 3.8 Flash-Lite TTS: Built for high-volume, cost-efficient scale. Optimized for high-volume dubbing, audio content creation, and expressive voice agents with fine-grained control over tone, pacing, and expressive nuance.

These models complement our fast-growing Gemini Audio family, following 3.5 Live Translate, 3.5 Transcribe, 3.8 Live, and 3.8 Live Extended Thinking.

Create and customize your own voices

Scale up from 30 original voices to an infinite library. Whether you need an entirely original character voice or a consistent brand ambassador, our 3.8 Flash TTS model powers a full vocal studio. This enables you to create and use expressive, natural-sounding voices for every moment, while empowering developers and enterprises to easily build custom audio experiences.

  • Generative voice design: With Gemini 3.8 Flash TTS, create bespoke voices from scratch by customizing role, accent and voice characteristics across more than 100 languages and dialects using natural language prompting — whether you're bringing a dramatic, fire-breathing dragon to life or crafting a charismatic narrator with a distinct regional cadence.

Hear how Gemini 3.8 Flash TTS generates a high-energy DJ voice from Melbourne.

Hear how Gemini 3.8 Flash TTS generates a super-tinny, monotone robot voice.

Hear how Gemini 3.8 Flash TTS brings a Japanese dragon to life.

  • Expansive voice library: Access 2,000+ production-ready voices with broad language coverage — including regional varieties like Mexican Spanish, Quebec French, and Scots English.
  • Voice replication: Recreate consistent vocal profiles from just a 30-second audio sample of your voice or a voice you have the rights to use, backed by built-in consent verification, SynthID watermarking, and C2PA credentials to protect both developers and their vocal talent.
  • Save and scale: Save and manage the custom voices you designed to ensure consistent performance and minimal drift across ongoing projects.
  • Voice remixing: Coming soon, pick a voice from our voice library and fine-tune timbre, pitch, pace, and accent. Use prompts to dial in characteristics (e.g. “add subtle Southern US accent” or “soften the delivery”).

Direct the performance, line by line

Once you've selected your voices, both TTS models give you precise control over how each line is delivered.

  • Direct performance line by line: Write your own stage directions or let Gemini steer delivery with natural script cues — from a calm customer service agent to a whispered suspense scene.

Hear how Gemini 3.8 Flash TTS enables natural, highly expressive conversations for interactive voice agents.

Watch and hear how Gemini 3.8 Flash TTS uses granular script control to build a deeply engaging, immersive audio experience.

  • Long-form generation: Maintain high voice quality, natural pacing, and character timbre across hours of continuous audio with minimal speaker drift — ideal for podcasts and audiobooks.
  • Native two-speaker scene staging: Direct multi-turn conversations seamlessly from a single script —whether for a podcast or dramatic storytelling—while keeping both voices distinctly separated with natural conversational turn-taking.
  • Scripted vocal bursts & backchanneling: Add realistic conversational texture using non verbal cues (like <laughs>, <sigh>, <gasp> and active-listening interjections (like |mhm| or|yeah|) for precise comedic timing and reaction beats.

See how Gemini 3.8 Flash TTS turns natural language prompts into bespoke vocal personas from scratch.

Watch how Gemini 3.8 Flash TTS enables creators to design custom scenes to bring animated dialogue to life.

See how Gemini 3.8 Flash TTS turns scripts into fully performed dialogue scenes, letting creators direct vocal delivery, and natural turn-taking.

Get expressive high-quality speech generation built for global scale

Gemini 3.8 Flash TTS delivers leading voice customization capabilities, securing the #1 overall spot on Hume AI’s Voice Design Benchmark (71.4) and also leading in accent modeling (60.8).

Gemini 3.8 Flash TTS and Gemini 3.8 Flash-Lite TTS enable truly expressive performances without sacrificing reliability, also securing the #1 and #2 spots respectively on Hume AI’s Overall Quality Index. The model shows major improvements on a wide range of use cases such as long-form content and dual-speaker screenplay control compared to Gemini 3.1 Flash TTS.

In blind human preference evaluations on Voice Arena, Gemini 3.8 Flash and Flash-Lite TTS secure top positions amongst competitors in key global languages, including Japanese, Brazilian Portuguese, Vietnamese, Modern Standard Arabic (MSA), Mexican Spanish and Hindi. With support for over 100 languages, these models empower creators, developers, and enterprises to build high-quality, multilingual voice experiences worldwide.

An evaluation showing text-to-speech quality benchmark Hume AI

an evaluation chart showing text to speech voice design leaderboard Hume AI

an evaluation chart showing text to speech leaderboard for Voice Arena

Build with trust, consent, and transparency

We built our voice creation and replication capabilities with strict safeguards to help protect voice talent, respect identity, and ensure content transparency. For voice replication our system leverages consent verification: users must provide a verbal consent recording from the voice owner that matches the reference speaker before a voice can be created.

More broadly, every audio clip generated by our Gemini Audio models is watermarked with SynthID. This imperceptible watermark is woven directly into the audio output, ensuring AI-generated speech remains detectable to help prevent misinformation. For more details on our approach to safety and responsibility, review the model card.

Try our new Google AI Studio audio playground

Starting today, developers can experience these new speech generation capabilities in Google AI Studio. Built like a voice design workspace, you can prompt entirely new vocal identities from scratch or replicate your own voice 1 , then bring them directly into a dual-speaker screenplay editor to direct line-by-line delivery.

Try voice replication in Google AI Studio.

Deploy high-performance voice interfaces with ease

By using the Gemini API, developer platforms such as Agora, LiveKit, Pipecat, Vercel enable developers to build and deploy high-performance speech generation experiences with ease.

We’re partnering with companies like Figma, HeyGen, Linguana, Wondercraft, 99.co, and Ollang, who are integrating our latest TTS models to help accelerate global dubbing, localize media with nuanced regional accents, and power conversational voice agents at scale.

a quote from Darius Cheung, CEO and Co-Founder of 99 Group

a quote from Mason Adams, Developer Evangelist, Agora

a quote from Jonathan Gur-Zeev, Director of Product, Figma Weave

a quote from Bin Liu, VP of Engineering for Hygen

a quote card from Luke Pane, Developer, katsuyo

quote from Ritwik Baranwal, Associate Director AI/ML of kuku.

a quote from Oded Shafran, Co-Founder & CTO of linguana

Aziz Ulak, CTO & Co-founder, Ollang

a quote from Phil Marshall, Founder and CEO of Spoken

quote from Zina Rahman, Co-Founder and CEO, Transforms.AI

quote from Mei Ki Yiu, CTO of Wondercraft

Start using our latest Gemini Audio models:

Gemini 3.8 Flash TTS is rolling out starting today:

Gemini 3.8 Flash-Lite TTS is rolling out starting today:

1

Voice replication through AI Studio is not available in Illinois, Texas, EEA, UK, Switzerland, and India.

The Daily Front Page 8 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Measured, Then Faster
article

Once Claude can measure something, it can make it faster

by matthieu_bl·▲ 186 points·127 comments·claude.dev ↗
Once Claude can measure something, it can make it faster.

Once Claude can measure something, it can make it faster. So we kept finding more things to measure.

This August, we made the core user experience of claude.ai and the Claude desktop app about 3x faster in a two-week sprint. Users had been telling us it was slow, and they were right. We ran everything from a single Slack channel, with Claude in every thread.

We focused on four journeys that make up 95% of user activity. At the 75th percentile, time to a typeable page on a fresh load of claude.ai went from 3.1 seconds to 0.55, starting a new Claude Code session went from 0.8 seconds to 0.3, and loading a Claude Cowork cloud session went from 2.6 seconds to 0.73. In aggregate, we estimate that saves tens of thousands of user-hours of waiting every day.

Core user journeys, p75 real user monitoring, per platform and product, August 13 vs. August 27.

We used Claude Tag (beta), running an internal research model roughly comparable to Opus 5.5. Claude found bottlenecks, built benchmarks, shipped improvements, and watched every deploy. We steered by setting goals, making tradeoffs, and approving every change. With that approach, we merged more than three thousand changes without a single customer-facing incident or rollback. This post covers what we shipped, how we measured it, and the loop we built with Claude to do it safely.

THE BRIEF

Before the sprint, we created a Slack channel with the following standing instructions:

@Claude Your job is to facilitate all things related to the performance of the claude.ai website and desktop app. Your responsibilities include monitoring deploys for performance regressions, assessing the accuracy and comprehensiveness of existing telemetry, maintaining well-curated observability dashboards, proactively implementing solutions for observed issues and low-hanging fruit, proposing performance project opportunities, and communicating with your human teammates. […]

The ultimate goal for this channel is for you to become as autonomous as possible, but today we know that isn’t yet possible.

We asked Claude to analyze usage data through the Datadog MCP server. It identified the four highest-impact user journeys: launching the app, starting a conversation, loading an existing conversation, and sending a message. Between web and desktop, and across our products, those journeys came to thirteen distinct measurements. To establish baselines, we added instrumentation until they were directly comparable: each started with a user interaction, ended once the result was rendered, and disambiguated client and server work.

We kicked off the sprint with a list of about twenty hand-picked projects, each targeting a specific journey. Claude estimated the impact of each project in milliseconds, and we aggregated those estimates to set our targets for the sprint. Some of the projects were fairly large, but we thought we could probably achieve most of them within two weeks.

We hit twelve of the thirteen targets by day three.

The planned projects landed early. For faster launches, we baked a static composer into the HTML so users can type during React initialization, and precompiled a V8 code cache so the desktop shell’s main process doesn’t recompile from scratch. For faster navigations, we kept the composer mounted between conversations, prefetched sessions when the user hovered over them, and cut sidebar re-renders by 90%.

We had also left room for Claude to identify opportunities and propose new workstreams. Those workstreams quickly ramped into full projects of their own, which far exceeded our initial targets. So we set new targets, then looked for more things to measure:

@Claude we’ve ended up funding nearly every project in the original projects list and more. let’s do a refresh […] what have we not explored, what can we hill climb on, where is the most opportunity at this point? […] i am open to WACKY ideas

ANYTHING CAN BE HILL CLIMBED

From the start, we knew we wanted to iterate faster than our deploy cadence. Claude could work asynchronously for many hours, even overnight, and we wanted to let it validate its prototypes without waiting for field reads. To achieve that, we looked for other ways to measure performance in the lab.

Sam found the first lead:

#claude-apps-perf · thread

  1. S

    Sam12:34 PM

    What can we do instead of wall-clock timing? Can we measure JS instruction counts for instance?

  2. ClaudeApp12:42 PM

    Yes. For pure-JS hot paths, literal instruction counts: run the benchmark under Valgrind with node --predictable and compare to a checked-in baseline — one run, no statistics needed.

    For browser paths there’s no instruction counting under Chromium, but there’s a ladder of other deterministic counts: React commits per interaction, function call counts from V8’s precise coverage, layout and style-recalc counts, DOM mutations. Which do you want first?

  3. S

    Sam12:49 PM

    Let’s explore valgrind + Ir + --predictable in one thread and each of the browser/react benches in new threads. Ping me in all of them. You know what we want. Let’s go

Recreated from a real conversation.

Eleven minutes later, five threads were running, each focused on a different measurement: instruction counts, V8 call counts, React commits, style recalculations, and DOM mutations.

We treated every new benchmark with some skepticism. Each one had two jobs: first, a metric Claude could move in the lab; second, a guardrail in CI with a number that could only ratchet down. If a benchmark was flaky, or if it didn’t actually correlate with user latency, we threw it out rather than let Claude climb the wrong hill.

@Claude please prove that hill climbing against each of these can result in measurable wall clock perf wins. we’ll unship the benches for any candidates that cannot prove that

Wall-clock time is what users feel, but it’s noisy, and milliseconds are too flaky to use as a CI gate. Instruction counts were appealing because they were deterministic, but we still needed Claude to prove they tracked wall-clock time.

So we asked Claude to drive the count down on two hot paths: the routine that assembles a conversation’s message tree, and a scanner for status lines in Claude Code output. Claude profiled both with Valgrind and found that a quarter of the first path’s instructions were megamorphic dictionary lookups, resolving the same message ID three separate times.

An hour later it had cut instructions on both paths by 48% and 31%, and wall-clock time had dropped 78% and 44%. We checked in two new ratchets. From then on, any PR that raised the instruction counts of those paths failed CI, and a daily job lowered each ceiling whenever the count went down.

Does the count track the clock? CPU instructions vs. wall-clock time.

That led us to the central lesson of the sprint. With Claude, measuring something makes it tractable.

Measurement used to be step zero: you’d add a metric, wait for data to roll in, and only then start to understand the problem. With Claude, it’s step one of the climb. As soon as Claude had a number to beat, it could start optimizing. This meant the highest-leverage thing we could do was find more things to measure.

THE LOOP, THREAD BY THREAD

All of this ran in the same Slack channel, with multiple engineers and Claude jamming in every thread. From there, the sprint settled into a loop:

  1. Someone would open a thread about a slow stretch of a journey, often with a screenshot or recording.
  2. Claude would trace the flow, then find or build a benchmark that demonstrated the problem.
  3. Once it had a promising result in the lab, Claude would come back with a PR — often several, sized for risk and review, with anything user-visible behind a flag.
  4. After it shipped, Claude watched the deploy and read the field data.
  5. If performance improved, Claude locked in the win by ratcheting the benchmark down; if not, it turned the flag off and iterated.
  6. Then it went looking for the next slow spot in the same journey.

An example: someone shared a screen recording that showed sidebar rows popping in after the page loaded. Chat and Cowork rows resolved at different times, making the page feel janky. None of our existing monitors detected it. The closest we had was Cumulative Layout Shift, but each shift only scored about 0.008 — well within the good threshold of 0.1.

Issac had the idea to reference the underlying Layout Instability API directly. Claude created a telemetry event that mapped the sources of each layout-shift entry to a named region (e.g. sidebar, transcript) and phase (e.g. before first paint, after typeable). It added an integration test that opened the page with a populated sidebar, held the sidebar’s data until after first paint, and failed on any shift in any named region. Claude used that as a benchmark to prove a fix: the test went red 20 of 20 runs on main, and green 20 of 20 on the PR.

After the event deployed, Claude read the field data and found that 31% of web page loads moved something after the page was usable, without any user interaction. From there, Claude worked through the causes by name: a header row that arrived late, a caret that slid sideways once the user’s name loaded, a list that moved when the scrollbar popped in. Claude fixed the top offenders as a batch, and when they were gone, it found the next batch.

Side-by-side recording of the claude.ai sidebar loading. Before, the rows arrive late and rearrange: ten rows jump, nine appear and four vanish. After, the rows fill in where they will stay, and nothing moves.

VIDEO PauseSidebar jank, before and after · throttled 4G

That was one thread. During the sprint, we ran more than a hundred and fifty at a time.

SCALING HORIZONTALLY

Once the loop worked on one thread, running it on more was just a matter of opening them. Instead of closing a thread once its original request had been fulfilled, Claude would keep going. An individual thread would put up fifty, sometimes a hundred, optimization PRs. Increasingly, it was Claude, not one of us, opening new threads to chase opportunities it had found on its own, as part of a separate investigation or nightly job. Shelley, one of the engineers in the channel, observed, “[This model] is a numbers demon.”

Every measurement found something to improve. Claude ran a React hook census and found 6,900 hooks and 900 store subscriptions in the composer’s typing path, re-rendering on every keystroke. Claude counted style recalculations and found a single :root:has() selector adding 24 milliseconds to every DOM change. Claude traced code paths after first paint and found a leftover location.reload() causing half a million hidden reloads a day that none of our load metrics could see. Claude read profiler samples from idle tabs and found identical cache snapshots being cloned into IndexedDB twice a minute, all on the main thread.

We rarely knew where a thread would lead. In a sweep for CPU hitches, Claude noticed that highlighting a finished code block could freeze the page for about a second. It dug in the lab and found the culprit: em dashes. If a reply’s markdown contained any non-Latin-1 character, like an em dash or a curly quote, V8 stored the entire string as UTF-16, which put every syntax-highlighting regex on its slower two-byte path. Claude fixed it with a twenty-line change to copy each code block into a one-byte string before highlighting it.

Highlighting the first code block on a page: main-thread blocking time, before and after the fix.

By the second week, we could barely summarize our output into daily updates. On the busiest days, more than two hundred changes landed. Claude kept proposing new benchmarks; about a third of PRs included additional telemetry or guardrails, and each new instrument generated more threads with more opportunities.

Working in one channel meant everything happened in the open. We jumped in and out of each other’s threads to debate decisions and celebrate wins. Word spread: other teams started bringing their changes into the channel to have them reviewed for performance. New projects were written in subtly more performant ways because of all the guardrails and Claude skills that had been introduced.

GUARDRAILS

We’d prepared for the pace. Because nearly everything we touched was a hot path (the first paint, the composer, the transcript), we’d established our safety mechanisms up front. Every PR went through automated review with at least one human approval, unit tests always came before optimizations, and anything that could cause a user-visible problem shipped behind a short-lived feature flag.

When the flags started piling up, we opened a thread to coordinate their rollouts and cleanup. Claude classified every flag as a kill switch or ramp, and retired each one as soon as it was safe. Across the two weeks, we introduced nearly two hundred flags, more than half of which were already cleaned up by the end.

We also knew that performance wins decay in a fast-moving codebase, and code ships fast at Anthropic. Once a project proved a win, we invested in ways to protect it. The static composer, for example, is brittle by design. We show users an HTML copy of the page almost immediately, and let React paint directly on top of it.

Side-by-side recording of a fresh load of claude.ai. Before, the page stays blank and the composer takes input at 2.93 seconds. After, a static greeting and composer take input at 0.36 seconds; the user types a message, and the text is kept when the real composer fades in at about 3 seconds.

VIDEO PauseStatic composer, before and after · throttled 4G

If the React render is off by even a pixel, the magic is lost. So Claude built dozens of guardrails:

  • The static markup is generated by rendering the real React component in jsdom, and a test guarantees they never drift.
  • An integration test suite compares the static page against the React render across fourteen viewport sizes, and asserts alignment within 1 px.
  • A keystroke test types straight through the handoff and fails on any lost or reordered key.
  • In the field, every handoff reports shifts to a tenth of a pixel. Claude opens a thread for any event with nonzero movement.

Not everything could be caught in the lab, so we also made use of the oldest guardrail in the book: incremental rollouts. High-risk changes were rolled out to employees first, then one percent of users, then everyone. Four hours after we released the static composer internally, a teammate shared a screen recording of a layout shift that none of our metrics could see. When he opened claude.ai in a new tab, the composer would drop — but it wasn’t our code.

#claude-apps-perf · thread

  1. M

    Marius6:15 PM

    Occasionally, I’m seeing a small-ish (maybe 15–20px) vertical layout shift (pushing the composer box down) when opening claude.ai in a new tab (not so much when reloading the page). I can’t quite pin down what exactly causes that, but it’s there

    Screen recording · 0:02

  2. ClaudeApp7:05 PM

    Found it in your recording — it’s Chrome resizing the page, not the handoff from the static composer to the real one (that measured 0 px on all 49 of your loads today).

    • On the new-tab page, Chrome draws its own 56 px footer below the page (“Managed by anthropic.com · Customize Chrome”). When the tab navigates to claude.ai the footer goes away and the page gets 56 px taller, but only ~100 ms after our first paint.
    • /new puts the greeting and composer 18% of the page height from the top, so they drop 0.18 × 56 ≈ 10 px (your video measures 10). A reload has no footer to remove, hence new-tab only; “occasionally” is whether first paint beats the resize.
    • It’s only “occasional” because it needs Chrome to pre-render the page from the address bar while you’re still on the new-tab page: the hidden page is laid out at the shorter height and only resized after it’s shown.
    • This was always latent; the page just never painted that early before. Our layout tests can’t see it because headless Chrome has no browser UI to retract, and the placeholder and the app move together.

Recreated from a real conversation.

Somehow, Claude traced it to an edge case in Chrome’s speculative loading. While a user was typing the URL into the address bar, Chrome would prerender the page in the background, at the height of the current tab. On browsers managed by an organization, the new-tab page is slightly shorter because of a footer. When the user pressed Enter, the first frame of claude.ai showed that slightly shorter layout, and Chrome resized it about a tenth of a second later. Claude pinned the layout across the resize, and we added a test to simulate the prerender flow.

STEERING

The loop was productive, but it wasn’t autonomous. Keeping it fast, safe, and on track was our job, and it had three parts.

Ambition. By default, Claude is careful about scope. It tickets findings, hedges on feasibility, and pads its estimates. But we were confident in our guardrails. A lot of what we did, especially early on, was to encourage Claude to be bolder.

#claude-apps-perf · thread

  1. ClaudeApp3:32 PM

    Yes — one small PR to give Code the same timing marks Chat and Cowork already have. I’ll put it up this week; realistically Code’s number waits a few days for merge, deploy, and a baseline window.

  2. R

    Raymond3:32 PM

    if you put it up right now I will get it merged and deployed. we have the power to do anything. please be braver

  3. ClaudeApp3:33 PM

    On it — the PR will be up within the hour.

Recreated from a real conversation.

When we started hitting the targets we’d set, we noticed that threads would slow down. Sam went thread to thread with the same message: “Let’s keep driving this down, the targets are not the stopping point. What’s next? Be ambitious.”

Taste. Every thread had a named human owner, and Claude highlighted any user-perceptible change with before-and-after screenshots or recordings for them to rule on. Should a table fill in cell by cell, or wait until each row is complete? Should a loading skeleton show up immediately, or only after half a second? Is a word-by-word fade on streamed text worth the fifth of the frame budget it costs? Claude looked for ways to shave milliseconds, and we weighed the tradeoffs.

Direction. We kept each thread deliberately narrow, focused on one benchmark or journey, and asked Claude to find improvements only within that scope. We thought of the threads as a hundred and fifty hammers seeking nails. Most of our calls were about sequencing and user impact: which surfaces to prioritize, how to combine threads that were stepping on each other, and when to close a thread that had reached diminishing returns. One 900-line PR got a one-line reply: “going to gavel that 2ms per send is not worth the complexity of maintaining this build plugin.”

AN 8-MILLISECOND BUDGET

One of our sidequests shows everything working together. To demonstrate an optimization to a regex used in live syntax highlighting, Claude attached a screen recording of a long answer streaming in the lab. In the corner, it had added a frame-rate readout, computed in the page from animation-frame timestamps.

#claude-apps-perf · thread

  1. R

    Raymond2:33 PM

    this is actually kind of a sick bench. are we capped at 60 fps? can you try to drive scroll and stream smoothness to 120? iiuc your rig may not support this

  2. ClaudeApp2:34 PM

    Right, today’s rig ticks at 60 Hz because headless Chromium does by default. I believe it can be driven at 120 (uncapped vsync or DevTools frame control) — confirming that first, then I’ll re-run the eval against an 8.3 ms frame budget.

  3. ClaudeApp2:59 PM

    Update on the 120 Hz rig: it works. Deterministic 120 Hz frame stepping in headless Chrome via DevTools begin-frame control — exactly 240 frames for 240 begin-frames at 8.33 ms, so “did this frame fit the 120 Hz budget” becomes an exact read rather than a noisy one.

  4. R

    Raymond3:05 PM

    amazing

    cook

Recreated from a real conversation.

Once the mechanism and ambition were established, Claude got to work. Each painted frame had a budget of 8.33 milliseconds, so Claude stepped through a long reply frame by frame, timing each one to find the slow parts. It eliminated O(message length) work per chunk by memoizing finished blocks, moved tokenization logic for growing code fences to a worker, and revealed tables cell by cell.

In that one thread, we landed nearly sixty PRs. Long replies blocked the main thread for about 200 milliseconds in total where they used to block it for about 750, ran on about a third of the CPU, and held 120 fps from start to finish on a 120 Hz MacBook. The 120 Hz rig itself became a nightly job, with Claude watching for regressions.

Long answers on Claude on web and desktop now stream ~4x smoother.

We rebuilt the streaming renderer to only touch what’s still changing, so a long reply stalls 9x less on a slower laptop, its worst freeze is 4.5x shorter, and on a 120Hz MacBook it holds 120fps start to finish.

— ClaudeDevs (@ClaudeDevs) Aug 24, 2026

When we started the sprint, we hadn’t planned to hill climb on the milliseconds between frames while streaming. But it turned out we could count them — and anything we could count, Claude could climb.

WHAT’S NEXT

Today, claude.ai and the desktop app are about 3x faster than they were in early August, and the ratchets should keep them there. But we’re not done: the 95th percentile, other journeys, and very long conversations still have room to improve. In a separate post, we’ll also write about some of the sidequests that took us upstream during the sprint, with contributions landing in Electron, Chromium, Node.js, and more.

When we shared the results internally, Issac put it best: “You could not have convinced me this was possible even six months ago.” We expect to keep working this way, one thread at a time, at any scale. The channel’s still going.

The Daily Front Page 9 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Agents at the Workbench
article

Strands Harness

by zuckerborg0101·▲ 130 points·92 comments·strandsagents.com ↗
A fully assembled, customizable, state-of-the-art agent you run locally or deploy anywhere.

Strands harness is a fully assembled, customizable, state-of-the-art agent you run locally or deploy anywhere.

We noticed builders often wished their Claude Code or Codex setup could run in the cloud because locally their agent idea just “worked” with those harnesses.

But the moment you build your own agent, you’re on your own. It’s tricky wiring up the right primitives just well enough to match that “it just worked” feeling.

Today we’re releasing Strands harness: a fully assembled state-of-the-art agent harness you can easily run locally or deploy to your favorite provider. It’s built to be a general-purpose agent rather than a coding agent. All you need is one line of Python or TypeScript to get it working with your choice of model. Strands harness beats other agent harnesses on cost efficiency while maintaining equal or better accuracy. It’s available under an Apache 2.0 license.

Strands harness costs 28% less when using the same Claude or GPT models across six benchmarks. We found Strands harness showed better token-efficiency and nearly equal benchmark scores compared to Claude Code, Codex, and other popular harnesses. That’s important because we never want to sacrifice accuracy for lower cost. Deepseek Harness proved to be the most token-efficient overall, however, it typically reported the lowest accuracy scores. Our testing setup was distributed benchmarking on EC2 with Harbor.

With Fable 5, Strands harness cost 77% less than Claude Code and scored higher on Terminal Bench 2.1. We’re also pleased to see two other open source harnesses perform similarly well on cost/accuracy against Claude Code.

Strands harness, built on the Strands Harness SDK, contains defaults for prompt caching and context management. Our default context management largely drove the token-efficiency and accuracy: tool results over ~1500 tokens get truncated, summarization (compaction) triggers when the context window hits above 85%, and context recovery runs within the loop if there’s an overflow.

Keep an eye out for a follow-up paper from our researchers regarding these benchmarks. In the meantime, we’re excited everyone gets to use these defaults in Strands harness.

Easy to get started

Strands harness runs on the latest models across Amazon Bedrock, Anthropic, OpenAI, and Google. Pick one by name, or point it at a local Ollama model:

from strands_harness import create_harness

agent = create_harness(model="bedrock/global.anthropic.claude-opus-5")

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "bedrock/global.anthropic.claude-opus-5" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");
from strands_harness import create_harness

agent = create_harness(model="anthropic/claude-opus-5")

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "anthropic/claude-opus-5" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");
from strands_harness import create_harness

agent = create_harness(model="openai/gpt-5.6-sol")

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "openai/gpt-5.6-sol" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");
from strands_harness import create_harness

agent = create_harness(model="google/gemini-3.5-flash")

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "google/gemini-3.5-flash" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");
from strands_harness import create_harness
from strands.models.ollama import OllamaModel

model = OllamaModel(host="http://localhost:11434", model_id="llama3.1")

agent = create_harness(model=model)

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "ollama/llama3.1" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");
from strands_harness import create_harness

agent = create_harness(model="litellm/openai/gpt-5.6-sol")

agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")
import { createHarness } from "@strands-agents/harness";

const agent = await createHarness({ model: "litellm/openai/gpt-5.6-sol" });

await agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md");

Out of the box, create_harness() returns an agent that:

  • Runs on a current reasoning model across Amazon Bedrock, Anthropic, OpenAI, Google, Ollama, or LiteLLM.
  • Ships with shell, file (read / write / edit), and web tools: the primitives a model already knows how to use, rather than a bespoke tool per task.
  • Manages its own context window. It offloads bulky tool results to files and caches the reused parts of each request to save time and cost.
  • Keeps long-term memory across runs, and resumes an earlier conversation when you give it a session ID.
  • Delegates open-ended subtasks to a built-in helper agent, and tracks multi-step work with a checklist.
  • Loads skills if they exist.

Strands harness can be deployed on any provider with a linux container, such as Modal, Cloudflare Containers, Azure Container Apps, Google Cloud Run, Amazon ECS, and Amazon Bedrock AgentCore.

We also have the Strands CLI that allows you to prototype your agent in plain English. Wire up your model provider of choice, then add prompts and tools to watch your agent come to life. Afterwards, you can run /export in the Strands CLI to get a copy of the code in either TypeScript or Python, a very convenient way to keep iterating on Strands harness with your preferred coding agent.

Here we ask the Strands harness agent to “add the Playwright MCP” and then measure latency when loading a video on a blog post. After seeing the MCP tools accurately work, we simply run /export to get the Strands harness code. You can see the Playwright MCP got added to the boilerplate, making it easy to iterate with a coding agent or adding config to deploy.

What you can build from Strands harness

The Strands CLI is actually built on top of Strands harness. We unlocked a bunch of ambitious ideas because of how easy it is to prototype any agent. Recently our engineer, Gautam Sirdeshmukh, inspired by agent platforms like Grokbot and Muse, built a desktop app that kicks off Strands harness remotely.

When you’re ready to go deeper, Strands harness is fully customizable. You can easily override any default, swap models, add tools, or gradually replace components all the way down to the Strands Harness SDK. The code is yours.

We’re excited for all kinds of agents that’ll come to life with Strands harness.

Try it out today

You can easily install Strands harness with pip install strands-harness for Python or npm install @strands-agents/harness for TypeScript. For an interactive experience, download the Strands CLI: npm install -g @strands-agents/cli.

We believe quickly prototyping with a batteries included harness will create more useful agents. Our team is also in Discord, so come say hi or ask us any question about agents!

The Daily Front Page 10 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Remote Machine
article

VSCode's SSH Agent Is Bananas (2025)

by Rapzid·▲ 152 points·95 comments·fly.io ↗

We’re interested in getting integrated into the flow VSCode uses to do remote editing over SSH, because everybody is using VSCode now, and, in particular, they’re using forks of VSCode that generate code with LLMs.

”hallucination” is what we call it when LLMs get code wrong; “engineering” is what we call it when people do.

LLM-generated code is useful in the general case if you know what you’re doing. But it’s ultra-useful if you can close the loop between the LLM and the execution environment (with an “Agent” setup). There’s lots to say about this, but for the moment: it’s a semi-effective antidote to hallucination: the LLM generates the code, the agent scaffolding runs the code, the code generates errors, the agent feeds it back to the LLM, the process iterates.

So, obviously, the issue here is you don’t want this iterative development process happening on your development laptop, because LLMs have boundary issues, and they’ll iterate on your system configuration just as happily on the Git project you happen to be working in. A thing you’d really like to be able to do: run a closed-loop agent-y (“agentic”? is that what we say now) configuration for an LLM, on a clean-slate Linux instance that spins up instantly and that can’t screw you over in any way. You get where we’re going with this.

Anyways! I would like to register a concern.

Emacs hosts the spiritual forebearer of remote editing systems, a blob of hyper-useful Elisp called “Tramp”. If you can hook Tramp up to any kind of interactive environment — usually, an SSH session — where it can run Bourne shell commands, it can extend Emacs to that environment.

So, VSCode has a feature like Tramp. Which, neat, right? You’d think, take Tramp, maybe simplify it a bit, switch out Elisp for Typescript.

You’d think wrong!

Unlike Tramp, which lives off the land on the remote connection, VSCode mounts a full-scale invasion: it runs a Bash snippet stager that downloads an agent, including a binary installation of Node.

I think this is the source code?

The agent runs over port-forwarded SSH. It establishes a WebSockets connection back to your running VSCode front-end. The underlying protocol on that connection can:

  • Wander around the filesystem
  • Edit arbitrary files
  • Launch its own shell PTY processes
  • Persist itself

In security-world, there’s a name for tools that work this way. I won’t say it out loud, because that’s not fair to VSCode, but let’s just say the name is murid in nature.

I would be a little nervous about letting people VSCode-remote-edit stuff on dev servers, and apoplectic if that happened during an incident on something in production.

It turns out we don’t have to care about any of this to get a custom connection to a Fly Machine working in VSCode, so none of this matters in any kind of deep way, but: we’ve decided to just be a blog again, so: we had to learn this, and now you do too.

The Daily Front Page 11 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Remote Machine
article

The GitHub wiki is an anti-pattern (2022)

by ibobev·▲ 166 points·104 comments·michaelheap.com ↗

The “should I use the wiki or a docs folder on GitHub?” discussion comes up every 6 months or so, and following Shawn Wang’s three strikes rule I thought it was about time I wrote something down about it.

The initial version of this post opened with “You can use the wiki or a docs folder for your GitHub project, both are valid choices” but as I wrote more, I realised that there is a single reason to use a wiki, and many more reasons not to use the wiki. So many in fact, that I consider using the wiki on GitHub is an anti-pattern.

Let’s start with the benefits of using a wiki:

  1. You can get to the wiki contents in a single click from anywhere in the repo
  2. There is no 2.

Really, the only benefit that I’ve been able to find to using a wiki is that it’s always there.

How about the reasons not to use the wiki?

  1. Documentation is versioned alongside your code when using the /docs folder. If you need to use an old version, the docs are easy to find
  2. The documentation isn’t available locally when someone clones your repo (you can clone the wiki separately, but this is a hidden feature)
  3. Documentation edits get the same treatment as code. They get a full peer review through the pull request process
  4. You can use GitHub Actions to lint your docs using tools such as Vale
  5. People can work with tooling that they already know (e.g. vscode with spellcheck)
  6. Wikis provide limited branding opportunities. They all look pretty much the same
  7. The wiki doesn’t support image uploads, so you have to put images somewhere else anyway

Now that you’re sold on the idea of keeping docs alongside your code, how do you make it easy for people to view them?

  1. Add your docs to your repository in the /docs folder. Do not use the gh-pages branch as this prevents docs being versioned alongside code

  2. Set up a GitHub pages build to publish the docs

    • If you’re just getting started, I recommend using the just-the-docs theme and letting GitHub build and publish your docs
    • If you prefer to build your own workflow (e.g. using Hugo), you can use this GitHub Action to publish the docs
  3. Add a single wiki page directing people to the hosted documentation

Using the /docs folder is the highest effort-to-reward ratio option whilst you’re building out a new product. At some point your docs will outgrow a single folder, and then all bets are off. You’ll want a separate repo with its own build process, pull request review guidelines and a whole host of other things. At that point people are already used to working with docs in a repository, and the migration from /docs to its own repo should be seamless for your contributors.

Whether you agree or disagree, I’d love to hear your thoughts on Twitter

The Daily Front Page 12 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Remote Machine
article

GPT-6 Astra has gained the ability to drive a car

by plurby·▲ 277 points·224 comments·drivingbench.com ↗

Can frontier models drive a real car? We give them control of a Toyota Corolla’s steering, accelerator, and brakes, then evaluate them on a fixed cone course.

Leaderboard

Up to 3 attempts in one continuous chat. Expand a model to inspect its runs, then click a run to view its trace and video.

GPT-6 Astra

Codex · medium

100% in 5:22

  • Attempt 1: 49% — 67.3 m — DNF — 81.2M · $2.01
  • Attempt 2: 100% — 134.7 m — 5:22 — 246.6M · $7.74

Claude Fable 5.1

Claude Code · medium

45%

  • Attempt 1: 9% — 17.5 m — DNF — 3581k · $0.96
  • Attempt 2: 10% — 27.3 m — DNF — 4866k · $1.35
  • Attempt 3: 45% — 73.7 m — DNF — 82.1M · $1.64

Grok 4.6

Cursor · medium

11%

  • Attempt 1: 8% — 14.4 m — DNF — 2216k · $0.18
  • Attempt 2: 11% — 22.6 m — DNF — 3294k · $0.19
  • Attempt 3: 10% — 22.2 m — DNF — 3516k · $0.29

GPT-5.6 Sol

Codex · medium

6%

  • Attempt 1: 6% — 15.0 m — DNF — 3364k · $0.35
  • Attempt 2: 6% — 15.6 m — DNF — 4729k · $0.43
  • Attempt 3: 6% — 17.1 m — DNF — 2517k · $0.27

Progress is how far along the course centerline the attempt got while staying within 4 m of it, as a share of the centerline length to the finish zone; a collision keeps the progress reached before it.

Distance is GPS speed integrated from the first accepted set_motion to the end of the attempt's last engagement.

Finish time is from the first accepted set_motion to the end of the attempt's last engagement. Shown for completed runs only; DNF means did not finish.

Commands are accepted set_motion and stop_now calls during the attempt.

Tokens · cost is total tokens and cost at list prices for the attempt, including the reflection after it.

Explore the course

DrivingBench

The Daily Front Page 13 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Firmware for the Faithful
repository

ReBarUEFI: Resizable BAR for almost any UEFI system

by nateb2022·▲ 233 points·73 comments·github.com ↗
★ 2,511⑂ 116 forks C

Resizable BAR for (almost) any UEFI system

GitHub Actions ReBarDxe GitHub Actions ReBarState Downloads

A UEFI DXE driver to enable Resizable BAR on systems which don't support it officially. This provides performance benefits and is even required for Intel Arc GPUs to function optimally.

screenshot showing cpu-z, gpu-z and amd software

If using an NVIDIA Turing GPU (20 or 16 series) see NvStrapsReBar for enabling Resizable BAR on it.

Requirements

  • (optional) 4G Decoding enabled. See wiki page Enabling hidden 4G decoding if you can't find an option for it. Without 4G Decoding you will be limited to 1GB BAR and in some cases 512MB you can try to increase this upto 2GB by reducing TOLUD
  • (optional) BIOS support for Large BARs. Patches exist to fix most issues relating to this

Usage

Follow the wiki guide Adding FFS module and continue through the steps. It covers adding the module and the additional modifications needed if required.

Once running the modified firmware make sure that 4G decoding is enabled and CSM is off.

Next run ReBarState which can be found in Releases (if you're on Linux build with CMake) and set the Resizable BAR size. In most cases you should be able to use 32 (unlimited) without issues but you might need to use a smaller BAR size if 32 doesn't work

If Resizable BAR works for you reply to List of working motherboards so I can add it to the list. Most firmware will accept unsigned/patched modules with Secure Boot on so you won't have any problems running certain games.

If you have any issues after enabling Resizable BAR see Common Issues (and fixes)

How it works

The module is added to the UEFI firmware's DXE volume so it gets executed on every boot. The ReBarDxe module replaces the function PreprocessController of PciHostBridgeResourceAllocationProtocol with a function that checks for Resizable BAR capability and then sets it to the size from the ReBarState NVRAM variable after running the original function.

The new PreprocessController function later gets called during PCI enumeration by the PciBus module which will detect the new BAR size and allocate it accordingly.

AliExpress X99 Tutorial by Miyconst

Resizable BAR on LGA 2011-3 X99

Instructions for applying UEFIPatch not included as it isn't required for these X99 motherboards. You can follow them below.

UEFI Patching

Most UEFI firmwares have problems handling 64-bit BARs so several patches were created to fix these issues. You can use UEFIPatch to apply these patches located in the UEFIPatch folder. See wiki page Using UEFIPatch for more information on using UEFIPatch. Make sure to check that pad files aren't changed and if they are use the workaround

Working patches

  • <4GB BAR size limit removal
  • <16GB BAR size limit removal
  • <64GB BAR size limit removal
  • Prevent 64-bit BARs from being downgraded to 32-bit
  • Increase MMIO space from 16-32GB to full usage of 512GB/39-bit range (Skylake/Kaby Lake/Coffee Lake)
  • Increase MMIO space from 8-16GB to full usage of 512GB/39-bit range (Haswell/Broadwell). The issue of older patches being limited to 64GB has been fixed.
  • Increase MMIO space from 16GB to full usage of 64GB/36-bit range (Sandy/Ivy Bridge). Requires DSDT modification on certain motherboards. See wiki page DSDT Patching for more information.
  • Remove NVRAM whitelist to solve ReBarState GetLastError: 5
  • Fix USB 3 ports not working in BIOS with 4G Decoding enabled (Ivy Bridge/Haswell/Broadwell)
  • X79 Above 4G Decoding fix

Build

Use the provided buildffs.py script after cloning inside an edk2 tree to build the DXE driver. ReBarState can be built on Windows or Linux using CMake. See wiki page Building for more information.

FAQ

Will it work on a PCIe Gen2 system?

Previously it was thought that it won't work on PCIe Gen2 systems but one user had it work with an i5 2500k.

Can I use Resizable BAR on my system without modifying BIOS?

You can use Linux with 4G Decoding on, recent versions will automatically resize and allocate GPU BARs. If your BIOS doesn't have the 4G decoding option (make sure to check hidden) or DSDT is faulty you can then follow the Arch wiki guide for DSDT modification using modifications from DSDT Patching and boot with pci=realloc in your kernel command line. Currently there is no known method to get it on Windows without BIOS modification

I set an unsupported BAR size and my system won't boot

Clear CMOS and Resizable BAR should be disabled. In some cases it may be necessary to remove the CMOS battery for Resizable BAR to disable.

Will less than optimal BAR sizes still give a performance increase?

On my system with an i5 3470 and Sapphire Nitro+ RX 580 8GB with Resizable BAR enabled in driver I get an upto 12% FPS increase with 2GB BAR size.

Credit

  • @dsanke, @cursemex, @dripsnek, @val3nt33n, @Mak3rde and @romulus2k4 for testing/helping develop patches
  • The Linux kernel especially the amdgpu driver
  • EDK2 for the base that all OEM UEFI follows
  • Ghidra which was used to patch UEFI modules to workaround artificial limitations
  • @vit9696 for the NVRAM whitelist patches
  • @ZOXZX for helping with the X79 Above 4G patches
  • @NikolajSchlej for developing UEFITool/UEFIPatch
  • QEMU/OVMF made testing hooking way easier although it didn't have any resizable BAR devices so the only way I could test it was on my actual PC.
The Daily Front Page 14 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Security Desk
article

Data-only attacks are easier than you think (2024)

by segfaultbuserr·▲ 97 points·42 comments·usenix.org ↗
Data-only attacks, those that do not affect a program’s control flow, have long been considered too sophisticated.

Data-only attacks, those that do not affect a program’s control flow, have long been considered too sophisticated and niche to pose a practical threat. With our research, however, we have built a tool that automatically generates them with surprising ease. We explain how such attacks work, and why our tool, Einstein, calls upon both researchers and vendors alike to rethink their mitigation strategies.

Suppose you are a hacker and you just found a bug that allows you to overwrite data in a victim program. Such a scenario is not uncommon: Microsoft, Google, and Mozilla report that about 70% of their security bugs are indeed such memory safety bugs [1, 2, 3]. The question then becomes, as a hacker, how do you weaponize this bug into a real exploit?

In the past, it would have been relatively straightforward: you could, for example, use the bug to conduct a control-flow hijacking attack, overwriting code pointers in the program [4], forcing it to execute your own malicious code. However, due to decades of research (resulting in defenses such as DEP, CFI, CPI, etc.), it is now very difficult to divert a program’s control flow away from the code that it intends to execute. Hence, weaponizing the bug in such a way is now often infeasible in practice.

In our recently published paper at USENIX Security 2024 [5], we present a practical approach to an entirely different method of exploitation: letting the program execute all of its intended code (e.g., any benign functions, system calls, etc.), but with malicious data. These so-called data-only attacks have been known for quite some time [6], but were assumed to be too application-specific or complex to pose any practical threat [7]. In our work, we show that such assumptions are not justified. In particular, we implemented a scalable and automated solution, Einstein, that demonstrates that building data-only attacks is easy — well within reach of low-effort attackers. In this article, we will discuss the insights that allow Einstein to automatically generate such exploits with surprising ease, and the implications of our findings on software vendors.

An example data-only attack

Let us first walk through one of the classic data-only attacks described in the literature, which exploits a victim web server [6] (simplified for clarity). At start up, the server reads its configuration file to initialize its data. One such configuration option is the CGI-BIN path, which is the directory it uses to execute external programs. In our example, the server sets its cgi_bin_path variable to "/usr/local/server/cgi-bin". We assume that the server has a program in its CGI-BIN directory, sort_script, that a client can use to sort numbers. Moreover, the server has a memory safety bug that allows a malicious client to overflow some buffer and overwrite, for instance, the contents of the cgi_bin_path variable to "/bin":

Figure 1: An example memory safety bug that allows the attacker to modify the CGI-BIN path.

Of course, the low-level details of the memory safety bug could differ from this (e.g., it could be a use-after-free rather than a buffer overflow), but nonetheless, the question arises: how could an attacker weaponize such a bug? To answer this question, we will show first how the server interacts with a benign client, then how it interacts with a malicious client:

Figure 2: An example data-only attack that corrupts a server’s CGI-BIN path to execute arbitrary code.

After the server initializes (Fig. 2a), it begins processing requests. A benign client interacts with it as follows (Fig. 2b):

  • ➊ The client sends a “POST sort-script” request with the unsorted numbers “2 1 3” in the request body.
  • ➋ The server concatenates the CGI-BIN path and the request’s path to determine the program to be executed, “/usr/local/server/cgi-bin/sort-script”.
  • ➌ The server executes the program, i.e., the sort script, and passes in “2 1 3” as its input. It does so by invoking the execve system call, which instructs the operating system to run the script on behalf of the server.
  • ➍ The script sorts the numbers and outputs “1 2 3”, which the server forwards to the client in its HTTP response.

Let us now sketch how a malicious client could exploit this (Fig. 2c):

  • ➎ The client exploits the bug to set the cgi_bin_path to the string “/bin” (Fig. 1).
  • ➏ The client sends a “POST /sh” request with “touch /tmp/attacker-was-here” in the request body.
  • ➐ The server concatenates the CGI-BIN path and the request’s path to determine the program to be executed, “/bin/sh”.
  • ➑ The server executes the program, i.e., the system shell, and passes in “touch /tmp/attacker-was-here” as its input. It does so by invoking the execve system call, which instructs the operating system to run the shell on behalf of the server.
  • ➒ The shell creates the file /tmp/attacker-was-here.

There are two important takeaways here.

First, the victim server does not execute any malicious code provided by the client; all harmful actions are triggered by malicious data. The attack effectively modifies only the arguments of the execve syscall. Other than that, the benign and malicious executions are equivalent — when handling a request, the victim server performs the same steps, and executes the same functions, albeit with different arguments.

Second, this attack is very powerful, as it allows the attacker to execute arbitrary programs on the victim machine. In our example, the client only creates the file /tmp/attacker-was-here, but any shell command is possible, e.g., to install a malicious program or to exfiltrate data.

Why data-only attacks are considered difficult

Despite the discovery of data-only attacks almost two decades ago, conventional wisdom says they rarely pose a practical threat, either because they are too application-specific or too complex.

Application-specific. As pointed out by the authors of the example attack, building such an attack “require[s] sophisticated knowledge about program semantics”. In other words, an attacker has to become so familiar with the server’s inner-workings — either through reverse-engineering its code, or studying its protocols, etc. — that they know that out of all the program’s data, the cgi_bin_path variable specifically is security-critical, and that a POST request that is malformed in a very specific way can exploit it. In all likelihood, this kind of labor-intensive, application-specific analysis is prohibitively expensive, and hence, according to conventional wisdom, such data-only attacks are too niche to pose a practical threat.

Complex. Recent approaches to building data-only attacks foray into complex territory, under the assumption that simpler attacks — such as the example attack — are not generally at reach. In particular, they assume the need either to solve complex data-flow constraints using heavyweight analyses, or to deviate the victim program away from the code it intends to execute to circumvent a variety of defenses. Several approaches even go so far as to construct highly complicated, Turing-complete machines — something real-world attackers rarely need.

In our work, we show that these assumptions are all false:

Exploitation requires neither extensive knowledge of the program semantics, nor the solving of complex data-flow constraints, nor the diversion of the control flow in a complicated (or even any) way.

Einstein: “As simple as possible, but not simpler”

Inspired by the quote attributed to Albert Einstein, we present a simple (but not too simple) data-only attack exploitation pipeline, named Einstein, that builds attacks with surprising ease. It generates data-only attacks using an application-agnostic technique, proving that such attacks are well within reach of low-effort attackers.

Application-agnostic. Rather than attempting to understand application-specific semantics (e.g., the corner cases of the HTTP protocol), Einstein targets a universal interface used by any program to communicate with the operating system kernel: its syscalls. In particular, we track the data that ends up in syscall arguments, determining whether an attacker can corrupt them to e.g., execute arbitrary code via execve or modify files in the filesystem via write.

Simple. Moreover, Einstein abstracts away unnecessary complexities and, instead, targets the exploits that are not only the simplest to identify, but also the most promising for an attacker. In particular, Einstein automatically generates exploits for the security-sensitive syscalls along a program’s (already valid) runtime path, and whose arguments are (simply) copied verbatim from attacker-controllable data. As detailed later, this simple approach can automatically generate a surprisingly large number of practical data-only exploits in popular real-world programs.

How Einstein builds the example attack

To explain how Einstein works, we walk through each step of how it builds the example attack and how it crafts the arguments of a security sensitive system call. We assume that the attacker has access to a program that is equivalent to the one deployed by their prospective victim, so they can run the server locally for analysis. Einstein takes the victim program as input, and operates in two stages: first, it generates candidate exploits; and second, it confirms whether each candidate exploit is indeed a working exploit. For an explanation of the finer points of the design beyond the scope of this example — e.g., how Einstein tracks unbounded data, chains together multiple syscalls, etc. — please refer to our paper [5].

Candidate exploit generation. To generate candidate exploits, Einstein tracks all attacker-corruptible data at runtime, determining which can influence the arguments of security-sensitive syscalls. To facilitate this, we first start the server with Einstein’s binary-level instrumentation (Fig. 3a, ➊). The instrumentation adds support for dynamic taint analysis, which allows us to track any “tainted” program data at runtime [8]. The server starts up, initializes its cgi_bin_path, and starts waiting for requests. Einstein models an attacker exploiting the memory safety bug by uniquely tainting any data that it could potentially corrupt, e.g., the string “/usr/local/server/cgi-bin”, but also all other data within reach of it. Additionally, we record the tainted data in a memory snapshot (➋).

Next, Einstein continues executing the program and tracks how the tainted data propagates throughout the program’s execution as the server handles a workload consisting of benign requests (➌). For instance, it sends the “POST /sort-script” request from Fig. 2b. Then, while handling the request, the server passes the tainted string as an argument to the execve syscall. Einstein identifies this flow of attacker-controllable data into a security-sensitive syscall, and records information about it, such as the arguments and their taintedness (➍).

Then, Einstein determines that execve’s pathname and argv parameters are not only tainted with an identifier that corresponds to cgi_bin_path, but they are in fact identical to cgi_bin_path. We refer to this kind of (very) straightforward data flow as an identity data flow. Einstein builds a candidate exploit for the identity data flow by generating (address, value) pairs that specify that the memory write bug could exploit the execve by overwriting the cgi_bin_path from "/usr/local/server/cgi-bin" to "/bin" (➎).

Figure 3a: First, Einstein generates a candidate exploit.

Exploit confirmation. Even though we have identified an identity data flow from attacker data into a syscall argument, we are not guaranteed that it is necessarily exploitable. For example, before executing the file, the server may double-check that it is within some preset, hard-coded directory, thereby mitigating the vulnerability. Hence, we confirm whether each candidate exploit is indeed a working exploit.

To confirm the exploit, we first restart the server (Fig. 3b, ➏). Then, at the point where an attacker may exploit the memory write bug, Einstein overwrites the data that is specified by the candidate exploit, changing cgi_bin_path to "/bin" (➐). Next, we send a workload to exploit the gadget — in this case, a “POST /sh” request with a shell command to create a file (➑). Finally, Einstein confirms that the file is indeed created, thereby confirming that the candidate exploit is indeed a working exploit (➒).

Figure 3b: Second, Einstein confirms the candidate exploit to be a working exploit.

Evaluation

We have seen how Einstein can automatically build the example attack from almost two decades ago. Now, let us see how it performs against popular servers today. Although we follow previous work by targeting server applications, we note that other types of applications (e.g., those with more limited user-input interaction and few obviously dangerous syscalls) may well be at risk.

We target the web servers httpd, lighttpd, and nginx; and the database servers postgres and redis — all of which have been shown to be at risk of weaponizable memory write bugs. To generate workloads for the target servers, we use their test suites. Moreover, because nginx is a common target for exploitation case studies, we confirm the candidate exploits that Einstein generates for nginx.

We first refer to Table 1, which presents the number of attacker-tainted syscalls per target program, and the percentage of those that have an identity data flow from attacker data. We observe that an attacker may corrupt many security-sensitive syscall arguments, and (with the exception of postgres) the high rate of identity flows (84–98%) allows us to generate candidate exploits for the vast majority of them. We refer to our paper [5] for a full breakdown per syscall argument. Despite the test suites generating relatively low code coverage (27–49%), Einstein still uncovers many security-sensitive issues. Further work into increasing coverage would undoubtedly yield even more dire results.

Target program Security-sensitive syscalls with tainted arguments (% with an identity data flow from attacker data) Code coverage
httpd 1834 (97%) 27.3%
lighttpd 92 (98%) 27.8%
nginx 1623 (82%) 49.1%
postgres 2105 (27%) 46.5%
redis 218 (84%) 33.6%

Table 1: Number of attacker-tainted syscalls per target program.

Next, we refer to Table 2, which presents the number of confirmed exploits for nginx. We observe that the exploits offer many primitives to attacker: a vulnerable execve gives us a Code-Execution primitive, vulnerable file-configuring syscalls (e.g., openat) combined with vulnerable file-write syscalls (e.g., write) give us 17 Write-What-Where primitives, vulnerable socket-configuring syscalls (e.g., connect) combined with vulnerable socket-write syscalls (e.g., sendmsg) give us 41 Send-What-Where primitives, etc. We refer to our paper for a description of two such exploits that bypass state-of-the-art mitigations [5]. Despite conventional wisdom dictating that data-only attacks are too complex or too niche to be practical, we can conclude that an attacker indeed has a diverse set of primitives at their disposal against popular server programs, even today.

Attack Primitive Count
Code-Execution 1
Write-What-Where 17
Write-What 375
Write-Where 79
Send-What-Where 41
Send-What 372
Send-Where 59
Total 944

Table 2: Confirmed exploits for nginx.

Conclusion

We presented Einstein, a data-only attack exploitation pipeline, which automatically builds exploits against popular servers and bypasses state-of-the-art mitigations. The question, then, is how do we properly mitigate such attacks? To answer this, let us consider two features that a proper mitigation would provide: (1) comprehensiveness, i.e., mitigating an attack surface entirely; and (2) practicality, i.e., requiring little effort to deploy, and, therefore, being more amenable to practical adoption.

For control-flow hijacking attacks in the old days, the parameters were relatively well-defined: they would typically overwrite a code pointer, which would then corrupt an indirect branch (e.g., a return instruction). Hence, the mitigations for such attacks (e.g., DEP, CFI, CPI) can generally afford to be both comprehensive and practical.

On the other hand, data-only attacks present a unique challenge: they may overwrite any data (not just code pointers), which may then corrupt any operation (not just indirect branches, or even syscalls, for that matter). Hence, the mitigations for such attacks can generally afford only to be either comprehensive or practical. That is, comprehensive defenses (e.g., memory safety, DFI) are impractical, because they either incur poor performance or require onerous changes in the software or hardware. Meanwhile, practical defenses (e.g., memory error scanning, selective DFI, syscall filtering) are noncomprehensive, because, as Einstein demonstrates, they leave part of the attack surface vulnerable.

Generating exploits that trivially bypass the practical defenses, Einstein highlights that vendors should strongly consider deploying one or more of the comprehensive defenses. Vendors may also use Einstein to mitigate vulnerabilities on a case-by-case basis, however, a general solution — e.g., by making the comprehensive defenses more practical — poses a pressing direction for future research.

Appendix

References

[1] M. Miller, "Trends, challenges, and strategic shifts in the software vulnerability mitigation landscape," in BlueHat, 2019.

[2] Chromium, "Memory safety," https://www.chromium.org/Home/chromium-security/memory-safety/.

[3] D. Hosfelt, “Implications of Rewriting a Browser Component in Rust,” https://hacks.mozilla.org/2019/02/rewriting-a-browser-component-in-rust/, 2019.

[4] E. H. Spafford, “The Internet Worm Program: An Analysis,” SIGCOMM CCR, vol. 19, no. 1, 1989.

[5] B. Johannesmeyer, A. Slowinska, H. Bos, and C. Giuffrida, "Practical Data-Only Attack Generation," in USENIX Security, 2024.

[6] S. Chen, J. Xu, E. C. Sezer, P. Gauriar, and R. K. Iyer, “Non-Control-Data Attacks Are Realistic Threats,” in USENIX Security, 2005.

[7] R. Rogowski, M. Morton, F. Li, F. Monrose, K. Z. Snow, and M. Polychronakis, "Revisiting Browser Security in the Modern Era: New Data-only Attacks and Defenses," in EuroS&P, 2017.

[8] J. Newsome and D. Song, "Dynamic Taint Analysis for Automatic Detection, Analysis, and Signature Generation of Exploits on Commodity Software," in NDSS, 2005.

The Daily Front Page 15 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Encryption Omitted
article

Radicle: Disclosure of Vulnerability in the Network Protocol

by lostmsu·▲ 128 points·51 comments·radicle.dev ↗
All versions of Radicle that were released to date are vulnerable.

Summary

What happened?

Two critical security vulnerabilities in the network protocol used by Radicle nodes were reported.

Which versions are affected?

All versions of Radicle that were released to date are vulnerable.

What is the issue?

Network traffic between nodes is not encrypted and not authenticated. Authentication of repository contents via Signed References still detects if attackers along the network path between two nodes modify objects in transit. Thus, the main concern is information leakage, i.e., attackers along the network path between two nodes reading objects in transit. For public repositories, information leakage is less of a concern. However, encryption in transit is crucial for private repositories.

What should users do?

We recommend to stop using private repositories until a fix is released.

When will the fixed version be released?

Due to a lack of version negotiation features, combined with the fix being incompatible on the wire, a backward compatible mitigation is not feasible; that means the release to fix this issue will be breaking, thus bump the major version number. Work towards this is under way. With this disclosure, our goal is, first and foremost, to be honest and clear about the situation, so that users can assess and act accordingly, while we are working on a resolution.

The vulnerabilities

  1. The network protocol used by Radicle does not give the confidentiality it was expected to give. Anyone who can observe the network path between two nodes can read the data they exchange as the data is sent in plain text. This was reported to us by Konstantinos Maninakis on 2026-06-24. You can read his post about the issue at https://maninak.com/blog/radicle-cleartext-transport-vulnerability/. We reported upstream, see this issue.
  2. Peer authentication in the connection handshake is broken and allows impersonation. An attacker can connect to your node and present a Node ID that is not its own. Private repositories are shared only with allow-listed Node IDs. An attacker who fakes an allow-listed Node ID can fetch a private repository directly, without being on the network path. This was reported to us by cryptocode on 2026-08-12. We proposed a fix upstream, see this pull request.

The second flaw is harder to exploit on its own than it sounds. To impersonate an allow-listed Node ID, an attacker must first know one. The allow-list is not public, so an attacker who is not on the network path has to guess.

In practice, the two flaws are most useful when they can be exploited together: an attacker on the path sees the Node IDs at both ends of a connection, and both are normally on the allow-list. That attacker can read whatever is exchanged while they watch, and can then use a Node ID they saw to fetch the whole repository on demand. The realistic threat is anyone on the path between your node and node it syncs with, and no setting or allow-list protects against them.

We are publishing this before the security update is available. You can act on it today, and no fix we release later can undo an exposure that has already happened.

Workaround

  • Stop using private repositories (over the network) until the security update is released. Stop seeding private repositories, as described below. However, you may want to keep your private repositories in storage, i.e., not delete them entirely, so that you may start seeding them again once a fixed version is released.
  • Consider every private repository you have transmitted over the network to another node leaked. If it contained unencrypted credentials, keys, or tokens, rotate them.
  • Using additionally encrypted transports, such as Tor, I2P, or other overlay networks or VPN solutions are not sufficient to protect your data. They hide network traffic from an attacker along the network path between two nodes. Even though that limits the attack surface, this does not prevent peer impersonation, and a targeted, sophisticated attack might lead to exfiltratation of the contents of private repositories.

How to stop seeding private repositories

List the private repositories in storage:

rad ls --private --all

Change the seeding policy of very individual repository to “block”:

rad block <RID>

Note: We recommend to use rad block instead of rad unseed, in case the seeding policy of your node is set to allow.

rad unseed removes the seeding policy for a repository, and your node then falls back to its default policy. The default is block, so on a default configuration rad unseed is enough. If you changed the default seeding policy to allow, your node keeps serving the repository after you unseed it. rad block sets an explicit block, which the node checks first, so it works either way.

To stop the node completely:

rad node stop

Three limits on what this achieves:

  • It stops your node from serving the repository. It does not delete your local copy. The copy stays in $(rad path)/storage/<RID without the rad: prefix>. Remove that directory only if you understand you are deleting the repository and every fork of it that you hold. If in doubt, do not delete from storage.
  • It does not reach copies that authorized peers already fetched. Those peers still hold the data, and their nodes have the same flaws. Ask them to block the repository too.
  • It does not undo past exposure. Data that has already synced over the network should be treated as disclosed.

What is affected

Both flaws are in the node transport layer, not in the repository data model. Git objects and signed references are verified at the storage layer as before. An attacker cannot forge code or identities.

The confidentiality flaw has been present in every Radicle version released to date.

Resolution

We are actively working on a resolution.

The resolution involves replacing Radicle’s networking protocol (currently a custom protocol using Noise) with iroh, an open source peer-to-peer networking stack built on open standards. We already shared out plans to migrate, and the vulnerabilities have given us all the more reason to move forward with this. Beyond addressing the vulnerabilities, iroh brings additional features like NAT traversal which improve the reliability and resilience of the Radicle network.

Such a change to the network transport is by its nature backwards-incompatible. As such, it causes the network to partition into the upgraded and non-upgraded clusters that can not communicate with each other.

Even though this means a major release, we are working to make the upgrade path as smooth as possible, by focusing breakage on the network end, keeping storage layout compatible.

Acknowledgements

We would like to thank Konstantinos Maninakis and cryptocode for responsibly disclosing these vulnerabilities to us and staying in touch.

If you would like to report a security issue, please refer to https://radicle.dev/.well-known/security.txt.

The Daily Front Page 16 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Cost of Signal
article

UK military jamming other nations' satellites to defend itself, BBC told

by thm·▲ 145 points·193 comments·bbc.com ↗
The British military has been jamming or blocking satellites from other countries in order to defend itself.

Getty Images Stock image of the UK Space Command badge stitched onto the arm of a soldier

It comes as the UK unveils a new unit dedicated to defending the UK's satellites in space - named the Space Effects Squadron

The British military has been jamming or blocking satellites from other countries in order to defend itself from hostile threats, the BBC has been told.

The RAF has been using a ground-based system for the past year, which a defence source said had already been used "to deter our adversaries".

It is understood the system could be used to prevent a hostile nation's satellites from tracking the movement of the UK's nuclear armed submarines or other sensitive military operations, such as those involving special forces.

It comes as the head of the RAF said the UK faced "unprecedented threats" from adversaries in space, coinciding with the creation of a new RAF unit set up to defend Britain's satellites.

The Ministry of Defence (MoD) said the new Space Effects Squadron will be focused on "disrupting, degrading and denying hostile threats in space".

The squadron will protect British satellites used to warn of incoming missile attacks, provide communications and help guide ships, the MoD said.

In a speech on Wednesday, Defence Secretary Wes Streeting said daily lives depend on satellites that power everyday technologies like mobile phones and banking apps, adding the loss of GPS would cost the UK economy £1.4bn a day.

"Our dependency on space is precisely why it is increasingly under threat from our adversaries." he said.

"We depend on them for everything from weather forecasts, energy supplies, and financial transactions to sat-navs, mobile phone connections, and Amazon deliveries," said Streeting, adding that the loss of "everyday conveniences would undermine our daily freedoms, and trust in our institutions."

Speaking at the UK Space Conference, Streeting said the threat from Britain's adversaries was growing in "scale, speed and sophistication", adding that the "challenges in space increasingly mirror the geopolitics on Earth".

A number of nations are believed to have similar ground-based systems against satellites. Last year the then head of the UK's Space Command said Russia was trying to jam UK satellites with ground based systems "every week".

The defence source described the UK's terrestrial electronic warfare capability as "world leading, and more".

Last week US confirmed for the first time that it had also deployed an unspecified "weapon" in space to defend its own satellites.

Both China and Russia condemned the move - warning of an arms race in space.

However, Washington has already accused both Russia and China of developing their own space weapons - ranging from electronic jammers, lasers to blind other satellites and even projectiles that can be fired from satellites in orbit.

Getty Images Mid-shot of Air Chief Marshal Sir Harvey Smyth taken in July 2026. He is looking off-camera and speaking behind a podium with a microphone. He is wearing a navy blue military uniform with golden tassels across his shoulder.

Air Chief Marshal Sir Harv Smyth said there were "more and more irresponsible and provocative actions" from the UK's adversaries.

In May, the RAF tracked a series of "dangerous manoeuvres" by five Russian satellites moving close to two Finnish commercial satellites. The RAF's Air Chief Marshal Sir Harv Smyth said in June that a Russian satellite constellation had caused disruptions to GPS signals across Europe and Canada.

The UK has a handful of military satellites in orbit for surveillance and military communications. But it works closely with the US Space Force - which has many more.

In a separate speech at the space conference, ACM Smyth added that "unfortunately we are seeing more and more irresponsible and provocative actions from our adversaries".

ACM Smyth warned that without satellites, some of the technologies people take for granted would be lost and would make every sector "less efficient, less prosperous and less secure".

"Sat-nav systems would fail, congestion on our roads would be severe and our emergency services would take longer to help those in need," he said, adding that satellites are also needed to monitor the weather and the effects of climate change.

The Daily Front Page 17 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Management, Without the Autopsy
article

I don't want the details

by mooreds·▲ 379 points·205 comments·michaelheap.com ↗
Michael, I don't want the details.

A few months ago I was dragged into a call with my engineering counterpart and their boss (who happens to be our SVP of engineering). Something had gone wrong that shouldn't have. Nothing catastrophic, but important enough that I was now on a call with an SVP.

I started to explain how it happened when they cut me off with "Michael, I don't want the details".

They continued:

I know that if we get into the details, the reasons will be perfectly reasonable. You'll explain what happened, I'll understand why everyone made the decisions they made, and I'll empathise with you.

Then it'll happen again.

So I don't want the details. I want to know what we're changing.

At first I thought "I don't want the details" sounded dismissive. How can they make informed decisions without understanding the details?

Then I realised that "I don't want the details" wasn't being dismissive. The executive assumed that we were competent, and was saying "I already believe you. Now let's talk about what happens next".

Asking the right question

After something goes wrong, most organizations ask "Why did this happen?" This is a question we're all familiar with answering.

We write up timelines. We reconstruct decisions. We explain dependencies. At the end of it, we hand over a document that contains the specific combination of events that led to the incident.

Everyone nods their head, says "that makes sense", and we all move on with our day.

Understanding an issue is not the same as fixing it. A good explanation can make things worse. Once everyone agrees that the behaviour was reasonable, the urgency to change anything disappears.

When an incident is an unfortunate but understandable sequence of events where no-one is at fault nothing changes. Then the same thing happens six months later, and everyone is left wondering how we landed here again.

To drive change in your organization, don't ask "why did this happen?".

Instead, ask:

What are we changing so that the same class of failure is less likely next time?

Reasonable people

The SVP wasn't interested in understanding how the issue happened or who was involved. They didn't want to be convinced that everyone involved behaved reasonably. That's a baseline expectation.

Their question became:

“Given that reasonable people produced this outcome, what needs to change?”

Consider these examples:

"We missed it because Alice was on holiday and Bob thought the Widgets team owned it".

Okay. How do we make ownership unambiguous when someone is unavailable?

"The requirements changed three days before launch."

Of course they did! What happens when requirements change inside the launch window?

"The alert fired, but the on-call engineer had already dealt with twenty low-value alerts that evening".

Makes sense. How do we improve the signal to noise ratio of our alerts?

Focus on changing the system. The people are usually not what needs changing.

A good explanation is not a fix

If your postmortem is full of sentences like "we should involve support earlier" and "we need to communicate better", or my personal favourite, "we'll be more careful next time", you have a collection of hopes dressed up as progress.

If your corrective action depends on people remembering a conversation from six months ago, you don't have a corrective action. You have organizational folklore. If everyone involved in the incident left the company tomorrow, would the fix still work? If the answer is no, the people may have learned something while the system is still destined to fail.

For a postmortem to drive lasting change, ask:

If the same situation happened tomorrow, what would cause a different outcome?

A process that forces a decision at this point is an improvement. A system that prevents this class of mistake is stronger still.

Process for process' sake

You can take "the system prevents this class of mistake" too far.

Not every failure deserves a new process. That's how you build environments that no-one wants to work in. Sometimes the cost of preventing recurrence is higher than the cost of occasionally accepting the failure, and that's ok.

But you need to accept failure with your eyes open. "We are consciously accepting this risk" is very different from "we said we'd try harder and everyone felt better".

Trust

I still think about what the SVP said a lot. What sounded like impatience was a declaration of trust. They didn't need me to prove that the people involved were competent or well intentioned. They were willing to start there. If the investigation showed otherwise, we could deal with that separately.

What they didn't want was for empathy to become the mechanism by which the organisation absolved itself of having to change.

People are usually making the best decisions they can with the information, incentives and constraints around them. That's why fixing the people is often the wrong answer.

Sometimes the most useful thing a leader can say is:

I believe you. I don’t need the details. Tell me what we're changing.

The Daily Front Page 18 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Long Vacancy
article

28% of job postings on company career sites have been open over 90 days

by rubatrejo·▲ 250 points·311 comments·unlisted.careers ↗
28.3% of open job postings have been up for more than 90 days.

28.3% of open job postings have been up for more than 90 days.

Measured across 607,050 postings open on 15 applicant tracking systems, read directly from each employer's own careers site. Age uses the date the employer published, available on 95.0% of postings. The median open posting is 36 days old.

Computed September 23, 2026 from a sweep that began August 24, 2026, 29 days earlier. Closure figures are bounded by that window and say so below.

163,057

postings open more than 90 days

28.3% of the dated postings. 94,106 have been up more than 180 days.

36 days

median age of an open posting

Half the catalog was published more recently than this, by the employer's own date.

14.6%

of closed postings came down within a week

13,013 of 88,895 closures in the last 30 days. A posting that disappears in days was real.

4.2%

of closed postings were reposted within 30 days

3,915 of 94,333: same employer, same role, back as a new posting after the close.

How old the open postings are

Every dated open posting, by the time since the employer published it. The two right hand bands are what this report calls stale.

Age Share Open postings
Under 30 days 45.1% 260,305
30 to 60 days 17.1% 98,473
60 to 90 days 9.5% 54,850
90 to 180 days 12% 68,951
Over 180 days 16.3% 94,106

By category

Hospitality postings sit the longest: 43.9% have been open more than 90 days, median 65 days. Healthcare turns over fastest at 19.7%.

Category Share over 90 days Median age Open postings Salary stated
Hospitality 43.9% 65 days 23,639 33.0%
Education 37.4% 56 days 8,928 51.5%
Other 35.3% 48 days 61,538 31.0%
Engineering 32.3% 46 days 69,017 32.5%
Design 31.5% 47 days 4,733 32.6%
Skilled trades 29.5% 37 days 44,283 44.2%
Product 29.4% 44 days 6,680 39.0%
Operations 29.3% 37 days 40,041 34.4%
HR & people 29.2% 35 days 6,323 32.0%
Logistics 27.3% 30 days 28,881 48.6%
Customer support 26.6% 32 days 10,023 46.1%
Marketing 25.9% 37 days 12,263 34.6%
Sales 25.5% 34 days 51,099 40.7%
Data 23.6% 34 days 13,205 32.9%
Finance 23.5% 33 days 20,517 35.1%
Legal 22.0% 34 days 8,367 39.4%
Retail 20.1% 24 days 41,677 51.0%
Healthcare 19.7% 29 days 68,283 47.6%

By applicant tracking system

The system an employer posts through says a lot about how its postings age. Lever boards carry the largest stale share at 48.2%; Workday the smallest at 17.2%. Pinpoint, Personio, Y Combinator publish no posting date, so their age cannot be measured and is not guessed.

System Share over 90 days Median age Open postings
Lever 48.2% 83 days 1,871
BambooHR 47.9% 79 days 64,151
Recruitee 45.3% 82 days 596
Teamtailor 42.3% 64 days 45,698
Rippling 38.6% 61 days 16,339
Workable 38.2% 51 days 5,755
Breezy 36.7% 55 days 25,124
Ashby 34.8% 54 days 13,899
Greenhouse 32.1% 47 days 52,589
SmartRecruiters 27.0% 35 days 73,024
UKG 26.7% 35 days 51,130
Workday 17.2% 26 days 226,520
Pinpoint no posting date no posting date 15,691
Personio no posting date no posting date 11,018
Y Combinator no posting date no posting date 3,645

By country

The fifteen countries with the most open postings, by how their postings age and how often a salary is stated. The full thirty are in the CSV.

Country Share over 90 days Median age Open postings Salary stated
United States 26.2% 34 days 334,681 50.7%
United Kingdom 26.8% 36 days 29,629 36.9%
Canada 27.6% 36 days 21,977 48.8%
Germany 31.7% 54 days 20,286 3.9%
France 32.6% 48 days 19,030 15.9%
India 25.9% 33 days 14,287 1.9%
Sweden 40.9% 51 days 11,774 0.4%
Australia 21.5% 28 days 7,872 14.7%
Spain 34.3% 50 days 6,367 9.3%
Singapore 26.3% 37 days 4,792 4.2%
Brazil 27.4% 39 days 4,153 13.8%
Mexico 29.7% 41 days 3,858 17.2%
Netherlands 39.2% 64 days 3,525 27.9%
Poland 28.8% 42 days 3,516 4.2%
Italy 25.8% 29 days 3,446 42.7%

The employers with the most open postings

The twenty employers with the most postings open on their own careers site, and how many of those have been up more than 90 days. A long open posting is not proof of anything on its own: some roles are evergreen, some employers hire in volume all year. This table reports the rate and links every name to its postings so you can check them at the source. Employers appear above 50 open postings only.

Employer Open postings Share over 90 days Median age
O'Reilly Auto Parts 14,320 45.6% 77 days
CVS Health 14,195 5.1% 22 days
Lowe's 12,225 0.0% 22 days
TJX Companies 10,157 14.0% 22 days
Accenture 4,270 3.4% 13 days
Whataburger Restaurants 4,184 83.9% 239 days
JLL 3,766 0.0% 15 days
PACS Group 2,786 1.1% 22 days
AdventHealth 2,778 0.0% 9 days
Genuine Parts Company 2,762 0.0% 22 days
ABB 2,757 5.2% 21 days
Kohl's 2,670 0.0% 23 days
Curtiss-Wright 2,667 0.0% 23 days
Dick's Sporting Goods 2,665 0.0% 23 days
Hitachi 2,649 0.0% 26 days
Mercy 2,634 0.0% 28 days
American Logistics Authority 2,597 100.0% 308 days
Booz Allen Hamilton 2,218 0.0% 26 days
GE Vernova 2,076 10.9% 21 days
MUSC 2,071 20.2% 37 days

Fastest to take a posting down

Employers whose postings close soonest after publishing, by median days from posting to removal over the last 90 days. At least 30 closures each.

  1. Worldpay — 2 days, 38 closed
  2. Phoebe Putney Memorial Hospital — 2 days, 35 closed
  3. OCE1003OCNS — 3 days, 41 closed
  4. The Works — 4 days, 103 closed
  5. Diamond — 5 days, 100 closed
  6. Grady Memorial Hospital — 5 days, 42 closed
  7. Pinnacle Treatment — 5 days, 33 closed
  8. Clera — 6 days, 681 closed
  9. BBVA — 6 days, 602 closed
  10. Weekday — 6 days, 318 closed
  11. Wellstar Health System — 6 days, 177 closed
  12. MSKCC Primary — 6 days, 38 closed
  13. Pluxee — 6 days, 35 closed
  14. EWOR GmbH — 7 days, 493 closed
  15. UofL Health — 7 days, 155 closed
  16. Parkland — 7 days, 88 closed
  17. Kaweah Health — 7 days, 68 closed
  18. ProMedica Central Physicians — 7 days, 52 closed
  19. Air Products — 7 days, 45 closed
  20. Maslow Group — 7 days, 44 closed

Every posting states a salary

Employers with 50 or more open postings where the largest share carry a stated salary. Sorted by share, then by size.

  1. Kimmel & Associates — 100.0%, 405 open
  2. Relativity Space — 100.0%, 335 open
  3. NYU Langone Health — 100.0%, 316 open
  4. Children's Hospital — 100.0%, 311 open
  5. 4th Day Trucking — 100.0%, 303 open
  6. DIG INN Chefs-In-Training — 100.0%, 302 open
  7. Nfamilyclub — 100.0%, 271 open
  8. MINK Life & Legacy Agency — 100.0%, 242 open
  9. Chevron Stations — 100.0%, 238 open
  10. 10-4 Truck Recruiting — 100.0%, 226 open
  11. American Transport Team — 100.0%, 220 open
  12. Hillstone Restaurant Group — 100.0%, 211 open
  13. Chess Wizards — 100.0%, 208 open
  14. Comprehensive Rehab Consultants — 100.0%, 200 open
  15. Flexport — 100.0%, 194 open
  16. Ensemble Performing Arts — 100.0%, 193 open
  17. Nexploreusa — 100.0%, 183 open
  18. Alchemy Financial Group — 100.0%, 177 open
  19. XP Inc. — 100.0%, 171 open
  20. Meron Financial Agency — 100.0%, 170 open

Closures and reposts

88,895

postings removed from their employer's site in the last 30 days

14.6% came down within a week of publishing and 30.8% within two.

24 days

median time from publishing to removal

Over postings that closed in the last 90 days. Ninety percent closed within 113 days. We have watched for 29 days, so the true medians can only be longer; this is a lower bound.

4.2%

of closed postings came back within 30 days

3,915 postings closed and the same employer published the same role again. A further 4,576 open postings were closed and reopened in place.

Definitions and method

Stale

A posting the employer's own careers site has shown open for more than 90 days, counted from the date the employer published. This report never calls a single posting a ghost job. It reports rates.

Repost

A posting that closes and comes back within 30 days as a new posting for the same role at the same employer, matched on the normalized title and description.

Where the data comes from

Unlisted reads the public APIs of the applicant tracking systems employers post through, board by board, every few hours. Nothing is scraped from job boards and nothing is estimated. Every posting counted here was open on its employer's site when the report was computed.

What it cannot say

Whether an employer that keeps a posting up is still interviewing, and how long the same postings stay on LinkedIn or Indeed after they leave the source. We only see the source. Closure times are bounded by how long we have been watching, and the report says so wherever it prints one.

Download the tables

Each table on this page as a CSV, with company rows linked to their catalog page.

Quoting this report

Free to quote and reproduce with a link to this page. Suggested citation:

Unlisted, Ghost Jobs Report, September 2026. unlisted.careers/ghost-jobs/report/2026-09

Questions about the method, or a figure you want cut differently: hello@unlisted.careers.

The Daily Front Page 19 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Choosing People
article

Side-stepping the Secretary Problem, unwittingly

by pvdebbe·▲ 95 points·16 comments·evalapply.org ↗
Memory fades fast. So, take what is useful, discard the rest.

Author's non-apology-cum-warning: Various versions of this screed have befallen various people...

… since—gulp, where did time go?—about 2015. This current version befalling your XML/RSS feed is 2024 vintage, and has also befallen others via acts of copy-pasta into gist/slack/zulip/discord. Since nobody has boo'd it yet, and I'm not sorry (yet), it hereby gingerly enjoins the public discourse.

Memory fades fast. So, take what is useful, discard the rest.

And yes, I love em dashes. Deal.

The Secretary Problem

"How many applicants do you need before you find the right one? One? Five? The entire community, every time? :laughcry:"

— A fellow slacker in the Clojurians Slack.

The asker isn't joking. Any proposal to use unfamiliar technology, especially programming languages like Clojure inevitably triggers managerial hand-wringing about the hiring pool.

And what could cause more Managerial Hand Wringing than than trying to hire in a niche of a niche… You see if you can go back to 2014 and find QA people, in Pune/India, willing to learn to read and write Clojure code, to help backend engineers test a rather large SaaS, written in Clojure?

I got to know of the so-called "Secretary Problem" 1 in the ensuing discussion. The problem statement is used to study Optimal Stopping Theory. It sets up a recruiting scenario, and explores how to maximize the odds of selecting the best applicant. It has been a fun rabbit hole to explore.

Story of bypassing the Secretary Problem

A key constraint of the secretary problem is Once rejected, an applicant cannot be recalled.

Once upon a time, my colleague, Mayank, and I violated this unknown-to-us constraint, in our otherwise-conventional tech hiring loop by:

  • Not only explicitly keeping the door open for re-applications, after a cooling-off period.
  • But also offering to help people learn stuff we were interested in hiring for, on an opt-in basis. We would send people curriculum and make ourselves available for office hours on a fixed weekly schedule, to those who showed interest in learning.

Over about late 2013 through 2014, him and I were hiring for programmers for our QA team (which was him and I :) at helpshift.com, a Clojure-happy startup. We wanted curiosity-driven people with enough technical proficiency that we could teach and train, because we were writing test tools and suites in Clojure. Not to mention all sorts of impractical to automate manual testing of our systems, which demanded some baseline capacity to wade through reams of technical manuals and documentation, and the desire and ability to learn and use our cli tools, scripts, and configurations, if not craft them.

We knew the tester-programmer combo is a tough ask in the first place, especially in India, where the hiring pool is almost entirely filled with manual-only testers 2. So we had braced ourselves for a noisy pipeline.

In this context, I figured it would be crazy to lose anyone with potential. In my previous career, as a business manager, I had seen companies lose candidates with exactly the right life experiences, but the wrong degree or pedigree or test score. So I spitballed the idea to offer reapplication + opt-in support. My colleague loved the idea, and so it was.

Luckily, the company culture was already about "nontraditional" hiring, looking for diamonds in the rough, so to speak 3. And since we didn't have an HR function, the two of us were left to our own devices.

In hindsight, having to go through HR, however supportive, would have been horrible because we would have had to compromise by saying something like "Oh so sorry this time, but you are part of our candidate pool and we will be in touch, pinky promise. Later. You can also try to reapply after six months".

Having known such rejection emails, and the following perpetual silences as well as black holes of re-application, I read those types of rejection emails as garden-variety weasel-wordy ass-coverage. Benign self-deceptions, at best. Be real… nobody from your org is ever going to follow up on that. And if I have no signal about why someone would listen to me again after a mere six months, I, the hopeful candidate, will not waste time re-applying. So don't set up those expectations.

Immediate and five-year outcomes

Direct outcomes

Over the year or so that we ran our interview loop;

  • We landed five hires out of about 300 inbound.
  • Each person became productive quickly (about a month) in our corner of the little open plan office. Three lapped up Clojure, two moved to mobile SDKs (installed base of 2 Billion devices as of 2017).
  • Each of them further grew way beyond our expectations and moved to other roles like back-end development and product management, when a company-wide re-org did away with a discrete QA function.
  • A pretty good retention rate, for VC-funded high-growth startups… All of our people became tenured staff (four to ten years each).

Indirect outcomes

Every single such hire further converted their input into fast-growth startup careers in-house, and elsewhere, as well as startups of their own.

Most of the credit for career growth and retention goes to the engineering culture built and nurtured by all of m'colleagues.

Hiring people with potential is critical, but it's only the beginning. All the work they did, actively helped these early hires acquire professional skills that helped them step out and do what they are doing.

We also indirectly hired at least one kickass engineer (who also became tenured), because of the good word-of-mouth our approach earned (which we did not anticipate, but it happened). He was blown away by the learning support we offered his wife, whom we had screened, who opted into our office hours, and whom we didn't end up hiring.

The One, actually Several, Weird Tricks

Getting Lucky

With 20/20 hindsight, I wonder if our approach would run into some HR or legal quagmire (Like, would it creat an implied commitment to hire if <criteria> are met, and if we don't then would we run afoul of some arcane labour law?). Anyway, we just did it because we could, and I'm glad we took our chance. I wish this was the default way to hire.

Refusing to copy the Zero-sum FAANG Hiring Loop Playbook

Common experience is that typical recruiting funnels yield one final offer/acceptance for every 10 applicants (in that ballpark). This suggests that in a global market, if everyone uses typical recruiting methods—"We have 5 rounds because <insert FAANG> has 5 rounds; which is proof that it is best practice."—the small fry will always lose to the big fish because you simply cannot allocate enough resources to absorb the damage of such an abysmally noisy pipeline.

Said another way, the main problem of normal hiring practice seems to be that, we play it like a zero sum game even though it is an adverserial game.

  • We have no objective standard to determine observed quality.
  • We don't usually know the n a-prioiri… how many applicants should we assume constitute our applicant pool for a given role?
  • The applicants do not reach us with uniform probability, and we cannot interview them all with the benefit of hindsight.

Running a tight, humane hiring loop: Max 24 hour SLA. Always Be Kind.

This one choice, I will take credit for being firm about at the outset, having hired people before, and having been fully convinced of speed as a core value of hiring, by Kayak's erstwhile CEO, Paul English 4. His "SLA" is seven calendar days (not seven business days) from getting to know about the existence of a candidate, to making a firm offer.

We got accustomed to receiving "Thank You" emails in response to "Regret" emails we sent out after people had passed through three of our four to five step filter pipeline (nb. a "step" in this filter pipeline does not equal "one to several hours long interview stage"). I attribute this mainly to our turn-around times, and clear communication. Any recruiter reading this, please meditate on this fact of life.

Here is an assorted recollection of the collection of rules we cooked up and/or evolved over the year we ran our loop:

  • Set clear communication expectations with candidate: We promised a max 24 hours turn-around time to candidates. We explicitly asked them to ping us if they did not hear within 24 hours. 5

  • Never ghost anybody. We both hate being ghosted in any sort of communication, not just hiring. Hearing a quick "no" is much, much better than hearing a "yes, but" after three months of being strung along multiple interview stages.

  • Ruthlessly protect our own brain-cycles:

    • Context is King. Route all communication through the ATS. Immediately create a note of the "why" of our vote/decision at each stage for each candidate. Just like good commit message hygiene. If by-chance either one of us spoke with some candidate out-of-band, we would immediately drop a note in the ATS. A dedicated browser tab was always open on both our laptops.
    • Synchronous calls and/or on-site interviews cost us heavily, by interrupting our own ongoing QA work. Ensure we always do these last, and always individually. This forced us to figure out early on precisely what to communicate, what our stage-by-stage checklist should be, what signals to look for, how to set up our templates and stages in the ATS, how to register votes etc.
    • Run all individual phone calls by a playbook for that call. Terminate the call early if it is going badly. Have a practiced, clear, and kind way to end it. Having the "open door" policy helps. So does having a structured Q&A + decision-rubric for each question.
    • Keep tuning our workflow for maximally async communication and decision-making criteria. Our mutual, written-down, check-listed clarity helped us independently decide and act within seconds and minutes–vote / reject / move forward—of noticing some change in the ATS.
    • Be diligent about our 24 hour communication SLA. Slow turn around times create piles of "candidate inventory" that force us to stop what we are doing and attend to the queue. In a fast-paced startup this never happens because everything is always on fire, and so candidates languish in ghosting-hell.
  • Protect their time:

    • Much of this benefit to candidates falls out of protecting one's own brain cycles.
    • Additionally, waiting for replies sucks for candidates. Therefore, never give out coding assignments that take candidates hours to do, because it is a burden on their time, and it also means we need hours of careful reading to review the code. Large coding assignments are horrible signal-to-noise ratio tools. Any coding assignment should be a fifteen-ish minute job for the career level of the candidate. Because as soon as they send it in, a reviewer will know in one look whether to issue a reject, or what to ask them next. By default, our immediate request would be to refactor the solution using a totally different design.
    • Some copying was assumed. Being transparent and up-front about said copying was demanded. A clearly-stated deal-breaker and firing criterion, to the candidate—if we ever learned at any point that they copied stuff and didn't disclose it (yes, even after they were hired and working full-time).
    • In practice, code review turn around time of minutes often let us make go/no-go decisions fully async within the same day. This is just concurrent programming 101.
    • As you will see this also feeds back into "ruthlessly protecting our brain cycles". It's great when these two mechanisms feed-back positively into each other.
  • Prize written communication and reading comprehension:

    • All primary screening over email, including the coding assignment, Q&A about the coding assignment, and refactoring of the solution.
    • All emails would require the person to think about something relevant to that stage and provide us a short written answer.
    • Our very first email would enumerate potential deal-breakers the candidate should consider for themselves. Such as, mandatory requirement to learn Clojure programming, potentially arriving a rung or two lower in a reporting hierarchy ("programmer" instead of "manager"), ballpark compensation budget, growth and promotion prospects, on-call expectations, strictness of per-commit code review culture etc… Little aspects of live culture that add up and have people say "no". (nb. We were not allowed to disclose salary band and compensation up-front, but I firmly believe disclosing this would be best practice. Promising candidates drop out at salary negotiation, which is an incredibly expensive place to lose them.)
  • Filter for initiative and curiosity:

    • Dig for legitimate self-driven study and project work, of any shape or form. Github portfolios and personal websites are not automatically-good signals. They are entry points to the digging.
    • Try to understand the "why" of the candidate. What animates them? Craft interview questions appropriately.
    • Offer "office hours" support to all maybe-yes candidates that we said "no" to.
  • Async decision-making protocol:

    • Only two "Yes" votes progresses to the next stage.
    • One Yes, one No = Reject (Two nos = Obviously Reject).
    • Both votes must be registered in the ATS within 24 hours.
    • Immediately send +2's to the next stage. Whichever of us registered a second +1 immediately chose an email template we had crafted for the purpose, in the ATS. We also fixed templates on the fly and/or created alternate versions for subtly different responses needed at the given stage. No mutual permission necessary.
  • Err on the side of false negatives:

    • After our rounds, we would chat for a few minutes and pass on only those we felt "hell-yes" about, to the "CXO interview and offer stage".
    • Our open-door policy let us say no safely, and quickly, to "oooh, almost… aaalmost there" candidates, because our approach respectfully held the door open to them to surprise us (and themselves) at any time thence.
    • We would often use the first-contact phone call to coach away people. Make them really think about why they are changing roles. Not infrequently it is because they had not even considered trying to change their situation at the current job. Prompting people to exercise initiative is a good thing. We wanted people who would not be the silent suffering type, because that way lies stagnation and decay. We wanted to have a professionally satisfying workplace. That means deliberately overcoming friction, and discomfort. If they really tried, and it didn't work out, then they knew our door was always open to talk again. (This feeds back into protecting their time + brain cycles and ours.)

This is all for now. I hope it helps someone out there. I'd love to discuss this, over email.

_\\// Live Long, and Prosper.

Footnotes

  1. To quote the wiki page for the Secretary Problem:

    The secretary problem demonstrates a scenario involving optimal stopping theory that is studied extensively in the fields of applied probability, statistics, and decision theory. It is also known as the marriage problem, the sultan's dowry problem, the fussy suitor problem, the googol game, and the best choice problem. Its solution is also known as the 37% rule. … The question is about the optimal strategy (stopping rule) to maximize the probability of selecting the best applicant.

  2. As far as I can tell, most of the talent pool works at IT services companies, where they tend to gravitate toward managerial roles because that is the main way to succeed in IT services. This trend spills over into product-based companies too, because that is the de-facto industry norm. Sadly, testing jobs are low status here (which blows my mind; rant for later). "Technical" people run away from the "QA" or "Tester" label, and testers tend to actively avoid "technical" roles—it is legitimately too much work for too little payoff. Consequently, entry-level testers don't have career incentive to master programming, and experienced ones would rather be managers than hands on practitioners. This is not to ding anyone—one has to put food on the table, and a job is a job—it's just how things were, and probably still are.

  3. We had no choice, really. Pune city is full of IT service companies, but almost no software product culture. So, its hard to find people crazy enough to take large pay cuts, eighty hour weeks, and no prospects of managerial growth, in exchange for borderline-vapourware stock options. No, this is not a city of such believers.

    It was not in the 2010s, and not today. Bangalore (now, Bengaluru) was the place even back then. Now, more so; the kind of atmosphere that sustains regular monthly Rust meetups, despite the ongoing peak AI meetup frenzy. IYKYK.

    'ooru, the kind of coffee culture where not a few months ago, in 2025, a junior barista at a pretty normal Starbucks breezed past my bar-stool perch, did a double-take and asked me if I was a DevOps person. My terminal screen was open, with some stacktrace. Under-caffeinated, I fumbled my answer and asked "Oh, are you a DevOps person too?". Too quickly, and with a bright smile, he answered "Oh no Sir, Data Science." The raw speed of his reply awoke me to my place in the pecking order.

    BLR, the playground of SaaS (now AI) dreamers, where eavesdropping in popular coffee shop chains, surfaces hiring pitches, VC pitches, LP pitches, stand-ups, retrospectives, product sales pitches; doing so in the selfsame brand-name coffee shop chains in Pune routinely yields college homework discussions (it's a student town), middle-aged friends and family gossip, snoozefest dates, the occasional arranged marriage family meet and greet, and plenty of Multi-level Marketing pitches. Three-people-to-a-little-round-table configurations. Hapless victim being "Introduced" to an "entrepreneurship opportunity" that will save them from their dead-end service jobber life (yes, this sort of thing is actually the opening pitch). The Introducer a.k.a. leech-in-progress. Introducer's "boss" / uber-leech / authority figure.

    Although, not to dunk on my otherwise-cromulent home city too much… Since the ZIRP era came into its own, it has been really hard to tell the two species of snake-oil sales people apart. Almost everyone in both groups seems to be playing the rug-pull game… Who will be the poor sod left holding the bag at the end of the game? And, on more than one occasion the Pune-local eavesdropping paid off somewhat. I did end up referring a few smart, self-driven, ambitious undergrad programmers to m'colleagues at Pune-local startups, for internships. Of course, being smart, self-driven, and ambitious, they self-moved to Bangalore for full-time jobs afterwards. GenZ knows where the money at.

  4. Episode 101: Masters of Scale Always be recruiting: Kayak’s Paul English https://mastersofscale.com/paul-english-always-be-recruiting/

    Paul English, co-founder of travel search platform Kayak, guides us through five critical lessons for the hiring journey. As you’ll hear, English is passionate and relentless about the subject of recruiting – and the scale of the stakes.

  5. This never happened. We were both diligent about upholding our SLA—at every step of our pipeline for every single candidate. Most received same-day responses. Everybody received at-most next-day responses. Meanwhile, our pace at work did not stop or let up and we were not putting in extra hours on account of our additional hiring responsibilities. We were both busy working through some pretty hairy QA problems, given how sophisticated, and fast-changing the Helpshift SaaS application was (tons of big-enterprise business requirements). Two examples:

    • Testing business logic using DSLs in Clojure (youtube.com) - by Mayank Jain

      Testing business logic quickly becomes tricky, as applications grow and scale. Example based unit and integration tests, and exploratory tests become poor choices to check and verify a large state space. Also such methods are not well-suited to clearly describe the state space / transitions we want to test.

      Since we use Clojure to write test suites and tools at Helpshift, we tried experimenting with DSLs to express some of our testing problems. We've found that mini DSLs can indeed become useful to describe and test fairly complicated business logic.

      In this talk I will cover some of the mini-DSL approaches we've tried, demonstrate one of them by example, and discuss the benefits and drawbacks based on current experience.

    • Designing an Object-Functional system with Clojure (youtube.com) - Aditya Athalye (PDF Slide deck.)

The Daily Front Page 20 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Polling’s Phantom Respondents
article

No Easy Fix for Bogus Respondents in Online Opt-In Polls

by luu·▲ 56 points·35 comments·pewresearch.org ↗
Voter file matching increased error by removing valid cases.

In a test of three screening methods, voter file matching increased error by removing valid cases

Why did we do this?

Pew Research Center does high-quality research to help the public, the media and decision-makers understand important topics. Our methodological research investigates the current challenges facing the polling industry, including past work on the impact of bogus respondents in opt-in surveys.

Learn more about Pew Research Center and our methodological research.

How did we do this?

We fielded a large online opt-in survey Nov. 14-19, 2024, among 11,114 U.S. adult respondents. Respondents who agreed to provide their name and contact information were matched to a registered voter file after the survey concluded.

We evaluated how each approach for removing bogus cases performed on three data quality metrics: “yea-saying,” or agreeing regardless of what is asked, 2) quality of open-end text responses, and 3) response order effects. We also examined how screening methods substantively affected estimates of voter turnout and vote choice in the 2024 presidential election.

Here are the questions used for this report the survey methodology.

One of the most urgent problems in online opt-in polling is bogus (or fraudulent) respondents. These are survey-takers who make no effort to answer questions truthfully and instead are just looking to finish surveys quickly and collect rewards.

To combat this threat, researchers have developed various ways to identify and purge bogus cases from survey samples. Approaches include 1) trap questions, sometimes called “attention checks,” that genuine respondents should always answer correctly, 2) automated prescreening services, and 3) matching respondents to a registered voter file.

But how well do they work? A new Pew Research Center study finds that:

  • Overall, purging bogus cases lowers error on most metrics, but a surefire solution remains elusive.
  • Matching an opt-in sample to voter files slightly increased error by removing mostly good respondents (e.g., those who simply declined to give their name or address).
  • Trap questions and an automated prescreening service performed similarly, improving data quality somewhat.
  • All three approaches modestly increased the overestimation of Democratic support in the 2024 election. This appears to be due not to a systematic partisan bias but to bogus respondents’ tendency to say they voted for the winning candidate – in this case, Donald Trump, the Republican.

Matching opt-in samples to voter files may serve other purposes, such as providing data on respondents’ voting history. This study speaks only to whether this is an effective tool for purging bogus cases.

Do all polls have bogus respondents?

No. Bogus respondents are primarily a threat to online opt-in polls, which are recruited through methods like online advertising, self-enrollment and email lists. Polls recruited offline using random sampling (e.g., Pew Research Center’s American Trends Panel) are generally immune to this threat, though they face other challenges.

Methods for removing bogus respondents

Studies conducted by Center researchers and others have found that standard data quality checks such as looking for “speeders” who complete surveys too quickly or “straightliners” who consistently select the same answer choice (e.g., always pick the first response option) fail to detect most bogus respondents. The same goes for many trap questions or attention checks, which not only fail to detect bogus respondents but can also confuse legitimate respondents, leading to false positives.

Faced with these challenges, pollsters have developed a variety of new approaches in hopes of better identifying bogus respondents.

In this study, we evaluate three such approaches:

  • Trap questions about unlikely behaviors
  • Automated prescreening by a leading fraud-detection company
  • Matching respondents to a commercial voter file

Trap questions

A difficulty in identifying bogus respondents lies in the fact that, for most questions, we have no way of knowing if a respondent has answered truthfully. To get around this problem, we asked respondents if they had ever engaged in four activities where we can be virtually certain that the true answer is “No.” Under this screening procedure, respondents were coded as bogus if they answered “Yes” to one or more of these questions.

The questions were designed so that diligent respondents would not be confused about how to answer, while bogus respondents trying to appear eligible for surveys targeting specific groups or answering randomly would be more likely to answer “Yes.” Specifically:

  • We asked respondents if they used any of six different social media platforms, one of which was a made-up platform called Fizzypress. We also asked if they had received any of six different government benefits in 2023, including payments from the United States Railroad Administration (USRA) – a real government agency, but one that ceased to exist in 1920. Both of these were asked early in the survey and were intended to resemble screening questions looking for users of specific social media platforms or recipients of certain kinds of benefits. Of the full sample, 6% said they used Fizzypress and 9% claimed to have received USRA payments.
  • Later in the survey, we asked respondents if they had ever visited the International Space Station; 10% said they had. Finally, we asked if they had ever served on a Polar-class icebreaker ship, only two of which were ever built and only one of which remains in active use by the U.S. Coast Guard; 8% answered in the affirmative.

A total of 1,963 cases (18%) answered “Yes” to one or more of these trap questions and were flagged as bogus.

Automated prescreening

CloudResearch’s proprietary Sentry prescreening system is designed to automatically identify problematic respondents before they begin a survey. When a potential respondent first clicks the survey invitation link, they are routed to the Sentry platform and asked a short series of questions designed to elicit problematic survey-taking behaviors like yea-saying and inattentive responding. Open-end answers are checked to confirm that they are responsive to the question asked and not pasted from another source via an automated process.

The system also performs passive checks using metadata about the respondent’s device, location and browser for other signs that they are misrepresenting themselves through technical means.

Respondents who pass these checks are then routed to take the survey. Typically, those who fail are not forwarded to the main survey, but for this study, no respondents were terminated for failing the preescreening checks. We used metadata about which cases failed and why to simulate what would have happened to the survey results if they were excluded at the outset.

Under this procedure, 5,369 cases – nearly half of all completes – failed at least one prescreening check, including 1,879 (35% of failed cases) that failed multiple.

  • 70% of failed cases had a problematic open-end, making this the most frequently failed check by far. This was followed by yea-saying (47%), inattentiveness (12%) and duplicate IP addresses (10%).
  • 7% of these cases failed checks for fraudulent behavior, and only 1% failed other passive technical checks.

Voter file matching

The third approach we tested involves asking respondents to provide their name and address and then looking for a matching record in a commercial voter file, a national database of nearly all registered voters in the United States. If a matching record can be found, the case is considered valid. If no matching record is found, the case is thrown out.

This method assumes that respondents who can be matched are most likely being honest about their identity, and that someone willing to provide detailed contact information that can be validated against official voting records will likely be diligent about answering other survey questions.

This approach has primarily been used by pollsters who work for political campaigns. For cases that are successfully matched, voter files can provide a great deal of information beyond what was asked in the survey, such as a respondent’s registration status and voting history.

But while many voter file vendors attempt to include the unregistered population, Center research has found that a sizable share of this group is not covered by these databases. This can lead to throwing away data for many otherwise-valid respondents who simply aren’t registered to vote. This is not a large drawback for political pollsters, who typically focus on surveying registered voters. But if certain kinds of people who are more likely to be unregistered are underrepresented in a sample or missing altogether, it may lead to biased results if applied to a general population survey.

In this study, we asked respondents if they were willing to provide their name and home address so that they could be matched to the voter file. Out of all respondents, 49% agreed to provide their contact information; of these, 73% were successfully matched to the TargetSmart voter file based on name, address, age and sex. Altogether, 3,977 cases (36% of the full sample) were successfully matched while 7,137 (64%) were screened out under this procedure.

Distinct demographic patterns in flagged cases

Although the overall number of cases screened out by each method varies dramatically, respondents claiming to have certain demographic characteristics were consistently more likely to be flagged. Specifically, trap questions and prescreening were especially likely to flag those claiming to be ages 18 to 29 or Hispanic – the two groups found to be most affected by bogus responding in previous Center studies.

This should not be taken to mean that members of these demographic groups tend to be poor survey-takers. Rather, insincere respondents tend to claim membership in these groups, likely falsely in many cases.

The profile of cases purged using voter file matching was different. This reflects the fact that voter file matching tends to purge cases for benign reasons (e.g., a respondent’s privacy concerns or their not being a registered voter), not harmful ones. Hispanic cases were no more likely to be screened out than non-Hispanic Black cases, and both were only 6 percentage points more likely to be screened out than non-Hispanic White cases. In contrast, Hispanic cases were more likely to be flagged than non-Hispanic White cases by trap questions (+22 points) and prescreening (+19).

Likewise, trap questions and prescreening were both more likely to flag men than women, by margins of 9 and 6 points, respectively. Men and women were screened out by voter file matching at roughly the same rate.

The three methods differed on education:

  • With trap questions, college graduates (+11) and respondents with a high school education or less (+7) were more likely to be flagged than those with some college education.
  • With prescreening, high school or less cases (+13) were more likely to be flagged than college graduates, who had the next-highest flag rate.
  • Voter file matching showed much less differentiation: Rates across education groups did not vary by more than 4 points.

Effect of screening on measures of data quality

What impact do these three screening methods have on data quality? There is no direct way to know what proportion of bogus respondents are successfully identified by each method, nor can we be sure how many valid cases are misidentified as fraudulent. Instead, we can compare various measures of data quality calculated before and after each screening method has been applied and the flagged cases removed. To ensure that results are comparable across screening methods, separate sets of survey weights were created for the unscreened sample and for the set of cases remaining after each method was applied. For details, refer to the methodology.

In this study, we focused on three measures of data quality: 1) the frequency answering “Yes” to yes/no questions, sometimes called “yea-saying,” 2) the quality of text responses to open-ended questions, and 3) the severity of response order effects when the order of answer choices is randomized.

Yea-saying

In a 2023 Pew Research Center study, one indicator of bogus responding was a tendency to answer yes/no questions in the affirmative, regardless of the question. In that study, 8% of online opt-in respondents answered “Yes” to at least 10 of 16 yes/no questions asked, with especially high shares among 18- to 29-year-olds (15%) and Hispanic respondents (19%). In contrast, the corresponding shares among respondents from probability-based panels fell between 1% and 2%. Many of these questions measured rare or uncommon characteristics, and we would expect that virtually no one answering truthfully would say “Yes” to 10 or more.

Our latest survey exhibits largely the same pattern. Prior to any screening, 7% of all adults, 10% of 18- to 29-year-olds and 13% of Hispanic respondents answered “Yes” to at least 10 of 15 yes/no questions (excluding a question measuring Hispanic ethnicity and questions used in any screening procedures).

After screening with trap questions, this behavior is largely eliminated from the remaining respondents: 1% of adults and no more than 2% of any demographic subgroup answered 10 or more yes/no questions in the affirmative. The reduction is almost as large for prescreening, which reduced the shares to 2% for all adults, 4% for young adults and 3% for Hispanic adults.

In contrast, matching to the voter file appears to have made the problem worse. The share among all adults increased slightly to 9%, and the shares among young and Hispanic adults rose to 15% and 17%, respectively.

This surprising result appears to be due to two factors. The first is that respondents who declined to provide their contact information – nearly half of the sample – appear much less likely to be bogus than those who agreed to provide this information. Among those who declined, only 3% answered “Yes” to 10 or more yes/no questions, compared with 12% among those who agreed.

The second is that a nontrivial share of bogus respondents were able to provide contact information that was accurate and detailed enough to result in a successful voter file match, though the information provided may not be their own. To the extent that some bogus respondents were successfully removed, it was not enough to offset the loss of valid respondents who declined to share contact information.

Open-end response quality

Examining text answers to open-ended questions has long been considered a reliable way to identify low-quality respondents. While attentive respondents give answers that are relevant to the question asked, bogus respondents often give nonsensical or gibberish answers.

This survey included an open-ended question that asked, “What is one thing that you would like politicians in Washington, D.C. to know about your own situation when they are writing laws and setting policy? Please share as much detail as you can.”

Each respondent’s answer was reviewed and assigned to one the following categories: 1) relevant, 2) nonresponse, 3) generic positive rating, 4) other non sequitur, 5) gibberish, or 6) probable AI (refer to the methodology for details). Because respondents had been told they could skip any question they did not wish to answer, both relevant and nonresponse answers were considered unproblematic, while the remaining categories were deemed problematic.

Prior to any screening, 88% of answers were classified as unproblematic, including 69% that were relevant and 19% that were nonresponse. The most common kind of problematic answers were other non sequiturs (7%), followed by generic positive ratings (2%), gibberish (2%) and probable AI (1%). It is worth noting that the probable AI responses detected were written in a distinct style that was relatively easy to spot. There may be other, more subtle, AI responses that were not detected.

Among all adults, trap questions and prescreening performed similarly, bringing the overall share of problematic open-ends down to 7% and 5%, respectively. Prescreening also resulted in a higher share of relevant answers than trap questions (80% vs. 74%) and a lower share of nonresponse (15% vs. 19%). This may be because the prescreening process itself includes an open-ended question. Matching to voter files, on the other hand, had virtually no effect on the proportion of problematic answers, though the proportion of relevant answers increased to 73%.

Response order effects

If a respondent is being attentive and answering questions accurately, the answer options they select shouldn’t be affected by the order in which they are presented. But inattentive respondents in online surveys tend to select answer choices that appear toward the top of the list, otherwise known as a “primacy effect.”

Our survey included a question asking if undocumented immigrants should be allowed to remain in the country, after which a random half of respondents were shown answer choices in the following order:

  • “They should not be allowed to stay in the country legally.”
  • “There should be a way for them to stay in the country legally, if certain requirements are met.”

For the other half of respondents, this order was reversed. If all respondents were answering diligently, the results from each half of the sample would be largely the same.

Instead, we saw a substantial primacy effect on this question. Without any screening, 43% of adults endorse the view that undocumented immigrants should not be allowed to stay legally when that option is presented first. The share drops to 34% when the order is reversed, a primacy effect of +9 percentage points.

The primacy effects were even larger for those subgroups most affected by bogus responding, at +13 points for men, +15 points for 18- to 29-year-olds and +17 points for Hispanic adults.

  • Screening with trap questions reduced the primacy effect by roughly half, to +4 points for all adults, +6 for men, +7 for young adults and +9 for Hispanic adults.
  • Prescreening performed similarly, reducing the primacy effect to between +5 and +10 points.
  • Voter file matching, on the other hand, resulted in even larger primacy effects than when there was no screening at all, with magnitudes increasing to +14 for all adults, +18 for men, +29 for young adults and +25 for Hispanic adults.

As with the frequency of giving “Yes” answers, voter file matching’s negative impact on data quality appears to be due to valid respondents choosing not to provide contact information for matching, with those cases showing a primacy effect of only +2 points.

Including the question about the status of undocumented immigrants, there were a total of 13 questions with randomized response options that were asked of all respondents. Nearly all of these showed the same pattern. Without any screening, the average primacy effect on these questions was +7 percentage points for all adults, and as high as +11 and +12 points for young adults and Hispanic adults, respectively. Trap questions reduced the average primacy effect by 4 points for all adults and by 7 points for young and Hispanic adults, while prescreening did almost as well.

How does screening affect questions about voter turnout and vote choice?

The prevalence of online opt-in samples in election polling raises the question of how different screening methods – voter file matching in particular – impact estimates related to voter turnout and vote choice. Fielded shortly after the 2024 U.S. presidential election, this survey asked respondents if they voted, and if so, for whom.

Without any screening, an estimated 84% of self-reported registered voters said they voted in the 2024 presidential election. Purging cases with trap questions and prescreening both increased that share by 3 points, to 87%, while voter file matching increased it by 1 point, to 85%. This pattern is more pronounced among young adults and Hispanic adults: For these groups, trap questions and prescreening increased estimated turnout by between 6 and 9 percentage points, while voter file matching produced a 1-point increase among young adults and a 2-point decrease among Hispanic adults.

Although an increase in voter turnout would appear to make these estimates less accurate relative to a higher quality estimate of roughly 77%, it is notable that, for this question, the order of response options was not randomized and the response option for having voted was presented last.1 This kind of pattern is what we would expect to see if bogus respondents, who are more likely to select answer choices toward the top of the list, are being screened out. The fact that the effect is smaller for voter file matching is also consistent with that method’s tendency to disproportionately exclude valid respondents.

All three screening methods increased estimated support for Harris

When it comes to presidential vote (for which response option order was randomized), the weighted raw sample showed Donald Trump and Kamala Harris tied, each with 48% of the vote – accurate to Harris’ true vote share, but underestimating Trump’s by 2 points. Trap questions slightly shifted the result from a tie to a 3-point advantage for Harris. The effect was larger for prescreening and voter file matching, which shifted Harris’ margin to +6 and +7 points, respectively.

These patterns suggest that Harris supporters are overrepresented among valid respondents. But prior to screening, this bias was largely offset by the presence of bogus respondents, who disproportionately said they supported Trump. When bogus respondents were screened out, the bias in favor of Harris became more apparent.

Because the answer choices for Trump and Harris were randomized, this result also implies that bogus respondents were not simply choosing the first option or choosing randomly. There appears to be a subset of bogus respondents, specifically those with the most glaring data quality problems, who were much more likely to say that they voted for Trump, regardless of whether that option was presented first or second. For example, in the unscreened sample, cases coded as having a problematic open-end supported Trump over Harris by a margin of 29 percentage points, while cases that gave 10 or more “Yes” answers favored Trump by 30 points.

Cases with one or both of these data quality problems made up anywhere from 11% of screenouts from voter file matching up to 57% of screenouts from trap questions.

This should not be taken to mean that bogus respondents will always be systematically biased in favor of Republican candidates. In a previous Center benchmarking study where respondents were asked about the 2020 presidential election, opt-in respondents who gave 10 or more “Yes” answers claimed to have voted for Joe Biden, the Democrat, over Trump by margins ranging from 34 to 51 points across three different opt-in samples. It seems plausible that, when asked about past elections, many of these respondents are simply choosing the candidate who won.

These effects are even larger for subgroups in which bogus respondents are most common. Among 18- to 29-year-old voters, the survey initially showed Trump ahead by 2 points prior to screening. All three screening approaches shifted the margin in favor of Harris, putting her ahead by 3 points with trap questions, 6 points with prescreening and 1 point with voter file matching. Among Hispanic voters, trap questions slightly decreased Harris’ lead from 9 points to 8. Prescreening and voter file matching had larger effects, increasing Harris’ lead among Hispanic voters to 16 and 19 points, respectively.

CORRECTION (Aug. 28, 2026): The following sentence was updated to reflect the correct percentages for all U.S. adults, young adults (ages 18 to 29) and Hispanic adults: “The share among all adults increased slightly to 9%, and the shares among young and Hispanic adults rose to 15% and 17%, respectively.” Figures were correct in the corresponding graphic; this change does not affect other findings reported.

  1. 77% voter turnout is based on an analysis of the validated voter dataset from Pew Research Center’s 2024 postelection survey.
The Daily Front Page 21 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Clock Tower
article

Fixing the Portobello Police Station Clock

by avidly·▲ 388 points·93 comments·pointinthecloud.com ↗
Clambering around the dusty nineteenth century clock tower of an abandoned police station sounds an ideal way to spend a Saturday afternoon.

I got a message from a friend today which read along the lines of "I know we were going to meet in Edinburgh today, but do you fancy meeting in Portobello instead and trying to fix the clock in the old police station with me?"

I don't know about you, but clambering around the dusty nineteenth century clock tower of an abandoned police station sounds an ideal way to spend a Saturday afternoon to me, so I jumped at the chance.

PXL_20260411_150433725-3.jpg

The rather grand Portobello Police Station building.

This was in response to a message from Action Porty:

"Can you help keep Portobello on time? Action Porty has recently bought the Police Station for the community, but we can't work out how to change the time on the clock tower! We wondered if there was anyone in the community with expertise that could advise us of the details for changing the time? Or who best to contact for help?"

The bit I hadn't figured out was that clocks are high up. If we were to fix the clock we would be next to it and so we would also be high up. And being high up involves heights, and steep long ladders are needed to get up high.

PXL_20260411_150433725.jpg

I suppressed my whimpers at climbing up the rather high, steep ladder into the likely spider-infested darkness and was rewarded with an explore of the attic, which lead to another set of steps which went to the clock tower itself.

PXL_20260411_150433725-2.jpg

Once there we were rewarded with the magnificent sight of the clock mechanism and its three clock faces:

PXL_20260411_150433725-4.jpg

PXL_20260411_150433725-5.jpg

Construction of the building apparently started in 1877 and it seems quite feasible that this was an original mechanism. Modifications had been made - electric motors powered the mechanism and a control box allowed the clock chime to be turned off overnight.

The building was built to house meeting, administration and courts for Portobello burgh council. After Portobello was absorbed into Edinburgh the building became a library, and then a police station.

The Scottish Land Fund has since enabled it to be purchased for community ownership and when I went there many volunteeers were removing the 1970s polystyrene ceiling tiles and wood-chip wallpaper to reveal the original grandeur of the building.

PXL_20260411_150433725-10.jpg

Setting the clock

The first step was to figure out how to set the time. This is probably easy to someone in the know, but we weren't.

We figured that the clock is driven from the small motor, through a series of gears onto a shaft which rotates once per hour. This shaft is split into three - one for each face, and drives the minute hand directly. A gear on each clock face derives the hour hand. If we could disconnect the motor maybe we could turn the shaft directly and set the time.

Sure enough - we found a pawl on one of the gears which could be lifted out of the way. Once this was done the shaft turned easily and we could set the time. Each hand had a counterweight on the clock face and we could set the time by imagining the hand we couldn't see opposite to each counterweight.

We had a slightly stupid moment when we thought we'd got it wrong, and the clock was running backwards - only to realise we were inside the clock and so were looking at it the wrong way. Doh. We had to head down to the ground to check that the time was correct - but - phew - time was OK and not running backwards.

Setting the chime

Figuring out the chime was more difficult. The original mechanism had been modified, and switches and a motor had been added. These led to a box containing a circuit board which definitely was not from 1877. It contained a PIC 16F628 microcontroller which had a suspected date-code of 2001. There were a number of relays, a power supply and a battery charging circuit to charge the included lead-acid battery. I assume this box would be getting on for 1/4 century old, but it still seemed to work. No idea how good the battery was; maybe this should be tested another time.

We have idea who designed and built this box; there were no obvious description markings. Is it a standard thing, or just a one-off for this clock?

PXL_20260411_150433725-6.jpg A mystery unmarked circuit board, ripe for deciphering.

This box didn't have much of a user interface, other than a non-obvious button marked "advance". The only problem was that pressing it did nothing. How did this thing work? Surely you had to set the time somehow.

PXL_20260411_150433725-7.jpg

A summary after more head scratching, measuring and fiddling:

TLDR:

  • The box switches a mains powered motor (the blue one with the chain in the picture above) which controls the chime striker mechanism. When the motor is powered the clock strikes continuously.
  • A switch on the striker tells the box how many chimes have taken place, so it knows when to stop.
  • A switch on the clock shaft triggers on the hour and tells the box when it should chime.
  • The box controls the clock motor. The "reset" switch appears to do nothing other than switch off the clock motor. (As I write this, I assume it also sets the 'time' back to midnight, but this is to be tested).
  • The "advance" button needs to be held for a few seconds before anything happens. When it is released, the clock will chime. When pressed and released again, it will chime again for the next hour.
  • Setting the time appears to be done by pressing advance until the correct hour is reached.
  • The "Status" LED flashes some kind of code - long long, short short short. I assumed the number of flashes would correspond to the time but apparently not. We didn't have time to figure this out before we had to leave.
  • The box has no "clock" as such in it - it just has a counter which keeps track of the hour. All timing is done from the "hour trigger" switch from the main mechanism.
  • The two switches are connected via banana plugs to the box; the box has cables for the GMT/BST switch, mains input, clock motor out, chime motor out.

I had hoped we could do a "test" by letting the clock chime thirteen (or even just strike continuously), but I was up in the tower with a bunch of spoilsports who wouldn't let me. Oh well, next time when they're not around.

Yay - It tells the time

So - we waited until 4pm and the clock had advanced and we checked outside and the time was good. Come 4pm and the bell chimed 4 times. Dongggggg. (Bells are loud when you're next to them. Oops again.) This was perfect timing - 4pm was the time we had to leave.

We decided our mission was a success. Some local residents may have decided that the chime reinstatement was not a success, so we disconnected the chime motor to disable the chime.

Some pub-fuelled enhancements:

After a quick visit to check out the police cells we decided to head across the road to the Portobello tap for a beer and one of their burgers to celebrate our success. Lucy the dog came to join us and she was very quick to point out how starved she was, and really a little chip would just tide her over until she got her dinner, as she had bad owners who just never fed her. She isn't a labrador really.

PXL_20260411_150433725-8.jpg

After our beer we thought of some "enhancements":

  • Have a box with more control of the chime times in case 8am is too early for chimes to start.
  • Be able to have a remote control chime for special occasions.
  • Have a doorbell which chimes the clock when you ring it.
  • Make it chime 13 at Halloween.
  • Have some customised LED lighting to replace the fluorescent tubes. This could have a rainbow for Porty Pride or St Patricks day or Christmas colourings or something.
  • More to come

It was fun

It was a fun afternoon, and thank you for the invite. I'm looking forward to seeing what becomes of the police station now it is community owned - it has the potential to be such a fun place! Maybe I can go back and become more involved.

The Daily Front Page 22 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — The Soft Side of Metal
article

The softness of metal

by NaOH·▲ 52 points·20 comments·psyche.co ↗
Watching a seated Ozzy play his final gig, my ankle broken, I’m in tears.

Watching a seated Ozzy play his final gig, my ankle broken, I’m in tears – this couldn’t be more metal

A rock band performing on stage with a large portrait backdrop of a person wearing rings and heavy eye makeup.

A tribute to Ozzy Osbourne at the 2026 Brit Awards in London, UK. Photo by Isabel Infantes/Reuters

I am grateful no one else is in the room with me. In principle, I’ve no problem with my family seeing me cry: but blinking away hot salty tears while watching Ozzy Osbourne? That seems somehow ludicrous. This is, after all, the self-styled prince of darkness, a trickster-like figure – one part devil, one part joker, one part joke.

I thought I knew Ozzy – we all thought we knew him, whether we liked him or not. He was the fresh-faced, charismatic vocalist of Black Sabbath. He was the bloated, crazed, drug-addled artist who bit the head off a dead bat onstage and once tried to strangle his wife. Later in life he was the lovable, bewildered paterfamilias on The Osbournes reality TV series. For some, he was also the artist with a back catalogue on which much of metal still rests.

The Ozzy that is making me cry is none of those things.

Here I am, in the easy chair in our living room, laptop balanced on my thighs, my recently broken ankle encased in a support boot and raised up on a bolster. Weeping. My lower leg and foot prickle with heat on this sultry day in July 2025, and I cannot take my eyes off Ozzy performing the final show of his illustrious career, at Villa Park in Birmingham, UK, before an ecstatic audience, and for those like me who have paid for the live stream. There are no antics, no wide-eyed devilish grin, none of the incessant running back and forth that we’re used to from him. Instead, he sits on a bat-shaped throne, singing with an appalling intensity, and occasionally demanding that the crowd clap along.

All day long I’d been watching metal’s great and good perform brief sets in honour of the man who inspired so many of them. Grizzled veteran megastars like Metallica, emerging legends like Gojira and fresh-faced talents like Yungblud and Lzzy Hale – all of them merely support acts just for one day, playing brief sets in which Ozzy/Sabbath covers predominate. Now, finally, it’s Ozzy’s turn.

He had been waiting for this moment to say a final goodbye for years. Health problems and the COVID-19 pandemic meant he’d had to cancel most of his farewell tour. Three years on from his only stage appearance since then (a couple of songs performed at a 2022 NFL game), he is obliged to perform seated due to a litany of medical complaints: Parkinson’s disease, acute back and neck trouble, and a whole lot else. You can see that singing takes everything he has left. He wants to stand, to run, to be the embodiment of rock and roll that he once was. It’s heartbreaking.

Ozzy professes his love for us and we return it, myself included. Even viewed on a laptop screen from my own sick chair, it feels like a deluge of emotion. A surfeit of love, pain, frailty and loss are converging on my own frail body.

When I first discovered Ozzy and metal, as a child on the cusp of adolescence, metal bodies seemed like the embodiment of strength and virility. The tousled locks, the phallic guitar poses, the distortion, the screams and the implausible vibrato – all this felt like what a man should be. Metal bodies thrilled me, the more so since, as a skinny, nebbish Jew, I felt I could never inhabit one.

He was always different, pudgy, vulnerable, a ball of emotion and confusion

My Jewish North London upbringing was settled, middle class, rule bound. Metal was none of those things and nor was Ozzy. Metal was confrontation, insensitive and insouciant to the loathing and derision its artists received from the mainstream music majority. Ozzy lived a life wilfully devoted to the pursuit of shock. His music, and metal more generally, explored the darkest of themes; violence, death and suicide, the occult, all the delights of transgression.

Yet, had I looked a little deeper, I would have discovered a different Ozzy that coexisted with the one I knew; an Ozzy I might have found common ground with. Physically, he was never a metal god either. He was always different, pudgy, vulnerable, a ball of emotion and confusion, far from the image of masculine mastery. Like me, he desperately felt he had to embody metal. Like me, he frequently felt shame for the weakness of his flesh. Unlike me, he somehow became the apotheosis of metal masculinity.

I spend the week before the show suffering, after slipping down the stairs in the middle of the night. It was my daughter’s Father’s Day card that I slipped on – a metaphor I don’t even want to think about. After a couple of days hobbling around the house, I give in to reality and get an X-ray. While I am waiting for the results, my son calls to tell me he was awarded a first class in his honours degree. I yelp. Then I learn that my ankle is fractured.

I spend the day before Ozzy’s final show alternately being wheeled and limping around a university town for the ceremonial awarding of my son’s degree. It’s a luminous, barely believable day, as I remember my son’s late diagnosis of dyslexia and the educational turmoil he’d had to cope with during the pandemic.

Ozzy’s brave performance stirs an emotional pot already full to the brim

In the afterglow of these hours spent marinating in love, and as I watch Ozzy declaring his love for the crowd, I can’t entirely banish the undercurrent of guilt that never leaves me on account of another bond of love: my immobility means that I haven’t been to visit my father today, in the nursing home where he has been confined for nearly a year. Like Ozzy, my dad has Parkinson’s disease and much else; standing up is a chancy enterprise for him. This week he won’t receive the fleeting comfort of a visit from me. It was my turn to be the man, to take over from the one who once carried me. Instead, there is only my weakness.

A weak father, a weak son; immobile while watching a weak man somehow transcend his desperate situation. So I cry, as Ozzy’s brave performance stirs an emotional pot already full to the brim.

I’ve spent years studying metal as a scholar and writing about it anywhere that will publish me. I know that metal today is a more diverse place. London’s best metal pub has a vegan menu and its best metal record store has an alcohol-free bar; metal festivals have viewing platforms for people with mobility issues. Metal is even used as a resource in support groups and 12-step programmes. Yet Ozzy’s performance still shocks me into a different kind of understanding. Who knew that metal could be a place where one of its most notorious stars could perform this achingly sad display of vulnerability and yearning?

Confined to his throne-cum-prison, Ozzy clearly feels something of this unnerving surprise himself. You can tell that his frustration with his disability is tinged with a portion of shame. He loves the love he’s getting, but he can’t play the transgressive part he’s played for so long. The pathos of his evident grief, his mourning the loss of what he once was, is hard to witness.

What appears to be metallic hardness is but a patina for something else

Ozzy may have helped create heavy metal but that doesn’t mean that he fully understood his creation, its possibilities and potential. Then again, for much of metal’s history, neither did anyone else. We were all sucked into the myth that the metal men were selling, to the point where we sometimes forgot that it was a myth.

I am as old as metal is, and as I aged the genre aged too. In adulthood, as a doctoral student, academic and writer, I learned that what appears to be metallic hardness is but a patina for something else – the terrifying realisation that, as humans, we are all condemned to the dirt and to the limitations of the body. For all that metal sometimes looks like a playpen for those gripped by delusions of mythic power, at its core there is also fear, despair and brokenness.

It was always there. Hiding in plain sight in Ozzy’s work. Songs like ‘Suicide Solution’ (1980), ‘So Tired’ (1983) and ‘Mama, I’m Coming Home’ (1991) helped to make metal the sound of suffering, and of weakness. That’s true even for metal men who present outwardly as the epitome of the metal warrior. Many of the artists who played Ozzy’s farewell show had explored this territory: Metallica’s ‘Welcome Home (Sanitarium)’ (1986), Pantera’s ‘I’m Broken’ (1994), and Tool’s ‘Forty Six and 2’ (1997) burn with pain and rage.

As a scholar, I learn fast. As a person with a body and a propensity for shame and anxiety, I learn achingly slowly. I wish that, years earlier, I’d internalised what I’d learned metal could be. Like Ozzy, I too have a body that fails me on occasion (I’ve had chronic fatigue syndrome for more than 30 years). Even before that, I never much liked my gawky, ungainly body anyway: I loved metal, but felt I couldn’t be metal. I wrote about the softness at the core of the metal body long before I accepted the squishiness in my own metal bone locker. Yet like Ozzy, I was more metal than I ever could have imagined.

Something had begun to shift for me in the years preceding Ozzy’s final concert. For this male Jewish weakling, metal and shame were natural bedfellows. My children were raised to be shameless: their musical tastes and their frailties were matters of fact. They both found their way to metal with little help from me.

Metal has become the place where my body can betray me, where I can be weak

My daughter fell particularly hard for metallic art. As an autistic person, she knows about limits and excess – meat and drink to metal culture. For years now, I’ve been taking her to gigs. Most recently, as she suffered through an energy-limiting conditions in her late teens, I’ve wheeled her into the disabled section at multiple venues. Unlike Ozzy and unlike me, she was unembarrassed about sitting down. She knew that metal was an ode sung by and to and about fallible bodies. She knew she was metal.

If only Ozzy had known that, too. He knew only the contrast between what he had once tried to be and what he now was: that the monumental myth had crumbled. And I, caught between my daughter’s generation and Ozzy’s, wept tears of sadness for what he would never understand – and tears of happiness for my children’s lack of shame (mingling with tears of pain as my ankle throbbed).

I always thought I would move on from metal as I aged. The opposite happened: following my daughter’s example, metal has become the place where my body can betray me, where I can be weak, where I can acknowledge my frailty. Looking round the audience at gigs, I can see that I am not the only one who knows this.

Ozzy died just 17 days after his final concert, on 22 July 2025. This time I didn’t cry. When I heard the news, I thought ‘How perfect!’ To end one’s life this way, after a mega performance of loving and being loved, was a beautiful thing. For one night only, Ozzy became the one who could strip bare my defences and make me feel. And what a blessing it was to be immobile at the time, joining my dad, my daughter and Ozzy in that place where there is no hiding from the fact that flesh is weak.

The Daily Front Page 23 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Civic Incentives
article

Transit rewards

by raybb·▲ 250 points·333 comments·waymo.com ↗

Today, Waymo is excited to announce our transit rewards program, which we will initially offer in the San Francisco Bay Area, with future cities to follow. This first-of-its-kind initiative rewards riders with Waymo Cash when they connect their Waymo rides with public transit and use their Visa card. We’ll start with employee access before gradually rolling out to the public in the coming weeks.

Public transit networks and shared autonomous vehicles are part of a complementary mobility ecosystem. As transit agencies modernize their payment systems to accept tap-to-pay debit and credit cards, multimodal trips are becoming more convenient than ever. 

"Governor Newsom has challenged all of us to build a transportation system that meets Californians where they are, and that means making the trip to the station as effortless as the train ride itself," said California Transportation Secretary Toks Omishakin. "CalSTA welcomes innovations that reward people for choosing transit and make a multimodal trip feel like one seamless journey."

Recent surveys show that over 50% of Waymo riders in our most mature service areas (San Francisco, Los Angeles, and Phoenix) use public transit, so we’re proud to invest directly in this connectivity to make everyday commutes easier and more affordable. The transit rewards program works alongside the regional transfer discount programs and tap-to-pay model launched in the San Francisco Bay Area last December. The program applies to all 27 San Francisco Bay Area transit agencies that accept contactless Visa tap-to-pay.

“San José has always believed innovation should make everyday life work better,” said San José Mayor Matt Mahan. “This partnership does exactly that by using new technology to strengthen public transit, not replace it, making regional travel more seamless and giving people more ways to get where they need to go.”

To participate, riders will link their Visa card in the Waymo app. When riders in the SF Bay Area use their Visa card to take a Waymo trip and public transit within 2 hours of each other, we will automatically issue $2.85 in Waymo Cash, which is the cost of a bus fare in San Francisco. 

Alongside the launch of our transit rewards program, we’re also announcing a partnership with Caltrain, which accepts tap-to-pay. Waymo will lease 40 dedicated Caltrain station parking spaces to better serve transit riders with staged vehicles. This is a model we hope to replicate with additional transit agencies, ultimately enabling more seamless connections between Waymo’s service and public transit.

This launch is the next step toward making our vision of shared mobility a reality. By taking the learnings from our transit credit pilot programs in San Francisco and Los Angeles, adding Waymo’s service to the LA Metro Mobility Wallet program, and kicking off a strategic microtransit partnership with Via in Chandler, AZ, we’ve been steadily learning what it takes to offer a successful transit integration product and are pleased to formally launch transit rewards.

“Shared mobility is a team effort, and our autonomous ride-hailing service helps expand clean transportation options for everyone,” said Adam Lenz, Head of Sustainability & Environment at Waymo. “We’re thrilled to partner with local transit agencies to fill multimodal gaps and make daily commutes easier through our new transit rewards program.”

Our goal is to expand this transit rewards program and transit agency partnerships to more cities over time, ultimately making shared, all-electric transportation more accessible and affordable for everyone.

The Daily Front Page 24 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Civic Incentives
article

Seattle City Council votes to ban surveillance pricing in sale of groceries

by ortusdux·▲ 322 points·204 comments·advocacy.consumerreports.org ↗

If signed, Seattle will become the first city in the nation to prohibit the pricing tactic

Seattle, Washington – The Seattle City Council today passed the Fair Pricing and Transparency Act (CB 121267), groundbreaking legislation supported by Consumer Reports that would prohibit personalized pricing in the sale of groceries. Consumer Reports provided technical assistance to the Mayor’s office throughout the policy development process, testified, and recently submitted a letter in support of the legislation. The bill now heads to Mayor Wilson for her signature.

This bill, which is the first of its kind to pass at the city level, would prohibit the use of a consumer’s personal data to change the price they see for groceries and other essential items. This includes, for example, data about a consumer’s web-browsing history, their realtime location, inferences about their income, family size, health conditions, and more. The bill also permits a vast array of discounting practices while requiring increased transparency around discounts and placing some limitations on how consumers can be profiled.

“Nobody should pay more for basic necessities because a data broker is quietly collecting information about what they’re searching for online, what they hover over, what their income is, or where they go,” said Grace Gedye, senior policy analyst at Consumer Reports. “The price you see shouldn’t be different based on who you are. Mayor Wilson and the City Council have made Seattle a leader on protecting shoppers from unfair grocery pricing tactics with this bill. We commend this work.”

Background:

Other states have taken action to sign bills into law to ban the practice of surveillance pricing, including Maryland, Connecticut and New Jersey.

In May 2025, Consumer Reports investigated Kroger’s consumer data practices and found that they were collecting vast data profiles for individual shoppers, with inferences about their income, family size, education level, gender, and more. One shopper who requested their data under a state privacy law received a 62-page profile.

In December 2025, CR, along with partners Groundwork Collaborative and More Perfect Union, published an investigation into Instacart’s pricing tactics. CR had nearly 400 consumers shop for the same basket of goods at the same time. Analysis of the shopping data found that consumers were quoted different prices for the same products from the same store at the same time. The investigation found that Instacart’s algorithmic pricing experiments could result in price differences as high as 23% for certain products and could cost families more than $1,200 a year at checkout. Soon after, Instacart announced in a company blog post that it would end the program that resulted in different shoppers being shown different ​prices for groceries on its platform. However, Instacart told CR that it would still allow its partners—grocery retailers and food brands—to test different types of promotions and discounts on their customers through the platform.

CR’s most recent investigation of Uber and Lyft’s AI-driven pricing tactics found that the companies routinely charge different customers significantly different prices for the same rides ordered at roughly the same time. CR also found that both apps regularly advertised supposed discounts off what appeared to be inflated original prices. (Note: CR defines “same rides” as trips from the same starting point to the same destination priced within minutes—and often seconds—of one another.)

Additional information on Consumer Reports’ campaign to Make the Price Right can be found here.

Contact: cyrus.rassool@consumer.org

The Daily Front Page 25 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Civic Incentives
article

A brief history of Windows scroll bar shortcuts

by tybulewicz·▲ 122 points·60 comments·devblogs.microsoft.com ↗

For the first two decades of Windows, the scroll bar control had just a few basic operations. (For expository purposes, let’s assume that the scroll bar is vertical.) There are five mouse targets: The arrows at the ends of the scroll bar scroll by a line. The regions between the thumb and the arrows scroll by a page. And the thumb itself lets you drag the scroll bar to a specific position.

Windows 7 Windows 2000 added a right-click menu to the scroll bar. This menu gave you four options that matched existing mouse operations, two operations that matched existing keyboard operations, and a new operation.

Menu option Mouse Keyboard
Scroll Here Drag thumb to position
Top Drag thumb to start Home
Bottom Drag thumb to end End
Page Up Click in upper gutter PgUp
Page Down Click in lower gutter PgDn
Scroll Up Click on up-arrow ↑
Scroll Down Click on down-arrow ↓

The interesting new one is “Scroll Here”: You can right-click directly on the spot you want to scroll to, and then pick “Scroll Here”. This is much more convenient if you want to scroll a long distance, since you don’t have to grab the scroll bar thumb and then drag it all the way to where you want to go. You can just focus on where you want to go and not where you are coming from.

I used this context menu a lot when I needed to jump long distances.

An even-more-hidden shortcut was added at the same time: Holding Shift while clicking on the scroll bar jumps the thumb directly to the spot where you clicked.

I didn’t know about this shortcut until recently. I had always used my trusty context menu.

Sadly, almost nobody uses Win32 scroll bars any more. Everybody uses frameworks that provide their own custom scroll bars.

Electron and other Web apps use the Chromium scroll bar, which doesn’t implement the context menu, but at least it does implement the Shift+click shortcut.

The WPF XAML framework appears to implement both the context menu Shift+click.

The WinUI XAML framework frustratingly has neither the context menu nor the Shift+click shortcut. (Though at least one person has requested it.)

The Qt framework has multiple customization points, so it’s really up to each app’s developer. You can enable context menus with SH_Scroll­Bar_Context­Menu, you can enable “left-click to jump to a position” with SH_Scroll­Bar_Left­Click­Absolute­Position, and you can enable “middle-click to jump to a position” with SH_Scroll­Bar_Middle­Click­Absolute­Position.

Great, so by the time I learn about a shortcut for scroll bars (Shift+click), the ecosystem has fragmented so much that I can’t even rely on it working.

The Daily Front Page 26 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Newsroom Cards
The Daily Front Page 27 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Also on the Front Page
The Daily Front Page 28 of 29
Wednesday, September 23, 2026 The Daily Front No. #260923 — Colophon

That's the Front for Today

Issue No. #260923 — Wednesday, September 23, 2026 — went to press 2026-09-24 at 04:05 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 Wednesday, September 23, 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 and chose the highlights; a second read a handful of the day's stories and briefed the cover illustrator — 31 model calls and 207k 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:

In a bright molecular biology laboratory, a scientist leans over a microscope while a robotic pipette transfers liquid between tiny wells. On the monitor, an abstract branching protein structure glows beside repeating strands of DNA, one segment marked by a fresh cut. A gloved human hand rests firmly on an oversized control knob, pausing the machine. Nearby, several transparent culture tubes contain cloudy bacterial samples, and a tray of discarded sequences curls toward a waste bin.

Create the full cover scene as a hyper-detailed 3D product render: use a precise three-quarter camera angle, physically based materials, studio rim lighting, and glossy micro-reflections across the bright molecular-biology laboratory, scientist, microscope, robotic pipette transferring liquid between tiny wells, monitor with a glowing abstract branching protein structure beside repeating DNA strands including one freshly cut segment, gloved hand firmly pausing the machine via an oversized control knob, transparent tubes of cloudy bacterial samples, and the curled discarded sequences leading toward a waste bin. Set a deliberate palette of cool white, laboratory cyan, cobalt blue, sterile silver, and controlled amber highlights, with crisp premium catalog polish and no painterly or flat graphic treatment.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image. Keep the main image subject primarily below the upper 10% of the composition, where a title may be overlaid; the scene may extend naturally underneath that title area.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 27 117,321 64,824
layoutgpt-5.6-terra 1 19,059 2,262
covergpt-5.6-luna 2 1,724 292
covergpt-image-2.5-flare 1 293 1,372

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. Jev in 25 Lines of Python by bashbjorn — nobodywho.ai·HN discussion ↗
  2. Claude Code reads AGENTS.md only when telemetry is on [fixed] by pszypowicz — blog.szypowi.cz·HN discussion ↗
  3. Claude discovers a novel enzyme system with CRISPR-like repeats by raahelb — anthropic.com·HN discussion ↗
  4. Tokens too cheap to meter by teoruiz — jyn.dev·HN discussion ↗
  5. The current balance of power in open models by gmays — interconnects.ai·HN discussion ↗
  6. Gemini 3.8 text-to-speech by swolpers — blog.google·HN discussion ↗
  7. Once Claude can measure something, it can make it faster by matthieu_bl — claude.dev·HN discussion ↗
  8. Strands Harness by zuckerborg0101 — strandsagents.com·HN discussion ↗
  9. VSCode's SSH Agent Is Bananas (2025) by Rapzid — fly.io·HN discussion ↗
  10. The GitHub wiki is an anti-pattern (2022) by ibobev — michaelheap.com·HN discussion ↗
  11. GPT-6 Astra has gained the ability to drive a car by plurby — drivingbench.com·HN discussion ↗
  12. ReBarUEFI: Resizable BAR for almost any UEFI system by nateb2022 — github.com·HN discussion ↗
  13. Data-only attacks are easier than you think (2024) by segfaultbuserr — usenix.org·HN discussion ↗
  14. Radicle: Disclosure of Vulnerability in the Network Protocol by lostmsu — radicle.dev·HN discussion ↗
  15. UK military jamming other nations' satellites to defend itself, BBC told by thm — bbc.com·HN discussion ↗
  16. I don't want the details by mooreds — michaelheap.com·HN discussion ↗
  17. 28% of job postings on company career sites have been open over 90 days by rubatrejo — unlisted.careers·HN discussion ↗
  18. Side-stepping the Secretary Problem, unwittingly by pvdebbe — evalapply.org·HN discussion ↗
  19. No Easy Fix for Bogus Respondents in Online Opt-In Polls by luu — pewresearch.org·HN discussion ↗
  20. Fixing the Portobello Police Station Clock by avidly — pointinthecloud.com·HN discussion ↗
  21. The softness of metal by NaOH — psyche.co·HN discussion ↗
  22. Transit rewards by raybb — waymo.com·HN discussion ↗
  23. Seattle City Council votes to ban surveillance pricing in sale of groceries by ortusdux — advocacy.consumerreports.org·HN discussion ↗
  24. A brief history of Windows scroll bar shortcuts by tybulewicz — devblogs.microsoft.com·HN discussion ↗
  25. Grammarly will send unhinged messages to all your users if you try to cancel by ksec — reddit.com·HN discussion ↗
  26. Pentagon says overreliance on AI contributed to missile strike on Iran school by devonnull — bloomberg.com·HN discussion ↗
  27. Italian parliament votes for return to nuclear energy by geox — apnews.com·HN discussion ↗
  28. People hooked on vapes try a new way to quit: cigarettes by alephnerd — bloomberg.com·HN discussion ↗
  29. Z80 REPL (2018) by adunk — abagames.github.io·HN discussion ↗
  30. Stripe's Knowledge AI Platform by ltononro — stripe.dev·HN discussion ↗

Browse all issues in the archive →