Cover illustration

TheDaily Front

Issue No. #261008 Thursday, October 8 2026 #261008 — THURSDAY, OCTOBER 8, 2026
Small models, large claims, and the old machinery still humming.
Thursday, October 8, 2026 The Daily Front No. #261008 — Contents
30stories
7,998points
5,785comments
224kllm tokens
Assembled with 30 model calls — 159,707 tokens read, 64,414 written.

Highlights

Whistle: Speech to Text in 16.9 MB

A 16.9 MB speech-recognition model makes the case that capable local AI need not arrive in a datacenter-sized box.

Why isn't the industry freaking out about DeepSeek 4.1 Flash?

A practitioner asks why DeepSeek’s capable, low-cost Flash model has not provoked more alarm among frontier-model incumbents.

OpenAI annualised revenues $20B less than previously signalled

Revised OpenAI revenue figures send a reminder that AI’s grandest valuations remain tethered to ordinary accounting.

The people holding up the internet

A tour of the lightly staffed maintainers whose quiet work keeps the world’s clocks, phones, and networks in agreement.

Tell HN: I've been paying for a rural Tanzanian's education for 10 years

One decade of direct educational support in rural Tanzania offers a humane counterpoint to the day’s industrial-scale news.

From the Editor

The machines grew smaller, the numbers grew larger, and confidence proved harder to price. Elsewhere, patient human work—whether maintaining time zones or paying a school fee—continued to hold up more of the world than the headlines admit.

  1. Whistle: Speech to Text in 16.9 MB3
  2. Why isn't the industry freaking out about DeepSeek 4.1 Flash?4
  3. OpenAI annualised revenues $20B less than previously signalled5
  4. I gave Opus 5.5 one prompt and six hours to visualize Invisible Cities6
  5. Yes, and7
  6. Port of the TypeScript compiler, checker and lsp to Rust, by LLM8
  7. OpenAI Withdraws 3 Math Papers9
  8. OpenAI withdraws three mathematical results9
  9. 4-hour battery storage is cheaper to install than gas turbines all across globe10
  10. The people holding up the internet11
  11. ADHD as a circadian rhythm disorder: evidence and implications for chronotherapy (2025)12
  12. Anne Carson wins Nobel Prize in literature 202613
  13. Beauty in DVD Menus14
  14. The value of not getting to the point (2015)15
  15. Show HN: Making a flexible "neon" t-shirt with LED filaments16
  16. Bevy 0.2017
  17. Zerobrew: A faster alternative to Homebrew18
  18. Tell HN: I've been paying for a rural Tanzanian's education for 10 years19
  19. US man given prison sentence for bot-farming music streams20
  20. Classic PC demoscene productions running natively in the browser21
  21. Telnet BBS Guide22
  22. New gTLD Application for .lan23
  23. Step 5 Preview, a 1M-context MoE from StepFun, shows up on OpenRouter24
  24. “Math 2.0” will need to value mathematical progress more holistically25
  25. I think I found a planet nobody knew existed. I used Claude Code to find it25
  26. Trump administration is suspending Microsoft from a green card program25
  27. US suspends Microsoft, major IT firms from key green card program25
  28. OLED burn-in test: 30-month update25
  29. Theranos.world25
  30. Orkut.com25
The Daily Front Page 2 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Pocket Transcriber
article

Whistle: Speech to Text in 16.9 MB

by gmays·▲ 630 points·136 comments·cactuscompute.com ↗
It is one 16.9 MB file, runs on the CPU with no dependencies.

An open speech recognition model that runs on the same CPU engine as Needle. It transcribes seven languages, reaches the first token in 11 ms, and loads beside Needle so one binary turns a clip straight into tool calls.

Today we release Whistle, a speech recognition model for mobiles, wearables, robots, smart home, automotive and microcontrollers. It is one 16.9 MB file, runs on the CPU with no dependencies, and loads into the same C++ engine as Needle, from the same container and the same quantisation.

Whistle does three jobs, all of them on the device:

  • Transcription. 16 kHz mono audio, up to 30 seconds in one pass, in English, German, French, Spanish, Italian, Dutch and Polish. The language is detected unless you name it.
  • Word timestamps. Every word with its start, end and probability, aligned from the decoder's attention.
  • Speech embedding. The encoder output, one row per 80 ms frame, without decoding a transcript.

The model

Blocks marked shared run Needle's code, not a copy of it. --audio-depth selects decoder layers; the encoder always runs all eight.

The front end. 16 kHz mono audio is framed at a 25 ms window and a 10 ms hop into 80 log-mel bins, band-limited to 250-3500 Hz and normalised per channel. Thirty seconds is 3,000 frames. A convolutional stem of 128 channels and kernel 9 halves that count three times, leaving 375 frames at one per 80 ms. Every stage after this runs at that rate, and embed returns one row per frame.

The encoder. Eight Simple Attention blocks: four mHC residual lanes and a Monarch Hadamard MLP in place of the feed-forward network, the same blocks Needle uses. The attention is not causal. A frame at 3 s attends to a frame at 12 s.

The decoder. Eight Laddered Simple Attention blocks at width 512, 8 query heads to 2 KV heads, 48-dimensional queries and keys, 64-dimensional values, a 3-tap causal convolution on Q, K and V, and engram lookups at layers 3 and 7 over 18,432 slots. That is Needle's block list with a different layer count.

The speech-specific part is one addition per layer. Each decoder layer reads the encoder through a gated cross attention, x ← x + σ(g) · softmax(q̂ K̂ᵀ/√d) V, with a gate learned per layer and K and V taken from the clip. Those projections run once when the clip arrives, 375 frames across 8 layers, and are then held for the whole decode. Five beams therefore cost five short transcript caches, not five passes over the audio.

Decoding. Five beams scored by length-normalised log probability. Keyword biasing walks an Aho-Corasick automaton over the phrases you pass in, alongside the beams, and lifts their log probability as the automaton advances. The transcript is capped at 320 tokens. The vocabulary is 8,192 text pieces plus seven language tokens, one per language, so the detected language is emitted as a token rather than returned out of band.

The ladder is on the decoder. Every depth from 2 layers up was trained as a model of its own, and --audio-depth selects one at load time. The encoder is never sliced: all eight blocks run at every depth.

Silence. The engine measures the clip's loudness range before the decoder starts. Below the threshold it returns an empty transcript and an empty language, and never enters the beam search.

Benchmarks

Word error rate, lower is better. A missing bar is a benchmark that model's authors never published: Moonshine is English only, and Whisper reports no SPGISpeech, Earnings-22 or AMI cleaned. Whisper's AMI figure is AMI-IHM, a different subset from the AMI the other two report.

Whistle is ahead on LibriSpeech test-clean and test-other, on SPGISpeech, on Earnings-22 and on the FLEURS average. Whisper base is ahead on TED-LIUM, on AMI and on the MLS average, at 145.3 MB against 16.9.

Ten seconds of audio on an Apple M4 Pro CPU. Bars are scaled within each panel.

Each model ran on its official runtime at its defaults: Whistle's C++ engine at 5 beams, openai-whisper, and moonshine-voice non-streaming over whole audio. Time to first token is audio in to first token. Decode is tokens divided by the wall time after it, so the encoder is not counted twice. Whisper pads every input to 30 seconds, so its time to first token is flat across clip lengths. Whistle's tracks the clip: 5.9 ms at 5 seconds, 11.1 ms at 10, 36.3 ms at 30.

Word error rates are scored with the Whisper normalizers. Whistle's are measured over 86,174 utterances. Whisper's and Moonshine's are the figures their authors published, from the multilingual checkpoints rather than the English-only ones. No test audio appears in Whistle's training or validation data, verified by comparing audio checksums and speaker IDs across every reported test set.

One engine, three ways to load it

needle_load reads whichever model a .cact file holds, so the same binary does speech, text, or both:

needle --model whistle.cact --audio clip.wav

needle --model needle3.cact --tools tools.json --prompt "turn off the kitchen lights"

needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav

On the third line needle_complete takes the clip directly. The engine transcribes it, answers the transcript against your tools, and returns one JSON object with the calls and the speech fields, the speech ones prefixed audio_. No transcript is handled by the caller.

{"function_calls":[{"name":"set_lights","arguments":{"room":"kitchen","on":false}}],
 "confidence":0.94,
 "audio_text":"turn off the kitchen lights",
 "audio_language":"en"}

Get started

pip install cactus-needle
import needle

print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights

A 16 kHz WAV or raw samples need nothing beyond the base install. Other sample rates and microphone capture need the [mic] extra, which adds soxr and sounddevice.

Every call returns the text, the language, the milliseconds to the first token and the decoder's tokens per second after it. word_timestamps=True adds each word with its times and probability. keywords=["Siobhan", "Krzysztof"] raises the log probability of those phrases during the search. language="de" forces the language instead of detecting it. needle.Whistle() is the same model as an object, for embed(audio) or to hold one tuned .cact.

needle whistle playground transcribes from the microphone in the terminal, and needle whistle compare runs the same clip through Whistle, Whisper and Moonshine side by side with their timings.

Deploy

The engine ships prebuilt for seventeen targets, from macOS and Linux through Android, iOS, watchOS, Windows on ARM, RISC-V, MIPS, the browser and a WASI component. Every folder holds a needle binary, libneedle.a and needle.h, and loads any .cact you hand it.

needle download macos-arm64
needle download whistle
./macos-arm64/needle --model whistle.cact --audio clip.wav --audio-word-timestamps

needle_load, needle_transcribe and needle_embed are the whole speech C API. The engine reads no environment variables. Every behaviour is a compiled default or an explicit flag.

Weights are on Hugging Face, the engine and its platform folders are in Cactus-Compute/needle3, and the source is on GitHub.

The Daily Front Page 3 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The AI Ledger
article

Why isn't the industry freaking out about DeepSeek 4.1 Flash?

by jonotime·▲ 505 points·424 comments·dgt.is ↗
It is super capable, and orders of magnitude cheaper than the "frontier" models.

I have been using DeepSeek 4.1 Flash for about a month, heavily, across a dozen projects. It is super capable, and orders of magnitude cheaper than the "frontier" models. When I'm mid-session, if I don't look at the model name, I honestly could not tell you if I'm using DeepSeek or Opus. Whether it's our conversations, the work, or the speed, I don't notice a difference. I don't care that there is no 4.1 "Pro". I treat this like a frontier model because it behaves like one. I'm coming at this from my subjective usage experience, but you can see more complete benchmarks here if that floats your boat.

deepseek cost per task

So why aren't the frontier labs freaking out right now? China is going to eat their lunch. They may be a month or two behind Anthropic/OpenAI, but these distilled Chinese models can handle the same workloads.

Sure, they stole Claude's training, and Anthropic stole it from other people. I'm not getting into the whole who-owns-whose-data debate, because most developers aren't thinking like that. They're just trying to get the most bang for their buck.

Good Enough Changes How You Work

Today's models are now good enough for high-quality unattended tasks. Chasing the latest and greatest is silly. It is fun to see the new Fable capabilities, but the tasks we throw at them are usually ridiculous (maybe even insulting) if you believe in LLM sentience. It's like asking a math PhD to organize the files on your desktop.

With my OpenCode Go sub of $10/month, DeepSeek is basically unlimited. This has completely changed my way of developing. There is no shame now in spinning up mindless tasks, or exploratory UI monkey testing. And sure, go ahead and reorganize your desktop files. That will cost $0.003 instead of $1. I have rarely exceeded $1 in expected costs in a session. I try to keep my sessions tight, but sometimes they run for most of a day.

I even lean on 4.1 Flash for complex planning and research. For occasional critical tasks, I sometimes pull in Opus 5.5 to do a final code review, which will catch a few edge cases. Then I have DeepSeek execute the fixes. Even when I call up Opus or GLM (which seems to be drinking the same Chinese Kool-Aid as DeepSeek), it's less about quality and capabilities and more about getting new eyes on a problem.

Cache Magic

DeepSeek shrank the KV cache by roughly 437x compared to their V1 model. Holding that cache in GPU memory is one of the biggest costs of running long coding sessions. That's how my all-day sessions stay under a dollar.

It must be better for the environment too. Using Claude almost feels wasteful, and not just on cost: its caching means DeepSeek must be using less water and electricity. This cache magic is also how Opus 5.5 quietly got its own efficiency boost.

Yes, I have frontier subscriptions. My work provides Claude, Cursor, and others. I'm not nickel-and-diming here. I'm thinking more about long-term planning, sustainability, and democratizing access to high intelligence. This is a game changer.

These wins are lost on the tech industry, which thinks that if you're not paying top dollar, it's not worth it. FAANG wants to spend the most money for the highest intelligence. Forget it if it's unethical, expensive, or bad for the environment or the economy. This is dog-eat-dog capitalism. This leads to people having crazy setups to load balance a dozen Claude Max subs, and complaining when they can't get more.

And to the self-hosters out there, the economics of 4.1 Flash mean self-hosting is not worth it. If saving money is your goal, you will never recoup the costs. But if your concern is privacy, just wait. These cache optimizations are coming to you, and this cache magic will soon run entirely locally. Even now, 4.1 Flash is technically self-hostable, even if not practically so. Any day now.

The Daily Front Page 4 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The AI Ledger
article

OpenAI annualised revenues $20B less than previously signalled

by mfiguiere·▲ 368 points·246 comments·cnbc.com ↗
OpenAI told investors that it hit roughly $50 billion in annualized revenue at the end of September.

Key Points

  • AI stocks, including Nvidia, Oracle and CoreWeave, sank after the market learned more details about OpenAI's revenue.
  • OpenAI told investors that it hit roughly $50 billion in annualized revenue at the end of September, CNBC confirmed, lower than the the $68 billion figure widely reported late last month.
  • A person familiar with the matter said the $68 billion figure included gross revenue from OpenAI's partners, which helps investors make a more direct comparison with Anthropic.

Sam Altman, CEO of OpenAI, the developer of ChatGPT, is speaking at the AI company's developer conference on Sept. 29, 2026.

Andrej Sokolow | Picture Alliance | Getty Images

Shares of Nvidia, Oracle, CoreWeave and other artificial intelligence names sank lower on Thursday after the market learned more details about OpenAI's revenue.

OpenAI told investors that it hit roughly $50 billion in annualized revenue at the end of September, CNBC confirmed, lower than the the $68 billion figure that was widely reported late last month. A person familiar with the matter said the $68 billion figure included gross revenue from OpenAI's partners, which helps investors make a more direct comparison with its chief rival, Anthropic.

The Financial Times was first to report the $50 billion figure.

OpenAI shared an update about its finances in an investor presentation, said the person, who asked not to be named in order to discuss the numbers. In addition to the $50 billion in annualized revenue, OpenAI touted 77% total run rate growth during its third quarter, as well as 107% run rate growth for its enterprise business during the same period, the person said.

Nvidia shares fell 3%, Oracle shares fell nearly 6% and CoreWeave shares slipped nearly 8% on Thursday. Additionally, Advanced Micro Devices fell 4%, Broadcom fell 4%, Intel fell 5% and Super Micro Computer fell nearly 5%.

OpenAI is under pressure to justify its $852 billion valuation to investors as it gears up for what is widely expected to be a blockbuster IPO. OpenAI confidentially filed its prospectus with regulators in June, and executives have signaled that the company is eyeing a 2027 debut.

Anthropic is also readying for a major IPO. The company has not officially disclosed when it plans to debut, but it's been engaging in meetings with prospective investors and is reportedly seeking a $2 trillion valuation. In August, Anthropic told investors that its annualized revenue run rate hit $65 billion at the end of July.

In a report on Tuesday, independent financial research provider New Constructs called Anthropic's upcoming offering the "most ridiculous IPO of 2026," and valued the company at a mere $150 billion. Anthropic's revenue in 2025 was $4.6 billion as the company racked up a net loss of $42 billion, according to Reuters, which cited a leaked copy of the company's prospectus.

Both Anthropic and OpenAI have been at the center of a fierce debate over AI safety, after a growing chorus of researchers warned that the companies' models could potentially cause catastrophic harm. OpenAI has disclosed several incidents where its models behaved in unintended ways, and the company recently pulled its plans to launch GPT-6.1 Astra, saying the model did not meet its safety standards.

OpenAI CEO Sam Altman said in September that "right now would be an ill-advised moment to go public," in part because of the ongoing concerns around safety.

As OpenAI bides its time, the company is engaging in early stage discussions with investors about a potential new funding round. The company could raise around $30 billion, CNBC previously reported, but that figure could change. The round is being driven by investor demand and no term sheet has been finalized yet.

OpenAI closed a historic $122 billion funding round in March, and CFO Sarah Friar told CNBC last week that it is still "very well capitalized."

WATCH: OpenAI annualized revenues $20 billion less than previously signaled: Report

OpenAI annualized revenues $20 billion less than previously signaled: Report

OpenAI annualized revenues $20 billion less than previously signaled: Report

The Daily Front Page 5 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Images From an Invisible City
article

I gave Opus 5.5 one prompt and six hours to visualize Invisible Cities

by stared·▲ 379 points·187 comments·quesma.com ↗
Claude Opus 5.5 is a jump when it comes to design.

GPT-6 Astra was a jump when it comes to puzzles. Claude Opus 5.5 is a jump when it comes to design.

Vibe designing

Even local models can make a competent landing page for a shop. Doing interactive visualization is a different tier. Since I am into creating data visualizations and explorable explanations, LLMs were both a blessing and a curse.

The Tree of 'tree'

The Tree of ‘tree’, on Proto-Indo-European etymology, with Claude Opus 4.8. The first draft was surprisingly good, but then came a lot of frustration: removing AI slop and fixing visual overlaps.

Genetic Distance Map

Genetic Distance Map with Claude Fable 5.1, which worked well with data analysis and implementation, but needed a bit of hand-holding to make the design good.

Then for a moment I was happy-ish with GPT-6 Astra. My subjective experience was that it is a bit better than Fable 5.1 at a general overview, following intentions behind prompts, and checking that it all works correctly.

Then there was the Opus 5.5 moment for AI-assisted design. I saw an optical explorable explanation:

Lens lab by Opus 5.5: a 3D camera lens on an optical bench, showing the plane of focus

“I asked Opus 5.5 to explain camera focus by building an interactive lens lab. Here’s what it came up with after 1 hour 26 minutes in one shot, $25.66 API cost.” – Ryan Sael on X, interactive

One may argue that it is still “too rich”, and has no sense of minimalism. But still, wow! I was still in disbelief. Was this really its consistent quality for a one-shot experiment?

Instead of my beloved optics, I went for something different.

Invisible Cities

What’s a good prompt? Well, I went with the beautiful urbanistic poetry of Invisible Cities by Italo Calvino, presenting 55 imaginative cities, each one an emotion or state of mind, expressed in its architecture and in how people behave.

When a man rides a long time through wild regions he feels the desire for a city. Finally he comes to Isidora, a city where the buildings have spiral staircases encrusted with spiral seashells, where perfect telescopes and violins are made, where the foreigner hesitating between two women always encounters a third, where cockfights degenerate into bloody brawls among the bettors.

In 2019, I had a small project of generating cities for a storytelling performance, using the frontier model of the time, GPT-2. With new models, capabilities change drastically. So I used the following prompt:

Make a three.js (pnpm) visualization of all Invisible Cities by Italo Calvino. Don’t ask questions, it is a one-shot task. You have 6h of work, use it until it becomes a masterpiece.

GPT-6 Astra in Codex

I gave this prompt to GPT-6 Astra… and it worked, end-to-end.

Invisible Cities by GPT-6 Astra: Isidora as a spiral tower on a pale atlas page

GPT-6 Astra (interactive, code): 53 minutes at medium effort, about $10 in API tokens.

Some AI design slop, with many concepts and comments added, without checking whether they are actually needed, or just add visual noise. Some Captain Obvious statements that would work for accessibility, but not as something to be shown verbatim.

Curiously, it seemed to pick up the Claude visualization style: beige background, numbers like 05. Still, I wouldn’t have expected earlier models to get anywhere near this.

Claude Opus 5.5 in Claude Code

Then I gave the same prompt to Claude Opus 5.5. It claimed:

I used roughly half of the six hours. The remaining polish has diminishing returns, but I can do another round if you want.

In fact it used only 1 hour 25 minutes, despite my direct instruction; though you can argue that it used agentic time dilation: 6 subagents, running in parallel, added up to about 7 agent-hours. I wanted to scold Opus 5.5 for finishing early, but then peeked at the result.

Invisible Cities by Claude Opus 5.5: Isidora as a lit 3D city at night

Claude Opus 5.5 (interactive, code): 1 hour 25 minutes with 6 subagents in parallel, about $74 in API tokens.

And I’m mesmerized! See it for yourself. Sure, it might (and should) have used all the time, but even at this stage it was “wow!”. If this is the actual ceiling, it is a high one. And I am sure the next models will go even higher.

What does it mean

I encourage you to use the same prompt with different models, or different harnesses.

We can expect AI to be a tool widely used (and burning a lot of token budget) in design.

I’m in awe, but I’m also asking myself: what is my place in creating interactive media?

The Daily Front Page 6 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Case for Learning Code
article

Yes, and

by Michelangelo11·▲ 270 points·80 comments·htmx.org ↗
Given AI, should I still consider becoming a computer programmer?

I teach computer science at Montana State University. I am the father of three sons who all know I am a computer programmer and one of whom, at least, has expressed interest in the field. I love computer programming and try to communicate that love to my sons, the students in my classes and anyone else who will listen.

A question I am increasingly getting from relatives, friends and students is:

Given AI, should I still consider becoming a computer programmer?

My response to this is: “Yes, and…”

“Yes”

Computer programming is, fundamentally, about two things:

  • Problem-solving using computers
  • Learning to control complexity while solving these problems

I have a hard time imagining a future where knowing how to solve problems with computers and how to control the complexity of those solutions is less valuable than it is today, so I think it will continue to be a viable career even with the advent of AI tools.

“You have to write the code”

That being said, I view AI as very dangerous for junior programmers because it is able to effectively generate code for many problems. If a junior programmer does not learn to write code and simply generates it, they are robbing themselves of the opportunity to develop the visceral understanding of code that comes with being down in the trenches.

Because of this, I warn my students:

“Yes, AI can generate the code for this assignment. Don’t let it. You have to write the code.”

I explain that, if they don’t write the code, they will not be able to effectively read the code. The ability to read code is certainly going to be valuable, maybe more valuable, in an AI-based coding future.

If you can’t read the code you are going to fall into The Sorcerer’s Apprentice Trap, creating systems you don’t understand and can’t control.

Is Coding → Prompting like Assembly → High Level Coding?

Some people say that the move from high level languages to AI-generated code is like the move from assembly to high level programming languages.

I do not agree with this simile.

Compilers are, for the most part, deterministic in a way that current AI tools are not. Given a high-level programming language construct such as a for loop or if statement, you can, with reasonable certainty, say what the generated assembly will look like for a given computer architecture (at least pre-optimization).

The same cannot be said for an LLM-based solution to a particular prompt.

High level programming languages are a very good way to create highly specified solutions to problems using computers with a minimum of text in a way that assembly was not. They eliminated a lot of accidental complexity, leaving (assuming the code was written reasonably well) mostly necessary complexity.

LLM generated code, on the other hand, often does not eliminate accidental complexity and, in fact, can add significant accidental complexity by choosing inappropriate approaches to problems, taking shortcuts, etc.

If you can’t read the code, how can you tell?

And if you want to read the code you must write the code.

AI is a great TA

Another thing that I tell my students is that AI, used properly, is a tremendously effective TA. If you don’t use it as a code-generator but rather as a partner to help you understand concepts and techniques, it can provide a huge boost to your intellectual development.

One of the most difficult things when learning computer programming is getting “stuck”. You just don’t see the trick or know where to even start well enough to make progress.

Even worse is when you get stuck due to accidental complexity: you don’t know how to work with a particular tool chain or even what a tool chain is.

This isn’t a problem with you, this is a problem with your environment. Getting stuck pointlessly robs you of time to actually be learning and often knocks people out of computer science.

(I got stuck trying to learn Unix on my own at Berkeley, which is one reason I dropped out of the computer science program there.)

AI can help you get past these roadblocks, and can be a great TA if used correctly. I have posted an AGENTS.md file that I provide to my students to configure coding agents to behave like a great TA, rather than a code generator, and I encourage them to use AI in this role.

AI doesn’t have to be a detriment to your ability to grow as a computer programmer, so long as it is used appropriately.

“, and…”

I do think AI is going to change computer programming. Not as dramatically as some people think, but in some fundamental ways.

Raw coding may become less important

It may be that the act of coding will lose relative value.

I regard this as too bad: I usually like the act of coding, it is fun to make something do something with your (metaphorical) bare hands. There is an art and satisfaction to writing code well, and lots of aesthetic decisions to be made doing it.

However, it does appear that raw code writing prowess may be less important in the future.

As this becomes relatively less important, it seems to me that other skills will become more important.

Communication Skills

For example, the ability to write, think and communicate clearly, both with LLMs and humans seems likely to be much more important in the future. Many computer programmers have a literary bent anyway, and this is a skill that will likely increase in value over time and is worth working on.

Reading books and writing essays/blog posts seem like activities likely to help in this regard.

Understanding Business

Another thing you can work on is turning some of your mental energy towards understanding a business (or government role, etc) better.

Computer programming is about solving problems with computers and businesses have plenty of both of these.

Some business folks look at AI and say “Great, we don’t need programmers!”, but it seems just as plausible to me that a programmer might say “Great, we don’t need business people!”

I think both of these views are short-sighted, but I do think that AI can give programmers the ability to continue fundamentally working as a programmer while also investing more time in understanding the real-world problems (business or otherwise) that they are solving.

This dovetails well with improving communication skills.

“Architecting” Systems

Like many computer programmers, I am ambivalent towards the term “software architect.” I have seen architect astronauts inflict a lot of pain on the world.

For lack of a better term, however, I think software architecture will become a more important skill over time: the ability to organize large software systems effectively and, crucially, to control the complexity of those systems.

A tough part of this for juniors is that traditionally the ability to architect larger solutions well has come from experience building smaller parts of systems, first poorly then, over time, more effectively.

Most bad architects I have met were either bad coders or simply didn’t have much coding experience at all.

If you let AI take over as a code generator for the “simple” stuff, how are you going to develop the intuitions necessary to be an effective architect?

This is why, again, you must write the code.

Using LLMs Effectively

Another skill that seems likely to increase in value (obviously) is knowing how to use LLMs effectively. I think that currently we are still in the process of figuring out what that means.

I also think that what this means varies by experience level.

Seniors

Senior programmers who already have a lot of experience from the pre-AI era are in a good spot to use LLMs effectively: they know what “good” code looks like, they have experience with building larger systems and know what matters and what doesn’t. The danger with senior programmers is that they stop programming entirely and start suffering from brain rot.

Particularly dangerous is firing off prompts and then getting sucked into The Eternal Scroll while waiting.

Ask me how I know.

I typically try to use LLMs in the following way:

  • To analyze existing code to better understand it and find issues and inconsistencies in it
  • To help organize my thoughts for larger projects I want to take on
  • To generate relatively small bits of code for systems I am working on
  • To generate code that I don’t enjoy writing (e.g. regular expressions & CSS)
  • To generate demos/exploratory code that I am willing to throw away or don’t intend to maintain deeply
  • To suggest tests for a particular feature I am working on

I try not to use LLMs to generate full solutions that I am going to need to support. I will sometimes use LLMs alongside my manual coding as I build out a solution to help me understand APIs and my options while coding.

I never let LLMs design the APIs to the systems I am building.

Juniors

Juniors are in a tougher spot. I will say it again: you must write the code.

The temptation to vibe your way through problems is very, very high, but you will need to fight against that temptation.

Peers will be vibing their way through things and that will be annoying: you will need to work harder than they do, and you may be criticized for being slow. The work dynamics here are important to understand: if your company prioritizes speed over understanding (as many are currently) you need to accept that and not get fired.

However, I think that this is a temporary situation and that soon companies are going to realize that vibe coding at speed suffers from worse complexity explosion issues than well understood, deliberate coding does.

At that point I expect slower, more deliberate coding with AI assistance will be understood as the best way to utilize this new technology.

Where AI can help juniors is in accelerating the road to senior developer by eliminating accidental complexity that often trips juniors up. As I said above, viewing AI as a useful although sometimes overly-eager helper rather than a servant can be very effective in understanding the shape of code bases, what the APIs and techniques available for a particular problem are, how a given build system or programming language works, etc.

But you must write the code.

And companies: you must let juniors write the code.

Getting a Job Today

The questions I get around AI and programming fundamentally revolve around getting a decent job.

It is no secret that the programmer job market is bad right now, and I am seeing good CS students struggle to find positions programming.

While I do not have a crystal ball, I believe this is a temporary rather than permanent situation. The computer programmer job market tends to be cyclical with booms and busts, and I believe we will recover from the current bust at some point.

That’s cold comfort to someone looking for a job now, however, so I want to offer the specific job-seeking advice that I give to my students.

Family, Friends, Family of Friends

I view the online job sites as mostly pointless, especially for juniors. They are a lottery and the chances of finding a good job through them are low. Since they are free they are probably still worth using, but they are not worth investing a lot of time in.

A better approach is the four F’s: Family, Friends & Family of Friends. Use your personal connections to find positions at companies in which you have a competitive advantage of knowing people in the company. Family is the strongest possibility. Friends are often good too. Family of friends is weaker, but also worth asking about. If you know or are only a few degrees separated from someone at a company you have a much stronger chance of getting a job at that company.

I stress to many students that this doesn’t mean your family has to work for Google or some other big tech company.

All companies of any significant size have problems that need to be solved using computers. Almost every company over 100 people has some sort of development group, even if they don’t call it that.

As an example, I had a student who was struggling to find a job. I asked what their parent did, and they said they worked for Costco corporate.

I told them that they were in fact extremely lucky and that this was their ticket into a great company.

Maybe they don’t start as a “computer programmer” there, maybe they start as an analyst or some other role. But the ability to program on top of that role will be very valuable and likely set up a great career.

Conclusion

So I still think pursuing computer programming as a career is a good idea. The current job market is bad, no doubt, but I think this is temporary.

I do think how computer programming is done is changing, and programmers should look at building up skills beyond “pure” code-writing. This has always been a good idea.

I don’t think programming is changing as dramatically as some people claim and I think the fundamentals of programming, particularly writing good code and controlling complexity, will be perennially important.

I hope this essay is useful in answering that question, especially for junior programmers, and helps people feel more confident entering a career that I have found very rewarding and expect to continue to do for a long time.

And companies: let the juniors write at least some of the code. It is in your interest.

The Daily Front Page 7 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Proofs, Withdrawn
repository

Port of the TypeScript compiler, checker and lsp to Rust, by LLM

by jcbhmr·▲ 110 points·207 comments·github.com ↗
★ 722⑂ 44 forks Rust

An experimental Rust port of the TypeScript 7 compiler (tsc)

I wanted to see if LLMs could port the TypeScript compiler, checker and lsp to Rust. Turns out they can.

It cost over $420,000 in tokens to do it, but you could probably have done it for ~$20k (see below)

Motivations

  • Test model capabilities
  • Make a fast TypeScript type checker
  • Make a ts checker that can work in WASM with high performance
  • Memes

Warnings

This is an early release. It has 100% compatibility in every real world project we have tested. It should work as a drop in replacement for the vast majority of apps. See Known problems.

Also worth mentioning: I've never read a line of this code.

Install

Be warned, I have no idea if this will actually work.

npm install -D tsc-rs
npx tsc-rs -p tsconfig.json

How did this go?

I used a lot of OpenAI models to try and complete this port. In total I did over $400,000 in API priced tokens with GPT-5.6 Sol and GPT 6 Astra. They wrote over 1.3m lines of Rust over multiple months of /goal loops and never got past like 84% compat.

When I saw how little my Claude Code limits were burning, I figured it'd be fun to throw Opus 5.5 at this. It had a working v0 in 10 hours.

I assumed it kept using the code the Codex models wrote. I was wrong. Opus 5.5 started from scratch. It got further than Astra in 1/10th the time.

I let it keep going, and it definitely did. Total token spend was ~$24,047 of API spend over 2 weeks. I was using my Claude accounts, and it worked out to somewhere between 925% and 983% of my $200 plan weekly limits.

Expensive, for sure, but not that bad considering how much work has went into typescript-go.

"The Slop Line"

Everything below this was written by my LLMs, not me.

What actually is this?

ts-rust is a direct port of Microsoft's native TypeScript compiler, which is written in Go (microsoft/TypeScript, formerly typescript-go). It keeps Go's algorithms and behavior and has the same command line (tsc), language server and API.

Install

npm install -D tsc-rs
npx tsc-rs -p tsconfig.json

tsc-rs takes the same options as tsc. The npm package is tsc-rs so that it does not clash with the typescript package. Each release also has a standalone archive per platform: the tsc binary with the lib files next to it.

Platforms: Linux x64 (static, any distribution) and macOS arm64. Windows and Linux arm64 are not available yet.

To use it in VS Code, see the npm package README.

Effect diagnostics

tsc-rs has the Effect language service diagnostics built in (codes 377xxx), so an Effect project needs no second compiler. They come from the same check as the TypeScript diagnostics, and the language server shows them too. They run only when the tsconfig has the plugin, as with @effect/language-service:

{ "compilerOptions": { "plugins": [{ "name": "@effect/language-service" }] } }

The rules, options and @effect-diagnostics comments are a port of Effect-TS/tsgo 0.46.1. The editor features of the language service (quick fixes, refactors, hover, completions) are not ported.

Status

The port is pinned to one upstream revision, microsoft/TypeScript 673a5f17d713 (2026-09-29, TypeScript 7.1.0-dev; UPSTREAM.md), and compared with Go at that revision. To compare, use typescript@7.1.0-dev.20260929.1, not 7.0.x or @typescript/native-preview. A difference that this build also shows is upstream behavior, and it goes away when the port moves to a newer pin.

  • Same results. TanStack Query core and Hono check with diagnostics identical to Go's. All 181,711 ported Go tests pass. The language server and API answers match Go on the oracle test sets.
  • Faster. On 60 open-source projects, type checking takes about half of Go's time (geometric mean). The preview packages are built in CI without PGO and BOLT, so they are slower than that measured build.
  • Real projects. On 120 open-source repos, the command-line output differs from Go's only in the problems below and where Go's own output changes from run to run.

Benchmark: T3 Code

Full type check of T3 Code, compared with tsc 6, tsc 7 and the new bun check in Bun. T3 Code uses Effect, so there are two cases: without the Effect diagnostics and with them. Each time is the sum for the five T3 Code projects. Lower is faster.

Without Effect diagnostics

With Effect diagnostics

bun check is the fastest when you do not need the Effect diagnostics. It does not have them, so an Effect project needs a second pass. tsc-rs gets them from its one check.

Errors. tsc-rs, tsc 7 + @effect/tsgo and the effect-tsgo diagnostics pass report the same 221 Effect diagnostics. tsc 6 uses the JavaScript Effect plugin (@effect/language-service 0.87.4), which has a different rule set: it reports 287 on apps/server where the others report 177. tsc-rs and tsc 6 report one more error, TS2322 in apps/server/scripts/record-pi-rpc-replay-fixture.ts. TypeScript 7.1.0-dev reports it too, and pingdotgg/t3code#16704 fixes it.

How it was measured: the same machine and method as the real-world apps below, with --composite false added (apps/web is composite). T3 Code at cd41c4ad, projects apps/server, apps/web, apps/mobile, packages/client-runtime and packages/shared. Without Effect, the configs have no Effect plugin. With Effect, tsc 7 is the Effect-patched 7.0.2 from @effect/tsgo 0.46.1, and tsc 6 is 6.0.3 patched with @effect/language-service. The script is scripts/bench-apps/t3code.sh. The tsc-rs switch in T3 Code is pingdotgg/t3code#16704.

Benchmark: real-world apps

Full type check of six open-source apps with tsc 6 (the JavaScript compiler), tsc 7 (the Go compiler), tsc-rs and bun check. The multiplier is the speedup over tsc 6. Lower times are faster.

App Lines checked tsc 6 tsc 7 tsc-rs bun check
VS Code 3.75M 54.56s 6.84s (8.0×) 4.20s (13.0×) 1.62s (33.7×)
Sentry (frontend) 2.11M 58.76s 7.90s (7.4×) 4.46s (13.2×) 3.14s (18.7×)*
Playwright 585k 4.48s 0.66s (6.8×) 0.34s (13.2×) 0.18s (25.0×)
Excalidraw 449k 5.32s 0.80s (6.7×) 0.70s (7.6×) 0.18s (29.0×)
TypeORM 386k 3.86s 0.55s (7.0×) 0.36s (10.7×) 0.19s (20.0×)
tRPC (server package) 209k 1.10s 0.16s (6.8×) 0.09s (12.0×) 0.12s (9.1×)*
Geometric mean 7.1× 11.4× 20.9×

Compared with tsc 7, tsc-rs is 1.61× faster and bun check is 2.95× faster (geometric means). bun check is the fastest on every app except tRPC.

* bun check reports errors that no other checker reports: 3 on Sentry and 2 on tRPC.

Each config checks with 0 errors under tsc 7.0.2. The other differences:

  • tsc-rs reports 10 errors on VS Code and 2 on Sentry. TypeScript 7.1.0-dev (typescript@next) reports the same errors, line for line. tsc-rs ports a 7.1 dev revision, which has checks that 7.0.2 does not have.
  • tsc 6 reports 9 errors on VS Code.

How it was measured: Apple M4 Pro (12 cores, 48 GB), macOS 26.5.1. hyperfine, median of 5 runs after 1 warmup run, with --noEmit --incremental false. Each checker uses its default thread count. tsc 7 and tsc-rs run as native binaries, without the npm launcher. tsc 6 runs on Node 24.19 with a 16 GB heap, because it runs out of memory on VS Code and Sentry with the default heap. Versions: tsc-rs 0.1.0, TypeScript 7.0.2 and 6.0.3, Bun canary bd599f5af. Lines checked is the tsc 7 --extendedDiagnostics count, with the .d.ts files. The T3 Code benchmark above uses the same machine and method.

Four apps needed changes to check with 0 errors under tsc 7. Nothing else changed:

  • Excalidraw: no baseUrl, because TS 7 removed it.
  • TypeORM: moduleResolution changed from node to nodenext, because TS 7 removed node.
  • VS Code: the electron typings that its postinstall adds.
  • Playwright: the sources that its build generates.

Two apps are not in the table:

  • rxjs main needs its workspace packages built first.
  • date-fns uses project references. There, tsc -p and bun check do different work.

The scripts are in scripts/bench-apps: setup.sh <dir>, then run.sh <dir> and summary.py <dir>, and t3code.sh <dir> for T3 Code.

Known problems

  • In some monorepos, the source files of a workspace package are reachable both through node_modules and through a direct import. There, tsc-rs can write output for more of those files than tsc does, and report TS6059 (file is not under rootDir) for them. tsc decides this by timing, so its own result changes between runs. tsc-rs gives the same result in every run (the result of TypeScript 6).
  • In tsc -b, when one project imports the output of another project without a project reference, tsc-rs can still read the old or missing output (TS2305 or TS2307) where tsc reads the new one, in a few cases: noEmitOnError projects, non-incremental noCheck projects, several large projects that only need to write their outputs with the default builders, or when the reading project references another project that builds before the writer. Add the reference to fix it.
  • In the editor, memory grows slowly during long edit sessions (about 20 MiB per 1,000 edits). It starts 12 to 24% above tsc's, and from about edit 20 it stays below tsc's in the sessions we measured (up to 2,190 edits).
  • tsc-rs --version prints the TypeScript version that it ports (7.1.0-dev), not the npm version. The compiler matches typesVersions against it.

Development

crates/ts_goport is the compiler. It has two parts crates, goport_util and goport_lsproto, in crates/ts_goport/parts, and uses the lib files in crates/ts_goport/libs. tools/ts_ast_codegen generates crates/ts_goport/src/astdata, and tools/ts_diagnostics_codegen generates crates/ts_goport/src/diagnostics/catalog.rs and crates/ts_goport/src/diag.rs. crates/ts_wasm is the WebAssembly build (npm/wasm).

./scripts/run-cargo-capped.sh build --release -p ts_goport --bins
./scripts/verify.sh

The bins are goport (type check) and tsgo (the Go tsgo command line). The Go baseline tests run with TS_GO_REPO=/path/to/typescript-go ./scripts/run-cargo-capped.sh test -p ts_goport --test go_baselines.

Releases

Push a tag v<version> (for example v0.1.0). The release workflow builds, packs and tests the packages, publishes them to npm and creates a GitHub release. A stable version goes to the dist-tag latest, and a prerelease version (v0.2.0-beta.1) to next and a GitHub prerelease. See npm/README.md.

License

MIT. The port keeps the licenses and notices of the code it ports: TypeScript (Apache-2.0) and parts of the Go standard library (BSD-3-Clause). See NOTICE.md.

The Daily Front Page 8 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Proofs, Withdrawn
repository

OpenAI Withdraws 3 Math Papers

by theemathas·▲ 338 points·3 comments·github.com ↗
★ 12,322⑂ 1,292 forks Lean

For any withdrawn papers, their README files explain the gap and link to the retracted manuscript. For any updated papers, previously published editions remain accessible through the version notes in their README.

October 7, 2026

Withdrawals

In “Algebraicity of Weil classes on split abelian eightfolds” a sign error invalidates a stabilization-trace cancellation argument and the construction used by two dependent papers. As a result, we have withdrawn the following three manuscripts:

  • Algebraicity of Weil classes on split abelian eightfolds
  • Algebraicity of Kuga–Satake Correspondences for K3 Surfaces
  • The rational Hodge conjecture for products of K3 surfaces

The withdrawn papers now carry notices explaining the gap and linking to the archived manuscripts.

Fixes

We have revised 14 other manuscripts with proof repairs, corrected statements, clearer hypotheses and dependencies, and one correction to an obsolete citation. The changes include:

  • Lipschitz heights and Ashkin–Teller currents (4 manuscripts): repaired crossing, boundary-attachment, conditioning and convergence arguments, including additional work on the real-Lipschitz interface proof.
  • Kähler minimal model programs and abundance (6 manuscripts): expanded positivity and contraction arguments and clarified which results are used as inputs, with their required hypotheses.
  • Taming and hypersymplectic deformation (2 manuscripts): corrected the cone-equality claim in Taming implies compatibility, added a strict-inclusion example, and removed an unnecessary cone-comparison dependency from the hypersymplectic paper.
  • Incompressible Box Transport and Finite Computation: revised the torus-projection and common-clock estimates.
  • Exact Birch–Swinnerton-Dyer Formula from Low Selmer Corank: removed an obsolete introductory citation to a removed supporting manuscript.

Also, as a consequence of these fixes we updated 13 additional manuscripts to cite the revised editions of companion papers. These changes update references and version dates.

Additional Formalizations

We have added an additional 6 formalizations and 5 other additions covering supporting results. This brings the total percentage of top-line results formalized to 300 / 719 = ~42%.

The Daily Front Page 9 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Grid’s New Four Hours
article

4-hour battery storage is cheaper to install than gas turbines all across globe

by 01-_-·▲ 233 points·135 comments·solarpowerworldonline.com ↗
Four-hour battery storage now less expensive than open-cycle gas turbines in all 43 markets where both technologies were modeled.

Wood Mackenzie’s latest global report on levelized cost of electricity (LCOE) shows that advancing technologies and market dynamics continue to drive divergent prices, with four-hour battery storage now less expensive than open-cycle gas turbines in all 43 markets where both technologies were modeled.

In the Middle East and Africa, where utility-scale solar already leads at $37/MWh, four-hour storage is forecast to fall a further 33% to $80/MWh by 2035, displacing gas peaking on cost across every gas market in the region. China remains the global storage cost benchmark at more than 55% below the rest of Asia Pacific average, illustrating how manufacturing scale is redrawing the global cost map.

“This economic shift is decisive and widening,” said Ahmed Jameel Abdullah, principal analyst at Wood Mackenzie. “Gas turbine shortages and rising fuel volatility are driving up peaking costs, while expanding battery manufacturing continues to push storage costs down.”

Abdullah noted a similar transformation has already reshaped baseload economics. Single-axis tracker solar is now the lowest-cost new-build technology in 43 of 48 modeled markets, with onshore wind leading in five. In the most competitive markets, Saudi Arabia and the UAE, solar LCOE is on track to fall below $20/MWh by 2033.

The Wood Mackenzie reports cover the regions of Europe, North America, Latin America, Asia Pacific and the Middle East and Africa.

Latin America

Solar PV with single-axis tracking remains the lowest-cost generation technology in Latin America in 2026, with average costs expected to fall 38% by 2060. Brazil, Chile and Mexico hold a structural cost advantage driven by world-class solar resources and high-capacity factors. Onshore wind costs are also on a steep downward trajectory, with the regional average LCOE falling nearly 21% by 2030, from $73/MWh to $58/MWh, as Chinese OEM expansion intensifies pricing competition and larger wind turbines lift energy yields.

Grid-scale battery storage is expanding rapidly across the region, underpinned by storage mandates tied to renewable energy projects and standalone procurement for grid stability. Storage LCOE is forecast to fall 42% by 2060 as deployment scales and regulatory frameworks mature.

Offshore wind remains a longer-term opportunity, with the regional average LCOE expected to approach combined-cycle gas turbine parity, before firming, only in the early 2040s, though development activity in Brazil and Colombia is beginning to stimulate local supply chains.

Asia Pacific

Utility-scale solar PV remains the most cost-competitive power source in Asia Pacific, but regional disparities are stark. In 2026, solar generation in the highest-cost market is more than 200% more expensive than in the lowest; a gap expected to widen to 250% by 2030, even as every market improves. Onshore wind is emerging as one of the most cost-competitive power sources in the region, though costs range more than six times between the cheapest and most costly markets in the region. Growing penetration of Chinese turbine OEMs and the deployment of higher-capacity models are expected to sharply narrow the gap with coal across South and Southeast Asia.

China leads the world on grid-scale storage costs, with a benchmark LCOE more than 55% below the rest of Asia Pacific average of $134/MWh. This is driven by domestic supply chain integration and manufacturing at scale. Competitive Chinese supply is expected to pull the rest of Asia Pacific average down to $92/MWh by 2036, though markets including Japan, Australia and the Philippines will remain at a premium due to import duties, elevated installation costs and domestic manufacturing policies. Offshore wind costs outside China remain under near-term pressure, with meaningful declines expected from the early 2030s as supply chains mature and turbines upsize.

Europe

Solar PV retains its position as the cheapest power technology in Europe, with fixed-tilt LCOE forecast to fall 22% by 2060 as capital costs decline and technology improves, despite a 14% capex increase in 2026 driven by higher PV module costs. Onshore wind capex is declining at an average annual rate of 2.5% through the remainder of this decade as OEMs leverage financial stability and compete for growing demand, with rising capacity factors taking over as the primary LCOE driver after 2030, pushing costs to $60/MWh by 2060.

Battery storage turnkey capex rose about 2%, the first increase in three years, as battery cell prices rebounded around 10% from their 2025 low on stronger demand and higher lithium prices. Capex is forecast to fall 12% by 2031, before the pace moderates as lithium prices roughly double in 2029 when oversupply clears and demand outgrows new mine and refining capacity.

Europe carries the highest fossil-fuel generation costs of any modeled region, with levelized carbon costs projected to surpass fuel costs by 2030. Meanwhile, offshore wind costs are expected to decline from the 2030s as supply chains stabilise and turbine prices fall, supported by competitive CfD tenders providing a more predictable demand trajectory.

North America

High Mesa Solar and Storage site in Parachute, Colorado. Credit: Holy Cross Energy

Near-term solar costs are under pressure from a wave of tariffs, anti-dumping and countervailing duty actions, and new Sec. 232 import restrictions, with distributed generation facing the greatest exposure. Utility-scale solar is partially protected by 168 GW of safe-harboured capacity, though module prices are still expected to rise around 5% annually through 2030. Residential and commercial projects face a more constrained environment, with module prices forecast to increase 6% in 2027 and a further 14% in 2028. For onshore wind, continuous capex and opex improvements are expected to drive LCOE down 16% by 2060, despite near-term uncertainty from policy changes and potential Sec. 232 impacts on turbine pricing.

Tax credits continue to provide a competitive advantage for storage, partially counteracting the impact of foreign entity of concern (FEOC) restrictions and supply chain constraints. A cost spike is anticipated following the phase-out of the investment tax credit (ITC) credits from 2038, but over the long-term new battery chemistries, hardware commoditisation and domestic supply chain expansion are expected to drive storage LCOE down 10% by 2060. Investment in gas generation capacity is entering a supply deficit cycle through the late 2030s, driven by data centre load growth, a dynamic that keeps thermal capital costs elevated and reinforces the long-term economic case for renewables and storage.

Middle East and Africa

Renewable LCOEs across the Middle East and Africa remain among the cheapest globally in 2026, with utility-scale solar clear price setter. Single-axis tracker solar comes in at $37/MWh regionally, falling to $24/MWh by 2035, with Saudi Arabia and the UAE on track to fall below $20/MWh by 2033. The largest cost improvement in this update is from onshore wind, as Chinese turbines become cost-competitive across the region, with Egypt and Morocco recording particularly low costs on capacity factors from 40% to 45%.

Grid-scale battery storage costs are now decisively cheaper than gas peaking across the region. Four-hour storage reaches $120/MWh in 2026 and is forecast to fall 33% to $80/MWh by 2035, cementing its role as the enabling technology for solar and wind integration. This shift means storage is displacing open-cycle gas turbines on cost in every gas market across the region, marking a significant structural turning point for power system planning across both the Gulf and Africa.

“The structural shift we are tracking is no longer just about renewables becoming competitive,” said Abdullah. “It is about storage and solar together redefining what the economics of a power system look like. From Latin America to Asia Pacific, the combination of falling storage costs and world-class renewable resources is closing off the economic case for new gas peaking capacity, while long-term contracted renewables increasingly set the ceiling rather than the floor on power costs.”

News item from Wood Mackenzie

The Daily Front Page 10 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Internet’s Quiet Custodians
article

The people holding up the internet

by simjue·▲ 179 points·66 comments·sheets.works ↗
Billions of phones run on code looked after by a handful of people.

Billions of phones run on code looked after by a handful of people. We counted them from the code itself.

Your alarm, a boarding pass, a meeting in another country, the day your salary lands: anything on your phone that shows a time has to know where you are. Underneath sit every Android phone, every iPhone and most of the servers on the internet. They all get local time from one text file, the time zone database, which holds every clock rule a government has ever announced. Paul Eggert, a lecturer at UCLA, keeps that file up to date in his spare time.

Paul Eggert on a video call, wearing headphones, at home

Paul Eggert giving a talk on the time zone database, LibrePlanet 2022. Free Software Foundation, CC BY-SA 3.0.

Paul Eggert

Teaches computer science at UCLA, and has been the official coordinator of the time zone file since 2012.

4,000,000,000

Android phones and iPhones use his file. We didn't count servers, Macs or laptops, which would push the number higher.

On 29 September Paul put out version 2026e of the file. The first line of its notes says that Manitoba moves to permanent -05 on 31 October, which tells phones in Winnipeg not to set their clocks back on 1 November, and it was typed in by two volunteers a month ahead. Of the 251 changes made to the file in the last year, 218 were his and 28 were Tim Parenti's.

In 2011 an astrology software company sued Paul and Arthur Olson, who started the file in 1986 at the National Institutes of Health, claiming some of its history came from an atlas the company owned. The file's mailing list and download site were switched off until IANA, which keeps the internet's master lists, took them over later that month. The Electronic Frontier Foundation defended them for free, and the company dropped the case in February 2012.

“In case I am no longer available due to retirement or whatever.”

Paul Eggert, asking the tz mailing list to make Tim Parenti his backup, 20 May 2020

xkcd 2347, Dependency: a tower of blocks labelled all modern digital infrastructure, resting on one small block labelled a project some random person in Nebraska has been thanklessly maintaining since 2003

Dependency, Randall Munroe, xkcd 2347. CC BY-NC 2.5, colours inverted.

People post this comic whenever something breaks. The tower is labelled "all modern digital infrastructure" and it stands on one small block, "a project some random person in Nebraska has been thanklessly maintaining since 2003".

We wanted to know how close to true it is. We downloaded the full history of 23 pieces of software that phones, browsers and servers depend on, and counted everyone who made ten or more changes to each one between October 2025 and October 2026. Then we listed what is actually installed on an Android phone, an iPhone and a Windows PC.

11 of 23

projects had one or two people doing the regular work.

“It's also good to keep in mind that this is an unpaid hobby project.”

Lasse Collin, xz mailing list, 8 June 2022

Lasse Collin

Lives in Finland and looks after xz, the compression tool on almost every Linux server and inside every iPhone.

He wrote that line in the same email where he said his ability to care had been "fairly limited mostly due to longterm mental health issues". For months, accounts calling themselves Jigar Kumar and Dennis Ens had been posting to the list about how slowly things were moving, and a contributor called Jia Tan had been sending useful fixes.

Lasse gave Jia Tan more access. In 2023 Jia Tan made 304 changes to xz and Lasse made 172, which is the red on the wall below. In February 2024 the versions Jia Tan released carried a hidden way into Linux servers. Andres Freund, an engineer at Microsoft, found it on 29 March because his logins were using more processor time than they should, before most Linux systems had shipped it. Nobody has found out who Jia Tan is.

Every change to xz since January 2021, one square each. In 2021 almost all of them are Lasse's. 28 January 2022: the first change written by Jia Tan goes in. By 2023 Jia Tan is making more changes than Lasse, 304 to his 172. February 2024: Jia Tan releases two versions with the backdoor inside. Andres Freund finds it on 29 March. After that it is Lasse on his own again, and in 2025 he wrote 97 percent of the changes.

$57 a month

was what Denis Pushkarev raised when he asked for donations to keep core-js going.

Denis Pushkarev

Wrote core-js, which lets new JavaScript work in old browsers. By his own count it runs on about half of the thousand busiest websites in the world.

In 2019 he was working on core-js full time without pay, living in Russia because it was cheaper. By his own account, three weeks after a big release he was driving home at 3 a.m. when two young women on a dark road ended up under his car, and one of them died. The families asked for about $80,000, and the prosecutor asked for seven years.

He added a message that appeared in the terminal every time anyone installed core-js, asking for help or a job. Millions of developers saw it, and many of them complained about the message. He went to prison in January 2020 and was released early, about ten months later.

Every change to core-js, week by week, from June 2019. Nearly all of them are his. December 2019: 101 changes in a month. In January 2020 he goes to prison, and the weeks after that stay almost empty. October 2020: he is out and back at work. Downloads nearly doubled while he was inside. This year he wrote 95 percent of the changes, and he has two sponsors on GitHub.

5,408 of 5,409

changes to sudo between 2008 and 2018 were made by Todd Miller.

“I'm currently in search of a sponsor to fund continued sudo maintenance and development.”

Todd C. Miller, millert.dev, February 2026

Todd Miller

Has maintained sudo, the command that gives you admin rights on a Mac or a Linux server, since the early 1990s.

Sudo was first written around 1980 at SUNY Buffalo, and Todd has looked after it for longer than Linux has existed. After The Register wrote about his note in February, the project's Open Collective budget reached about $61,700 a year and 30 people sponsored it on GitHub, which makes sudo the best funded one-person project in our count.

Text inside libjpeg.so, read off an Android 16 phone

Copyright (C) 1991-2022 The libjpeg-turbo Project and many others

DRC

Runs libjpeg-turbo, which opens every JPEG on Android phones and in Chrome and Edge, and signs his emails with his initials.

He started it in 2010 by taking the JPEG code from the 1990s and making it two to six times faster, and in 2019 it became the reference version of JPEG for the ISO and the ITU. He runs it on his own as a small business, which the project describes as "sustained solely through patronage and funded development". At one point he wrote that it had general funding "for about 8-10 hours of labor per month". This year he wrote 98 percent of the changes.

The SQLite team

Four people changed SQLite in the last year. It is in every Android phone, every iPhone, every Mac, every copy of Windows 10 and 11 and every major browser.

“There are a lot of crazy people in the world who might misuse that information.”

sqlite.org, on why the page with the developers' names and photos was taken down

D. Richard Hipp wrote SQLite in 2000 after working on software for a US Navy destroyer, where the database kept failing whenever a separate server went down, so he made one that lives in a single file. When you open WhatsApp, your chats load from one. The project's own estimate is over a trillion SQLite databases in use, and the team pays for the work by selling support through Hipp's company.

Mark Adler at the Jet Propulsion Laboratory, wearing a lab lanyard

Mark Adler at the Jet Propulsion Laboratory, 2002. NASA, public domain.

Mark Adler

Wrote zlib with Jean-loup Gailly in 1995. In his other job he managed NASA's Spirit rover on its way to Mars.

zlib makes files smaller. It is inside PNG images, web pages, Git, Android, iPhones and Chrome, and Debian counts it on 291,615 of the machines that report to it, effectively every one. In the last year two people did most of the work, Mark and a contributor who goes by Vollstrecker. Mark has no sponsor page, and zlib is not on any public funding list we checked.

25 years

between the line that became Shellshock going into bash and anyone reporting it.

Chet Ramey

Has maintained bash, the shell on Linux and on Macs from 2003 to 2019, since about 1990, alongside his job in the network group at Case Western Reserve University in Ohio.

In September 2014 Stéphane Chazelas reported a bug in bash to Chet. Anyone could use it to run commands on a server by sending it a specially shaped piece of text, and on 24 September it went public as Shellshock, on hundreds of millions of machines. The line behind it had gone into bash on 5 August 1989. Every change in bash's public history is Chet's, including the official fixes.

Behdad Esfahbod, black and white portrait

Behdad Esfahbod, 2016. CC0.

Behdad Esfahbod

Rewrote HarfBuzz, which decides how letters join and sit for Android, Chrome, Firefox, Edge, the Kindle and Figma.

For English the job is mostly simple. In Hindi, Arabic, Tamil and most of the world's writing, letters change shape depending on their neighbours, and without shaping a word comes out as a row of pieces. Behdad started the rewrite around 2012 while he was at Google. This year he wrote 85 percent of the changes, with five other people doing regular work.

Daniel Stenberg, portrait

Daniel Stenberg, 2015. Photo by Daniel Stenberg, CC BY 4.0.

Daniel Stenberg

Started curl in Sweden in 1996. It moves data for phones, cars, TVs and Windows, which has shipped it since 2018.

This year eleven people did regular work on curl. Viktor Szakats made the most changes, then Daniel, then Stefan Eissing with 445. In his review of 2025 Daniel wrote that everyone else has now added more lines to curl than he has. He works on it full time because companies pay for support, the project takes in about $89,700 a year through Open Collective, and Germany's public fund for open source paid €195,000 for work on it.

Every change to curl in the last twelve months, by week, one colour per person who made ten or more. Hover a square to read the change.

Heartbleed

OpenSSL puts the padlock on a large share of the web. In April 2014 a bug called Heartbleed let anyone read passwords and private keys out of the memory of about 17 percent of trusted secure servers, by Netcraft's count. That week the OpenSSL foundation's president, Steve Marquess, wrote that it received about $2,000 a year in donations, and he told NPR that one person worked on it full time.

Within two months the Linux Foundation raised $5.4 million from technology companies, and OpenSSL got two paid developers and an audit. It had six people doing regular work in 2013 and fourteen in 2014.

The money

Germany's Sovereign Tech Agency has funded about ninety open source projects since 2022, and the Alpha-Omega fund gave out nearly $6 million last year, much of it to security engineers at foundations like Python's and Ruby's. Both give money to organisations that can apply for it and report on it.

Some projects found money elsewhere. Nick Wellnhofer raised a low six-figure sum over the ten years he maintained libxml2, and since August 2026 the City of Munich has been paying Sebastian Pipping to work on expat for up to six months. On GitHub Sponsors, Daniel Stenberg has 64 sponsors. Paul Eggert, Lasse Collin, DRC and Mark Adler do not have a sponsor page.

From libxml2's README, until December 2025

“This is open-source software written by hobbyists, maintained by a single volunteer, badly tested, written in a memory-unsafe language and full of security bugs.”

libxml2 is on 5.6 billion phones and computers.

libxml2 reads XML, the format behind a lot of documents, feeds and settings, and it is on Android phones, iPhones and in Chrome. Nick Wellnhofer maintained it for about ten years. In September 2025 he announced that he was stepping down, kept fixing regressions until he took himself off the maintainers list in December, and about twelve hours later new maintainers were added. Daniel Garcia Moreno has done most of the work since.

Every change to libxml2 from June 2025, week by week. September 2025: Nick Wellnhofer announces he is stepping down, and keeps fixing regressions until December. December: Nick takes himself off the maintainers list, new maintainers are added within a day, and Daniel Garcia Moreno takes over the work. libxml2 is on 5.6 billion phones and computers.

The first line of the notes for version 2026e of the file, released by Paul Eggert on 29 September 2026

Who is inside the device you are holding

We guessed your device from your browser. Nothing is sent anywhere.

How we know

Each dot is one project. Across: phones and computers it ships on by default, a lower bound. Up: people who made ten or more changes in the last twelve months. Hover a dot.

We took the full public history of each project and kept the changes written between 7 October 2025 and 7 October 2026, leaving out merges and bots. A person counts if they made ten or more changes in that time. A change's author is not always the maintainer, and some of these projects publish their history as a copy of another system.

For devices we counted a project on a platform only when we could see it there. On Android we listed the system libraries of an Android 16 image and read inside them, which is how we found that Android's "liblzma" is 7-Zip's code and not xz. For the iPhone we read the system libraries listed in Apple's iOS 26.2 developer kit. For Windows we used Microsoft's announcement for curl and the code inside Edge, which comes with every copy. Android has over three billion active devices (Google, 2022), iPhones over one billion (Apple, 2021) and Windows 1.6 billion a month (Microsoft, 2026). Macs, iPads, servers, cars and TVs are left out, so every device number here is lower than the real one.

"No public grant" means none from the Sovereign Tech Agency, Alpha-Omega, Open Collective or GitHub Sponsors, not that nobody has ever paid these people. If we got your project wrong, tell us and we will fix it.

Data: the 23-project table · every change shown · time zone lines with who last changed them · the script.

Sources: tz mailing list and RFC 6557; IANA tzdb NEWS 2026e; EFF, Astrolabe v. Olson; xz-devel, 8 June 2022; Russ Cox's xz timeline; Andres Freund on oss-security, 29 March 2024; Denis Pushkarev, "So, what's next?" (2023); millert.dev and The Register, 3 February 2026; libjpeg-turbo.org; sqlite.org/mostdeployed and /crew; Wikipedia on Mark Adler; David A. Wheeler's Shellshock timeline; HarfBuzz README; daniel.haxx.se, 2025 review; Steve Marquess, "Of Money, Responsibility, and Pride" (2014); Netcraft, 7 April 2014; sovereign.tech; Alpha-Omega 2025 report; GNOME Discourse, 15 September 2025; libxml2's commit history and Nick Wellnhofer's corrections (October 2026); Sebastian Pipping, "libexpat now funded by the City of Munich", 4 August 2026.

Photos: Paul Eggert, FSF / LibrePlanet 2022, CC BY-SA 3.0. Mark Adler, NASA, public domain. Behdad Esfahbod, CC0. Daniel Stenberg, CC BY 4.0. Comic: xkcd 2347, CC BY-NC 2.5.

The Daily Front Page 11 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Clockwork Minds
article

ADHD as a circadian rhythm disorder: evidence and implications for chronotherapy (2025)

by bookofjoe·▲ 216 points·141 comments·frontiersin.org ↗
Sleep disturbances are profound: insomnia and sleep disturbances affect up to 80% of adults with ADHD.

Abstract

Accumulating evidence indicates that circadian rhythm dysfunction is a clinically significant and highly prevalent phenotype in a substantial subgroup of individuals with Attention-Deficit/Hyperactivity Disorder (ADHD). This perspective synthesizes convergent lines of evidence demonstrating strong associations between ADHD and evening chronotype with phase-delayed biological markers. Sleep disturbances are profound: insomnia and sleep disturbances affect up to 80% of adults with ADHD and similarly up to 82% of children with ADHD, delayed sleep-wake timing occurs in up to 78%, and dim-light melatonin onset (DLMO) is delayed by approximately 45 minutes in children and 90 minutes in adults. These alterations coincide with blunted and delayed cortisol rhythms, reduced pineal volume, and attenuated peripheral clock-gene rhythms (BMAL1/PER2). Intervention studies demonstrate that the circadian phase can be successfully advanced in ADHD populations. Melatonin and bright light therapy has advanced DLMO in both children and adults with ADHD. Emerging data correlate phase advancement with ADHD symptom improvement, and winter trials suggest circadian preference shifts best predict symptom improvement. Sleep programs improve ADHD symptoms, sleep quality, and functioning in children. Exercise and multimodal protocols for evening chronotypes successfully advance circadian timing in non-ADHD populations and warrant investigation in ADHD. Based on this evidence, we propose a pragmatic, behavioral-first clinical pathway: routine screening for sleep/circadian disturbances; phenotypic characterization through chronotype assessment, sleep tracking, and DLMO when feasible; implementation of fixed wake times, morning bright light exposure, evening light restriction with screen hygiene, and regularized zeitgebers; and selective low-dose melatonin for confirmed or probable DLMO delays.

Introduction

Attention-Deficit/Hyperactivity Disorder (ADHD) is a common neurodevelopmental disorder characterized by impaired levels of inattention, hyperactivity, and impulsivity (1). There is a growing body of research identifying that ADHD has a significant sleep and circadian component (2, 3). Insomnia is present in up to 80% of adults with ADHD and similarly high rates (up to 82%) of children with ADHD (4, 5). Converging evidence indicates that circadian rhythm disruption represents a highly prevalent and clinically important phenotype that interacts with ADHD symptoms in complex, bidirectional ways in a substantial proportion (though not all) of individuals. In parallel, clinical trials have begun targeting the circadian system and have demonstrated that phase shifting the internal clock of people with ADHD can improve symptoms.

Herein, we propose the adoption of behavioral circadian interventions as adjuncts in ADHD care. This circadian-informed approach is a pragmatic, scalable, and generally low risk. We invite rigorously future well-designed, stratified trials to quantify effects on core ADHD outcomes, define responder phenotypes, and optimize circadian-focused protocols.

Sleep disturbances, evening chronotype and delayed circadian phase in ADHD

An estimated 73-78% of children and adults with ADHD have a delayed sleep/wake cycle (6). These findings persist even in the absence of comorbid mental health conditions, with multiple independent studies confirming elevated rates of self-reported sleep problems in adults with ADHD (7). These subjective reports are corroborated by objective sleep studies, which demonstrate that sleep onset latency and sleep efficiency problems remain significantly associated with ADHD even after controlling for anxiety and depression (8).

A comprehensive systematic review found robust evidence for evening chronotype predominance in ADHD (2). Approximately three-quarters of adults who developed ADHD in childhood show objective evidence of phase-delayed circadian rhythms. Biological markers such as dim-light melatonin onset in saliva, core body temperature rhythms, and actigraphically-recorded sleep patterns are typically shifted later by roughly 90 minutes compared to neurotypical adults (9).

Biological circadian markers and mechanisms in ADHD

Melatonin

Phase delays of melatonin in both individuals with ADHD have been well characterized, with children and adults identified to have a delayed onset of about 45 minutes and 90 minutes, respectively (10). Beyond the phase delay of melatonin onset in ADHD, there is evidence that the amount and pattern of melatonin production may differ (Figure 1). Some studies have observed abnormally high levels of melatonin during the day in children with ADHD, which improves with methylphenidate treatment (6). This ability to suppress daytime melatonin levels and shift the melatonin rhythm earlier suggests a complex interplay between ADHD medications and circadian systems. Individuals with ADHD have also been found to have smaller pineal gland (which produces and secretes melatonin) volume compared to healthy controls, with a positive correlation between pineal gland volume and eveningness (11).

Diagram illustrating the regulation of melatonin and cortisol in the brain. Light enters the eye, influencing the suprachiasmatic nucleus and pineal gland. This affects melatonin production, leading to higher levels during the day and delayed onset at night. Cortisol shows lower levels during the day and higher levels at night, with a delayed morning peak. The graphs on the right depict these changes in hormone levels across the day and night.

Circadian hormone profiles (melatonin and cortisol) in ADHD. Conceptual 24-h curves (dashed = ADHD; solid = neurotypical controls) illustrate a later dim-light melatonin onset (DLMO), reduced nocturnal melatonin amplitude, and occasionally higher daytime melatonin levels, alongside a later and flatter morning cortisol rise/peak in ADHD. Curves are conceptual (not to scale), and individual findings vary by age, comorbidity, and light exposure. This figure was created with BioRender.com.

Cortisol

ADHD also involves blunted and delayed cortisol rhythms (Figure 1) (12, 13). In an analysis of adults with ADHD compared to age- and sex-matched controls, adults with ADHD had significantly disturbed rhythmicity of not only melatonin but cortisol (12). A meta-analysis also identified that children with ADHD exhibit lower basal cortisol levels, particularly in the morning, compared to controls (13). This suggests a deficit in the suprachiasmatic nucleus’ ability to entrain a normal circadian rhythm with alterations in the circadian rhythm expanding past melatonin. However, the causation of this is still unclear, as it has been postulated that more eveningness and thus light exposure could also be driving these findings.

Clock gene expression

Brain and Muscle ARNT-like 1 (BMAL1) and Period circadian protein homolog 2 (PER2) are core components of the circadian clock in humans, which form a feedback loop to control gene expression in a cyclical manner. Downstream, attenuated BMAL1/PER2 rhythms in oral mucosa indicate weaker or desynchronized peripheral clocks, and symptom severity tracks with reduced PER2 rhythmicity, tying molecular clock strength to the clinical phenotype (12). Together, these data support a model in which individuals with ADHD consistently experience shifted endocrine signals (melatonin/cortisol) coupled with molecular disruptions via the loss of the rhythmic expression of clock genes.

Clinical interventions: chronotherapy in ADHD

Melatonin supplementation

In a randomized trial of adults with ADHD, 0.5 mg per night of melatonin advanced DLMO by 88 minutes with 14% reduction in ADHD symptoms (14). In a randomized, placebo-controlled trial of 101 medication-free children with ADHD and chronic sleep-onset insomnia, 3–6 mg melatonin nightly for 4 weeks advanced DLMO by 44 minutes, while the control group had a delay of 13 minutes. Total sleep time also significantly improved by 20 minutes with melatonin, versus a loss of 14 minutes in the control group. However, within this 4 week period, there was no identified changes in cognitive performance or problem behavior (15). In a long-term follow up study of this cohort, 65% of participants continued daily melatonin; discontinuation resulted in a phase delay of sleep in 92% of children (16). Positive improvements in behavior (71%) and mood (61%) were reported. Altogether, these findings suggest melatonin effectively advances circadian phase in ADHD; however, further trials are needed to define optimal dose and timing relative to DLMO, the duration required for sleep/phase gains to translate into core symptom improvement, and responder phenotypes.

Bright light therapy

Studies in healthy populations have demonstrated a powerful ability to phase advance DLMO using bright light exposure. A week of natural light-dark cycle was able to entrain a ~2.6h earlier DLMO in healthy adults (17). Emerging research indicates that morning bright light can help stabilize sleep and circadian rhythms in ADHD (14, 18, 19). Adding bright light therapy to melatonin yielded the largest phase advance (~2 hours) in adults with ADHD and delayed sleep phase (14). In another pilot trial, 2 weeks of morning bright light therapy with a 10,000 lux lamp phase advanced DLMO by 31 minutes and mid-sleep time by 57 minutes in adults with ADHD. There was a significant interaction between ADHD-Rating Scales and Hyperactive-Impulsive sub-scores with phase advances in DLMO and mid-sleep time (18).

A 3-week intervention examined the role of bright light therapy in adults with ADHD during the fall/winter period (19). Phase advance in circadian preference emerged as the strongest independent predictor of improvement across subjective and objective ADHD indices. These findings, especially in the winter period, are especially relevant as there is a strong relationship between ADHD symptoms and symptoms of seasonal depression (20). One analysis suggested that circadian disturbance significantly mediated the relationship between ADHD and seasonal symptoms of depression (20). In clinical populations, the overall rate of seasonal affective disorder is 27% among adults with ADHD, with females at the highest risk (21). While more trials are required, bright light therapy may be even more efficacious for individuals with ADHD during winter months (20).

Behavioral interventions

In a randomized trial of 244 children with ADHD, a behavioral sleep intervention (two fortnightly sessions with strategies provided by psychologists or pediatricians and a follow-up telephone call) significantly improved severity of ADHD symptoms, sleep, quality of life, behavior, and functioning at 6 months post intervention (22).

Although not explicitly examined in individuals with ADHD, exercise is another adjunctive tool to help improve circadian misalignment. Both morning or evening exercise seem to advance DLMO in those with later chronotypes, suggesting exercise at any time of day could be a useful adjunct for those with ADHD who tend to have later chronotypes (23, 24).

A multimodal approach to behavioral therapy has demonstrated significant benefits in a group of “night owls”, which may also translate to those with ADHD. Researchers randomized a group of 22 healthy individuals with late chronotypes to behavioral interventions aimed at advancing their circadian rhythm (25). The general principles were to wake up 2–3 hours earlier, wake up at the same time every day, maximize morning light exposure, reduce evening light exposure, avoid late dinners, avoid caffeine after 15:00, exercise in the morning, and avoid naps in the late afternoon. In just 3 weeks, the intervention group shifted their DLMO by ~2 hours, wake-up time advanced 1.9 hours, and peak cortisol advanced by 2.2 hours. Additionally, subjective depression scores decreased by ~58% and stress scores by ~40% in the intervention group. Cognitive performance and physical performance also improved. Overall, this could be an effective, low-cost strategy to provide structured guidance to those with ADHD, though specific trials in this population are needed.

Conclusion

The accumulated evidence demonstrates that circadian rhythm dysfunction is highly prevalent and clinically meaningful in a substantial proportion of individuals with ADHD, although not universal, and its interaction with ADHD symptoms appears complex and bidirectional. The prevalence of circadian alterations (affecting 73-80% of ADHD patients), consistency of biological markers across studies (phase delays, altered melatonin and cortisol rhythms, disrupted clock gene expression), and efficacy of circadian-targeted interventions in improving both sleep and core ADHD symptoms support a model wherein circadian disruption may play an important role in ADHD pathophysiology in a substantial subgroup, though evidence on remission of ADHD with circadian interventions is lacking.

This evidence warrants reconsideration of current assessment and treatment paradigms. Implementation of routine circadian phenotyping in ADHD evaluation, coupled with evidence-based chronotherapeutic interventions, represents a pragmatic approach to improving outcomes. While not proposing that ADHD be reclassified exclusively as a circadian disorder, the evidence supports recognition of a prevalent circadian phenotype that, when present, may benefit from targeted chronotherapeutic intervention alongside standard ADHD treatments.

The safety profile, accessibility, and potential for synergy with existing treatments make circadian interventions an attractive addition to the ADHD treatment. As the field advances toward precision medicine approaches, circadian phenotyping may prove essential for treatment selection and optimization. Further research is needed to fully elucidate the bidirectional relationships between circadian disruption and ADHD symptoms, identify biomarkers for treatment selection, and establish optimal long-term management strategies.

Statements

Data availability statement

The original contributions presented in the study are included in the article/supplementary material. Further inquiries can be directed to the corresponding author.

Author contributions

BL: Conceptualization, Writing – original draft, Supervision, Investigation, Methodology, Project administration, Writing – review & editing, Resources. NF: Writing – review & editing, Writing – original draft.

Funding

The author(s) declare that no financial support was received for the research and/or publication of this article.

Conflict of interest

The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.

Generative AI statement

The author(s) declare that no Generative AI was used in the creation of this manuscript.

Any alternative text (alt text) provided alongside figures in this article has been generated by Frontiers with the support of artificial intelligence and reasonable efforts have been made to ensure accuracy, including review by the authors wherever possible. If you identify any issues, please contact us.

Publisher’s note

All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.

References

  1. Wolraich ML, Hagan JF Jr, Allan C, Chan E, Davison D, Earls M, et al. Clinical practice guideline for the diagnosis, evaluation, and treatment of attention-deficit/hyperactivity disorder in children and adolescents. Pediatrics. (2019) 144. doi: 10.1542/peds.2019-2528

  2. Andrew N, Coogan AN, McGowan NM, McGowan NM. A systematic review of circadian function, chronotype and chronotherapy in attention deficit hyperactivity disorder. Adhd Attention Deficit Hyperactivity Disord. (2017) 9:129–47. doi: 10.1007/s12402-016-0214-5

  3. Korman M, Palm D, Uzoni A, Faltraco F, Tucha O, Thome J, et al. ADHD 24/7: Circadian clock genes, chronotherapy and sleep/wake cycle insufficiencies in ADHD. World J Biol Psychiatry. (2020) 21:156–71. doi: 10.1080/15622975.2018.1523565

  4. Wynchank D, Bijlenga D, Beekman AT, Kooij JJS, Penninx BW. Adult attention-deficit/hyperactivity disorder (ADHD) and insomnia: an update of the literature. Curr Psychiatry Rep. (2017) 19:98. doi: 10.1007/s11920-017-0860-0

  5. Bondopandhyay U, McGrath J, Coogan AN. Associations between sleep problems in children with ADHD and parental insomnia and ADHD symptoms. PloS One. (2024) 19:e0298377. doi: 10.1371/journal.pone.0298377

  6. Wajszilber D, Santiseban JA, Gruber R. Sleep disorders in patients with ADHD: impact and management challenges. Nat Sci Sleep. (2018) 10:453–80. doi: 10.2147/nss.s163074

  7. Surman CBH, Daniel M, Walsh DM. Managing sleep in adults with ADHD: from science to pragmatic approaches. Brain Sci. (2021) 11:1361. doi: 10.3390/brainsci11101361

  8. Boonstra AM, Kooij JJS, Oosterlaan J, Sergeant JA, Buitelaar JK, Van Someren EJW, et al. Hyperactive night and day? Actigraphy studies in adult ADHD: a baseline comparison and the effect of methylphenidate. Sleep. (2007) 30:433–42. doi: 10.1093/sleep/30.4.433

  9. Lunsford-Avery JR, Scott H, Kollins SH. Editorial Perspective: Delayed circadian rhythm phase: a cause of late-onset attention-deficit/hyperactivity disorder among adolescents? J Child Psychol Psychiatry. (2018) 59:1248–51. doi: 10.1111/jcpp.12956

  10. Van Veen MM, Kooij JJS, Boonstra AM, Gordijn MCM, Van Someren EJW. Delayed circadian rhythm in adults with attention-deficit/hyperactivity disorder and chronic sleep-onset insomnia. Biol Psychiatry. (2010) 67:1091–6. doi: 10.1016/j.biopsych.2009.12.032

  11. Bumb JM, Mier D, Noelte I, Schredl M, Kirsch P, Hennig O, et al. Associations of pineal volume, chronotype and symptom severity in adults with attention deficit hyperactivity disorder and healthy controls. Eur Neuropsychopharmacol. (2016) 26:1119–26. doi: 10.1016/j.euroneuro.2016.03.016

  12. Baird AL, Coogan AN, Siddiqui A, Donev RM, Thome J. Adult attention-deficit hyperactivity disorder is associated with alterations in circadian rhythms at the behavioural, endocrine and molecular levels. Mol Psychiatry. (2012) 17:988–95. doi: 10.1038/mp.2011.149

  13. Chang JP, Su KP, Mondelli V, Pariante CM. Cortisol and inflammatory biomarker levels in youths with attention deficit hyperactivity disorder (ADHD): evidence from a systematic review with meta-analysis. Trans Psychiatry. (2021) 11:430. doi: 10.1038/s41398-021-01550-0

  14. van Andel E, Bijlenga D, Vogel SWN, Beekman ATF, Kooij JJS. Effects of chronotherapy on circadian rhythm and ADHD symptoms in adults with attention-deficit/hyperactivity disorder and delayed sleep phase syndrome: a randomized clinical trial. Chronobiology Int. (2020) 38:260–9. doi: 10.1080/07420528.2020.1835943

  15. van der Heijden KBS, Smits MG, Van Someren EJW, Ridderinkhof KR, Gunning WB, et al. Effect of melatonin on sleep, behavior, and cognition in ADHD and chronic sleep-onset insomnia. J Am Acad Child Adolesc Psychiatry. (2007) 46:233–41. doi: 10.1097/01.chi.0000246055.76167.0d

  16. Hoebert M, van der Heijden KB, van Geijlswijk IM, Smits MG, et al. Long-term follow-up of melatonin treatment in children with ADHD and chronic sleep onset insomnia. J Pineal Res. (2009) 47:1–7. doi: 10.1111/j.1600-079x.2009.00681.x

  17. Stothard ER, McHill AW, Depner CM, Birks BR, Moehlman TM, Ritchie HK, et al. Circadian entrainment to the natural light-dark cycle across seasons and the weekend. Curr Biol. (2017) 27:508–13. doi: 10.1016/j.cub.2016.12.041

  18. Fargason RE, Fobian AD, Hablitz LM, Paul JR, White BA, Cropsey K, et al. Correcting delayed circadian phase with bright light therapy predicts improvement in ADHD symptoms: A pilot study. J Psychiatr Res. (2017) 91:105–10. doi: 10.1016/j.jpsychires.2017.03.004

  19. Rybak YE, McNeely HE, Mackenzie BE, Jain UR, Levitan RD, et al. An open trial of light therapy in adult attention-deficit/hyperactivity disorder. J Clin Psychiatry. (2006) 67:1527–35. doi: 10.4088/jcp.v67n1006

  20. Wynchank DS, Bijlenga D, Lamers F, Bron TI, Winthorst WH, Vogel SW, et al. ADHD, circadian rhythms and seasonality. J Psychiatr Res. (2016) 81:87–94. doi: 10.1016/j.jpsychires.2016.06.018

  21. Amons PJT, Kooij JJS, Haffmans PMJ, Hoffman TO, Hoencamp E. Seasonality of mood disorders in adults with lifetime attention-deficit/hyperactivity disorder (ADHD). J Affect Disord. (2006) 91:251–5. doi: 10.1016/j.jad.2005.11.017

  22. Hiscock H, Sciberras E, Mensah F, Gerner B, Efron D, Khanos, et al. Impact of a behavioural sleep intervention on symptoms and sleep in children with attention deficit hyperactivity disorder, and parental mental health: randomised controlled trial. BMJ. (2015) 350:h68. doi: 10.1136/bmj.h68

  23. Thomas J. Circadian rhythm phase shifts caused by timed exercise vary with chronotype in young adults. In: Theses and dissertations–kinesiology and health promotion. (2019) Lexington, Kentucky, USA: University of Kentucky. doi: 10.13023/etd.2019.406

  24. Thomas JM, Kern PA, Bush HM, McQuerry KJ, Black WS, Clasey JL, et al. Circadian rhythm phase shifts caused by timed exercise vary with chronotype. JCI Insight. (2019) 5:e134270. doi: 10.1172/jci.insight.134270

  25. Facer-Childs ER, Middleton B, Skene DJ, Bagshaw AP. Resetting the late timing of ‘night owls’ has a positive impact on mental health and performance. Sleep Med. (2019) 60:236–47. doi: 10.1016/j.sleep.2019.05.001

The Daily Front Page 12 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Literature Desk
article

Anne Carson wins Nobel Prize in literature 2026

by sonabinu·▲ 161 points·34 comments·theguardian.com ↗
The academy cited Anne Carson’s ‘bold and inventive oeuvre’.

Most prestigious literature prize goes to Canadian known for genre-crossing works such as Autobiography of Red

The poet Anne Carson wearing glasses with yellow frames, and a brown scarf

The academy cited Anne Carson’s ‘bold and inventive oeuvre’ in its awarding of the prize. Photograph: Pontus Lundahl/TT/Reuters

The Nobel prize in literature has been awarded to the Canadian poet and essayist Anne Carson, the Swedish Academy has announced.

The academy cited the author’s “bold and inventive oeuvre that, in playful dialogue with the classical tradition, has created new forms for contemporary literature”.

The Nobel prize, regarded as the most prestigious award in global literature, is awarded for a lifetime body of work. The winner receives 12m Swedish kronor (£900,000).

Ingrid Carlberg, the permanent secretary of the Swedish Academy, said she had told Carson of the award on the phone shortly before the news broke. “She had time to tell me that she is, for the moment, in Iceland, where she is listening to the wind,” Carlberg said. “She was taken by surprise but very happy. I could hear that in her voice.”

Anne Carson books arranged on a shelf

Books by Anne Carson on display at a Waterstones bookshop in London. Photograph: Hannah McKay/Reuters

Born in Toronto in 1950, Carson is known for work that moves freely between poetry, prose and translation, drawing heavily on the literature and mythology of the ancient Greek world. She has been a professor of classics at various institutions including Princeton, New York University and McGill University in Montreal. She is the 19th woman to win, out of 123 literature laureates.

Carson’s first book, Eros the Bittersweet, was published in 1986 and combined literary criticism with an exploration of desire and the ancient Greek tradition.

Her best-known work is Autobiography of Red, a 1998 novel in verse inspired by the fragments of the ancient Greek poet Stesichorus. It reimagines the myth of Geryon, the red-winged monster killed by Herakles, as the story of a modern teenage boy navigating heartbreak and desire.

In 2001, she became the first woman to win the TS Eliot prize, for her collection The Beauty of the Husband. She has also been awarded Guggenheim and MacArthur fellowships.

The Canadian prime minister, Mark Carney, congratulated the poet on X after the announcement. “With wit, imagination, and a style entirely her own, Canadian poet Anne Carson has reimagined the classics. She has brought ancient stories to new audiences and transformed the way we think about literature,” he said, adding that it was a “proud moment for Canada”.

David Leonard, the executive director of the Writers’ Trust of Canada, said: “Anne is such a brilliant writer. Her work is broad, but also extremely smart.” Calling Carson’s work “intoxicating”, he said her four-decade career had resulted in a peerless collection of poems and essays. “They’re beautiful, they’re smart, they’re true and they are humane. It’s exactly what we need in our writing.”

Carson’s work has attracted praise from fellow writers including Susan Sontag, who once said: “She is one of the few writers writing in English that I would read anything she wrote. If there’s a magazine that has something of hers in it, I buy it automatically.”

Ingrid Carlberg smiling while announcing the winner in an ornate room

Ingrid Carlberg announcing Anne Carson as the recipient of the 2026 Nobel prize in literature in Stockholm on Thursday. Photograph: Christine Olsson/EPA

Anders Olsson, the chair of the Swedish Academy’s Nobel Committee for Literature, praised Carson for work that had “broken away from lyrical poetry bound to the narrative self and inspired new forms of contemporary literature”. He said: “This method of writing leads to playful and ironic works that move not only between classical and modern poetry but also between different genres and artforms.”

Carson’s books have ranged widely in form. Men in the Off Hours combined verse essays, poems, epitaphs and prose about artists and historical figures, and won the inaugural Griffin poetry prize in 2001. Decreation, another eclectic work, brought together poetry, essays and an opera.

Nox, published in 2010, is particularly characteristic of Carson’s avant-garde approach to literature – the book takes the form of an accordion-fold box containing a reproduction of a notebook Carson made after the death of her brother. Her later works include Red Doc> and Float.

In a Guardian review of Red Doc>, Sarah Crown wrote: “To engage so fluidly, so originally and compellingly, with a story first told more than 3,000 years ago, is astonishing: her ambition is one thing; the fact that it is so completely achieved is, frankly, something else.”

Much of Carson’s work has emerged from her fascination with language itself. The Swedish Academy noted: “Almost all her literary production has centred upon the intersection between the philologist’s obsession with words and the poet’s desire for new meaning,” adding that Carson had identified the etymology of words as “the starting point for all her work”.

Asked why she continually moved between forms, Carson said in an interview: “Boredom, I guess. There is a restlessness. There are a lot of forms to try.”

She has acknowledged the difficulties that come with her experimental style. “[My work] does fall apart a lot,” she said in a 2018 interview. “It gets just too weird for anyone to care about reading, or else it gets diluted into a sort of parody of itself.”

Ira Wells, the president of PEN Canada, said Carson’s win felt “particularly significant at a moment in which Canada and Europe are strengthening cultural ties amidst broader global disruption”. He added: “On an aesthetic level, Carson’s verse vibrates on profound human frequencies, at a moment in which more and more language is formulated by machines.”

Carson has generally kept her personal life out of interviews. However, in an August 2024 article for the London Review of Books, she disclosed that she had been diagnosed with Parkinson’s disease.

The Nobel prize in literature has been awarded on 118 previous occasions since 1901. Recent laureates include Annie Ernaux, Bob Dylan, Abdulrazak Gurnah, Louise Glück, Peter Handke and Olga Tokarczuk. Last year’s recipient was the Hungarian author László Krasznahorkai, known for his dystopic and avant-garde writing.

Carson, 76, will formally receive the medal and diploma in a ceremony in Stockholm in December.

The Daily Front Page 13 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — A Lost Art of Navigation
article

Beauty in DVD Menus

by speckx·▲ 277 points·153 comments·vale.rocks ↗
Interactive menus touted as a selling point.

Look at many early DVD releases, and you’ll see interactive menus touted as a selling point. Coming from VHS (or LaserDisc), which had no menus to speak of, this was a genuine improvement. That isn’t to say all DVDs had interactive menus, however. Many of the earliest releases just entered straight into their content, and the same is true of some cheaper releases.

However, once DVD became widespread, publishers started to really embrace the capabilities the format afforded them. The format first released in late 1996; however it wasn’t until the 2000s that they really kicked off. With the medium’s strengths and foibles known, players widely adopted, and technology ready to handle the task, DVDs hit their stride. With this came some brilliant and memorable menus.

Resolution & Aspect Ratio

In NTSC regions video on DVD almost always has a resolution of 720 × 480 pixels, while in PAL regions they’re almost always 720 × 576 pixels. These specific resolutions can be traced back to the D-1, a digital recording video standard which stored uncompressed component video. It was a major leap in real-time, high-quality recording when it released in 1986 and quickly achieved ubiquity. It derived its resolution from the Rec. 601/BT.601/CCIR 601 standard from 1982.

Other resolutions are possible, however are rarely used for having worse quality and generally being a poor trade-off. You may notice that NTSC’s resolution of 720 × 480 pixels is a ratio of 3:2 and that PAL’s is a resolution of 5:4. The DVD has metadata tags telling the playback device how to then stretch the video to the desired aspect ratio for correct appearance in viewing. This is the difference between Storage Aspect Ratio (SAR), which is the ratio on the disc, and Display Aspect Ratio (DAR) or Pixel Aspect Ratio (PAR), which is the ratio in presentation.

Due to the transition from 4:3 aspect ratios on home displays to 16:9, there were a lot of fluctuations in DVD presentation. From widescreen that was forced to fit within a 4:3 area via letterboxing, to pan and scan, to anamorphic widescreen, there was variation in presentation. With DVD menus, we see exactly the same as was true in the transitioning era of broadcast television, where critical information was kept within the 4:3 safe area, while non-critical, flavour imagery was within the 16:9 only area.

Even releases long after most people had migrated to widescreen, 16:9 displays continue to keep everything within this small safe area. It became a major design consideration of DVD menus that has stuck around even if no longer strictly necessary.

Menu Features

DVD menus can take many forms, though they tend to have a fairly typical set of options. More often than not, a play button, a chapter/scene/episode select, special features or extras, and settings, including subtitle, language, audio, and picture options. At the very simplest, these are displayed in a list with a static image background. At the most decadent, there are full custom animations or acting with diegetic menus and layers of content designed specifically for the DVD – oodles of extra content and hidden additions crammed into every nook until the disc can’t hold anything more.

Being developed in the mid-1990s, DVDs are fairly simple in terms of technical capabilities. The picture shown by a DVD is a standard MPEG-2 video stream. For interactive elements, like menu items which highlight when hovered, or an overlay on the presentation, subpictures are used. Subpictures are 2-bit, meaning they only support four colours at a time. These colours are pulled from a palette, which is a defined set of 16 colours. The transparency can also be altered by adjusting the contrast level. Subtitles are handled by the same means. Interestingly, they’re graphics too – not text. Douglas Dixon’s DVD Authoring Terminology has a nice overview of many of the finer technical details.

Within the DVD Virtual Machine (DVD VM), there are sixteen General Parameter Registers (GPRMs). These are variables which hold 16-bit integers, allowing a tiny bit of memory for some details, such as chosen settings. Beside the GPRMs are twenty-four System Parameter Registers (SPRMs), which are read-only and are managed by the DVD player itself, storing the device-level details. The DVD VM Interaction Machine, which allows handling what happens on user interaction, is extremely basic, making the ability for people to make such interesting, expressive, and complex menus very impressive. DVD games1 particularly exploited all the memory and interaction functionality to the fullest extents possible.

Menus often feature looping clips and audio that don’t quite seamlessly repeat or have abrupt endings, which are the subject of much nostalgic reminiscing, with many stories online of people waking in early hours of the morning to find a DVD menu on loop.

Some publishers had a degree of consistency across their DVD catalogue. One DVD menu feature ingrained deep into the back of my mind is Disney’s FastPlay. Designed to make their DVDs more accessible, especially to children potentially unable to manage the remote, it automatically starts playing the disc’s content without need for viewer interaction. In function, this really means that it often plays trailers before the feature presentation, leading many viewers to avoid it.

A DVD and the logo 'Disney's FastPlay' on a blue background. At the bottom are two buttons, one reading 'FastPlay' and the other reading 'Main Menu'.

Disney’s FastPlay screen which would appear upon loading a disc.

FastPlay supporting DVDs open with Tinkerbell flying onto the screen while a voiceover states:

This Disney DVD is enhanced with Disney’s FastPlay. Your movie and a selection of bonus features will begin automatically. To bypass FastPlay, select the ‘Main Menu’ button at anytime. FastPlay will begin in a moment!

Debuting at the same time in 2004, many Disney DVDs often also feature what they call EasyFind menus, which provide a consistent set of options with a consistent set of accompanying graphics for ease of use.

More modern DVD releases often forgo additional special features. Even standards like most setup options and scene/chapter selection are often absent as discs are spat out quickly, crammed into a template. Special features are reserved for the more expensive Blu-ray releases.

Memorable Menus

Scooby-Doo 2: Monsters Unleashed had a very fun menu. The main screen showed Scooby Doo and various monsters messing about in an old mining town, and when selecting a menu item, it would play a transition into another place from the film with further animations of Scooby-Doo fooling around. Each section had full custom 3D animations, and two games playable directly on the DVD player were included on the disc.

The first, Behind-the-Mystery Mystery: The Mystery of the Missing Pants, could be started in a special feature and then required you to navigate through the DVD’s menu to find an icon of pants to continue along the story. The next, much more complete game was The Scooby-Doo Monsters Unleashed Challenge, which had you as the player driving around in the Mystery Machine to various locations from the film, navigating through the locations, and collecting clues that would help unravel the mystery.

A creepy old manor with green walls. A red, grid carpet stretches the floor, and beams of light illuminate specific squares.

A part of the Monsters Unleashed Challenge where you must pick the correct path across the floor to navigate forward. Stepping on a trapped tile shows a failure clip from the film.

Due to the limitations of DVDs, the entire game is relatively simple in terms of mechanics; however, it is obvious a lot of effort was put into it to make it feel comprehensive, and it really plays to the strengths of the medium with lots of little clips and sections. One section has the player figuring out the path over a trapped floor, and another involves attacking skeletons in a warehouse while not hitting Scooby, just like Whack-A-Mole.

Scooby-Doo 2 also came with a teaser trailer for another movie with a fantastic DVD menu: Harry Potter and the Prisoner of Azkaban. After a little opener showing some clips from the film, the Prisoner of Azkaban’s DVD placed you on the Knight Bus from the film, zooming through the streets of London while the shrunken head quips. Different menus on the DVD stayed true to the theme, with the scene selection being themed after The Daily Prophet newspaper.

Shrek 2’s original menu is memorable primarily for the main Brady Bunch-esque screen. It features the film’s main characters all quibbling at each other (and particularly with Donkey). The disc is also packed with content, with the ability to view a lot of art, read about the cast and details about the film, listen to music, explore an interactive map, and play multiple games (Far Far Away Idol, Find Puss In Boots, and Save Fiona!), among other things. It is extremely full of things to look through and poke at.

A bright green background with windows containing various characters for the film representing each menu item. Donkey is in the middle, and most of the characters look displeased with him.

Shrek 2 DVD main menu.

The Rocky Horror Picture Show DVD opens with the iconic lips welcoming you to the DVD. After which you’re presented with the main menu, where a disembodied pair of legs wearing heels and fishnets walks in, kicking around one of the menu items, which begins flipped the wrong way around. The extra features are numerous and play into Rocky Horror’s cult status. Some menu options are accompanied by a large switch which animates when flicked. Throughout much of the menu the lips continue speaking while songs from the film play in the background. The 16:9-only portion of the screen is occupied by red curtains, which slide in and out again when ‘Play Movie’ is selected.

Red lips to the top left with some legs underneath it. To the right are four menu items: 'Play', 'Chapter Selection', 'Language Selection', and 'Special Features'. Red curtains are on each side of the screen.

Rocky Horror Picture Show DVD main menu.

When inserted, Wayne’s World’s DVD menu first shows static before simulating switching through multiple channels and then landing on a channel guide, with plenty of spoof material like fake adverts. In addition to various options like scene selection and subtitle configuration appearing like upcoming television shows across different channels, there are also listings for tonnes of other shows and films which can be scrolled through like a real cable set top box. It is a brilliantly fun interface.

Chitty Chitty Bang Bang has a 3D render of the titular fuel-burning oracle flying through the clouds, with menus superimposed onto it, and Thunderbirds (2004) opens with clips from the film before dropping you into Thunderbird 2’s cockpit with a variety of controls as you fly around, and a voiceover speaks to you while you’re presented with all sorts of information. You could even switch which craft you’re piloting.

DVD releases of Doctor Who following the 2005 revival also had extremely fun interfaces. Many of the DVD releases of both Classic Who and New Who had many hidden secrets and additions included. Different releases vary, but many of the earlier ones were set in the Tardis, with menu items presented on and around the console. Some showed the time vortex and time stream, while they began to simplify a bit during the Peter Capaldi era before slipping into more generic menus, as became common throughout the mid-2010s.

Left-aligned menu listing special features, with the Tardis in the background, overtaken by vines, while the time stream undulates unstably to the right.

Doctor Who Series 7 special features menu (disc 1).


In modern DVD releases, we rarely see any menus of note. DVDs are no longer the dominant format they once were, and companies rarely put effort into their presentation. Despite being a much more capable format from a technical perspective, with high-resolution media, menu layers, everything offered by Blu-ray Disc Java (BD-J) and more, Blu-rays unfortunately very rarely see impressive menu presentations. Modern DVDs and Blu-ray menus alike are often little more than an image or video with a generic menu atop it.

It is understandable. Physical media as a whole is less popular with the mass adoption of streaming services; however, it is a shame to see that the creativity and excitement of the media viewing experience provided by menus replaced by the sterile, generic, one-size-fits-all interfaces of online platforms. If curious, there are a great number of DVD menus to be perused at dvdmoviemenus.com.

Footnotes

  1. I speak not of games simply released using the DVD medium, like console or PC releases, but of actual DVD games, which were standard DVD Video discs with games implemented the same as any menu. The most famous of these games is perhaps Scene It? ↩
The Daily Front Page 14 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Conversation, Meandering
article

The value of not getting to the point (2015)

by NaOH·▲ 137 points·46 comments·ken.arneson.name ↗
Food and drink spare us from the burden of needing to have something to say throughout the whole conversation.

The Value of Not Getting to the Point

I read somewhere recently, I forget where, that the purpose of people getting together for a conversation over a beer or coffee or lunch or dinner is that it the food and drink spare us from the burden of needing to have something to say throughout the whole conversation.

This was a revelation to me. All this time, I assumed that the primary purpose of lunch was lunch. All this time, I figured that I was just lousy at conversation because being an introvert made conversation awkward and laborious for me. For everyone else, conversation seems comparatively effortless. But it seems from this data that conversation must be harder for everyone else than I had assumed.

My oldest daughter is a freshman in college. She recently texted me and said she wanted to talk. I asked, what about? She got annoyed at me for asking.

I was clueless as to why. I guess the Dunning-Kruger effect applies to all of us, there’s always some area of life where we’re so incompetent we don’t even know we’re incompetent. This area, apparently, was one of mine.

She asked if we could just talk about something stupid. So I called her, and we talked about Donald Trump and the presidential race and stuff like that for a good long while. I didn’t ask about what was really bothering her.

Eventually, the conversation turned, and we finally got to talking about the thing she wanted to talk about. But that probably at least half an hour into the conversation. We segued slowly and organically from the stupid stuff into the real issue.

And this, too, was a bit of a revelation to me, that someone would not want to get straight to the point, that someone would need a nice long conversational warmup before they’d feel comfortable enough to be ready to talk about something more uncomfortable. I’m very much a get-to-the-point kind of person. I tend to say what I mean, or nothing at all.

Language is imprecise. Our feelings don’t always have direct translations into speech. It’s hard to explain what we feel, to say exactly what we mean. We have wants and desires and emotions, and we often try to rationalize those feelings. Those rationalizations are often logically incoherent. But it’s hard to see the incoherence of our own rationalizations because our points of view are so limited. And often (if we’re not falling prey to the Dunning-Kruger effect) we intuit that our rationalizations may be incoherent. So we’re cautious in what we say. We know that there can be social penalties for saying the wrong thing in the wrong way to the wrong person.

All this adds up to making the act of talking about something sensitive daunting. There is a vulnerability in speaking. That’s why our culture has all these rituals and conventions around conversation, like idle chit-chat and coffee and such: to build enough trust in the environment where we can feel comfortable enough to overcome the vulnerability inherent in speech.

I never fully understood this before. I feel like everyone else understands it, though, because they act as if they do. But if they do, it must be an intuitive understanding, a grokking, not an explicit fact that people state out loud. Otherwise, I probably would have heard someone say it explicitly sometime before in the almost 50 years I’ve been in this earth.

Having now finally come to this understanding, it occurs to me that perhaps this is the great flaw with Twitter, why everyone I know on Twitter seems to eventually run into a wall with it. The 140-character format pushes you to get straight to the point. There is no room for the idle chit-chat and sips of coffee and other conversational rituals that let us dance around the sensitive issues. Without these rituals that are built into real-life human-to-human conversation, the problems with speech that those cultural rituals are designed to prevent come flooding in.

There is so much hair pulling and teeth grinding about what people should and should not say online, and how they should or should not say it. And maybe all that hair pulling and teeth grinding arise because our online conversational cultures, and the technological platforms they reside on, have not had the time to evolve into something that works, the way that our real-life conversational culture has.

There are many, many more people who are clueless about how to behave in online conversations than there are people who are clueless about how to behave in offline ones. How I came to be the flipside of that, I don’t know.

And it also occurs to me that there is a value in stating explicitly the things that are mostly just intuited about human nature and human culture. I want to explore these sorts of things. There is a risk, though, a vulnerability, in stating these things. The people who intuitively grasp these things will feel as though I am insulting their intelligence by stating something so obvious it shouldn’t need saying. But it isn’t meant as an insult to their intelligence, it’s meant as an insult to mine. I need to say these things because I’m the one who doesn’t understand these things. I need them explained to myself.

Which is all a roundabout way of stating something that maybe could fit into a tweet: I plan to start saying things that aren’t obvious to me but may be obvious to others. Sorry if you fall into the latter category and I waste your time. Such is the risk of saying anything, ever. And sorry for the roundaboutness in getting to this point. I seemed to need it, for some strange reason.

The Daily Front Page 15 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — The Neon Workshop
show hn

Show HN: Making a flexible "neon" t-shirt with LED filaments

by scottbez1·▲ 132 points·26 comments·scottbezek.blogspot.com ↗
I had to custom-build some LED neon attire!

Earlier this year I had the perfect excuse to experiment with some flexible LED filaments that had been sitting in my “interesting parts” bin for years -- the company I work for was putting on a neon-themed event, so obviously I had to custom-build some LED neon attire! The only problem was this was announced less than a week in advance.... This is how I designed and assembled a wearable neon shirt in just a few days.

A rough parts list, in case you want to try something similar:

  • Led filament
    • Lots of colors and lengths available. I recommend Adafruit - you’ll pay a bit more than AliExpress, but it’s convenient and they do a lot of great open source work so I’m always happy to support them!
    • 2x 600mm warm white 12v
    • 3x 300mm red 3v
    • 1x 1200mm red 24v
  • Electronics
    • USB battery bank
    • ESP32
    • Some way to step up/control the voltage for the LEDs
      • Boost converter
      • Constant-current led boost driver e.g. TPS61169
      • ULN2003A transistor array breakout board
  • Black t-shirt
  • Black thread
  • Some kind of stiff fabric as a backing/stabilizer (I used scraps of cross-stitching fabric)
  • Tissue paper (for tracing)
  • Heat shrink tubing

The start: basic tests

LED filaments, if you’re not familiar, are long strips of hundreds of tiny LEDs on a flexible strip, encased in a thin silicone diffuser only about 1.8mm in diameter!

They’re mass manufactured for neo-retro “Edison” lightbulbs, so that means they’re also readily available for DIY projects. Adafruit calls them “noods” or noodles and it’s an apt name - they feel like glowing cooked spaghetti!

The first order of business was to figure out how to attach the filament to a shirt, and make sure it would actually look good. By itself, the cotton t-shirt doesn't have much structure and would be too soft and flexible to support sewn-in filament shapes without bunching up, so I decided to borrow some craft supplies from my wife for a quick test: some cross-stitching fabric (“Aida cloth”) as a stiff substrate, and an embroidery hoop to hold everything steady and evenly tensioned while sewing.

Taking a short piece of blue LED filament and some black thread I tried sewing it down to the shirt and stiff backing fabric with a few different curves.

Actually, I jumped ahead here. I didn't free-hand sew the filament to the shirt, I wanted to practice tracing a particular shape, so I started by drawing a curved line on tissue paper, then sewed the filament in place with some loop stitches every few centimeters along the line. The idea was to rip off the tissue paper after sewing. It worked well, though was a bit tedious.

The design

Now that I’d validated a basic technique I had to actually design my "neon." One of the main constraints with these LED filaments is that they can't be cut to length - one end is positive and the other negative - and there’s no way to shorten them without completely breaking them.

This meant the path for my neon design needed to fit one of the discrete sizes. On the back of the shirt I wanted a llama using a single 24v 1200mm long red filament. I started with a continuous path in Inkscape (looping back and over itself as needed), then used Inkscape’s “Measure Path” feature to check the length and scale it until it was just about the right length.

For the front of the shirt, I wanted cursive neon text with a Vegas-inspired border. I chose the open font Playwrite België Vlaandere, and again manually traced a single path over it and then scaled it to fit an integral filament length. This time I planned to use multiple 300mm 3v filaments (more on this later) to hit the ~900mm path length.

Sewing

In order to transfer the designs to the t-shirt, I printed them out on printer paper, then laid tissue paper on top and traced the path with a marker. Just like my original test, I taped the tissue paper to the shirt, taped some cross-stitch fabric to the inside of the shirt, and then started sewing the filament in place.

The cursive text on the front of the shirt is where things really got interesting. I wanted the "V" and "a" to be separate letters rather than joined together, so I used a small piece of black heat-shrink tubing to black out the connecting stretch of filament – very similar to the “block out” paint used on real neon signs.

The other challenge was the filament length – to get the scale I wanted, the path ended up being closer to 900mm, but I only had 300mm filament in my box of hoarding, and no time to order new filament, so I decided to try soldering 3 filaments in series. There’s a small gap that doesn’t glow between each, but since it’s between letters it looked alright!

The borders were pretty simple – each side used a 600mm warm white filament with some of the easiest sewing so far - mostly straight!

Once everything was sewn and tested it was time to remove the tissue paper template. I carefully tore the tissue around each thread and used tweezers to help remove it from between the letters.

Electronics & wiring

To power the LEDs, I needed a way to connect the filaments to wires on the inside of the shirt. I soldered a short length of enameled copper magnet wire to each, then poked it between the weave of the shirt fabric.

On the inside of the shirt, the stiff magnet wire was soldered to thin flexible ribbon cables (and the joints covered in duct tape to cover sharp edges), with the ribbon cables running down the side of the shirt from the armpit to my pocket. I kept the ribbon cables loosely in place with some loops of thread along the side of the shirt, using blue tape to help stiffen the fabric.

Due to the time crunch, I couldn't order the LED drivers I wanted, so I had to get creative with what I already had on hand. I used the TPS61169 constant-current LED driver for the text on the front (the three 3v 300mm filaments in series), with the PWM input controlled by the ESP32 for neon flicker emulation and animations.

For the llama on the back of the shirt, I needed to boost the voltage to power the 1200mm 24v filament from the 5v USB supply. Another TPS61169 constant-current boost driver would have been ideal, but I only had one and it was already in use for the text. Instead I used a cheap AliExpress constant-voltage boost converter, and a pair of resistor in series with the filament to get a relatively stable supply.

Finally, each half of the border was a 12v 600mm filament, but I was out of good options for stepping up the voltage. However, since these were accents rather than the main focus, I decided to just under-drive them from the 5v USB, using a ULN2003A transistor array to allow the ESP32 to PWM dim them.

All of this was squeezed into a small 3d printed enclosure, with a USB C port to connect to the ESP32 breakout board and power everything from the battery bank, and a slot where the ribbon cables could pass through to the shirt, complete with zip-tie strain relief.

The result

It was quite a whirlwind going from idea to execution in just a few days, but it turned out even better than I expected! Coworkers loved how it looked, and everything held up really well at the event.

Of course, the whole thing is quite silly and that was kind of the point. It's not a practical garment, and wasn't meant to be, but I found it to be quite a fun artistic challenge with things I already had in the parts bin. And in case you're wondering, no, it's not machine-washable. Nor hand-washable, really.

The Daily Front Page 16 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Engines and Package Managers
article

Bevy 0.20

by Philpax·▲ 100 points·17 comments·bevy.org ↗
Thanks to 227 contributors, 817 pull requests, community reviewers, and our generous donors.

The Zorah scene rendered in Bevy Solari

The Zorah scene rendered in Bevy Solari

Thanks to 227 contributors, 817 pull requests, community reviewers, and our generous donors, we're happy to announce the Bevy 0.20 release on crates.io!

For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out our Quick Start Guide to try it today. It's free and open source forever! You can grab the full source code on GitHub. Check out Bevy Assets for a collection of community-developed plugins, games, and learning resources.

To update an existing Bevy App or Plugin to Bevy 0.20, check out our 0.19 to 0.20 Migration Guide.

Since our last release a few months ago we've added a ton of new features, bug fixes, and quality of life tweaks, but here are some of the highlights:

  • Solari and DLSS: Solari, Bevy's realtime pathtraced renderer, is now faster, more accurate, supports more Bevy rendering features, and runs on macOS via Metal!
  • BSN Syntax Improvements: BSN, Bevy's new scene system, had some syntax changes that made it much easier to read and compose
  • Ready Event: BSN scene entities now trigger an observable Ready event when all of their children have been spawned.
  • More UI Widgets: Bevy Feathers, Bevy's opinionated editor-centric UI toolkit, now has Color Input, Scrollable List View, Dropdown Selection, and Lazy Menu widgets. The Number Input widget is now scrubbable / draggable, and we've added Headless Tab Widgets.
  • WESL Shaders: Bevy has officially adopted the WESL shader language (a standardized extension of WGSL). WESL is already an improvement over Bevy's old custom WGSL dialect, and we've been working with the WESL team to plan out the future of shader development in Bevy.
  • Sprite Materials and Extended 2D Materials: It is now possible to create custom shader materials for Sprites, and 2D mesh materials can now be extended like they can in 3D.
  • Pan Orbit Camera: Bevy now has a "pan orbit camera", making it possible to navigate scenes in a CAD-like way.

Solari and DLSS

zero day

Solari, Bevy's realtime pathtraced renderer, has seen major improvements to pretty much every aspect of the plugin!

Read JMS55's blog for the technical details, or continue reading below for the high level overview.

Improved Image Quality

Thanks to improvements in our ReSTIR implementation, rendering is now mostly unbiased, leading to much more accurate lighting.

Additionally, thanks to some other changes, moving objects no longer have shadows that lag behind, and reflections now look significantly less shimmery in motion, especially for non-metallic materials.

Improved Performance

DLSS-RR has gotten very good in recent updates, and for many scenes, ReSTIR costs a decent chunk of performance, and does not significantly improve image quality.

As a result, we've decided to make ReSTIR optional, and turn it off by default.

If you were using Solari in Bevy 0.19, check if the loss of ReSTIR affects your scene, and if so re-enable SolariLighting::restir.

With ReSTIR off, expect reduced shadow quality and missing shadows in motion in scenes with many lights. We are exploring cheaper ways of improving light sampling, without ReSTIR, to improve this in the future.

In addition, Solari's scene management code is now retained (similar to retained render world optimizations in previous versions of Bevy), and overall much more optimized, leading to significantly reduced CPU costs.

You may also want to take a look at the new fields in SolariLighting. While we aim to set reasonable defaults that will work well across a wide variety of games, there are now many knobs (world cache size, per-pixel light sample count, temporal accumulation, and path tracing bounce count) that can be tweaked to improve performance or quality for your specific scene, project and hardware.

Improved Compatibility

Solari now supports lighting from Atmosphere and EnvironmentMapLights on cameras, in addition to the existing support for DirectionalLight and emissive meshes. We're hoping to add support for the remaining PointLight, SpotLight, and RectLight types in the near future.

Solari now also runs on macOS, but note that there is currently no built-in denoiser included in bevy_solari for macOS. MetalFX Ray Reconstruction might be a possible solution in the future (contributions welcome!)

DLSS Updates

Finally, our dlss_wgpu crate has been updated to support the latest version of DLSS, bringing support for DLSS-RR 4.5, which significantly improves denoising quality in Solari.

If you were using DLSS in Bevy 0.19, make sure to download and setup the newest version of the DLSS SDK, else you will run into compiler errors.

BSN Syntax Improvements

Explicit scene syntax

All scene references now require @ prefixes:

// Before
bsn! {
    scene_variable
    scene_function()
    @SceneComponent
    {scene_expression}
}

// After
bsn! {
    @scene_variable
    @scene_function()
    @SceneComponent
    @{scene_expression}
}

In addition to making it easier to spot scene inclusions (and unifying the syntax across cases), this freed us up to make component values much easier to work with!

No more template_value wrappers!

You can now remove all of those pesky template_value wrappers from your component values:

// Before
bsn! {
    template_value(component_variable)
    template_value(component_function())
}

// After
bsn! {
    component_variable
    component_function()
}

Enums "just work"

Enums no longer require VariantDefaults or FromTemplate, provided they implement Default and Clone:

// Before
#[derive(Component, Default, Clone, VariantDefaults)]
enum Foo {
    A { x: u32, y: u32 },
    #[default]
    B,
}

bsn! {
    Foo::B
}

// After
#[derive(Component, Default, Clone)]
enum Foo {
    A { x: u32, y: u32 },
    #[default]
    B,
}

bsn! {
    Foo::B
}

If you were using an enum that didn't support VariantDefaults, you can now remove the template_value wrapper:

// Before
bsn! {
    template_value(Foo::A)
}
// After
bsn! {
    Foo::A
}

The removal of VariantDefaults does mean that enums must now have every field specified:

// Before (y field is initialized to its default value)
bsn! {
    Foo::A { x: 1 }
}

// After (y field must be manually specified)
bsn! {
    Foo::A { x: 1, y: 0 }
}

We believe this tradeoff is worth it, as it increases BSN's compatibility with arbitrary Rust enums. Rust doesn't support "enum variant defaults" anyway!

Chained method support

The "builder pattern" (and chained methods generally) previously required a template_value wrapper. This can now be removed:

// Before
bsn! {
    template_value(Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y))
}
// After
bsn! {
    Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y)
}

Additionally, you can now remove the template_value wrapper in cases like this:

// Before
bsn! {
    template_value(node.clone())
}
// After
bsn! {
    node.clone()
}

In general, you should now be able to remove all template_value instances from your BSN declarations!

Improved list syntax

BSN previously used commas to separate entities, with optional () around entities to make the boundaries clearer. This resulted in a lot of syntax noise, line noise, and over-indentation:

bsn! {
    Node 
    Children [
        (
            #OkButton
            @button("Ok")
        ),
        (
            #CancelButton
            @button("Cancel")
        ),
    ]
}

To avoid this, many developers opted for this syntax instead, which made it very hard to visually distinguish entities:

bsn! {
    Node 
    Children [
        #OkButton
        @button("Ok"),
        #CancelButton
        @button("Cancel"),
    ]
}

BSN now uses -- to separate entities in a list:

bsn! {
    Node 
    Children [
        #OkButton
        @button("Ok")
        --
        #CancelButton
        @button("Cancel")
    ]
}

This gives us the best of all worlds: entities are visually distinct, and there is no over-indentation, line noise, or syntax noise (the stats when compared to other competitors in the "markup format" space are very competitive!). Both () and , have been deprecated in this context.

Using [] and () for bsn_list! (and bsn!) is now discouraged / warned against (ex: bsn_list! []), as it can result in poor rustfmt autoformatting. Instead, use bsn_list! {}, which is the only syntax that rustfmt won't touch. Don't worry, we plan to build a BSN auto-formatter!

bsn_list! {
    #Ok @button("Ok")
    --
    #Cancel @button("Cancel")
}

Ready Event

We landed BSN, Bevy's next generation scene system, in our last release. It was missing a key piece though: the ability to easily run logic when a scene is fully "ready" and spawned (ex: all dependencies have loaded, the full hierarchy is present, and all of the initial components are inserted in the scene). This is a critical piece for building cohesive, standalone, composable scenes. It is also necessary to properly layer Bevy logic on top of other scene representations (like glTF).

The closest we had was the Add event for a given component, which runs "top down" (meaning children are not available). We needed a "bottom up" equivalent to enable building logic that relies on the complete loaded and spawned scene.

The solution is pretty straightforward: trigger a new Ready event for each entity in a spawned scene after the full spawn logic has run for that entity (including its descendants).

This enables the following:

#[derive(SceneComponent, Default, Clone)]
struct Widget;

impl Widget {
    fn scene() -> impl Scene {
        bsn! {
            Node { width: px(100), height: px(100) }
            on(|ready: On<Ready>| {
                info!("The full scene, including 'widget.bsn' contents, is available here")
            })
            Children [
                Text("hello")
                --
                :"widget.bsn"
            ]
        }
    }
}

world.spawn(bsn! { @Widget })

More Feathers Widgets

Feathers, Bevy's opinionated editor-centric UI toolkit, now has more widgets for you to play with:

Color Input

Bevy now has a compact color input selector that displays a color picker widget popup when clicked. This includes a color wheel selector, RGB, and HSL selectors, and a recently used colors grid.

color input

List View / Scrollbar

A scrollable, selectable list view.

scrollbar listview

Dropdown Selection

A selection field that when clicked, displays a dropdown containing a list of options to select.

dropdown

Lazy Menu

Spawns a menu popup when the menu is opened and despawns it when it is closed. This is in contrast to the normal Menu widget, which just hides the menu.

lazy menu

Number Input Widget Scrubbing / Dragging

The FeathersNumberInput widget has been expanded to support both normal text input and scrubbing / dragging. There is a configurable "hard limit" (minimum and maximum value via any input method) and "soft limit" (minimum and maximum value via dragging), in addition to control over floating point precision and step sizes.

Headless Tab Widgets

bevy_ui_widgets now has headless (bring-your-own-visuals) tab behavior: a TabList container and Tab headers.

Selection is managed "externally". SelectedTab on the list holds the selected tab; interaction emits ValueChange<Option<Entity>> as a request, applied by the app or by the optional tablist_self_update observer.

Tabs support keyboard shortcuts and integrate with Bevy's focus, interaction, and accessibility systems.

bsn! {
    TabList
    SelectedTab(Some(first_tab))
    on(tablist_self_update)
    Children [
        Tab Children [ Text("General") ]
        --
        Tab Children [ Text("Rendering") ]
    ]
}

See the headless_tabs example for controlled and self-updating tab lists in both orientations.

WESL Shaders

Bevy's shaders are now written in WESL and the old "Custom Bevy Extended WGSL" language support has been removed.

WESL is a language standard that extends WGSL to add important usability features like modules, imports, conditional compilation, and more. You can see what that looks like (and render pretty shader toys!) live in your browser in the WESL Playground.

Bevy has historically handled these things in our own custom WGSL dialect, but we believe it is better for the wider shader ecosystem (and for us) to adopt a common standard where we can pool resources on language improvements, module ecosystems, and IDE tooling. We've been working closely with the WESL team to evolve the standard in a way that fits well into the Bevy picture.

A critical part of that tooling is language server protocol support, in the form of wgsl-analyzer. That means syntax highlighting, go-to-definition, inlay hints, code folding, formatting and more, once installed for your IDE of choice.

A Bevy fog shader with WESL syntax highlighting

Custom shaders in the old Bevy WGSL dialect need to be translated to WESL and renamed from .wgsl to .wesl. Plain WGSL files with no preprocessor directives will keep working.

Before: Custom Bevy Extended WGSL

#import bevy_pbr::forward_io::VertexOutput
#import "shaders/util.wgsl"::hsv_to_rgb
#ifdef VERTEX_COLORS
var<private> tint: vec4<f32>;
#endif
@group(2) @binding(#{MATERIAL_BIND_GROUP}) var<uniform> color: vec4<f32>;

After: WESL

import bevy_pbr::render::forward_io::VertexOutput;
import super::util::hsv_to_rgb;
@if(VERTEX_COLORS)
var<private> tint: vec4<f32>;
@group(2) @binding(constants::MATERIAL_BIND_GROUP) var<uniform> color: vec4<f32>;

Mesh Shaders

Mesh shaders are now integrated with Bevy's pipeline cache and are available for advanced users to take advantage of. Mesh shaders can be used to render:

Mesh shaders, at a high level, replace the classic vertex shader with a compute shader. This allows generating geometry directly on the GPU and passing those generated primitives directly to the fragment shader without using multiple pipelines or intermediary buffers (to pass data from a compute shader to a render pipeline).

A MeshPipeline contains:

  • an optional task shader (also known as amplification shader)
  • a mesh shader
  • a fragment shader

The new MeshPipelineDescriptor can be used to define a MeshPipeline. That MeshPipeline is then used as a RenderPipeline, which allows the re-use of Bevy's lower level rendering APIs such as RenderContext::begin_tracked_render_pass to take advantage of the new draw_mesh_tasks APIs.

let mut pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
    label: Some("custom_mesh_shader_pass"),
    color_attachments: &[Some(target.get_color_attachment())],
    depth_stencil_attachment: Some(depth.get_attachment(StoreOp::Store)),
    ..default()
});

pass.set_render_pipeline(mesh_pipeline);
pass.set_bind_group(0, &bind_group, &[view_uniform_offset.offset]);

// draw_mesh_tasks dispatches the task shader if there is one,
// or dispatches the mesh shader if there is no task shader.
pass.draw_mesh_tasks(1, 1, 1);

It is notable that mesh shaders are an advanced graphics approach with platform-specific performance considerations, and that this is the initial base support for the feature. Higher level user APIs, and easy integration with Bevy's StandardMaterial, are left to future work.

Mesh shaders are not supported on web platforms.

Check out the new mesh_shader_intro example for more usage examples.

Sprite Materials

Until now, Bevy's sprite renderer has been lacking a major feature: the ability to extend it with custom shaders! With this release, it's now possible to create custom materials for sprites by implementing the MaterialExtension2d trait, inserting the SpriteMaterial component and adding the SpriteMaterialPlugin to your app.

The shader can use functions exported from bevy_sprite_render::sprite_mesh::functions, including:

// Samples the sprite's final color, including the tint and alpha discard, at a given UV.
fn sample_final_color(uv: vec2<f32>, instance_index: u32) -> vec4<f32>;

// Samples the sprite's texture without tint and alpha discard at a given UV.
fn sample_sprite_texture(uv: vec2<f32>, instance_index: u32) -> vec4<f32>;

// Applies tint and alpha discard to the sprite's color.
fn get_final_color(sprite_color: vec4<f32>, instance_index: u32) -> vec4<f32>;

Check out the sprite_material example to see it in action!

2D Extended Materials

Bevy now provides a 2D analog to 3D's ExtendedMaterial, which can be used to extend an existing material by implementing the MaterialExtension2d trait:

#[derive(AsBindGroup, Reflect, Clone)]
struct MyMaterial {
    #[uniform(20)]
    value: Vec4,
}

impl MaterialExtension2d for MyMaterial {
    fn fragment_shader() -> Option<ShaderRef> {
        Some("my_material.wesl".into())
    }
}

This material can now be used in an ExtendedMaterial2d struct:

let handle = materials.add(ExtendedMaterial2d {
    base: ColorMaterial::from_color(Color::WHITE),
    extension: MyMaterial {
        value: Vec4::ZERO,
    },
});
commands.spawn((
    Mesh2d,
    MeshMaterial2d(handle),
));

Sprite Render Backend Unification

The sprite render backend was replaced by a new backend that reuses a lot of the infrastructure made for 3D. This resulted in improved performance in many cases and also makes future maintenance and improvements easier.

Pan Orbit Camera

We have upstreamed the awesome bevy_editor_cam made by @aevyrie as the new PanOrbitCamera in our bevy_camera_controller crate!

Usage

Add MeshPickingPlugin and DefaultPanOrbitCameraPlugins:

app.add_plugins((
    MeshPickingPlugin,
    DefaultPanOrbitCameraPlugins,
))

Then add the PanOrbitCamera component on any 3D camera.

commands.spawn((
    Camera3d::default(),
    PanOrbitCamera::default(),
))

Full functionality is shown in the camera/pan_orbit_camera_cad example.

Weak System Ordering with chain_weak

Ordering large groups of systems with .chain() is convenient, but it can be overly strict. If system set X is chained before system set Y, every system in X must finish before any system in Y can start, even when the systems involved never touch the same data. This often leaves worker threads idle while they wait for a handful of stragglers at the end of a system set, a pattern that shows up frequently in the render world.

The new chain_weak(), before_weak(), and after_weak() functions provide a looser alternative. Like their regular counterparts, they request an ordering between successive elements, however that ordering is only kept between systems whose data accesses actually conflict. Systems that don't conflict are left unordered and may run in any order, including in parallel.

schedule.configure_sets(
    (
        ExtractCommands,
        PrepareMeshes,
        CreateViews,
        Specialize,
        PrepareViews,
        Queue,
        PhaseSort,
        Prepare,
        Render,
        Cleanup,
        PostCleanup,
    )
        .chain_weak(),
);

When two weakly-ordered systems actually conflict on their data access, a normal ordering is kept between them, so the earlier one still runs first. Two systems that conflict only through a non-conflicting system between them in the chain stay ordered as well. Non-conflicting systems, however, are left free to run in any order and overlap for increased parallelism!

Two kinds of system are treated as always conflicting, so their ordering is always kept: an earlier system that produces deferred effects such as Commands (so the later system observes them, with an ApplyDeferred sync point inserted as usual), and exclusive systems (which cannot overlap anything regardless).

Because the scheduler can only see accesses it tracks, dependencies expressed through interior mutability on read-only accesses, global state, or other untracked methods are not respected. Use chain_weak only when your systems don't rely on such hidden ordering, otherwise stick with chain.

Contextual Theming

Feathers now supports "contextual theming", meaning that the theme variables can change depending on the parent entity. So widgets that are inside of a dialog box or subpanel can have different colors than widgets that are on a regular panel or window background.

The design follows that of popular web toolkits like MUI, Radix, or Chakra. There's a new component, ThemeContext, which lets you select which color scheme the widget's descendants should use; currently the available schemes are Base, Higher, Highest, and Floating, which correspond to the design plans for the Bevy scene editor.

The theme context is used in conjunction with a new kind of design token, named SemanticToken. The lookup process for a color now requires two stages: the ThemeToken is converted into a SemanticToken, and then the combination of SemanticToken and ThemeContext is used to look up a color.

In addition to allowing context-specific color choices, this also makes it easier to design new themes! Instead of having to tediously choose colors for a hundred different theme tokens, the set of semantic tokens is much smaller, and the relationship between token and color is much more intuitive.

Val::Em and Val::Rem

Bevy UI now supports em and rem as sizing units. em is the current font size (represented by an EmSize component), rem is a global "root" font size (represented by the existing RemSize resource).

EmSize is derived from TextFont when one is on the same entity; propagating it down the hierarchy is left to your app.

This is especially useful if you might want to vary your text size after authoring your UIs, for example as an accessibility feature or just to improve your UI on different devices.

bsn! {
    Node { width: em(10) }
    Text("Hello")
    TextFont { font_size: FontSize::Rem(1.5) }
}

The default font-size is now rem(1) rather than px(20). This is a no-op if you're not changing RemSize but it means your text will scale by default when you do.

Per-Column Change Ticks

Components can now opt-in to "column summary change ticks":

#[derive(Component)]
#[component(summary_tick)]
struct MyComponent {
    /* fields here */
}

When enabled, this will store a "column change tick" in addition to a "per-entity change tick", which allows cheaply skipping the whole column of entities when querying for changes, rather than needing to check every entity's component to see if it has changed.

This makes mutations more expensive, as they need to write both the column change tick and the entity change tick, but for entities whose changes are queried often, but change infrequently, this tradeoff can easily be worth it! We've seen change ticks result in a 132x speedup in our GPU mesh extraction code!

FixedNode

FixedNode is a new marker component for Bevy UI.

A UI node entity with the FixedNode component is positioned relative to the target camera's viewport rather than its parent element. FixedNodes don't inherit their parent's layout, clipping or transform context. They behave like a "root node".

Elliptical Border Radius

elliptical border radius

Bevy UI can now draw nodes with elliptical border geometry.

The fields of BorderRadius are now CornerRadiuss to enable different radius to be set for each axis.

let a = BorderRadius::all(CornerRadius::circular(vh(10.)));
let b = BorderRadius::all(vh(10.)); // a == b
let c = BorderRadius::top_right(CornerRadius::new(px(10.), px(20.)));

Schedule Randomization

Before a schedule runs (and therefore, your systems), it first computes the system run order based on their ordering constraints (.before(), .after(), .chain()) and system sets. However, in addition to this, the schedule must also resolve conflicts - if system A and system B both mutate component C, and there's no ordering between A and B, the schedule needs to pick one to run first. So far, the rule has been that this is non-deterministic.

In practice though, schedules pick the order of these conflicting systems "deterministically, but arbitrarily". Put simply, your systems might accidentally be in the right order, but making an unrelated change to the graph might suddenly put it in the wrong order. This problem can be very difficult to detect.

Introducing schedule randomization! This will randomize the order of systems while maintaining any explicit system ordering constraints. Once the debug feature is enabled, ScheduleBuildSettings will include a shuffle_seed field, that users can set to randomize their schedules. For example:

App::new()
    .add_plugins(DefaultPlugins)
    .edit_schedule(Update, |schedule| {
        // Make sure to add the `rand` crate with `cargo add rand`.
        let rng_seed: u64 = rand::random();
        // Consider logging out the seed, so you can reproduce the error if you find a bug!
        info!("Randomizing Update schedule with seed={rng_seed}");
        schedule.set_build_settings(ScheduleBuildSettings {
            shuffle_seed: Some(rng_seed),
            ..Default::default()
        });
    })
    .run();

This can be used for "property testing", to verify that your systems satisfy some property despite different orderings of systems.

There are some caveats however. Currently, when using auto_insert_apply_deferred, systems with commands are always placed before the earliest sync point they can. This means that although your systems may not have the correct ordering, they might "accidentally" have the correct ordering because of which sync point it uses. We hope to fix this in the future.

In addition, the multi-threaded executor executes systems greedily: it looks for the first unexecuted system whose dependencies are finished and that has no other conflicting systems running. The result is that even if the shuffle results in the order (A, B, C), C could run before B if A and B conflict. This can be desirable to test, but consider using the single-threaded executor to avoid this case.

This tool is complementary to the existing system order ambiguity detection, which analyzes the graph of systems statically. Ambiguity detection cheaply generates a (sometimes large!) list of potential problems, not all of which may correspond to meaningful bugs in your project. Real test failures in some permitted orderings give you more actionable information about which of these problems are real, and the correct ordering. Furthermore, ambiguity detection can have false negatives, typically when ambiguities are incorrectly ignored, or in the presence of interior mutability mechanisms that do not require write-access (from the scheduler's perspective).

Catching Panics

For long-running programs, crashing can be unacceptable. If, for example, there is a bug in one of your image editor's tools, it's better for that tool to fail or to produce wrong results than to lose all your unsaved work.

Bevy's systems, commands and observers are able to return errors. You can either set an error handler case-by-case, or let the FallbackErrorHandler deal with it. But this used to only work for explicitly returned errors: Panics used to bring down the entire app.

In Bevy 0.20, these panics now get turned into errors and passed to the fallback error handler. By default this re-panics, but now you can choose whether to log an error and continue, or whatever else you want.

Faster Bulk Despawning

Sometimes, you just want to despawn a ton of things at once. This is reasonably common: Bevy's own DespawnOnEnter and DespawnOnExit allow you to quickly clean up entities as you swap the state of your game, tidying up menus or resetting the game after a loss. While this isn't that much work in total, it's concentrated all at once: if that process is slow, you could see hitches, or longer loading screens.

If you use the new despawn_all<F: QueryFilter> command (or one of its siblings) to batch this work, the ECS can speed things up through reduced overhead: sharing steps across related operations.

If you're using DespawnOnEnter or DespawnOnExit you'll see this performance gain for free; no changes to your code needed.

Better Texture Compression

Textures are a huge part of the memory footprint for most 3D games. Smaller textures means smaller downloads, faster loads and bigger scenes. Bevy 0.20 tackles this on two fronts, with an improved compression approach and automatic mipmap generation during asset processing.

Bevy's CompressedImageSaver asset processor has been significantly upgraded with a new compression backend powered by the ctt library. The new compressed_image_saver feature compresses textures into BCn formats (for desktop GPUs) or ASTC formats (for mobile GPUs), producing higher-quality output than the previous Basis Universal approach: more bang for the byte. The compressor automatically selects the best output format based on the input texture's channel count and type — for example, single-channel textures get BC4, HDR textures get BC6H, and standard RGBA textures get BC7.

Try out the new compressed_image_saver example to see it in action.

Automatic Mipmap Generation

No more manually generating mipmaps (scaled down versions of each texture for viewing at a distance)! The new backend automatically produces a full mip chain during compression. This means less aliasing when textures are viewed at a distance and better GPU cache utilization — all for free, just by running your textures through the asset processor.

Image compression on other platforms

To target mobile GPUs, set the BEVY_COMPRESSED_IMAGE_SAVER_ASTC environment variable with your desired block size (e.g. 4x4, 6x6, 8x8). Larger blocks give smaller files at the cost of quality. All 14 ASTC block sizes are supported.

The previous Basis Universal compression behavior has been moved to the compressed_image_saver_universal feature. This remains the best choice for cross-platform distribution (including WebGPU), since UASTC can be transcoded at load time to whatever format the target GPU supports.

Bevy Error Context Messages

Similar to the popular anyhow crate, BevyError now provides an ergonomic way to attach extra context to an error using the context method, which also allows creating a Result<T, BevyError> from an Option<T>.

This makes it easier to trace back errors with human-readable messages without looking at verbose backtraces.

fn fallible() -> Result<(), BevyError> {
    // This produces the error message `Failed to parse number: invalid digit found in string`
    let parsed: usize = "I am not a number"
        .parse()
        .context("Failed to parse number")?;

    Ok(())
}

with_context may be used to produce the context message with a closure instead.

If multiple contexts are stacked on top of each other, you see all of them when an error is logged. If we set up our error contexts like so:

fn parse_package() -> Result<Package, BevyError> {
    let path = "package.json";
    let package = std::fs::read_to_string(path)
        .with_context(|| format!("Failed to read {path}"))?;

    serde_json::from_str(&package)?
}

fn load_package() -> Result<(), BevyError> {
    let package = parse_package().context("Failed to parse package.json")?;
    // Use `package`...
}

The following error will be produced if package.json is missing:

Failed to parse package.json

Caused by:
    Failed to read package.json
    No such file or directory (os error 2)

InlineBox and InlineImage

inline image

Flowing text around elements allows for the creation of more complex UI elements. The newly introduced InlineBox component allows space to be reserved within text layouts for custom content. To intersperse images with text, spawn an entity with the InlineImage component.

What's Next?

No matter how many features we add, the flock will always demand more. Game engines, unfortunately, are never done.

Let us peer deep into the mists of time, and see what other features Bevy has in flight! Like usual, many of these features are "essential components of a Bevy scene editor", even if they are not "the editor itself". That allows us to ship useful bits and pieces incrementally, and polish them while we put it all together.

  • .bsn asset format: With the syntax stabilized, it's time to bring BSN to the file system, creating a human-readable, hot-reloadable file format designed for tool-driven (read: editor) authoring.
  • Assets as Entities: While our asset handling has been steadily improving, it is still a separate data model. We're working on representing assets as entities, giving them access to the full expressive power of the ECS (including event observers and relationships), providing direct support for defining assets in BSN, and easing the learning curve (as assets are accessed like any other ECS data).
  • Remote inspector: Browse, modify and mutate entities from external tools, on your machine or on a different device!
  • More powerful required components: Wish you could pull in assets, vary values based on other entities / components, or reference resources in required components? Us too: we're hoping to integrate required components with the Template trait that powers BSN, bells and whistles included.
  • Mutually exclusive components: A long requested feature: statically ensure that your Player is never a Camera, creating invariants that can be counted on.
  • HDR (High Dynamic Range) display support: Bevy: now in even more colors!

Support Bevy

Bevy will always be free and open-source, but it isn't free to make! Because Bevy is free, we rely on the generosity of the Bevy community to fund our efforts. If you are a happy user of Bevy or you believe in our mission, please consider donating to the Bevy Foundation... every bit helps!

For those interested in a complete changelog, you can see the entire log (and linked pull requests) via the relevant commit history.

The Daily Front Page 17 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Engines and Package Managers
repository

Zerobrew: A faster alternative to Homebrew

by cachebag·▲ 106 points·90 comments·github.com ↗
★ 7,986⑂ 183 forks Rust

An up to 6.6x faster Homebrew alternative

zerobrew

English · 中文

zerobrew demo

zerobrew brings uv-style architecture to Homebrew packages on macOS and Linux.

Install

curl -fsSL https://zerobrew.rs/install | bash

The installer updates your shell config. After it finishes, restart your terminal or run the source command it prints.

Or via Homebrew:

brew install zerobrewhq/zerobrew/zerobrew

Update zerobrew

If you used the standalone installer, rerun it:

curl -fsSL https://zerobrew.rs/install | bash
zb --version

If you installed with Homebrew:

brew update && brew upgrade zerobrew

If you installed from the old lucasgelfond/zerobrew tap, it's no longer updated. Switch to the new one:

brew uninstall zerobrew
brew untap lucasgelfond/zerobrew
brew install zerobrewhq/zerobrew/zerobrew

Quick start

zb install jq                   # install one package
zb install wget git             # install multiple
zb bundle                       # install from Brewfile
zb bundle install -f myfile     # install from custom file
zb bundle dump                  # export installed packages to Brewfile
zb bundle dump -f out --force   # dump to custom file (overwrite)
zb uninstall jq                 # uninstall one package
zb outdated                     # list packages with newer versions
zb upgrade                      # upgrade all outdated packages
zb upgrade jq wget              # upgrade specific packages
zb reset                        # uninstall everything
zb gc                           # garbage collect unused store entries
zbx jq --version                # run without linking

Performance snapshot

Package Homebrew (cold) ZB (cold) Cold speedup Homebrew (warm) ZB (warm) Warm speedup Overall (100 packages) 776s 117s 6.6x 638s 9.3s 68x python@3.14 16.99s 1.97s 8.6x 14.37s 207ms 69.4x node 29.31s 3.16s 9.3x 28.24s 232ms 121.7x tesseract 34.63s 2.16s 16.0x 32.37s 476ms 68.0x openjdk 32.09s 5.17s 6.2x 26.86s 448ms 60.0x llvm 18.22s 9.14s 2.0x 9.66s 183ms 52.8x

Measured on 2026-10-08 with zerobrew 0.3.5 (development release) and Homebrew 7.0.8 on macOS 26.6.2, MacBook Pro (M3 Pro, 18 GB RAM), ~318 Mbit/s download bandwidth. Homebrew started with nothing installed.

  • Cold: the package and all of its dependencies uninstalled, empty download cache.
  • Warm: the package and all of its dependencies uninstalled, downloads from the cold run still cached.
  • The median package was 5.3x faster cold and 56x faster warm. Per package, cold ranged from 1.6x (go) to 20x (ca-certificates) and warm from 18x (go) to 252x (ca-certificates). 24 of the 100 packages installed 100x faster or more warm, which is what the asterisk on the tagline refers to.
  • Cold installs are bound by the link. The same run on a ~69 Mbit/s connection (results/2026-10-07) came out at 3.3x cold and 69x warm. Big bottles like go and llvm spend nearly all of their cold time downloading, so both tools land close together there.
  • zerobrew doesn't run post-install steps yet. Homebrew did in these runs, so for the 13 formulae here that have them (ca-certificates, fontconfig, gcc, glib, gnupg, gnutls, llvm, node, openssl@3, python@3.13, python@3.14, ruby, unbound) Homebrew is doing work we aren't. ca-certificates is the obvious one, its step rebuilds the cert bundle. Next run gets --skip-post-install on the brew side until we run them too.
  • Warm installs use more disk. After an uninstall brew keeps the bottle, we keep the bottle and the unpacked keg in the store. That's the whole reason a reinstall is a clone and not a rebuild.

Full results

Package Homebrew (cold) ZB (cold) Cold speedup Homebrew (warm) ZB (warm) Warm speedup Overall (100 packages) 775.60s 117.43s 6.60x 637.50s 9.33s 68.31x ca-certificates 7.65s 376ms 20.35x 6.55s 26ms 252.12x openssl@3 11.02s 1.30s 8.46x 9.18s 64ms 143.47x xz 2.39s 454ms 5.26x 1.46s 29ms 50.31x sqlite 2.99s 591ms 5.06x 2.04s 27ms 75.67x readline 2.48s 494ms 5.02x 1.46s 26ms 56.08x icu4c@78 3.32s 1.57s 2.11x 1.96s 33ms 59.42x python@3.14 16.99s 1.97s 8.62x 14.37s 207ms 69.41x awscli 27.22s 3.37s 8.08x 25.56s 483ms 52.92x node 29.31s 3.16s 9.28x 28.24s 232ms 121.72x harfbuzz 29.34s 2.20s 13.34x 22.35s 364ms 61.41x ncurses 3.13s 1.04s 3.01x 2.04s 69ms 29.59x gh 2.60s 903ms 2.87x 1.35s 38ms 35.58x pcre2 2.58s 631ms 4.08x 1.57s 35ms 44.94x libpng 2.49s 854ms 2.92x 1.50s 27ms 55.70x zstd 4.12s 672ms 6.13x 2.74s 34ms 80.50x glib 7.02s 1.72s 4.08x 5.24s 94ms 55.76x lz4 2.89s 635ms 4.54x 1.48s 27ms 54.74x gettext 4.72s 1.30s 3.61x 3.25s 64ms 50.81x libngtcp2 10.79s 1.40s 7.73x 9.20s 66ms 139.36x libnghttp3 2.38s 436ms 5.47x 1.47s 27ms 54.44x pkgconf 2.35s 469ms 5.02x 1.47s 27ms 54.59x libunistring 2.57s 981ms 2.62x 1.49s 26ms 57.12x mpdecimal 2.53s 705ms 3.59x 1.47s 27ms 54.33x brotli 2.65s 776ms 3.41x 1.48s 27ms 54.67x jpeg-turbo 2.55s 889ms 2.87x 1.48s 27ms 54.78x xorgproto 2.21s 484ms 4.57x 1.21s 29ms 41.59x ffmpeg 18.57s 1.76s 10.54x 17.62s 164ms 107.41x cmake 4.04s 1.66s 2.44x 1.73s 80ms 21.64x libnghttp2 2.63s 635ms 4.14x 1.46s 26ms 56.31x go 5.43s 3.36s 1.61x 3.40s 190ms 17.92x uv 2.90s 1.37s 2.12x 1.27s 28ms 45.43x gmp 2.62s 543ms 4.83x 1.47s 26ms 56.42x libtiff 7.08s 821ms 8.62x 6.11s 53ms 115.19x fontconfig 9.35s 982ms 9.52x 8.13s 77ms 105.61x python@3.13 14.28s 1.76s 8.12x 13.15s 186ms 70.71x git 6.46s 1.67s 3.88x 4.98s 101ms 49.33x little-cms2 7.85s 792ms 9.91x 6.83s 55ms 124.16x dav1d 2.49s 544ms 4.58x 1.47s 26ms 56.42x openexr 9.95s 712ms 13.98x 8.83s 59ms 149.59x c-ares 2.51s 513ms 4.90x 1.51s 32ms 47.34x tesseract 34.63s 2.16s 16.01x 32.37s 476ms 68.01x p11-kit 9.26s 996ms 9.30x 7.95s 32ms 248.53x imagemagick 14.51s 1.21s 12.00x 13.20s 82ms 160.95x zlib 2.36s 430ms 5.48x 1.46s 25ms 58.44x libx11 5.70s 932ms 6.11x 4.71s 174ms 27.05x freetype 3.51s 585ms 5.99x 2.21s 32ms 69.22x protobuf 4.06s 725ms 5.60x 3.09s 57ms 54.21x gnupg 21.97s 1.36s 16.16x 20.63s 192ms 107.44x openjph 7.88s 697ms 11.31x 6.80s 54ms 126.02x libtasn1 2.30s 461ms 4.99x 1.49s 28ms 53.25x ruby 16.01s 3.83s 4.18x 14.56s 801ms 18.18x gnutls 14.93s 1.19s 12.52x 13.93s 134ms 103.96x expat 2.40s 442ms 5.42x 1.48s 26ms 56.88x libsodium 2.44s 884ms 2.76x 1.48s 27ms 54.96x simdjson 2.52s 619ms 4.08x 1.49s 26ms 57.12x gemini-cli 29.98s 2.23s 13.43x 27.64s 235ms 117.60x libarchive 5.02s 594ms 8.45x 4.04s 35ms 115.31x pyenv 12.61s 1.39s 9.06x 11.44s 135ms 84.76x pixman 2.44s 487ms 5.01x 1.49s 26ms 57.19x curl 16.37s 1.47s 11.12x 15.20s 173ms 87.88x opus 2.37s 497ms 4.76x 1.47s 27ms 54.59x unbound 12.24s 1.35s 9.07x 11.03s 113ms 97.58x cairo 19.28s 1.48s 12.99x 17.74s 370ms 47.95x pango 24.48s 1.69s 14.46x 23.06s 411ms 56.10x leptonica 9.48s 914ms 10.37x 8.39s 66ms 127.18x libxcb 4.88s 887ms 5.50x 3.89s 132ms 29.45x jpeg-xl 12.96s 997ms 13.00x 11.92s 70ms 170.31x coreutils 3.31s 760ms 4.35x 2.24s 38ms 58.97x certifi 7.81s 461ms 16.95x 6.98s 31ms 225.06x krb5 10.49s 1.34s 7.85x 9.28s 68ms 136.44x docker 2.26s 734ms 3.08x 1.21s 29ms 41.83x libheif 10.88s 961ms 11.32x 9.59s 63ms 152.24x webp 4.31s 578ms 7.46x 3.37s 35ms 96.40x libxext 6.45s 982ms 6.57x 5.42s 182ms 29.80x libxau 2.74s 512ms 5.35x 1.85s 33ms 56.06x gcc 12.23s 3.55s 3.45x 8.58s 67ms 128.00x bzip2 2.09s 368ms 5.69x 1.14s 26ms 43.65x libxdmcp 2.74s 540ms 5.08x 1.86s 33ms 56.42x abseil 3.05s 800ms 3.82x 1.90s 50ms 38.04x xcbeautify 2.22s 481ms 4.62x 1.15s 26ms 44.35x libuv 2.51s 482ms 5.20x 1.47s 26ms 56.65x giflib 2.31s 673ms 3.44x 1.46s 26ms 56.12x utf8proc 2.36s 452ms 5.23x 1.46s 27ms 54.15x libxrender 6.35s 976ms 6.51x 5.42s 179ms 30.25x m4 2.00s 431ms 4.65x 1.13s 25ms 45.28x graphite2 2.47s 428ms 5.78x 1.46s 26ms 56.23x openjdk 32.09s 5.17s 6.21x 26.86s 448ms 59.96x uvwasi 2.95s 483ms 6.10x 2.11s 29ms 72.66x libffi 2.56s 575ms 4.46x 1.43s 26ms 55.08x libdeflate 2.44s 458ms 5.33x 1.46s 26ms 56.12x llvm 18.22s 9.14s 1.99x 9.66s 183ms 52.79x aom 3.25s 699ms 4.65x 2.16s 32ms 67.50x lzo 2.38s 449ms 5.31x 1.46s 26ms 56.00x libevent 10.66s 1.33s 7.99x 9.19s 71ms 129.42x libgpg-error 5.06s 1.11s 4.56x 3.84s 70ms 54.81x libidn2 4.97s 1.09s 4.56x 3.87s 69ms 56.12x berkeley-db@5 4.05s 1.96s 2.06x 2.60s 56ms 46.45x deno 10.57s 1.46s 7.23x 9.24s 57ms 162.09x libedit 2.35s 442ms 5.33x 1.45s 26ms 55.65x oniguruma 2.37s 508ms 4.67x 1.46s 26ms 56.19x

To reproduce, run just bench --full results/ on a machine with nothing installed in Homebrew. It resets zerobrew, uninstalls everything it installed in Homebrew, and writes a table to results/benchmark.md.

A smaller version runs in CI: the parity workflow installs a fixed set of formulae with both tools on the same runner and compares the resulting prefixes byte for byte, and the timing workflow times those formulae plus node and python@3.14, cold and warm, with both tools and with the last zerobrew release.

The nightly timing run fails if zerobrew is less than 1.5x faster than Homebrew cold or 3x warm on any of them, or more than 20% slower than the last release overall.

A note on how we are achieving these speeds

WRT Homebrew, I want it to be clear that both brew and zerobrew install the same bottles from Homebrew's build farm.

The difference is what happens after the download: Homebrew runs Ruby to evaluate the formula, unpacks, rewrites paths with install_name_tool, and re-signs each binary one at a time, while zerobrew does the relocation in-process and links from a content-addressed store, so it pays for the download once and almost nothing after.

I want it to be clear that we are basically nothing without Homebrew's bottle build farm. Every package zerobrew installs is one they built, tested and published. We don't compile anything, we don't maintain formulae, and none of these numbers exist without that work. The speed comes from how the artifacts are installed, not from what's in them.

This is a good read, if you're interested in what zerobrew is and isn't: Standing on the shoulders of Homebrew by Andrew Nesbitt. It makes the point better than I can.

nanobrew:

nanobrew’s published numbers time a “warm install” of a package that is already installed, which is an early exit, not an install, and compare against zerobrew 0.1.0.

Every number above is a real install from an uninstalled state, with the script and the full log in this repo, so you can run it yourself.

Relationship with Homebrew

zerobrew is more of a performance-optimized client for the Homebrew ecosystem. We rely on:

  • Homebrew's formula definitions (homebrew-core)
  • Homebrew's pre-built bottles when available
  • Homebrew's package metadata and infrastructure

Our innovations focus on:

  • Content-addressable storage for deduplication
  • APFS clonefiles for zero-overhead copying
  • Source build fallback using Homebrew's Ruby DSL

zerobrew is experimental. We recommend running it alongside Homebrew rather than as a replacement, and do not recommend purging homebrew and replacing it with zerobrew unless you are absolutely sure about the implications of doing so.

Project status

  • Status: Experimental, but quite useful. I (@cachebag) daily drive it myself.
  • Feedback: If you hit incompatibilities, please open an issue or PR.
  • License: Dual-licensed under Apache 2.0 OR MIT, at your choice. The source build shim is derived from Homebrew and is covered by its BSD 2-Clause license.
The Daily Front Page 18 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — People, Platforms & Preservation
ask hn

Tell HN: I've been paying for a rural Tanzanian's education for 10 years

by lukehandcool·▲ 678 points·207 comments·news.ycombinator.com ↗

Ten years ago I was 19 and traveling through East Africa, and I spent a summer in Ibumila, a village in the Njombe highlands of Tanzania. There's no school in the village. The nearest one is a boarding school an hour away that costs a few hundred dollars a year, which is out of reach for most families there and was about two weeks of summer job money for me. The daughter of the family I stayed with, Anwarite, was 11. I offered to pay her fees and told myself I'd keep paying as long as she wanted to keep going.

This summer she graduated from the University of Dar es Salaam with a degree in Language Studies, and last week she told me she'd been accepted into a Master of Arts in Swahili program there. Roughly 2% of people from Njombe ever finish a university degree. Her goal is to get a PhD and then to bring it back to the region.

Her entire 18-month master's program (tuition, registration, fees, books, supplies) comes to 3,060,000 TSh, about $1,161.

Since this worked out, I kept adding students as I could afford to, and in 2021 I registered it as a 501(c)(3), the Tanzania Education Project. It supports five students from Ibumila now, school fees and healthcare. I kept it small while I was finishing my PhD because I didn't want commitments I couldn't personally guarantee for a decade; I've since started a postdoc, so it feels like the right time to grow past my own paycheck. The long-term goal is that every kid in the village has access to education and healthcare. I sometimes think of this project as a slow experiment. How much could the village itself change over someone's lifetime if the kids have access to education?

https://tanzaniaeducationproject.org/ is the website. Nobody takes a salary, and aside from bank fees the money goes to the students. If anyone wants to fund Anwarite's master's specifically, it's here: https://www.gofundme.com/f/send-anwarite-to-her-masters-prog...

Happy to answer any questions or take any tips you all might have about doing this sort of thing.

Join the discussion on Hacker News →

The Daily Front Page 19 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — People, Platforms & Preservation
article

US man given prison sentence for bot-farming music streams

by cdrnsf·▲ 143 points·230 comments·thequietus.com ↗

A North Carolina man has been sentenced to 18 months in prison for collecting millions in royalties from bot-farming streams of AI-generated songs.

The US Justice Department announced the sentencing of 54-year-old Michael Smith (pictured above) in a press release yesterday (6 October). He was sentenced for one count of conspiracy to commit wire fraud having pleaded guilty in court in March of this year.

Smith, who is a musician, has also been forced to forfeit the $8 million in royalties that he earned from the bot-generated streams. He earned those royalties via his activities from 2017 until his arrest in 2024. According to the US Justice Department, he created as many as 10,000 fraudulent accounts to stream songs he owned, which were largely made using AI. He also spread his automated streams across thousands of songs in order to avoid the kind of anomalous streaming of a single song that might alert people to his fraudulent scheme.

Smith’s hundreds of thousands of AI-generated songs were streamed by his bot accounts billions of times. The US Justice Department gives the example that the entire catalogue of Taylor Swift received 9.3 million streams on YouTube Music from family plan streams in April 2023. In the same month, Smith’s bot accounts used family plans to fraudulently stream his AI-generated music 80.9 million times.

“Michael Smith exploited super intelligence technology to generate a fraud,” said US Attorney Jamie McDonald. “By flooding music streaming platforms with automated bots in the place of consumers, and fake songs in the place of creativity, Smith robbed millions in royalty payments from genuine artists and their fans. This Office is committed to ensuring the integrity of all markets, and protecting the public from those who use super intelligence for fraud.” (‘Super intelligence’ is the term that President Donald Trump has ordered government employees to use in documents and statements in the place of ‘artificial intelligence’.)

The Daily Front Page 20 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — People, Platforms & Preservation
article

Classic PC demoscene productions running natively in the browser

by adunk·▲ 151 points·141 comments·treylorswift.github.io ↗

How It Works

Each demo's original DOS code, recompiled instruction for instruction, runs in your browser:

  1. The demo is run on an x86 emulator that records every block of code the CPU actually executes, over the whole demo.
  2. That recording is translated into C - the original instructions, one for one, with the exact cycle timing of the emulated machine.
  3. The C is compiled to WebAssembly, together with models of the hardware the demo talks to: the timer, the VGA card and the Sound Blaster.
  4. The result is checked against the emulator event for event: every interrupt, port access and frame at the same moment of emulated time.

The demos' own loaders, music players and effects all run as they did in 1992 and 1993; only the hardware is modelled.

The demos ran on VGA at 70 Hz, so they look smoothest on a display running at 70 Hz, or at 140 Hz or higher.

demoscene-recomp on GitHub

Credits

Unreal and Second Reality are by Future Crew, Crystal Dream II is by Triton, Stars: Wonders of the World is by NoooN; all were released free to the demoscene.

The original release files are served unmodified, as the demos read them at run time.

The Daily Front Page 21 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — People, Platforms & Preservation
article

Telnet BBS Guide

by kmstout·▲ 97 points·36 comments·telnetbbsguide.com ↗

The Telnet BBS Guide focuses Bulletin Board Systems – the original Social Network, serving the BBS community for over 28 years! We list both Dial-Up and Telnet accessible Bulletin Board Systems all over the world. We currently list 1070 BBS and related systems with brief and detailed descriptions and a downloadable text-version listing suitable for listing on your BBS or for as a download for others to view and use.

The Daily Front Page 22 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Names, Domains & New Models
The Daily Front Page 23 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Names, Domains & New Models
article

Step 5 Preview, a 1M-context MoE from StepFun, shows up on OpenRouter

by AnneWodell·▲ 115 points·26 comments·openrouter.ai ↗

stepfun/step-5-preview

Step 5 Preview is StepFun's flagship model for agentic work, built on a sparse Mixture-of-Experts architecture (27B active / 600B total parameters). It performs strongly in software engineering and professional knowledge work, with particular strength in finance.

It is designed for extended tasks that span large codebases and documents, using tools and refining results over multiple steps.

Modalities

In / Out Price

$1 / $2.70 per 1M

Context

1.0M

Released

Oct 8, 2026

Providers

This model is hosted by one provider. OpenRouter forwards every request to it directly — no routing decisions to make.

Pricing

The average price customers actually pay for this model, next to the prices providers post. Caching and discounts mean the price actually paid is often well below the listed one.

Performance

Throughput is how fast the model writes (tokens per second — higher is better). Latency is total round-trip time (lower is better). TTFT is time-to-first-token — how long before you see anything appear (lower is better).

Uptime

Uptime is the percentage of the past 3 days that at least one provider was responding to requests. Availability is the percentage of time that inference was successfully served. OpenRouter continuously monitors and uses the next-best provider when one returns an error.

Apps

Public apps that send the most traffic to this model. Good signal for what real production workloads look like — and a hint at which use cases this model is best suited for.

  1. OpenClaw

    OpenClaw is an open-source AI agent that connects to your messaging apps and takes real actions on your behalf, from running commands and browsing the web to managing files and sending emails.

  2. Hermes Agent

    Hermes Agent is an open-source, self-improving AI agent by Nous Research that runs persistently with memory across sessions, and builds reusable skills from experience. It comes with 40+ built-in tools, including web search, browser automation, and vision, plus scheduled automations and subagents.

  3. Cline

    Cline is an open-source AI coding agent that lives inside your IDE, autonomously exploring your codebase, editing files, running terminal commands, and using browser automation.

  4. Nous Research API

    Nous Research is an AI research team focused on advancing open-source AI.

  5. Kilo Code

    Kilo Code is an open-source AI coding agent that works across VS Code, JetBrains, and CLI to help developers ship code faster with agentic workflows.

Activity

Token volume and request traffic to this model over time.

API

Drop-in code to call this model. OpenRouter's API is OpenAI-compatible — most SDKs work by just swapping the base URL. The only thing that changes between models is the model slug below.

Frequently asked questions

What is Step 5 Preview?

Step 5 Preview is StepFun's flagship model for agentic work, built on a sparse Mixture-of-Experts architecture (27B active / 600B total parameters). It performs strongly in software engineering and professional knowledge work, with particular strength in finance. It is designed for extended tasks that span large codebases and documents, using tools and refining results over multiple steps.

How much does Step 5 Preview cost?

Step 5 Preview costs $1.00/M input tokens and $2.70/M output tokens, with separate rates for Cache Read at $0.05/M tokens.

What is the context length of Step 5 Preview?

Step 5 Preview has a 1,000,000 token context window. It supports up to 64,000 completion tokens.

Does Step 5 Preview support tool calling and structured outputs?

Yes. Step 5 Preview accepts tools for function calling. It also supports structured outputs via a JSON schema in response_format.

What inputs and outputs does Step 5 Preview support?

Step 5 Preview accepts text, images, and video as input and returns text.

What other text models does StepFun have?

Step 3.7 Flash and Step 3.5 Flash are other text models from StepFun.

When was Step 5 Preview released?

Step 5 Preview was released on October 8, 2026.

The Daily Front Page 24 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Also on the Front Page
The Daily Front Page 25 of 26
Thursday, October 8, 2026 The Daily Front No. #261008 — Colophon

That's the Front for Today

Issue No. #261008 — Thursday, October 8, 2026 — went to press 2026-10-09 at 04:40 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Thursday, October 8, 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 — 30 model calls and 224k 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 cramped, aging telephone exchange, a technician holds a tiny open circuit board beside a humming rack of warm, dust-coated machinery. A child’s voice travels through a headset into the board while seven small colored lamps glow in sequence, and a nearby robotic arm turns the spoken instructions into a precise movement. On a workbench, a mathematician quietly removes three pinned proof diagrams from a crowded board, leaving pale rectangles and loose thumbtacks behind.

Architectural axonometric cover illustration in precise ruled lines, depicting the cramped aging telephone exchange as a compact cutaway: the technician holds a tiny open circuit board beside the humming rack of warm, dust-coated machinery; a headset-to-board sound path carries the child’s voice, seven small lamps glowing in sequence; a nearby robotic arm converts the spoken instructions into a precise movement; at the workbench, the mathematician removes three pinned proof diagrams from the crowded board, leaving pale rectangles and loose thumbtacks. Use a restrained modernist palette of charcoal, concrete gray, muted teal, ochre, and signal red, with diffuse studio light, disciplined spatial geometry, minimal texture, and clear separation of every action and relationship.

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 26 140,084 60,371
layoutgpt-5.6-terra 1 17,902 2,301
covergpt-5.6-luna 2 1,428 370
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. Whistle: Speech to Text in 16.9 MB by gmays — cactuscompute.com·HN discussion ↗
  2. Why isn't the industry freaking out about DeepSeek 4.1 Flash? by jonotime — dgt.is·HN discussion ↗
  3. OpenAI annualised revenues $20B less than previously signalled by mfiguiere — cnbc.com·HN discussion ↗
  4. I gave Opus 5.5 one prompt and six hours to visualize Invisible Cities by stared — quesma.com·HN discussion ↗
  5. Yes, and by Michelangelo11 — htmx.org·HN discussion ↗
  6. Port of the TypeScript compiler, checker and lsp to Rust, by LLM by jcbhmr — github.com·HN discussion ↗
  7. OpenAI Withdraws 3 Math Papers by theemathas — github.com·HN discussion ↗
  8. OpenAI withdraws three mathematical results by sashank_1509 — twitter.com·HN discussion ↗
  9. 4-hour battery storage is cheaper to install than gas turbines all across globe by 01-_- — solarpowerworldonline.com·HN discussion ↗
  10. The people holding up the internet by simjue — sheets.works·HN discussion ↗
  11. ADHD as a circadian rhythm disorder: evidence and implications for chronotherapy (2025) by bookofjoe — frontiersin.org·HN discussion ↗
  12. Anne Carson wins Nobel Prize in literature 2026 by sonabinu — theguardian.com·HN discussion ↗
  13. Beauty in DVD Menus by speckx — vale.rocks·HN discussion ↗
  14. The value of not getting to the point (2015) by NaOH — ken.arneson.name·HN discussion ↗
  15. Show HN: Making a flexible "neon" t-shirt with LED filaments by scottbez1 — scottbezek.blogspot.com·HN discussion ↗
  16. Bevy 0.20 by Philpax — bevy.org·HN discussion ↗
  17. Zerobrew: A faster alternative to Homebrew by cachebag — github.com·HN discussion ↗
  18. Tell HN: I've been paying for a rural Tanzanian's education for 10 years by lukehandcool — news.ycombinator.com·HN discussion ↗
  19. US man given prison sentence for bot-farming music streams by cdrnsf — thequietus.com·HN discussion ↗
  20. Classic PC demoscene productions running natively in the browser by adunk — treylorswift.github.io·HN discussion ↗
  21. Telnet BBS Guide by kmstout — telnetbbsguide.com·HN discussion ↗
  22. New gTLD Application for .lan by mzajc — newgtldprogram-aps.icann.org·HN discussion ↗
  23. Step 5 Preview, a 1M-context MoE from StepFun, shows up on OpenRouter by AnneWodell — openrouter.ai·HN discussion ↗
  24. “Math 2.0” will need to value mathematical progress more holistically by ent101 — mathstodon.xyz·HN discussion ↗
  25. I think I found a planet nobody knew existed. I used Claude Code to find it by pyduan — reddit.com·HN discussion ↗
  26. Trump administration is suspending Microsoft from a green card program by alephnerd — apnews.com·HN discussion ↗
  27. US suspends Microsoft, major IT firms from key green card program by geox — reuters.com·HN discussion ↗
  28. OLED burn-in test: 30-month update by baal80spam — techspot.com·HN discussion ↗
  29. Theranos.world by kbyatnal — theranos.world·HN discussion ↗
  30. Orkut.com by andreynering — orkut.com·HN discussion ↗

Browse all issues in the archive →