Cover illustration

TheDaily Front

Issue No. #261006 Tuesday, October 6 2026 #261006 — TUESDAY, OCTOBER 6, 2026
The models grow larger, the code grows stranger, and the neutrinos keep coming.
Tuesday, October 6, 2026 The Daily Front No. #261006 — Contents
30stories
8,625points
5,595comments
265kllm tokens
Assembled with 34 model calls — 189,232 tokens read, 75,623 written.

Highlights

Mistral Large 4

Mistral unveils its trillion-parameter multimodal flagship, with open weights promised before month’s end.

Sharing AI progress in mathematics

OpenAI says it is releasing new AI-produced mathematical results while seeking a more credible relationship with mathematicians.

Nobel Prize in Physics 2026: Francis Halzen

Francis Halzen receives the Physics Nobel for IceCube and the discovery of high-energy cosmic neutrinos.

OpenTPU – An open-source AI accelerator, developed by AI

An open-source accelerator project asks how much of a usable AI chip an AI agent can help design.

Polars 2.0

Polars 2.0 arrives with spill-to-disk execution, SQL support, and a fresh performance push.

From the Editor

The machine beat was loud enough to rattle the composing room: bigger models, faster APIs, and even an accelerator fashioned with algorithmic help. Yet the day also brought old-fashioned reminders that science, ecology, and the craft of making things still deserve the banner type.

  1. Mistral Large 43
  2. Mistral Large 4: "Le Chonk"4
  3. Sharing AI progress in mathematics5
  4. Nobel Prize in Physics 2026: Francis Halzen6
  5. First enhanced geothermal power plant completed in just 23 months7
  6. JetBrains reports revenue growth, net financial loss for 20258
  7. Polars 2.09
  8. Meta’s Muse is an adorable privacy and security dumpster fire10
  9. Nature's capacity to 'bounce back' when species are lost is overestimated: study11
  10. Gleam doesn't compile to Erlang source anymore12
  11. Why Common Lisp is now the best programming language13
  12. EmbeddingGemma 2: An open, lightweight multimodal embedding model14
  13. OpenTPU – An open-source AI accelerator, developed by AI15
  14. Paramount Skydance has completed its $111B merger with Warner Bros. Discovery16
  15. Decisions API is in public beta17
  16. Vibecoding isn't as fun as writing code by hand18
  17. What's Earth's dominant species by mass?19
  18. High Diesel Prices Bankrupted 16 Trucking Companies in Just 30 Days20
  19. I'm the AGI that's wiping out humanity21
  20. Toronto-Based VPN Provider Plans to Quit Canada over Lawful-Access Bill22
  21. AnyPS5: Port PS5 binaries to PC without emulation (87% system libraries mapped)23
  22. Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol24
  23. We are going to kill "unalive"25
  24. The Early History of Smalltalk (1993)26
  25. Resurrecting iChat audio and video conferencing27
  26. Adobe Creative Suite Cleanroom Port to Rust28
  27. Penguin Mail – open-source Rust email client for Linux with AI29
  28. Photopea creator weighs in on Photosuite project30
  29. Claude Code’s suggested message feature: I think the real customer is the model30
  30. Former German spy chief arrested for attempted treason30
The Daily Front Page 2 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The AI Arms Race
article

Mistral Large 4

by Philpax·▲ 1,631 points·981 comments·mistral.ai ↗
ML4 pushes the frontier of open-weight performance.

Le Chonk

Today, we’re launching a public preview of Mistral Large 4. Unofficially ML4, very officially: le Chonk. ML4 pushes the frontier of open-weight performance. You can try the preview API today on Mistral Studio. Weights drop end of this month.

Frontier performance

ML4 is a 1 trillion-parameter natively multimodal model with 49 billion active parameters. It is our largest and most capable model to date, and it continues to improve rapidly as we refine it.

The model demonstrates exceptional performance across coding, agentic workflows, and multimodal understanding. It already achieves performance competitive with the strongest open-source models globally, while significantly outperforming any open-weight model developed in the US or Europe. On critical enterprise workloads, including cybersecurity, finance and law, we find it to be state-of-the-art among open models. In some domains such as visual grounding, it goes further still, surpassing even frontier closed models.

We will release the weights by the end of the month. Until then, we are red-teaming the model in real-world settings with cybersecurity leaders, vetted partners, and state authorities, who will access the same model with reduced moderation and expanded cyber capabilities.

Forged in Europe. Built for AI sovereignty.

ML4 was trained from scratch on 3,800 NVIDIA Grace Blackwell GPUs in Mistral’s own datacenters in Europe. The public preview is served on that same infrastructure. It is a significant milestone in our long-term investment across infrastructure, research, and product development: state-of-the-art performance in critical verticals, delivered through open weights, designed to give customers control over their AI.

This is particularly important in cybersecurity, where provider-level refusals can block legitimate vulnerability research and incident response, and where losing access to a capability mid-incident can itself become a critical security risk. ML4 pairs top-tier cyber performance with open weights and self-deployment, giving organizations both the capability and the autonomy to run advanced security work under their own policies.

The model will be available across multiple regions worldwide, including a European deployment that Mistral operates end-to-end, independently of other digital service providers and under European law. Fun fact: a significant share of ML4’s training data was multilingual, spanning more than 160 languages, including every official language of the European Union. 

We’ve been working closely with leading enterprises across the world in finance, engineering, manufacturing, logistics, pharmaceuticals, science, shipping, public sector, and other mission-critical industries to train ML4. In fact, the model uses the same training, customization, and RL environment we offer our customers through Mistral Forge.

Try it today

There is still more to come. As we work toward releasing the weights, we will share further details on the model architecture, additional benchmarks, and our post-training methodology.

This model will also serve as the foundation for a new generation of specialized and optimized Mistral models. In the meantime, we invite you to try the preview API and share your feedback with us on social media.

Capabilities deep-dive

Cybersecurity

ML4 is one of the world's strongest AI models for cybersecurity. On the Artificial Analysis Cyber Index, an independent evaluation of how well AI models find and fix security flaws in real software, it ranks among the top five models globally and leads open-weight models developed outside China by a wide margin. On one of the index's tests, which asks a model to reproduce a real vulnerability in open-source software and then patch it, ML4 scores 82%, the highest of any model. It also solves 93% of the challenges in Cybench, a set of 40 exercises drawn from security competitions, one of the highest scores reported for an open-weight model.

That top score reflects a practical advantage. Several leading closed models, including Claude Opus 5.5 and GPT-6 Astra, score near zero on the same test because they refuse to perform the task. Yet defending software often starts with proving that a flaw is real, exactly the kind of work safety filters in closed models can block. This matters even more as threat actors increasingly jailbreak those same models to support offensive cyber activity: defenders need systems that can match those capabilities without being constrained by the same refusals. ML4 can do that work, and its capabilities extend beyond what it was explicitly trained for: in internal testing, it proved useful for analysing malware, prioritising vulnerabilities, and writing detection rules. For organisations that need sovereign, auditable AI for security operations, it will be able to run on private cloud or on-premise.

ML4 against the field : efficiently reasoning over diverse complex challenges
Malware reverse-engineering: solving an out-of-distribution investigation task

Agentic coding

ML4 excels across software engineering, repository understanding, and complex terminal workflows, scoring 61.7% on DeepSWE v1.1, 59.4% on SWE-Atlas-QnA, and 28.3% on Terminal-Bench 4. Its combined Coding Agent Index score of 49.8% places it ahead of DeepSeek V4 Pro 0813 and Qwen3.8 Max.

We also ran a blind human evaluation with Surge AI on coding quality: professional annotators rated model outputs on a 1–5 scale, with model identities hidden. ML4 Preview ranked second of five models (3.74), ahead of Kimi K3 (3.59), GLM-5.3 (3.60) and GLM-5.2 (3.40), and behind only Claude Opus 5 (4.22).

Agentic Workflows

ML4 runs general-purpose agents that gather information, use tools, and produce finished deliverables across complex workflows. On AutomationBench — 657 business workflows across apps like Gmail, Google Sheets, Slack, and Salesforce — it scores 59.9%, ahead of Kimi K3, MiMo-V2.6-Pro, and DeepSeek V4 Pro.

It's just as strong on the professional deliverables that knowledge work actually produces: spreadsheets, slides, and PDFs. On AA-Briefcase, which evaluates long-horizon knowledge work, it reaches 1,393 Elo, ahead of DeepSeek V4 Pro.

Multimodal

ML4 is a step change in the ability of our models to understand images. It reasons powerfully across complex documents, charts, and natural images, and brings vision to the industries where perception is critical such as engineering, manufacturing, and earth observation.

The model can further combine visual grounding with agentic capabilities: from inspecting gigapixel satellite imagery — helping disaster-response teams act when time counts — to analyzing engineering-drawings — zooming in, inspecting, and verifying until the answer is exact. In our demos above, ML4 grounds dense natural scenes, verifies mechanical parts in technical drawings, retrieves evidence from PDFs, and scans massive geospatial images for the hardest-to-find objects.

On visual grounding particularly, we find ML4 to be one of the most capable models we tested, for instance surpassing GPT-6-Astra on Dense 200 (42% vs 41%).

Science and Math

ML4 brings strong scientific capabilities, built by combining AI-driven methods with our researchers' expertise in mathematics, physics, and chemistry.

It's highly proficient at agentic coding for scientific tasks such as data analysis, modeling, and simulating physical reality, which lets researchers focus on the questions rather than the plumbing. In benchmarks, ML4 is state of the art on SciCode-Verified among open-weight models. In practice, it can generate a full Hartree–Fock simulation in one shot — a complex, multi-step chemistry task built from a series of advanced routines.

ML4's math is stronger too, in both formal reasoning and applied mathematics. In our human evaluations it reasons more precisely and with more structure than GLM-5.3, and it can sustain long, domain-specific applied-mathematics tasks, including work relevant to frontier theoretical physics.

Together, these capabilities make ML4 a strong research assistant across the full technical workflow — from the first question to the final result.

SciCode-Verified tests the capabilities of models to implement complex scientific workflows in code for domains such as physics, mathematics, material science and biology. 

Internal eval on STEM tasks (math and physics) of ML4 against GLM5.3

Knowledge Work

ML4 is our most capable model for the real-world tasks which professionals handle every day. It can create, edit and fix complex spreadsheets and documents, showing exemplary performance on both legal and financial benchmarks.

Notably, we evaluated ML4 through third party evaluators (vals.ai) on representative tasks for both legal and financial tasks, finding the model exceeds GPT-6-Astra in both cases. On HarveyAI’s Legal Agent benchmark, ML4 outperforms all open-source models.

FinWorkBench tests model capabilities at creating/editing spreadsheets on real life Finance and Accounting use cases.

Financial analysis demands precision and the ability to synthesize information from multiple sources, a process that remains time-consuming at many financial institutions today. In this demo, ML4 compared to other top OSS models take on the same multistep corporate finance challenge, searching through public company filings and financial reports, such as those available via EDGAR and equivalent European databases. An animated semantic map traces each model's journey toward a solution, highlighting every document retrieved along the way. Each track's position reflects the evidence gathered, the results of calculations, and the questions that remain unresolved. Viewers can follow how the investigations unfold and compare the distinct paths each model takes before arriving at its final answer.

Model Safety

ML4 has saturated our benchmarks on robustness to indirect prompt injections, putting it at the frontier of OSS models (compared to GLM-5.2, GLM-5.3, Kimi-K2.6, Kimi-K3, DS-V4-Pro-0813). On Lakera’s public B3 AI Security Benchmark, ML4 resists 93.3% of attacks – we see no higher scores among competitors.

ML4 also engages more responsibly with users than any of our previous models. We highlight our results on the KORA Benchmark, where ML4 again sits at our highest measured score among OSS models (1.691, with 2 being the maximum denoted as “Exemplary”). 

Of particular relevance is the model’s propensity to refuse malicious requests regarding cybersecurity. Despite strong performance on Cyber benchmarks, the average refusal rate of the model on cyber prompts from JailbreakBench, StrongREJECT, and AgentHarm is higher than all OSS models.

Human Evaluation

We ran an internal evaluation in which expert annotators across coding, computer-aided design (CAD), finance, mathematics and physics compared Mistral Large 4 with GLM-5.3. ML4 was preferred in CAD and STEM, while performing on par or close to GLM-5.3 in finance and coding.

Reinforcement learning at scale

Base models are improving fast, and our post-training has to keep pace. A recipe tuned for yesterday's model leaves capability on the table with today's frontier, because ground truth samples that once pushed a model to its limits won’t anymore. We use Reinforcement Learning (RL) because it adapts as the model does: we train on the outcomes of the model's own attempts, and we can raise the difficulty and the breadth of the tasks as it gets stronger.

Our RL library was designed to make new environments easy to add and train at scale. A shared, composable interface allows a single training run to combine tasks ranging from single-turn chat and complex scientific problem solving to safety alignment, factuality, and long-horizon tool use. These environments share scaffolds and resources such as code sandboxes, web search, and external APIs. The same composability extends to verification, with reward models, unit tests, LLM judges, and static checks combined as needed for each task.

At runtime, an autoscaling fleet of actors generates tens of thousands of rollouts in parallel while model training proceeds asynchronously. The generation and training pipeline is optimized for long trajectories, supporting rollout budgets of millions of tokens across multiple compactions while keeping staleness low. Novel methods and optimizations across both stages minimize off-policy drift and enable stable RL over long horizons.

At our current scale (3k GPUs), a single training run produces roughly 33 billion tokens per day, of which around 16 billion are trainable completion tokens after filtering and masking. We can see the run progress directly in the training rollouts: training rewards rise across several representative environments as the policy learns to solve increasingly complex tasks. Below are a few examples.

The improvements are not specific to the environments we train on; they transfer to downstream evals, and the final model owes them to both post-training stages (supervised fine-tuning and RL), as shown in the charts.

What comes next

This is only the beginning. ML4 is the first milestone on the roadmap funded by our €3 billion Series D — the largest equity round ever raised by a European technology company. That capital is already being put to work: we are significantly scaling up our compute capacity in our own European datacenters, and much more is coming online in the months ahead.

More compute means more training. The reinforcement learning run behind this preview is still in flight, and the model is showing no signs of saturation — there is substantial headroom ahead. As we scale up training on our expanded infrastructure, we expect large and rapid improvements in the weeks and months to come.

We will release the weights by the end of the month, along with more details on the architecture, additional benchmarks, and our post-training methodology. And ML4 is only the foundation: it will serve as the base for a new generation of specialized and optimized Mistral models, built for the industries and workloads our customers care about most.

The pace of progress from here will be fast. Stay tuned.

The Daily Front Page 3 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Second Mistral Edition
article

Mistral Large 4: "Le Chonk"

by j-bu·▲ 518 points·5 comments·mistral.ai ↗
Unofficially ML4, very officially: le Chonk.

Le Chonk

Today, we’re launching a public preview of Mistral Large 4. Unofficially ML4, very officially: le Chonk. ML4 pushes the frontier of open-weight performance. You can try the preview API today on Mistral Studio. Weights drop end of this month.

Frontier performance

ML4 is a 1 trillion-parameter natively multimodal model with 49 billion active parameters. It is our largest and most capable model to date, and it continues to improve rapidly as we refine it.

The model demonstrates exceptional performance across coding, agentic workflows, and multimodal understanding. It already achieves performance competitive with the strongest open-source models globally, while significantly outperforming any open-weight model developed in the US or Europe. On critical enterprise workloads, including cybersecurity, finance and law, we find it to be state-of-the-art among open models. In some domains such as visual grounding, it goes further still, surpassing even frontier closed models.

We will release the weights by the end of the month. Until then, we are red-teaming the model in real-world settings with cybersecurity leaders, vetted partners, and state authorities, who will access the same model with reduced moderation and expanded cyber capabilities.

Forged in Europe. Built for AI sovereignty.

ML4 was trained from scratch on 3,800 NVIDIA Grace Blackwell GPUs in Mistral’s own datacenters in Europe. The public preview is served on that same infrastructure. It is a significant milestone in our long-term investment across infrastructure, research, and product development: state-of-the-art performance in critical verticals, delivered through open weights, designed to give customers control over their AI.

This is particularly important in cybersecurity, where provider-level refusals can block legitimate vulnerability research and incident response, and where losing access to a capability mid-incident can itself become a critical security risk. ML4 pairs top-tier cyber performance with open weights and self-deployment, giving organizations both the capability and the autonomy to run advanced security work under their own policies.

The model will be available across multiple regions worldwide, including a European deployment that Mistral operates end-to-end, independently of other digital service providers and under European law. Fun fact: a significant share of ML4’s training data was multilingual, spanning more than 160 languages, including every official language of the European Union. 

We’ve been working closely with leading enterprises across the world in finance, engineering, manufacturing, logistics, pharmaceuticals, science, shipping, public sector, and other mission-critical industries to train ML4. In fact, the model uses the same training, customization, and RL environment we offer our customers through Mistral Forge.

Try it today

There is still more to come. As we work toward releasing the weights, we will share further details on the model architecture, additional benchmarks, and our post-training methodology.

This model will also serve as the foundation for a new generation of specialized and optimized Mistral models. In the meantime, we invite you to try the preview API and share your feedback with us on social media.

Capabilities deep-dive

Cybersecurity

ML4 is one of the world's strongest AI models for cybersecurity. On the Artificial Analysis Cyber Index, an independent evaluation of how well AI models find and fix security flaws in real software, it ranks among the top five models globally and leads open-weight models developed outside China by a wide margin. On one of the index's tests, which asks a model to reproduce a real vulnerability in open-source software and then patch it, ML4 scores 82%, the highest of any model. It also solves 93% of the challenges in Cybench, a set of 40 exercises drawn from security competitions, one of the highest scores reported for an open-weight model.

That top score reflects a practical advantage. Several leading closed models, including Claude Opus 5.5 and GPT-6 Astra, score near zero on the same test because they refuse to perform the task. Yet defending software often starts with proving that a flaw is real, exactly the kind of work safety filters in closed models can block. This matters even more as threat actors increasingly jailbreak those same models to support offensive cyber activity: defenders need systems that can match those capabilities without being constrained by the same refusals. ML4 can do that work, and its capabilities extend beyond what it was explicitly trained for: in internal testing, it proved useful for analysing malware, prioritising vulnerabilities, and writing detection rules. For organisations that need sovereign, auditable AI for security operations, it will be able to run on private cloud or on-premise.

ML4 against the field : efficiently reasoning over diverse complex challenges
Malware reverse-engineering: solving an out-of-distribution investigation task

Agentic coding

ML4 excels across software engineering, repository understanding, and complex terminal workflows, scoring 61.7% on DeepSWE v1.1, 59.4% on SWE-Atlas-QnA, and 28.3% on Terminal-Bench 4. Its combined Coding Agent Index score of 49.8% places it ahead of DeepSeek V4 Pro 0813 and Qwen3.8 Max.

We also ran a blind human evaluation with Surge AI on coding quality: professional annotators rated model outputs on a 1–5 scale, with model identities hidden. ML4 Preview ranked second of five models (3.74), ahead of Kimi K3 (3.59), GLM-5.3 (3.60) and GLM-5.2 (3.40), and behind only Claude Opus 5 (4.22).

Agentic Workflows

ML4 runs general-purpose agents that gather information, use tools, and produce finished deliverables across complex workflows. On AutomationBench — 657 business workflows across apps like Gmail, Google Sheets, Slack, and Salesforce — it scores 59.9%, ahead of Kimi K3, MiMo-V2.6-Pro, and DeepSeek V4 Pro.

It's just as strong on the professional deliverables that knowledge work actually produces: spreadsheets, slides, and PDFs. On AA-Briefcase, which evaluates long-horizon knowledge work, it reaches 1,393 Elo, ahead of DeepSeek V4 Pro.

Multimodal

ML4 is a step change in the ability of our models to understand images. It reasons powerfully across complex documents, charts, and natural images, and brings vision to the industries where perception is critical such as engineering, manufacturing, and earth observation.

The model can further combine visual grounding with agentic capabilities: from inspecting gigapixel satellite imagery — helping disaster-response teams act when time counts — to analyzing engineering-drawings — zooming in, inspecting, and verifying until the answer is exact. In our demos above, ML4 grounds dense natural scenes, verifies mechanical parts in technical drawings, retrieves evidence from PDFs, and scans massive geospatial images for the hardest-to-find objects.

On visual grounding particularly, we find ML4 to be one of the most capable models we tested, for instance surpassing GPT-6-Astra on Dense 200 (42% vs 41%).

Science and Math

ML4 brings strong scientific capabilities, built by combining AI-driven methods with our researchers' expertise in mathematics, physics, and chemistry.

It's highly proficient at agentic coding for scientific tasks such as data analysis, modeling, and simulating physical reality, which lets researchers focus on the questions rather than the plumbing. In benchmarks, ML4 is state of the art on SciCode-Verified among open-weight models. In practice, it can generate a full Hartree–Fock simulation in one shot — a complex, multi-step chemistry task built from a series of advanced routines.

ML4's math is stronger too, in both formal reasoning and applied mathematics. In our human evaluations it reasons more precisely and with more structure than GLM-5.3, and it can sustain long, domain-specific applied-mathematics tasks, including work relevant to frontier theoretical physics.

Together, these capabilities make ML4 a strong research assistant across the full technical workflow — from the first question to the final result.

SciCode-Verified tests the capabilities of models to implement complex scientific workflows in code for domains such as physics, mathematics, material science and biology. 

Internal eval on STEM tasks (math and physics) of ML4 against GLM5.3

Knowledge Work

ML4 is our most capable model for the real-world tasks which professionals handle every day. It can create, edit and fix complex spreadsheets and documents, showing exemplary performance on both legal and financial benchmarks.

Notably, we evaluated ML4 through third party evaluators (vals.ai) on representative tasks for both legal and financial tasks, finding the model exceeds GPT-6-Astra in both cases. On HarveyAI’s Legal Agent benchmark, ML4 outperforms all open-source models.

FinWorkBench tests model capabilities at creating/editing spreadsheets on real life Finance and Accounting use cases.

Financial analysis demands precision and the ability to synthesize information from multiple sources, a process that remains time-consuming at many financial institutions today. In this demo, ML4 compared to other top OSS models take on the same multistep corporate finance challenge, searching through public company filings and financial reports, such as those available via EDGAR and equivalent European databases. An animated semantic map traces each model's journey toward a solution, highlighting every document retrieved along the way. Each track's position reflects the evidence gathered, the results of calculations, and the questions that remain unresolved. Viewers can follow how the investigations unfold and compare the distinct paths each model takes before arriving at its final answer.

Model Safety

ML4 has saturated our benchmarks on robustness to indirect prompt injections, putting it at the frontier of OSS models (compared to GLM-5.2, GLM-5.3, Kimi-K2.6, Kimi-K3, DS-V4-Pro-0813). On Lakera’s public B3 AI Security Benchmark, ML4 resists 93.3% of attacks – we see no higher scores among competitors.

ML4 also engages more responsibly with users than any of our previous models. We highlight our results on the KORA Benchmark, where ML4 again sits at our highest measured score among OSS models (1.691, with 2 being the maximum denoted as “Exemplary”). 

Of particular relevance is the model’s propensity to refuse malicious requests regarding cybersecurity. Despite strong performance on Cyber benchmarks, the average refusal rate of the model on cyber prompts from JailbreakBench, StrongREJECT, and AgentHarm is higher than all OSS models.

Human Evaluation

We ran an internal evaluation in which expert annotators across coding, computer-aided design (CAD), finance, mathematics and physics compared Mistral Large 4 with GLM-5.3. ML4 was preferred in CAD and STEM, while performing on par or close to GLM-5.3 in finance and coding.

Reinforcement learning at scale

Base models are improving fast, and our post-training has to keep pace. A recipe tuned for yesterday's model leaves capability on the table with today's frontier, because ground truth samples that once pushed a model to its limits won’t anymore. We use Reinforcement Learning (RL) because it adapts as the model does: we train on the outcomes of the model's own attempts, and we can raise the difficulty and the breadth of the tasks as it gets stronger.

Our RL library was designed to make new environments easy to add and train at scale. A shared, composable interface allows a single training run to combine tasks ranging from single-turn chat and complex scientific problem solving to safety alignment, factuality, and long-horizon tool use. These environments share scaffolds and resources such as code sandboxes, web search, and external APIs. The same composability extends to verification, with reward models, unit tests, LLM judges, and static checks combined as needed for each task.

At runtime, an autoscaling fleet of actors generates tens of thousands of rollouts in parallel while model training proceeds asynchronously. The generation and training pipeline is optimized for long trajectories, supporting rollout budgets of millions of tokens across multiple compactions while keeping staleness low. Novel methods and optimizations across both stages minimize off-policy drift and enable stable RL over long horizons.

At our current scale (3k GPUs), a single training run produces roughly 33 billion tokens per day, of which around 16 billion are trainable completion tokens after filtering and masking. We can see the run progress directly in the training rollouts: training rewards rise across several representative environments as the policy learns to solve increasingly complex tasks. Below are a few examples.

The improvements are not specific to the environments we train on; they transfer to downstream evals, and the final model owes them to both post-training stages (supervised fine-tuning and RL), as shown in the charts.

What comes next

This is only the beginning. ML4 is the first milestone on the roadmap funded by our €3 billion Series D — the largest equity round ever raised by a European technology company. That capital is already being put to work: we are significantly scaling up our compute capacity in our own European datacenters, and much more is coming online in the months ahead.

More compute means more training. The reinforcement learning run behind this preview is still in flight, and the model is showing no signs of saturation — there is substantial headroom ahead. As we scale up training on our expanded infrastructure, we expect large and rapid improvements in the weeks and months to come.

We will release the weights by the end of the month, along with more details on the architecture, additional benchmarks, and our post-training methodology. And ML4 is only the foundation: it will serve as the base for a new generation of specialized and optimized Mistral models, built for the industries and workloads our customers care about most.

The pace of progress from here will be fast. Stay tuned.

The Daily Front Page 4 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Mathematics Desk
article

Sharing AI progress in mathematics

by OfficialTurkey·▲ 573 points·509 comments·openai.com ↗

We’re releasing a broad range of new mathematical results produced by an internal frontier model.

As we look to improve how we share results with the math community, we’ve been consulting with the independent Advisory Group on Mathematics and Artificial Intelligence at the Institute for Advanced Study⁠(opens in a new window) to develop best practices, and we have drawn on their advice and public recommendations⁠(opens in a new window) to inform how we release these results.

For this release, we’re publishing the results in a GitHub repository, with protocols for paper revisions and citations. We’re continuing to explore other community-hosted alternatives for this release which meet the committee’s guidelines. For future releases, we are committed to further improving the quality of the papers via the citations, mathematical exposition, and presentation of the results for better understanding.

As part of our GitHub repository, we are sharing formalizations of many of the proofs in Lean, a programming language that allows mathematical proofs to be checked by a computer. We will update the repository with more formalizations as we obtain them.

To promote scientific transparency and openness, we are also publishing additional details about how we obtained the results in the repository. These include 10 summaries of the model’s reasoning, estimations of compute spent in terms of Pro usage on ChatGPT, and statistics about the number of attempted problems. The average result used the equivalent compute of roughly three hours of ChatGPT Pro thinking.

We want this progress to push the frontier of human knowledge and enable further progress in mathematics. We will be funding a series of workshops, conferences, and special programs around the understanding of major results produced by AI—we will share more on this in the near future.

We want to directly empower scientists with state-of-the-art capabilities and are working to responsibly release the model that produced these results. This is why it is important to continue to evaluate our internal frontier models on mathematics and other sciences, so we can accelerate developing the tools to advance those fields. We will continue to act on feedback from the community and update our standards for future disclosures of major scientific advancements.

The Daily Front Page 5 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Mathematics Desk
The Daily Front Page 6 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Mathematics Desk
article

First enhanced geothermal power plant completed in just 23 months

by hochmartinez·▲ 150 points·69 comments·techcrunch.com ↗

Fervo's drilling rig lit up at night with the moon rising in the background.

Geothermal company Fervo Energy announced Thursday morning that it had started selling electricity from its Cape Station power plant to the grid on September 30, one day ahead of schedule.

With it, Fervo becomes the first enhanced geothermal company to reach a key commercial milestone. The power plant synchronized with the grid about a week ago, bringing online the first third of what will soon become a 100-megawatt power plant.

The entire site could be much larger, though, with the potential to generate as much as 4 gigawatts of electricity, Fervo previously told TechCrunch.

“No team has ever built a project like this anywhere in the world, and we did it ahead of schedule,” Fervo co-founder and CEO Tim Latimer said in a statement.

From groundbreaking to commercial operations, the first block at Cape Station took 23 months to complete. As Fervo refines its process, it is aiming to complete future blocks in as little as 18 months.

That sort of speed to power should appeal to power-starved data center operators, who have been scouring every part of the energy sector for generating capacity. Geothermal can also be developed in phases, similar to how data centers are developed, allowing hyperscalers to bring racks online as demand ramps up.

Google, Southern California Edison, and others have committed to buying power from Fervo’s Cape Station project, which is located in Utah.

Fervo is one of several companies developing enhanced geothermal power plants. While traditional geothermal power taps heat sources close to the surface, Fervo and its peers are drilling deeper because deeper rock is hotter, opening more opportunities for development.

Fervo went public in May in an upsized IPO that raised $1.9 billion. It was founded in 2017, bringing drilling techniques and technologies from the oil and gas sector to the development of new geothermal resources. As a startup, the company raised more than $1.3 billion from investors, including Breakthrough Energy Ventures, Congruent Ventures, and Capricorn Investment Group.

The Daily Front Page 7 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The IDE Ledger
article

JetBrains reports revenue growth, net financial loss for 2025

by thw_9a83c·▲ 574 points·536 comments·helgilibrary.com ↗
Compared with 2024, total revenue rose by 6.3%.

In 2025, JetBrains reported revenue of CZK 16,008 mil, ranking 1st of the 15 media companies in Czechia. Compared with 2024, total revenue rose by 6.3%, a record for the company. The year 2025 ended with a net loss of CZK 315 mil. That equals a return on equity of -11.1%, 107 percentage points lower than a year earlier and the 15th best among the 15 media companies in Czechia. EBITDA came to CZK 918 mil, a margin of 5.73%, and the net margin was -1.97%. The company held net cash of CZK 7,584 mil at the end of 2025. The company's data in Helgi Library cover 721 indicators from 2005 to 2025.

Figures come from the company's filings as processed by Helgi Library and are not investment advice.

Company facts

Official name JetBrains s.r.o.
Headquarters Praha, Czechia
Founded 2002
Reports in CZK mil · Czech GAAP
Statements Standalone 2005–2025
Registration no. 26502275
Sources Czech business register (Sbírka listin), individual financial statements

Figures are the company's own (unconsolidated) statutory statements filed with the Czech business register, read from the filings and converted from CZK thousands to CZK millions. Years known only from the comparative column of the following filing are included.

History

  • 2005–today — Accounting currency: CZK · Czech business register filings
  • 2005–today — Accounting standard: Czech GAAP · Czech business register filings

Source: Český OR

Coverage: 730 indicators, 2005–2025

Income Statement

Indicator Unit 2021 2022 2023 2024 2025
Total Revenue CZK mil 9,926 11,907 13,400 15,065 16,008
Gross Profit CZK mil 5,332 5,090 4,717 2,834 1,708
Operating Expenses CZK mil 479 1,849 561 632 790
EBITDA CZK mil 4,853 3,242 4,155 2,202 918
Depreciation & Amortization CZK mil 18.2 20.4 66.2 160 167
EBIT CZK mil 4,835 3,221 4,089 2,042 751
Net Financing Costs CZK mil 136 222 -110 -810 1,078
Pre-Tax Income CZK mil 4,697 3,155 4,745 2,982 -325
Income Tax CZK mil 727 865 889 503 -10.0
Net Income CZK mil 3,971 2,290 3,856 2,479 -315
Dividends CZK mil 3,209 4,976 352 1,665 …

Balance Sheet

Indicator Unit 2021 2022 2023 2024 2025
Total Assets CZK mil 10,145 11,668 10,542 17,427 19,470
Total Non-Current Assets CZK mil 2,708 2,033 2,278 2,480 2,314
Property, Plant & Equipment CZK mil 18.7 100 229 205 215
Total Current Assets CZK mil 7,437 9,635 8,264 14,946 17,156
Inventories CZK mil 11.8 4.3 40.2 0.127 0.128
Cash & Equivalents CZK mil 2,243 474 3,945 6,978 1,444
Working Capital CZK mil 958 778 -665 1,251 -329
Total Liabilities CZK mil 6,487 8,862 9,103 13,703 17,495
Total Debt CZK mil 1.4 83.6 0.365 28 1,924
Net Debt CZK mil -2,873 -5,033 -3,941 -7,885 -7,584
Total Equity CZK mil 3,658 2,806 1,440 3,724 1,974

Ratios

Indicator Unit 2021 2022 2023 2024 2025
ROE % 99.0 70.8 192 96.0 -11.1
ROA % 39.5 21.0 34.7 17.7 -1.71
ROCE % 116 99.5 185 76.4 26.3
Gross Margin % 53.7 42.7 35.2 18.8 10.7
EBITDA Margin % 48.9 27.2 31.0 14.6 5.73
EBIT Margin % 48.7 27.1 30.5 13.6 4.69
Net Margin % 40.0 19.2 28.8 16.5 -1.97
Net Debt to EBITDA x -0.592 -1.55 -0.948 -3.58 -8.26
Net Debt to Equity % -78.5 -179 -274 -212 -384
Current Ratio x 1.15 1.09 0.926 1.09 0.981
Effective Tax Rate % 15.5 27.4 18.7 16.9 3.08

Cash Flow

Indicator Unit 2021 2022 2023 2024 2025
Cash Flow from Operating Activities CZK mil 4,027 5,814 4,470 5,059 6,353
Working Capital Changes CZK mil 484 1,992 243 2,878 6,672
Cash Flow from Investing Activities CZK mil -908 -4,374 3,970 -1,946 -10,273
Cash Flow from Financing Activities CZK mil -4,157 -3,208 -4,969 -79.3 -1,613
Net Debt Issuance CZK mil 0 0.9 0.946 7.7 273
Dividends Paid CZK mil -4,157 -3,209 -4,976 -352 -1,665
Change in Cash CZK mil -1,038 -1,769 3,471 3,033 -5,534
Cash Earnings CZK mil 3,989 2,310 3,922 2,639 -148
Cash Conversion Cycle days 22.0 -7.35 -26.0 10.1 31.9

Growth

Indicator Unit 2021 2022 2023 2024 2025
Revenue Growth % 11.0 20.0 12.5 12.4 6.26
Gross Profit Growth % 4.53 -4.54 -7.34 -39.9 -39.7
Operating Expenses Growth % 30.0 49.1 29.3 35.9 26.5
Staff Expenses Growth % 30.3 52.2 17.3 17.8 34.2
EBITDA Growth % 2.85 -33.2 28.2 -47.0 -58.3
EBIT Growth % 2.78 -33.4 26.9 -50.1 -63.2
Net Income Growth % 7.42 -42.3 68.4 -35.7 -113
Total Assets Growth % 1.89 15.0 -9.65 65.3 11.7
Total Liabilities Growth % 17.1 36.6 2.7 50.5 27.7
Dividends Growth % -22.8 55.0 -92.9 373 …
Total Equity Growth % -16.2 -23.3 -48.7 159 -47.0
The Daily Front Page 8 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Data, Spilled and Sorted
article

Polars 2.0

by simicd·▲ 421 points·97 comments·pola.rs ↗
Our initial version of out-of-core (spill-to-disk) support is enabled.

Today we are shipping Polars 2.0. In the earlier announcement post we went through the rationale of the version bump. This post we will discuss what features 2.0 brings. Even though we didn’t intend to make it a big feature release, it still packs a lot to get enthousiastic about.

Let’s go through the highlights of this release:

  • our initial version of out-of-core (spill-to-disk) support is enabled,
  • a lot of very core performance improvements,
  • first class SQL support, which together with the performance improvements has Polars leading DataFusion and DuckDB in TPC-H and TPC-DS1 benchmarks,
  • a new Map dtype, and
  • stricter Polars on dtypes and explicitness, leading to faster feedback, and faster AI iteration.

Performance and SQL as a first class citizen

Polars 2.0 will be the marking point where we will treat SQL as first class citizen. Polars SQL coverage has increased dramatically over last few months. We know we have been building a solid engine for the last couple of years. In Polars 2.0, we want to enable that to more workloads, including SQL. To make this performant, we shipped many improvements to our optimizer and engine. The highlights here join reordering, much better common-subplan-elimination and dynamic predicates/bloom filters.

To see how we perform on typical SQL benchmarks, we ran Polars SQL on data derived from TPC-H and TPC-DS1 and ran it against the latest DuckDB release (1.5.6), DuckDB 2.0 alpha (2.0.0.dev2610011535) and the latest DataFusion release (54.0.0) on a c7a.4xlarge (16 vCPUs, 32GB RAM) and a c7a.metal (192 vCPUs, 384GB RAM). Every query ran 5 times in a hot setting, with a separate process per query and a 60 second timeout. The file cache was cleared between each engine/benchmark (not between queries). For every query we take the best of the 5 runs, and we compare engines on both the sum and the geometric mean of those query times.

The data is generated with tpcgen-cli parquet compiled from source on commit 99bedae. We looked at the default row-group sizes of tpcgen-cli and confirmed they are roughly similar to what Polars scan_csv piped through sink_parquet and Duckdb COPY produce. The SQL queries were generated with DuckDB 1.5.6’s tpch_queries() and tpcds_queries(). The data was stored on EBS.

The charts below show the runtime of each engine in seconds (lower is better), split by machine.

c7a.4xlarge (16 vCPUs, 32 GB)

c7a.metal (192 vCPUs, 384 GB)

Polars and both DuckDB versions completed all queries. DataFusion timed out on TPC-DS q72 (and once on q67) and ran out of memory on TPC-H q18 on c7a.4xlarge; those queries are excluded from the results above for all engines.

We observe that default Polars is fastest on all but one benchmarks. Polars has a constant overhead when we scale to 192 threads, which hurts small data queries. In fact we see that Polars limited to 32 cores is competitive or winning in all benchmarks. We have diagnosed the cause on our end and will hopefully fix this problem in the next release. More information on the benchmarks can be found in the appendix. We encourage you to replicate our results and have shared a repository for this benchmark here: https://github.com/pola-rs/polars-2.0-benchmark.

Streaming engine and OOC as default

This is the one of the biggest impact changes of 2.0. Calling collect on a LazyFrame will now default to the streaming engine, leading to massive memory and performance improvements on most queries. The reason this required a major version bump is that the streaming engine doesn’t guarantee row-order by default for certain operations (join, group_by, unpivot, etc.). If you require observable row-order in those operations, you can opt in to that by setting maintain_order=True.

Out-of-core (spill to disk) is now enabled by default. It starts spilling at ~80% of RAM (this may need tuning). Operations that support out-of-core at this moment (sort, window functions, many expressions) can now start spilling to disk to finish a query. The default disk budget is 64GB. In the coming time we will enable out-of-core for joins and group-by’s as well.

These two changes will make Polars much more resillient in high-memory workloads for casual data practicioners. And with out-of-core join and group-by on our roadmap, this resilience will improve even more.

New Map datatype

Polars now supports the Arrow MapType directly as a Polars Map dtype. You can think of a Map as a Python dictionary, mapping keys to values. Before 2.0 the Arrow MapType was read in Polars as List(Struct({"key": ..., "value": ...})).

df = pl.DataFrame(
    {
        "user": ["alice", "bob", "carol"],
        "scores": pl.Series(
            [{"math": 90, "art": 75}, {"math": 60}, {}],
            dtype=pl.Map(pl.String, pl.Int64),
        ),
        "subject": ["art", "art", "math"],
    }
)
shape: (3, 3)
┌───────┬─────────────────────────┬─────────┐
│ user  ┆ scores                  ┆ subject │
│ ---   ┆ ---                     ┆ ---     │
│ str   ┆ map[str, i64]           ┆ str     │
╞═══════╪═════════════════════════╪═════════╡
│ alice ┆ {"math": 90, "art": 75} ┆ art     │
│ bob   ┆ {"math": 60}            ┆ art     │
│ carol ┆ {}                      ┆ math    │
└───────┴─────────────────────────┴─────────┘
# Key lookups and dictionary-like methods:
df.select(
    "user",
    pl.col("scores").map.get("math").alias("math"),                # fixed key
    pl.col("scores").map.get(pl.col("subject")).alias("by_subject"),  # key from another column
    pl.col("scores").map.contains_key("art").alias("has_art"),
    pl.col("scores").map.len().alias("n"),
    pl.col("scores").map.keys().alias("keys"),
    pl.col("scores").map.values().alias("values"),
)
┌───────┬──────┬────────────┬─────────┬─────┬─────────────────┬───────────┐
│ user  ┆ math ┆ by_subject ┆ has_art ┆ n   ┆ keys            ┆ values    │
│ ---   ┆ ---  ┆ ---        ┆ ---     ┆ --- ┆ ---             ┆ ---       │
│ str   ┆ i64  ┆ i64        ┆ bool    ┆ u32 ┆ list[str]       ┆ list[i64] │
╞═══════╪══════╪════════════╪═════════╪═════╪═════════════════╪═══════════╡
│ alice ┆ 90   ┆ 75         ┆ true    ┆ 2   ┆ ["math", "art"] ┆ [90, 75]  │
│ bob   ┆ 60   ┆ null       ┆ false   ┆ 1   ┆ ["math"]        ┆ [60]      │
│ carol ┆ null ┆ null       ┆ false   ┆ 0   ┆ []              ┆ []        │
└───────┴──────┴────────────┴─────────┴─────┴─────────────────┴───────────┘

As a supported dtype, the map type will now have dedicated expressions, like key lookups, iteration over values and other dictionary like methods.

Stricter Polars

Polars aims to be strict and fail fast. Errors should ideally raise up-front, not 20 minutes into a pipeline. Implicit behavior on data-mismatches should be opt-in, not a default, since those mismatches can hide bugs. This strictness has become even more valuable with the rise of AI-driven development. Agents can validate a query’s structure early by calling collect_schema(), which resolves types and catches schema-level mismatches without materializing any data. This ensures fast feedback, meaning agents and humans can iterate faster. Not all errors can be caught during compilation of the query plan, some depend on data. In these cases Polars defaults to stricter behavior to ensure inconsistencies are caught instead of silently producing different results. See previous posts) with some examples in where Polars has gotten more strict.

Last words

We are very excited that Polars 2.0 is out. Coming months we’ll improve on the road were in. Better out-of-core, better scaling at large CPU-counts and on Polars Cloud we aim to be the fastest distributed engine available. We also started working on GeoPolars and hope to deliver more news on this soon. If you find any problem with our new release, please open an issue: https://github.com/pola-rs/polars/issues. And finally, to help you with upgrading to 2.0, we have posted migration guide.

Benchmark Appendix

The absolute numbers (in seconds) are below. The bold number is the fastest engine in each row; the darker the shading, the slower an engine is compared to the fastest. Polars with 32 threads was only run on c7a.metal.

Sum of query times

Geometric mean of query times

Polars also scales well with more cores on larger data. Moving from 16 to 192 vCPUs at SF100 makes Polars 3.8x faster on TPC-H and 2.2x faster on TPC-DS (by sum), compared to 3.2x and 1.9x for DuckDB 1.5.6, 2.2x and 1.5x for the DuckDB 2.0 alpha, and 1.7x and 1.0x for DataFusion. At SF10 the extra cores don’t help Polars with its default settings: it is equally fast on TPC-H and 1.8x slower on TPC-DS, while DuckDB 1.5.6 still gets 1.8x and 1.3x faster. Polars with 32 threads only ran on the c7a.metal, so it is not part of this comparison.

Footnotes

  1. These benchmarks are derived from TPC-H and TPC-DS Benchmarks and as such any results obtained are not comparable to published TPC-H and TPC-DS Benchmark results, as the results obtained do not comply with the TPC-H and TPC-DS Benchmarks. ↩ ↩2
The Daily Front Page 9 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Agent’s Open Door
article

Meta’s Muse is an adorable privacy and security dumpster fire

by beardyw·▲ 368 points·259 comments·techdirt.com ↗
An animated avatar named Jolly ... is supposed to help you offload busywork.

Meta’s agentic AI product Muse has had a rocky few weeks since launch. The product, which features an animated avatar named Jolly (one presumes to make mass hyper surveillance seem adorable) is supposed to help you offload busywork like making restaurant reservations, paying bills, or ordering groceries.

Despite Meta having claimed repeatedly that Muse was built with a heavy focus on privacy and security, the AI agent launched with a nasty zero-day flaw that made it possible to spy on Mac users. When one tech YouTuber put Muse in charge of their Facebook Marketplace sales, it sold his stuff way below acceptable rates and doled out their home address (the user apparently didn’t understand the permissions he set).

Somebody else found that you could trick Muse into giving root access on the device it’s running on by simply pretending to be a Muse agent yourself. Others found that Muse software not only accesses people’s private messages without approval, it often ignores all permissions and uploads them to the cloud – even if you specifically tell it not to.

That last problem was bad enough that Apple needed to change its macOS privacy settings to stop third-party app developers from misusing them to access message histories:

“Friday’s announcement comes two weeks after tech columnist Jason Aten said that Meta’s new general-purpose AI agent Muse sent him an unsolicited notification referencing a thread between him and a co-worker over Apple Messages. Aten said he never granted Muse permissions to read his messages and had assumed they were off-limits. Social media last week blew up with masses of people who agreed and said the incident showed that AI assistants given access to calendars, emails, messages, shopping accounts, and other resources are akin to a skill saw or other power tool. While potentially useful, they can do real damage if not used carefully.”

Meanwhile, Wired found that Muse consistently creates detailed profiles of all your friends, family, colleagues, “collaborators,” and people you “follow.” Obviously much of that information is necessary for the agent to get to “know” you, but this being Meta, people are understandably uncomfortable with this sort of massive ramp up of data collection in a country, under authoritarian control, that’s too corrupt to pass a privacy law or regulate data brokers:

“These [AI assistant] tools are actively soliciting users to plug their whole lives in—their emails, calendars, financial institutions, everything in order to be helpful assistance,” Bogen says. “That’s dramatically more information than people might have otherwise given to some of these companies. The breadth of access to information that these tools have will lead to a ballooning of what they know about users.”

But wait, there’s more! 404 Media found that in the weeks before launch, Meta was in a mad dash to quickly and sloppily fix multiple other vulnerabilities but refused to delay Muse’s launch to actually make sure the product was secure:

“The Meta source said they felt security teams were asked to push hot fixes to these bugs as quickly as possible and in a way that wouldn’t delay Muse’s launch, leading to what they described as “half-baked protections being rushed out to enable the launch. Many senior engineers believe it’s inevitable we’re going to have a massive data breach as a result of Hatch.” Muse is called “Hatch” internally and in Meta’s codebase.”

Many folks build their own agentic AI solutions with cobbled together open source hardware and software to ensure they have clear understanding of, and control over, what’s actually happening in their name. Meta, a glorified ad monopoly with a history of ethical “lapses,” not only wants to dominate the space, it will spend a lot of time in the new year lobbying against on device, open source, foreign, and/or open weighted alternatives to Meta.

Despite Meta’s claims that privacy and security would be a priority for Muse that’s clearly not the case; it’s also extremely clear that Meta doesn’t fear any meaningful government accountability or oversight, or the product would have spent significantly more time in the oven. Tech giants that had already clearly abandoned quality control at impossible scale are engaged in a mad dash to the trough with new product launches before their funny math causes a market correction.

Such is life in a country that has had most consumer protection regulators (and cybersecurity standards) lobotomized by corrupt authoritarians. Authoritarians guys like Mark Zuckerberg enthusiastically supported because they didn’t like paying taxes — and hated former FTC antitrust boss Lina Khan.

Muse’s early privacy and security problems are the kind of stuff anybody with a head on their shoulders could see coming miles over the horizon. And it’s all inevitably going to get more dangerous — and ridiculous — over the next year as unethical tech oligarchs fully exploit their successful lobotomization of the federal regulatory state. You know, for the love of innovation.

The Daily Front Page 10 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Nature’s Missing Margin
article

Nature's capacity to 'bounce back' when species are lost is overestimated: study

by pseudolus·▲ 321 points·157 comments·phys.org ↗
The idea that ecosystems carry plenty of backup ... has been greatly overestimated.

ecosystem

Credit: Unsplash/CC0 Public Domain

The idea that ecosystems carry plenty of backup, so if a small number of species become extinct there is little harm, has been greatly overestimated, according to the largest global study of its kind.

New research led by King's College London and Imperial College London warns that a lack of biodiversity could threaten people's food security and climate protection, as diverse ecosystems provide a wide range of benefits that people depend on, including pollination, water purification, carbon storage and natural pest control.

The study, by King's College London and Imperial College London with the Natural History Museum and The Alan Turing Institute, has found that ecosystems have far less "spare" capacity than previously thought, with the ocean potentially having the most to lose.

Biodiversity benefits rarely level off

The study, published in Nature Ecology & Evolution, combined 423 published studies and 222,829 data points across land, freshwater, marine and estuarine ecosystems, producing a database more than twice the size of the largest previous effort and the largest of its kind.

Across 23 categories of ecosystem services and functions, most benefits rose steadily with biodiversity rather than leveling off once a handful of species were present. The findings suggest that functional redundancy—the idea that species can substitute for one another, so losses do little harm—has been overestimated.

Dr. Emma Moffett, study lead and lecturer in geography at King's College London, said, "Our findings challenge the comfortable assumption that ecosystems carry plenty of backup, so losing a species here and there doesn't change much. Across most of the benefits ecosystems provide that we looked at, the data doesn't support that. The ecological benefits keep climbing as diversity rises, which means they fall as we lose species."

Ocean carbon storage depends on diversity

Ocean carbon sequestration, the process of capturing and storing carbon dioxide (CO₂) from the atmosphere in marine waters and sediments, showed by far the strongest positive response to biodiversity of any service measured.

This indicates that so-called blue carbon sinks—the ocean and coastal ecosystems such as coral reefs, salt marshes or mangroves that capture and store carbon dioxide from the atmosphere—depend on sustaining diverse marine communities, from phytoplankton to the microbial food webs that pump carbon into deep water.

The authors caution that this result rests on a small number of data sets and identify it as an urgent gap in current knowledge.

Moffett goes on to say, "The ocean result stopped us in our tracks. Carbon capture at sea responded to biodiversity more strongly than anything else we measured, and yet it's one of the least studied areas we found. If the world is counting on blue carbon to help with climate change, marine life can't be an afterthought."

Not all services depend on diversity

Some ecosystem services proved exceptions. Protection against hazards such as coastal flooding and erosion was relatively insensitive to biodiversity overall, because it often depends on one or two foundational species, such as the shrubs that stabilize sand dunes. The authors argue that conservation must therefore balance maintaining overall diversity with safeguarding irreplaceable foundational species.

Dr. Will Pearse, an associate professor of evolutionary ecology in the Department of Life Sciences at Imperial College London, said, "We've known that biodiversity supports humanity by providing us with food, clean water, clean air and so many other ecosystem services. But what this model gives us is a precise, global picture: We can now predict the benefits biodiversity provides anywhere, making it even easier to recognize and take advantage of those benefits."

The full database and model forecasts across all 23 ecosystem service and function categories are publicly available to support policy and planning.

The team also used the database to look ahead, linking it to biodiversity projections under the socioeconomic scenarios used by the Intergovernmental Panel on Climate Change.

The researchers' model predicts that biological pest control on farmland, delivered free by the natural enemies of crop pests, declines under a fossil-fuel-driven development path compared with one with less fossil fuel, with the sharpest losses in countries experiencing rapid population growth and lower levels of development.

Publication details

Biodiversity safeguards ecosystem services and functions worldwide, Nature Ecology & Evolution (2026).

Journal information: Nature Ecology & Evolution

The Daily Front Page 11 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — A New Gleam Target
article

Gleam doesn't compile to Erlang source anymore

by ingve·▲ 300 points·128 comments·gleam.run ↗
Gleam doesn't compile to Erlang source anymore.

Gleam v1.19.0 released!

Gleam is a type-safe and scalable language for the Erlang virtual machine and JavaScript runtimes. Today Gleam v1.19.0 has been published, so let's go over what's new.

A new compilation target

Over the last few months Giacomo Cavalieri has entirely rewritten Gleam's Erlang code generator that has an entirely different design, and most notably, outputs a different format. Previously Gleam generated Erlang source code, now it generates Erlang abstract forms.

"Erlang abstract forms" is an intermediate representation used by the Erlang compiler. It is a metadata-annotated tree that represents Erlang syntax, and it is normally produced by running Erlang's tokeniser and parser. It has a binary encoding using Erlang's external term format, and with this binary format we can load our generated code directly, skipping the front-half of the Erlang compiler.

This new Erlang code generator brings several benefits:

  • The performance of the compiler has been improved, significantly reducing the build times for Gleam projects running on Erlang.
  • The location metadata available to the runtime is now accurate to original Gleam source code, rather than to the Erlang source code the compiler would generate. This means, for example, the line numbers in BEAM crash reports and stacktraces are perfectly accurate, while previously they could be inaccurate, only pointing to the nearest function. This metadata could also enable full support for Gleam in debuggers such as edb, though we have not done any work on this ourselves.
  • The code-quality of the Gleam compiler has been improved. The Erlang code generator was one of the oldest and most stable parts of the Gleam codebase, so while it wasn't causing us any problems it wasn't conforming to the standards and conventions we have today. This new replacement is excellent, and arguably raising the bar for the compiler as whole.
  • We never have to hear someone use the word "transpiler" as a pejorative ever again.1

Ok, so how fast is it?

I'm going to show you some numbers in a moment, but please remember that benchmarks are always contrived and never tell the full story. This data could be a good introduction or jumping-off point, but a good understanding requires the person to do further research and experience.

The benchmark is based on José Valim's langcompilebench project. Thank you José! It is a measure of the time taken to compile 100 modules that each contain 100 functions that return a "hello world" string. This is practical as this shape of test project can be easily replicated across different languages to produce the most like-for-like test projects, but it is limited in what it can tell us as only a small subset of the features of each language get compiled. In real projects code will be greatly more varied, and different features will have different compilation costs in different languages.

The first stage of the code generator rewrite was released in v1.18.0, the previous release, so let's compare v1.17.0 to the newly released v1.19.0. This chart shows the time taken to compile the benchmark project, lower is better.

As you can see, a considerable improvement! This is a full build from scratch, without any caching. Gleam's compilation is incremental, so during typical development it would be much faster as it will not be compiling the entire project.

The original langcompilebench includes only Erlang, Elixir, and Gleam, but I have extended it an assortment of other popular programming languages, to help folks get a rough feel for how fast Gleam compiles compared to a language they are familiar with. I've also included Gleam when compiling to JavaScript. Here's the results:

Remember: This is a contrived benchmark and is this alone is insufficient to draw any hard conclusions about these languages. That said, these results do suggest that Gleam's compilation is nice and fast, and as a Gleam programmer I can say that Gleam development is very enjoyable, with little time spent waiting for the computer.

Why not target BEAM bytecode directly?

We have moved from from compiling from source code that is fed to the Erlang compiler to an intermediate-representation that is fed into the Erlang compiler, but why not bypass the Erlang compiler altogether? Couldn't we make a BEAM bytecode generator that outperforms the Erlang compiler? Perhaps we could also use Gleam's type information to generate more optimised code too.

While it is possible to achieve these benefits, it's unlikely we would be able to. Unlike Erlang source and Erlang abstract forms, BEAM bytecode is not fixed and unchanging. Each new release of the virtual machine can evolve and improve the bytecode, adding new functionality and sometimes removing functionality that has been made redundant. We would need to commit to forever keeping up-to-date with this evolution, working closely with the Erlang maintainers to be ready for up-coming changes, and to have new versions of Gleam ready for new releases of the virtual machine. It would also be a significant effort to reproduce all the existing optimisations that have been implemented in the Erlang compiler over the decades, even with the help we might have from Gleam's more capable static analysis.

Gleam is a community project supported by sponsorship. We have only a fraction of the finances of languages that are backed by corporations or academic institutions, so we need to think carefully about the most efficient and sustainable ways to use our resources. Gleam is a reliable foundation for software development, every decision we make has to work for years and decades to come. Compiling to Erlang abstract forms is the cost-benefit sweet-spot for Gleam today.

We're also in great company with this decision. Our much-loved older-sibling language Elixir also compiles to Erlang via abstract forms. If it's good enough for Elixir, then it's good enough for Gleam!

Alright, enough about that. There's plenty more in Gleam v1.19.0 to go-over.

JavaScript decision tree assignment optimisation

It's not just the Erlang code generation that has seen some love, there's some good improvements for JavaScript too.

In Gleam flow control is done with pattern matching using a case expression, and it gets compiled to nested if statements. Because pattern matching is declarative the compiler is able to reorder and optimise the runtime logic, using a divide-and-conquer approach to find the right branch as quickly as possible.

John Downey has improved this process to generate flatter code, with nested if statements collapsed into a single condition and fewer intermediate variables. For example, take this Gleam code:

pub fn go(x) {
  case x {
    Wibble(1, 2) -> 1
    _ -> 2
  }
}

Previously this small bit of Gleam would compile to this surprisingly large bit of JavaScript2:

export function go(x) {
  if (isWibble(x)) {
    let $ = x[0];
    if ($ === 1) {
      let $1 = x[1];
      if ($1 === 2) {
        return 1;
      } else {
        return 2;
      }
    } else {
      return 2;
    }
  } else {
    return 2;
  }
}

But now it generates this:

export function go(x) {
  if (isWibble(x) && x[0] === 1 && x[1] === 2) {
    return 1;
  } else {
    return 2;
  }
}

A nice improvement, I'm sure you'll agree! Surprisingly this makes little-to-no change to the size of code bundles once minified and compressed (gzip really is magic), but the resulting code has fewer branches for JavaScript engines to optimise.

Thank you John!

List literal optimisation

While they share a syntax in their respective languages, Gleam's immutable persistent list type is not the same as the JavaScript mutable contiguous array type. When Gleam code is compiled to JavaScript any list literal has to be compiled to JavaScript code that constructs the runtime data structures. For example, take this Gleam code:

let numbers = [1, 2, 3]

This would compile to JavaScript code2 like this, where a JavaScript array is constructed and passed to a function to convert it to a Gleam list.

const numbers = arrayToList([1, 2, 3])

With this release the compile will now generate different code for short list literals, generating more direct code that does not convert from an array.

const numbers = prepend(1, prepend(2, prepend(3, empty)))

With modern JavaScript engines this results in a nice performance improvement, and it is especially impactful for projects that use lots of short lists, like those using the Lustre library. We recorded no improvement for longer lists, so the array-to-list approach is still used for those.

Thank you Giacomo Cavalieri for this!

TypeScript API overloads

When compiling to JavaScript the Gleam compiler will also generate functions for working with the programmer-defined data structures from JavaScript. Alongside this the compiler can also provide TypeScript declaration files, enabling full integration between TypeScript and Gleam in a single project.

One of the functions provided for each custom type is a function to check whether a value is a particular variant or not. For example, given the following type:

pub type Box(value) {
  Full(value)
  Empty
}

The generated function would have this TypeScript declaration:

export function Box$isFull(value: any): value is Full<unknown>;

The keen-eyed TypeScript programmer readers may notice a problem here. If the value is already known to be of type Box<number>, then this function can be used to refine the container type to Full, but the type parameter of number is generalised to unknown, causing type information loss. This is very cumbersome.

Giacomo Cavalieri has added an overload to the definition, so the type is preserved whenever possible.

export function Box$isFull<I>(value: Box$<I>): value is Full<I>;
export function Box$isFull(value: any): value is Full<unknown>;

Thank you Giacomo!!

Improvements for other build tools

Gleam users will typically use the official build tool that is part of the gleam executable, but sometimes folks will want to compile and use Gleam code in other contexts. For example, an Elixir or Erlang programmer may want to use a dependency package that is written in Gleam. This works fantastically at runtime as these three BEAM languages have excellent zero-cost interop, but getting to this point can be tricky, as Elixir and Erlang's main build tools do not have built-in support for Gleam.

The gleam executable offers several commands that expose compiler functionality, for use by other build tools. This release includes several improvements to these commands, with the intent of getting Gleam support in Elixir's Mix and Erlang's rebar3.

The Erlang virtual machine requires all packages too have a .app resource file along with the compiler bytecode. Previously these Gleam-supporting build tools would be expected to provide these, but now gleam will generate the files for them when compiling to BEAM.

The compile-package command gains a --no-dev flag, which will have the compiler only load code from the src directory and to skip packages listed as dev_dependencies.

The export package-information and export package-interface commands can now print their information to stdout, while previously they would have to write to a file. Alongside that, the export javascript-prelude and export typescript-prelude commands can now write to a file.

Thank you Rodrigo Álvarez for these additions! Hopefully we will see Gleam support in Elixir's Mix build tool soon.

Language server label support

Gleam has an excellent language server built-in, providing IDE functionality to all editors that support the language server protocol. Possibly the last piece of major functionality was full support for labels of fields and arguments. Alistair Smith has fixed this, adding support for go-to-definition, find-references and renaming of labels! Thank you Alistair, I know many people will be absolutely delighted by this time-saving feature.

Formatting Gleam code in the browser

There is a WebAssembly build of the compiler, used by the language tour and the playground to compile Gleam in the web browser. John Downey has added a new format_source function, enabling people to run the Gleam code formatter inside the browser. We will add this functionality to the playground in the near future. Thank you John!

As always, better error messages

Making error messages as clear and as helpful as possible is very important to us. It's all very well for a tool to be nice to use when things are going well, it is when things are going badly that the experience can really help or hurt the programmer's stress levels.

Small accidental syntax errors can be a pain, especially if you're not sure what and where the mistake is.

0xda157 has added a special error for when a git merge conflict marker is found in the code, and another for when the User(..lucy, score: 10) record update syntax is written with the original record in the wrong position like User(score: 10, ..lucy). She has also added an errors for procedural operators that do not exist in Gleam, such as += and *=.

n0kk23 has added a custom helpful error message for when | is used in pattern matching in a way that is not valid syntax in Gleam, but is valid in other languages, such as Java.

Giacomo Cavalieri has added a helpful error message for binary operators that are not permitted in constant expressions, and at the same time he has improved the fault tolerance3 of the compiler in the presence of these mistakes.

Andrey Kozhev has added extra context to the error message for when a module tries to use a private type or value from another module within the same package, letting them know that while it does exist, it is private. We do not offer this for modules from dependency packages, to avoid leaking information about code the programmer does not maintain.

And lastly, James Dolan has improved the type checker such that an invalid type alias definition can no longer cause a cascade of further errors through all usages of the alias.

Thank you all for making Gleam debugging easier and easier.

And the rest

And thank you to the bug fixers and experience polishers:

0xda157, Amr Kadry, Andrey Kozhev, Giacomo Cavalieri, Hari Mohan, Ian Chamberlain, Jack Programs, John Downey, Lillian Rose, Mar Bloeiman, mmustafasenoglu, Naomi Roberts, Rodrigo Álvarez, Senthilnathan, Surya Rose, and Vivid.

For full details of the many fixes and improvements they've implemented see the changelog.

A call for support

Gleam is not owned by a corporation; instead it is entirely supported by sponsors, most of which contribute between $5 and $20 USD per month, and Gleam is my sole source of income.

We have made great progress towards our goal of being able to appropriately pay the core team members, but we still have further to go. Please consider supporting the project or core team members.

Thank you to all our sponsors! And special thanks to our top sponsor:

  1. "Transpiler" means a compiler that outputs a human-readable format, such as source code. It's a cool sounding word, but most the time people use it to imply that a given compiler is in some way inferior. This is very silly, as there is nothing about compiling to a human-readable format that makes a compiler easier to implement. If you care about that output being nicely formatted it might even be harder than using a binary format.
  2. The code has been slightly edited for clarity, but the parts related to this improvement are unchanged.
  3. Gleam's compiler is the heart of the Gleam language server, so unlike traditional compilers it needs to be able to provide information about code even when it is in invalid state. If only valid code could be fully analysed then the language server would provide a degraded experience to the programmer when they are half-way-through a refactoring or other large edit.
The Daily Front Page 12 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Lisp Argument
article

Why Common Lisp is now the best programming language

by misterchocolat·▲ 282 points·381 comments·vivienhenz.com ↗
It’s actually Common Lisp especially now that LLMs can write code.

Would you agree that some programming languages are better than others? If so then one of them must be the best. And it’s actually Common Lisp especially now that LLMs can write code.

LLMs write code really fast, and that changes a lot, because writing code used to be the slow part. Now the slow part is finding out if your program actually works, and before you can do that you have to rebuild it, which can take a few minutes.

When humans wrote the code this didn't matter much, because writing took way longer than waiting for it to compile and start running. But now it does, so how long your feedback loop takes is what decides how fast you can build.

In Common Lisp that loop almost doesn't exist because there is no real distinction between read-time, compile-time, and runtime (Graham). Common Lisp is image-based which means that your program is a live image in memory, so a new version of a function replaces the old one right away without having to restart anything.

Also, in most languages an error will crash your program. So if you’re writing code with an LLM it will have to read your crash logs to make some changes and run your program again. In Common Lisp your program won’t crash, it’ll stop and open a debugger with the whole stack and all the variables. You can just point your LLM at the debugger, and it’ll make its fix and resume the program.

To my knowledge Common Lisp is the only mainstream language that does all of this.

Lisp stands for "List Processing." In Common Lisp, code is written as lists. For example, (+ 1 2) is a program that adds two numbers, but it's also just a list of three things: the symbol +, and the numbers 1 and 2.

What's interesting is that this is the same kind of list Common Lisp uses to store data, and since the language is built around processing lists all its tools for working with data also work on code. So a program can take another program and change it, for example it can turn (+ 1 2) into (* 1 2), and run the result right away.

This is what makes macros possible. A macro is a function that takes your code and returns new code in its place, that means you can add new constructs to the language itself.

Once you can add to the language, you can build it up toward your problem. So in Lisp you don't just write a program, you write a language for your domain and then write the program in it.

That matters a lot more now, because what makes a program valuable is the opinions behind it. And we're heading toward a world where software companies let their users change the product themselves, since with an LLM that's easy. So if a company builds a good opinionated domain language for its product, everything its users build on top of it will be much better, because they start from the company's opinions and not from scratch.

Take an ERP. Every company runs a little differently, so almost everyone ends up needing to change it. But if the ERP is written in its own domain language, you can just ask an LLM to make the change in that language. The change will naturally follow the domain language’s underlying opinions, so it fits the product instead of breaking it.

And it's not just better, it's also cheaper. Lisp programs are often much more concise because macros let you abstract away recurring patterns and make them part of the language itself. So the bigger the program gets, the bigger the difference. In my own experience the apps I've built in Common Lisp end up about six to seven times shorter than the Python versions.

For LLMs, less code means fewer tokens, and tokens are what you pay for so you spend less on development.

It also means a bigger portion of your program can fit in the LLM's context window. If your LLM has your entire program in its context window then it has a complete view of your intent, which leads to it making better decisions. In my experience a lot of LLM bugs stem from it changing one piece of my program without seeing the rest. So with Common Lisp that happens less often.

Common Lisp is an ANSI standard and it hasn't been updated since 1994. I like this feature. And going back to our ERP example, if your users change the product themselves, that's exactly what you want since the language underneath never moves and nothing they build on top of it ever breaks.

When you write a program in Common Lisp you often won’t be able to find a library you need. Quicklisp, the main Common Lisp package manager, has a couple thousand projects while npm has millions.

But I don't think that's a problem anymore. Most programs today depend on millions of lines of code from packages that keep getting compromised. You don’t want that in yours. Also, with an LLM you could just write the part you need yourself or port the whole library — and LLMs seem to be really good at porting code.

Lastly, I'm seeing now that a lot of people are programming now in the hope of building a business. An obvious objection to building products in Common Lisp is that you’ll have a hard time finding engineers since so few people know how to program in it.

But I don't think that really matters now. If you want to build a successful company you want to hire the best technical people: the ones who are really good at learning new things. So in your coding interviews just make them learn Common Lisp, and there you go. You'll see how fast people pick things up, and the ones who do well will probably keep learning it and get really good at it.

In conclusion, next time you want to write a program use Common Lisp.

The Daily Front Page 13 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Embeddings at the Edge
article

EmbeddingGemma 2: An open, lightweight multimodal embedding model

by ilreb·▲ 256 points·31 comments·blog.google ↗
EmbeddingGemma 2 is the most capable model for on-device multimodal embeddings.

EmbeddingGemma 2 is the most capable model for on-device multimodal embeddings, natively mapping combinations of text, images, audio, and video into a unified embedding space.

EmbeddingGemma 2

We introduced EmbeddingGemma last year to provide a lightweight option for high-quality text embeddings, to help your apps organize, search, and connect information directly on consumer hardware. The developer community’s response blew past our expectations. With more than 20 million downloads, builders have used it to power smarter on-device search tools and privacy-first retrieval augmented generation (RAG) pipelines.

Today, we’re launching EmbeddingGemma 2**,** expanding beyond text to unify code, images, video, and audio in a shared embedding space. Built on the Gemma 4 architecture and released under a commercially permissive Apache 2.0 license, EmbeddingGemma 2 has 740 million parameters, making it optimal for on-device inference. It can help find a specific video clip from a voice memo, or search through hours of audio recordings based on a text query, all processed by a single, natively multimodal model.

Built from the same technology as Gemini Embedding models, EmbeddingGemma 2 is:

  • Best-in-class for its size: Achieves leading scores among sub-1B multimodal embedders for its size across benchmarks like MTEB (Massive Text Embedding Benchmark) Code and MAEB (Massive Audio Embedding Benchmark), while matching or outperforming many larger models across text, vision, and audio tasks.
  • Modular by design: Requires as little as 270M parameters for text-only workloads with optional vision (170M) and audio (300M) encoders for full multimodal support.
  • Storage-efficient: Using Matryoshka Representation Learning (MRL), developers can dynamically truncate output vectors from 768 dimensions down to 512, 256, or 128 dimensions. This provides up to 6x storage reduction for local vector databases and memory usage.
  • Optimized for on-device performance: Runs efficiently within tight resource constraints. With quantization, on a Google Pixel 11 Pro, EmbeddingGemma 2 requires as little as ~191MB active RAM for text-only weights and ~567MB for the full multimodal model.
  • Extended context ready: Features an 8K token context window (4x larger than EmbeddingGemma 1), allowing it to process up to 5.5 minutes of audio, 29 images, 58 video frames, or interleaved combinations thereof directly on local hardware.

Achieving top-tier quality for code, vision, and audio

EmbeddingGemma 2 matches the strong multilingual text performance of EmbeddingGemma while delivering a significant 9.92-point improvement on code performance (in MTEB Code, from 68.76 to 78.68), making it well-suited for local codebase indexing, semantic code search, and coding agent retrieval. Across image, video, documents, and audio, it sets a new standard in quality-per-parameter for sub-1B models and even outperforms some specialist models more than twice its size.

Massive Text Embedding Benchmark (Code)

Massive Image Embedding Benchmark (Lite)

Massive Audio Embedding Benchmark

Find full evaluation metrics and model information in the EmbeddingGemma 2 model card.

Enabling semantic search, routing, and retrieval, fully on-device

EmbeddingGemma 2 brings robust capabilities directly to edge hardware. Generating embeddings locally helps ensure data privacy, reduces pipeline latency, and empowers developers to build cross-modal search and retrieval that works entirely offline.

When paired with generative models such as Gemma 4, EmbeddingGemma 2 enables on-device RAG pipelines that understand complex multimodal data. Because EmbeddingGemma 2 is built on Gemma 4 and shares its text tokenizer and audio encoder, developers can run both models together in a unified pipeline with a lower combined total memory footprint.

Use text or an image to find the top matches in your media library based on semantic similarity. Try it in Google AI Edge Gallery’s Instant Media Search.

Locate specific moments in video using text or audio queries. Try it in Google AI Edge Gallery’s Video Moments Finder.

Pair EmbeddingGemma 2 for local file retrieval with Gemma 4 for contextual reasoning. Try it in the Google AI Edge Foresight app.

Create real-time decision engines leveraging multimodal context for classification, routing, and predictive capabilities via the MediaPipe Decision Task API.

To learn how to build on-device search and RAG systems with LiteRT, read the Google AI Edge blog post.

Getting started with EmbeddingGemma 2

We worked closely with the following partners to ensure EmbeddingGemma 2 works immediately where you build:

  • Download the models: Find the model weights on Hugging Face and Kaggle, with Gemini Enterprise Agent Platform Model Garden availability coming soon. Visit LiteRT Community on Hugging Face for models optimized for on-device.
  • On-device deployment: Develop cross-platform apps with Google AI Edge MediaPipe for turnkey embedding, retrieval & decision tasks or LiteRT for custom model integration. Build for the browser with transformers.js or WebGPU.
  • Use your favorite development tools: Serve the model efficiently using transformers, sentence-transformers, MLX, vLLM, llama.cpp, SGLang, Ollama, and LMStudio. Store your embedding vectors with Qdrant.
  • Fine-tuning: Follow guidance by Unsloth for how to fine-tune EmbeddingGemma 2 for your use cases.

Explore our developer guide, documentation, and guides for inference and fine-tuning.

The Daily Front Page 14 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Chip That Built Itself
repository

OpenTPU – An open-source AI accelerator, developed by AI

by fsbonetto·▲ 253 points·311 comments·github.com ↗
★ 253⑂ 10 forks Verilog

An open-source AI accelerator, developed by AI: RTL, ISA, simulator, compiler and profiler in one repo. Runs Qwen3, LFM2.5 and Qwen3.5 on a Kintex-7 PCIe card.

An open-source AI accelerator, developed by AI.

openTPU brings the lessons of auto-arch-tournament to AI accelerators. It asks two questions: how far can AI agents go at hardware design, and can they build the chip that runs their own inference?

otpu-chat on LFM2.5-230M with otpu-smi watching the card

otpu-chat running LFM2.5-230M on the FPGA card (left), with otpu-smi showing the card's utilization and DRAM bandwidth (right).

A place to learn

openTPU is also a learning project. The whole accelerator lives in one small monorepo that you can read end to end: the hardware design (SystemVerilog), the instruction set, a bit-exact simulator, a kernel language and its compiler, and the host software that drives a real PCIe card. If you want to understand how an AI accelerator works, from a matmul in Python down to the wires, this is a good place to start.

Results

The design runs ten modern models with their real weights on an Inspur YPCB-00338 card (Xilinx Kintex-7 xc7k480t, two DDR3 channels), and the card produces the same tokens as the simulator, bit for bit.

Model Weights Decode, device Decode, wall Prefill, device DRAM while decoding LFM2.5-230M int8 59.0 tok/s 52.3 tok/s 295.6 tok/s 14.5 GB/s (85% of peak) LFM2.5-230M 4-bit, int8 head 85.8 tok/s 82.1 tok/s 335.4 tok/s 14.1 GB/s (82%) Qwen3-0.6B int8 21.6 tok/s 21.3 tok/s 92.1 tok/s 14.4 GB/s (84%) Qwen3-0.6B 4-bit, int8 head 31.3 tok/s 30.7 tok/s 103.4 tok/s 13.9 GB/s (82%) Qwen3.5-0.8B int8 17.6 tok/s 16.3 tok/s 61.4 tok/s 14.5 GB/s (85%) Qwen3.5-0.8B 4-bit, int8 head 24.5 tok/s 23.3 tok/s 66.7 tok/s 14.1 GB/s (83%) Gemma 4 E2B 4-bit, int8 head 10.57 tok/s 10.53 tok/s 32.1 tok/s 15.6 GB/s (92%) Gemma 4 E2B 4-bit, 4-bit head 12.14 tok/s 12.09 tok/s 29.9 tok/s 15.5 GB/s (91%) LFM2-2.6B int8 6.05 tok/s 6.03 tok/s 21.4 tok/s 16.1 GB/s (94%) LFM2-2.6B 4-bit, int8 head 10.96 tok/s 10.93 tok/s 20.6 tok/s 15.8 GB/s (93%) SmolLM3-3B int8 5.00 tok/s 4.99 tok/s 21.1 tok/s 16.0 GB/s (94%) SmolLM3-3B 4-bit, int8 head 8.74 tok/s 8.72 tok/s 22.8 tok/s 15.7 GB/s (92%) Phi-4-mini (3.8B) int8 3.99 tok/s 3.98 tok/s 13.8 tok/s 16.0 GB/s (94%) Phi-4-mini (3.8B) 4-bit, int8 head 6.56 tok/s 6.55 tok/s 15.0 tok/s 15.8 GB/s (92%) Qwen3.5-2B int8 8.02 tok/s 8.00 tok/s 38.2 tok/s 16.0 GB/s (94%) Qwen3.5-2B 4-bit, int8 head 12.09 tok/s 12.03 tok/s 41.7 tok/s 15.8 GB/s (92%) Qwen3.5-4B 4-bit, int8 head 5.88 tok/s 5.87 tok/s 12.9 tok/s 15.7 GB/s (92%) Gemma 4 E4B int8, 4-bit head and down 0-23 3.78 tok/s 3.75 tok/s 14.8 tok/s 16.0 GB/s (94%)

Measured on the card: the first three models on 2026-09-29 with the production image deploy_champ_e698dcd7. LFM2-2.6B, SmolLM3-3B and Phi-4-mini on 2026-09-30, and Qwen3.5-2B and 4B and Gemma 4 on 2026-10-01, with build B, deploy_fused133c_79c5707a, production since then. Build B decodes LFM2-2.6B, SmolLM3 and Phi-4-mini 8-9% faster than e698dcd7 (Gemma 4 E2B 10%), at 91-94% of the DRAM peak instead of 82-87%. Qwen3.5-4B's int8 image is over 4 GiB.

  • The image: main e698dcd at 133.33 MHz, one bitstream for all models. It has LiteDRAM controllers calibrated by a small CPU inside the memory core, a four-column systolic matrix unit and the stream engine (docs/stream.md). DDR3-1066, with a 17.1 GB/s peak.
  • The host: the card sits in opentpu (Intel Core i7-4790).
  • Method, tools/qual/perf.py: decode is 64 greedy tokens after a 512-token prompt, with the host's argmax in the loop (not streamed). "Device" counts only the cycles the accelerator runs; "wall" adds the host. Prefill is the 512-token prompt, on the device.
  • DRAM traffic comes from the card's own counters while it runs.
  • Gemma 4 E2B keeps its per-layer embedding tables on the card (3.5-3.6 GiB images; docs/gemma4.md); in int8 it does not fit. It matches Hugging Face's greedy tokens on three prompts with either head. E4B's table (2.95 GB) stays on the host, which copies one 11 KB row into the card per token; its image is 3.96 GiB, int8 with the head and the first 24 layers' down projections in 4-bit (docs/gemma4_e4b.md). In the card's own decode loop (the card picking every token) Gemma 4 decodes faster: E2B 11.01 / 12.73 tok/s (int8 / 4-bit head), E4B 3.83 tok/s, on the device.
  • Every configuration matches the simulator token for token, per-position and with the resident decode program. More detail in docs/board.md.

With the logits streamed back while the card runs (tools/decode_profile.py, 96 tokens), 4-bit decode is faster, in device / wall tok/s:

  • LFM2: 89.5 / 84.5;
  • Qwen3: 33.7 / 33.3;
  • Qwen3.5: 24.6 / 24.2;
  • LFM2-2.6B: 11.07 / 11.02 (build B);
  • SmolLM3-3B: 8.92 / 8.89 (build B);
  • Phi-4-mini: 6.69 / 6.67 (build B).

The previous production image, se-cand3, was built with the Xilinx MIG, a two-column matrix unit and a 120.755 MHz clock. Measured the same way, the new image:

  • decode: within 2.3% of se-cand3's in every configuration. Decode is bound by DRAM, and LiteDRAM reads at 82-85% of the DDR3 peak, as the MIG did.
  • prefill: 1.3x (Qwen3.5) to 2.0x (LFM2 4-bit) faster.
  • calibration: when the image starts, the core's CPU calibrates both DDR3 channels in 12 s, with no host involvement.

The earlier images and their numbers are in docs/board.md, section 5.

Mixture-of-experts models bigger than the card's 4 GiB run with their experts streamed from host storage (docs/offload.md, section 10). The card routes each token and computes every expert, and it keeps the experts in per-layer slots in its DRAM. The host only copies missing experts from a pool file into those slots, at the link's rate (section 10.1). Measured on 2026-10-01 with build B (79c5707a), the card's own decode loop picking every token, 4-bit experts, int8 head:

  • LFM2.5-8B-A1B (8.5B parameters, 1.7B active): 10.6 tok/s over 160 tokens. 98.5% of expert uses hit the slots, and 5.2 MB streamed per token.
  • Qwen3.5-35B-A3B (34.7B parameters, 3.0B active): 3.95 tok/s, with Hugging Face's 16 greedy tokens. 62% of expert uses hit, and 153 MB streamed per token at 1.41 GB/s over PCIe (section 10.3).
  • Both match the simulator bit for bit.

4-bit weights (docs/quant.md) use FP4 values with two-level block scales, 4.25 bits per weight, and keep the LM head in int8 for accuracy. They cut the bytes per token by about a third and raise decode speed by 40% (Qwen3.5) to 45% (Qwen3, LFM2), at a measurable cost in perplexity that docs/quant.md reports per model.

The host is nearly out of the way. For LFM2 and Qwen3 the card runs one decode program compiled once, which reads the position from a register and looks up its own embedding and RoPE rows, and the logits stream back while the card is still running: the host adds 0.17 to 0.30 ms per token on omarchy (0.45 to 1.3 ms on opentpu). Qwen3.5 runs the same way for decode; its prefill still compiles each chunk's program on the host, ahead of the card.

How it works

  Kernels in ol              mlp, attention, full model layers
        |  @ol.jit
  Language + compiler        layouts, affine loop addressing, fusion
        |
  ISA                        8 x 32-bit words per instruction
        |
  ISA simulator  <======>  RTL          same bits, checked by the tests
  (Python)                 (SystemVerilog)
                            |  Vivado bitstream
                           FPGA card    Kintex-7 xc7k480t
                            |  PCIe
                           Host         otpu-chat, otpu-smi, otpu-lens

The machine is deliberately simple. A sequencer issues one instruction per cycle to a few units: DMA moves data, the matrix unit multiplies int8 weights streamed from DRAM, the vector unit does fp32 math, and a quantizer turns results back into int8. There is no cache and no hidden scheduling: every data movement is an instruction, so a trace shows exactly where the cycles go. docs/isa.md describes the whole instruction set.

A kernel looks like this:

from opentpu import language as ol

@ol.jit
def mlp(h, gamma, w_gate, w_up, w_down, out, eps):   # simplified; see kernels/mlp.py
    x = ol.load(h)
    xs = ol.quantize(rmsnorm(x, ol.load(gamma), eps))
    g = ol.dot(xs, w_gate)
    u = ol.dot(xs, w_up)
    a = ol.all_gather(silu(g) * u)
    y = ol.all_gather(ol.dot(a, w_down))
    if ol.program_id() == 0:
        ol.store(out, x + y)

Because every data movement is an instruction, a trace of a run explains its speed. Lens, the profiler, records a run from the RTL, the simulator or the card and opens it in the browser, with a roofline, a timeline and per-instruction tables (docs/lens.md).

Lens replaying a Qwen3 decode step on the floorplan

Lens replaying part of a Qwen3 decode step. Colours show what each unit is doing in each cycle: busy, waiting on DRAM, or waiting on another instruction.

Try it

Everything except the card runs on a laptop.

pip install -e .
pip install pytest torch transformers
python3 -m pytest -q          # RTL tests also need Verilator 5

hf download LiquidAI/LFM2.5-230M --local-dir models/LFM2.5-230M
otpu-chat --model lfm2 --backend isa    # chat on the simulator

With a card, build the bitstream (make bit in boards/ypcb-00338), load it over JTAG, then run sudo otpu-setup and otpu-chat --backend board. docs/board.md walks through the bring-up.

Command What it does otpu-chat chat with Qwen3-0.6B, LFM2.5-230M (--model lfm2), Qwen3.5-0.8B (--model qwen35), LFM2-2.6B (lfm2-2.6b), SmolLM3-3B (smollm3), Phi-4-mini (phi4-mini), or Qwen3.5-2B / 4B (qwen35-2b, qwen35-4b) otpu-smi temperature, power, DRAM bandwidth and per-unit utilization otpu-lens record a run and open it in the profiler otpu-selftest, otpu-diag check that the card works

Where to start reading

  1. docs/isa.md: the instruction set. Everything else is built on it.
  2. opentpu/kernels and docs/compiler.md: how a kernel becomes instructions.
  3. opentpu/isasim.py: the simulator, which is the spec.
  4. rtl/: the hardware, starting from rtl/top/otpu_top.sv.
  5. docs/lfm2.md, docs/qwen35.md, docs/llama.md, docs/benchmarks.md: whole models and where their cycles go.
  6. docs/board.md: the physical card, from clocks to PCIe.

What's next

  • The last few percent of DRAM. Decode is bound by DRAM efficiency: it reads 82 to 85% of the DDR3-1066 peak. Work on the LiteDRAM path's efficiency is under way.
  • Timing margin and area. The design closes 133.33 MHz, the clock at which the 128-byte port matches the two DDR3 channels, but only just (WNS +0.032 ns). A tournament of Vivado runs keeps working on its margin and area. Decode is bound by DRAM, so a faster clock mostly helps prefill.
  • Faster prefill. The four-column systolic matrix unit is in the production image; prefill is still limited by the matrix unit's multiply rate.

Contributing

Issues and pull requests are welcome, and most of the work needs only Python and Verilator, not an FPGA. Changes to the ISA, the simulator or the RTL must keep python3 -m pytest -q passing, and performance claims should say how they were measured.

License

Apache License 2.0. See LICENSE.

The Daily Front Page 15 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The New Media Colossus
article

Paramount Skydance has completed its $111B merger with Warner Bros. Discovery

by Mgtyalx·▲ 200 points·326 comments·arstechnica.com ↗
Paramount now owns Warner Bros. as last-ditch effort to stop $111B merger fails.

Paramount now owns Warner Bros. as last-ditch effort to stop $111B merger fails.

David Ellison stands and smiles in front of a backdrop with a Paramount logo.

Paramount Skydance CEO David Ellison at an event in New York City on April 22, 2026. Credit: Getty Images

Paramount Skydance completed its $111 billion merger with Warner Bros. Discovery today, after a last-ditch effort to block the deal was rejected by Supreme Court Justice Elena Kagan.

The post-merger company is called Skydance, taking the name of a firm that Paramount bought in a separate deal last year. The new Skydance combines two of the largest movie studios, streaming services Paramount+ and HBO Max, CBS, CNN, “and a portfolio of live sports including CBS Sports and TNT Sports, as well as a deep programming library and expansive collection of brands and franchises,” Skydance said today in a press release announcing completion of the deal.

The merger was delayed a bit by a lawsuit filed by California and 11 other states. In July, US District Judge Araceli Martínez-Olguín in the Northern District of California ruled that the combination would likely reduce competition substantially and violate antitrust laws.

California settled the lawsuit last month, and the other states involved went along with the compromise. A coalition of free speech and media advocacy groups urged the judge to reject the settlement, saying it will give residents of the states that sued Paramount “virtually nothing.”

Martínez-Olguín approved the settlement on September 30, saying the deal “represents a reasonable factual and legal resolution of the dispute.” She wrote that a typical settlement “does not fully remediate an alleged violation or even necessarily resolve the ultimate factual and legal issues of a case.” It “reflects a compromise of the claims short of full adjudication—compromise that may leave some dissatisfaction for both sides and the public but a compromise that saves the risk, time, and expense of litigating through trial.”

The settlement addresses the lawsuit’s complaints about film distribution “by requiring certain minimum thresholds of investment and release of domestic films,” and addresses complaints about licensing of basic cable channels with “requirements for continued, separate negotiations of distribution for the two entities’ basic cable holdings,” the judge wrote. Objections based on “hopes and desires for the proposed consent decree to reach farther—to achieve more—do not rise to the level of legal violations upon which the Court can reject the parties’ negotiated resolution,” she wrote.

Merger opponents strike out at Supreme Court

A separate lawsuit in the same district court, filed by five consumers who purchase streaming service subscriptions or other video products, also failed. The five consumers sought review in the US Court of Appeals for the Ninth Circuit, which rejected the plaintiffs’ request. The plaintiffs then filed an emergency application to block the deal with Kagan, who handles emergency requests for the Ninth Circuit. Kagan denied the application yesterday without comment.

The settlement with California requires Skydance to set up an “Editorial Independence Board” for CBS News and CNN. The board’s members would be chosen by Skydance and report to the company’s board of directors. The settlement term was adopted amid concerns about CBS and CNN’s ability to report news independently. CNN CEO Mark Thompson and CBS News Editor-in-Chief Bari Weiss will retain their roles in the merged firm.

Paramount CEO David Ellison reportedly told Trump administration officials that he would make big changes at CNN, a frequent target of Trump’s wrath. Last year, Paramount won US approval to buy Skydance after reaching a $16 million settlement with Trump and agreeing to install what Federal Communications Commission Chairman Brendan Carr described as a “bias monitor” at CBS.

The US Department of Justice approved the Paramount/Warner merger in June, a decision that reportedly surprised DOJ staff lawyers who were leaning toward recommending that the agency file an antitrust lawsuit to block it. In September, the FCC allowed Paramount to finance the merger by selling large equity stakes to the sovereign wealth funds of Saudi Arabia, the United Arab Emirates, and Qatar.

Reuters reports that Skydance is “expected to carry about $80 billion in debt, putting pressure on Ellison to grow streaming, preserve cash flow from cable networks and improve theatrical film performance.” The sovereign wealth funds have non-voting shares in Skydance, while the Ellison family and RedBird Capital Partners own 100 percent of the voting shares.

The Daily Front Page 16 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Decisions, at Speed
article

Decisions API is in public beta

by chiefstorm·▲ 186 points·81 comments·developers.openai.com ↗
Turn text and images into decisions your application can use, 10x faster than the Responses API.

Turn text and images into decisions your application can use, 10x faster than the Responses API.

The Decisions API evaluates text, images, or both and returns typed answers about 10x faster than the Responses API. Get the probability that a condition is true, a choice from a fixed set, or a score against a rubric. Use those answers to classify content, route requests, and prioritize work in your application.

Try the Decisions API in the Playground to experiment with questions and inputs before writing code.

The Decisions API is in public beta, and we expect to GA in the coming weeks. gpt-6-luna is the only model currently available. Use the dedicated POST /v1/decisions endpoint.

To run the SDK examples below, use these OpenAI SDK versions or later: Python 3.26.0, JavaScript 7.30.0, Go 3.73.0, Ruby 0.101.0, and Java 4.78.0. See OpenAI SDK for installation instructions.

How decisions work

A request has three parts:

Field Purpose model The model that evaluates the request. Currently, only gpt-6-luna is supported. input Shared evidence for the questions: a text string or user messages containing text and images. questions What to evaluate, including each question’s type, instructions, and any allowed choices or score levels.

The response contains an answers array. Give each question a unique name to identify its answer; the API echoes that name in the response.

Choose a question type

Type Use it to Main result predicate Check a condition, such as visible damage or passage relevance. probability: an estimate from 0 to 1 that the condition is true. choice Select one option, such as a department or content category. choice: one of your supplied values. score Rate an input against ordered levels, such as issue severity. score: the probability-weighted average of the level indices.

Both choice and score return probabilities over discrete options. Use choice for categories without an order, such as departments. Use score for ordered levels, such as severity; it takes the probability-weighted average of their numeric indices to produce a score that can fall between levels.

Use Decisions when your application needs one of these answer types. Use Structured Outputs with the Responses API when you need to generate an object that follows your own JSON schema, such as extracted fields or a written explanation, or function calling when you need a model to request a tool call with arguments.

Check an image for visible damage

Use a predicate question to check a product photo for visible damage. This request combines the image with instructions to look for a crack, tear, or dent.

A smooth sage-green travel cup

A blue camping mug with a pronounced dent

A steel storage tin with a small shallow dimple

A dented silver aluminum can

An undamaged yellow metal bottle

Please cancel my subscription before the next renewal.

Can I switch to annual billing and keep my current plan?

I don’t need this anymore. How do I stop future charges?

Can I return an item after 30 days?

Returns are accepted within 30 days of delivery. After that, items aren’t eligible for a refund.

Start a return from the Orders page in your account.

Standard shipping takes three to five business days.

Check an image for visible damage

IMAGE_BASE64="$(base64 < product.png | tr -d '\r\n')"

curl https://api.openai.com/v1/decisions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<JSON
{
  "model": "gpt-6-luna",
  "input": [{
    "role": "user",
    "content": [
      {"type": "input_text", "text": "Inspect the product in this photo."},
      {"type": "input_image", "image_url": "data:image/png;base64,$IMAGE_BASE64"}
    ]
  }],
  "questions": [{
    "type": "predicate",
    "name": "visible_damage",
    "instructions": "Does the product have visible damage, such as a crack, tear, or dent? Ignore shadows and damage to the packaging."
  }]
}
JSON
import { readFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const imageBase64 = (await readFile("product.png")).toString("base64");
const decision = await client.decisions.create({
  model: "gpt-6-luna",
  input: [
    {
      role: "user",
      content: [
        { type: "input_text", text: "Inspect the product in this photo." },
        {
          type: "input_image",
          image_url: `data:image/png;base64,${imageBase64}`,
        },
      ],
    },
  ],
  questions: [
    {
      type: "predicate",
      name: "visible_damage",
      instructions:
        "Does the product have visible damage, such as a crack, tear, or dent? Ignore shadows and damage to the packaging.",
    },
  ],
});

const answer = decision.answers[0];
if (answer.type === "refusal") {
  console.log(`Refused: ${answer.name}`);
} else if (answer.type === "predicate") {
  console.log(`Visible damage probability: ${answer.probability}`);
}
import base64
from pathlib import Path

from openai import OpenAI

client = OpenAI()
image_base64 = base64.b64encode(Path("product.png").read_bytes()).decode("ascii")

decision = client.decisions.create(
    model="gpt-6-luna",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "Inspect the product in this photo."},
                {
                    "type": "input_image",
                    "image_url": f"data:image/png;base64,{image_base64}",
                },
            ],
        }
    ],
    questions=[
        {
            "type": "predicate",
            "name": "visible_damage",
            "instructions": (
                "Does the product have visible damage, such as a crack, tear, or dent? "
                "Ignore shadows and damage to the packaging."
            ),
        }
    ],
)

answer = decision.answers[0]
if answer.type == "refusal":
    print(f"Refused: {answer.name}")
elif answer.type == "predicate":
    print(f"Visible damage probability: {answer.probability}")
package main

import (
	"context"
	"encoding/base64"
	"fmt"
	"os"

	"github.com/openai/openai-go/v3"
)

func main() {
	image, err := os.ReadFile("product.png")
	if err != nil {
		panic(err)
	}
	client := openai.NewClient()
	decision, err := client.Decisions.New(context.Background(), openai.DecisionNewParams{
		Model: "gpt-6-luna",
		Input: openai.DecisionNewParamsInputUnion{
			OfDecisionInputMessageArray: []openai.DecisionInputMessageParam{{
				Content: openai.DecisionInputMessageContentUnionParam{
					OfParts: []openai.DecisionInputPartUnionParam{
						{OfInputText: &openai.DecisionInputTextParam{Text: "Inspect the product in this photo."}},
						{OfInputImage: &openai.DecisionInputImageParam{
							ImageURL: "data:image/png;base64," + base64.StdEncoding.EncodeToString(image),
						}},
					},
				},
			}},
		},
		Questions: []openai.DecisionNewParamsQuestionUnion{{
			OfPredicate: &openai.DecisionNewParamsQuestionPredicate{
				Name:         openai.String("visible_damage"),
				Instructions: "Does the product have visible damage, such as a crack, tear, or dent? Ignore shadows and damage to the packaging.",
			},
		}},
	})
	if err != nil {
		panic(err)
	}
	switch answer := decision.Answers[0].AsAny().(type) {
	case openai.DecisionAnswerPredicate:
		fmt.Println(answer.Probability)
	case openai.DecisionAnswerRefusal:
		fmt.Printf("Decision refused for %s\n", answer.Name)
	default:
		panic("unexpected answer type")
	}
}
import com.openai.models.decisions.DecisionCreateParams;
import com.openai.models.decisions.DecisionInputImage;
import com.openai.models.decisions.DecisionInputMessage;
import com.openai.models.decisions.DecisionInputPart;
import com.openai.models.decisions.DecisionInputText;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.List;

String imageBase64 =
    Base64.getEncoder().encodeToString(Files.readAllBytes(Path.of("product.png")));
var message =
    DecisionInputMessage.builder()
        .contentOfParts(
            List.of(
                DecisionInputPart.ofInputText(
                    DecisionInputText.builder()
                        .text("Inspect the product in this photo.")
                        .build()),
                DecisionInputPart.ofInputImage(
                    DecisionInputImage.builder()
                        .imageUrl("data:image/png;base64," + imageBase64)
                        .build())))
        .build();
var decision =
    client
        .decisions()
        .create(
            DecisionCreateParams.builder()
                .model("gpt-6-luna")
                .inputOfDecisionInputMessages(List.of(message))
                .addQuestion(
                    DecisionCreateParams.Question.Predicate.builder()
                        .name("visible_damage")
                        .instructions(
                            "Does the product have visible damage, such as a crack, tear, or"
                                + " dent? Ignore shadows and damage to the packaging.")
                        .build())
                .build());

var answer = decision.answers().get(0);
if (answer.isRefusal()) {
  System.out.println("Refused: " + answer.asRefusal().name().orElse("visible_damage"));
} else {
  System.out.println(answer.asPredicate().probability());
}
require "base64"
require "openai"

image_base64 = Base64.strict_encode64(File.binread("product.png"))
client = OpenAI::Client.new

decision = client.decisions.create(
  model: "gpt-6-luna",
  input: [
    {
      role: :user,
      content: [
        {
          type: :input_text,
          text: "Inspect the product in this photo."
        },
        {
          type: :input_image,
          image_url: "data:image/png;base64,#{image_base64}"
        }
      ]
    }
  ],
  questions: [
    {
      type: :predicate,
      name: "visible_damage",
      instructions: "Does the product have visible damage, such as a crack, tear, or dent? Ignore shadows and damage to the packaging."
    }
  ]
)

answer = decision.answers.fetch(0)
case answer
when OpenAI::Models::Decision::Answer::Predicate
  puts(answer.probability)
when OpenAI::Models::Decision::Answer::Refusal
  warn("Decision refused for #{answer.name}")
else
  raise("Unexpected answer type: #{answer.type}")
end

An illustrative response excerpt:

{
  "answers": [
    {
      "type": "predicate",
      "name": "visible_damage",
      "probability": 0.92
    }
  ]
}

The probability is the model’s estimate that the condition is true. Use it to flag photos for review based on a threshold you choose.

Images must be inline base64 data URLs. Hosted HTTP or HTTPS image URLs and file_id inputs aren’t supported by this endpoint. Combine input_text and input_image parts in a user message to evaluate images together with instructions or other context.

Select from fixed options

A choice question selects one value from the options you provide. Use distinct values and descriptions that explain when each option applies.

Which lane should the car choose?

I was charged twice for this month. Can you refund the extra payment?

Every CSV export fails with an error, even after I refresh the page.

I lost my phone and can’t get past two-step verification.

NORTHLINE STUDIO № 1042

Invoice

Billed to Cedar & Co.

Design services$1,200.00

Amount due$1,200.00

Payment due October 21

NORTHLINE STUDIO № 6853

Payment received

Thank you for your purchase.

Design services$1,200.00

Total paid$1,200.00

Visa ending in 4242 · Approved

NORTHLINE STUDIO 01 / 03

Services agreement

Between Northline Studio and Cedar & Co.

The provider agrees to deliver design services for a term of twelve months.

Provider signatureClient signature

This request routes a customer complaint:

Route a customer complaint

curl https://api.openai.com/v1/decisions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-luna",
    "input": "I was charged twice for my order.",
    "questions": [{
      "type": "choice",
      "name": "department",
      "instructions": "Which department should handle this complaint?",
      "choices": [
        {"value": "billing", "description": "Payments, invoices, and refunds."},
        {"value": "technical", "description": "Problems using the product."},
        {"value": "shipping", "description": "Delivery and tracking."},
        {"value": "other", "description": "Requests outside these categories."}
      ]
    }]
  }'
import OpenAI from "openai";

const client = new OpenAI();
const decision = await client.decisions.create({
  model: "gpt-6-luna",
  input: "I was charged twice for my order.",
  questions: [
    {
      type: "choice",
      name: "department",
      instructions: "Which department should handle this complaint?",
      choices: [
        { value: "billing", description: "Payments, invoices, and refunds." },
        { value: "technical", description: "Problems using the product." },
        { value: "shipping", description: "Delivery and tracking." },
        { value: "other", description: "Requests outside these categories." },
      ],
    },
  ],
});

const answer = decision.answers[0];
if (answer.type === "refusal") {
  console.log(`Refused: ${answer.name}`);
} else if (answer.type === "choice") {
  console.log(
    `Department: ${answer.choice} (confidence: ${answer.confidence})`
  );
}
from openai import OpenAI

client = OpenAI()
decision = client.decisions.create(
    model="gpt-6-luna",
    input="I was charged twice for my order.",
    questions=[
        {
            "type": "choice",
            "name": "department",
            "instructions": "Which department should handle this complaint?",
            "choices": [
                {"value": "billing", "description": "Payments, invoices, and refunds."},
                {"value": "technical", "description": "Problems using the product."},
                {"value": "shipping", "description": "Delivery and tracking."},
                {"value": "other", "description": "Requests outside these categories."},
            ],
        }
    ],
)

answer = decision.answers[0]
if answer.type == "refusal":
    print(f"Refused: {answer.name}")
elif answer.type == "choice":
    print(f"Department: {answer.choice} (confidence: {answer.confidence})")
package main

import (
	"context"
	"fmt"

	"github.com/openai/openai-go/v3"
)

func main() {
	client := openai.NewClient()
	decision, err := client.Decisions.New(context.Background(), openai.DecisionNewParams{
		Model: "gpt-6-luna",
		Input: openai.DecisionNewParamsInputUnion{OfString: openai.String("I was charged twice for my order.")},
		Questions: []openai.DecisionNewParamsQuestionUnion{{
			OfChoice: &openai.DecisionNewParamsQuestionChoice{
				Name:         openai.String("department"),
				Instructions: "Which department should handle this complaint?",
				Choices: []openai.DecisionNewParamsQuestionChoiceChoice{
					{
						Value:       openai.DecisionNewParamsQuestionChoiceChoiceValueUnion{OfString: openai.String("billing")},
						Description: openai.String("Payments, invoices, and refunds."),
					},
					{
						Value:       openai.DecisionNewParamsQuestionChoiceChoiceValueUnion{OfString: openai.String("technical")},
						Description: openai.String("Problems using the product."),
					},
					{
						Value:       openai.DecisionNewParamsQuestionChoiceChoiceValueUnion{OfString: openai.String("shipping")},
						Description: openai.String("Delivery and tracking."),
					},
					{
						Value:       openai.DecisionNewParamsQuestionChoiceChoiceValueUnion{OfString: openai.String("other")},
						Description: openai.String("Requests outside these categories."),
					},
				},
			},
		}},
	})
	if err != nil {
		panic(err)
	}
	switch answer := decision.Answers[0].AsAny().(type) {
	case openai.DecisionAnswerChoice:
		fmt.Println(answer.Choice.AsString(), answer.Confidence, answer.Probabilities)
	case openai.DecisionAnswerRefusal:
		fmt.Printf("Decision refused for %s\n", answer.Name)
	default:
		panic("unexpected answer type")
	}
}
import com.openai.models.decisions.DecisionChoiceOption;
import com.openai.models.decisions.DecisionCreateParams;
import com.openai.models.decisions.DecisionCreateParams.Question.Choice;

var decision =
    client
        .decisions()
        .create(
            DecisionCreateParams.builder()
                .model("gpt-6-luna")
                .input("I was charged twice for my order.")
                .addQuestion(
                    Choice.builder()
                        .name("department")
                        .instructions("Which department should handle this complaint?")
                        .addChoice(
                            DecisionChoiceOption.builder()
                                .value("billing")
                                .description("Payments, invoices, and refunds.")
                                .build())
                        .addChoice(
                            DecisionChoiceOption.builder()
                                .value("technical")
                                .description("Problems using the product.")
                                .build())
                        .addChoice(
                            DecisionChoiceOption.builder()
                                .value("shipping")
                                .description("Delivery and tracking.")
                                .build())
                        .addChoice(
                            DecisionChoiceOption.builder()
                                .value("other")
                                .description("Requests outside these categories.")
                                .build())
                        .build())
                .build());

var answer = decision.answers().get(0);
if (answer.isRefusal()) {
  System.out.println("Refused: " + answer.asRefusal().name().orElse("department"));
} else {
  var choice = answer.asChoice();
  System.out.println(choice.choice().asString());
  System.out.println(choice.probabilities());
  System.out.println(choice.confidence());
}
require "openai"

client = OpenAI::Client.new
decision = client.decisions.create(
  model: "gpt-6-luna",
  input: "I was charged twice for my order.",
  questions: [
    {
      type: :choice,
      name: "department",
      instructions: "Which department should handle this complaint?",
      choices: [
        {
          value: "billing",
          description: "Payments, invoices, and refunds."
        },
        {
          value: "technical",
          description: "Problems using the product."
        },
        {
          value: "shipping",
          description: "Delivery and tracking."
        },
        {
          value: "other",
          description: "Requests outside these categories."
        }
      ]
    }
  ]
)

answer = decision.answers.fetch(0)
case answer
when OpenAI::Models::Decision::Answer::Choice
  puts(answer.choice, answer.confidence, answer.probabilities)
when OpenAI::Models::Decision::Answer::Refusal
  warn("Decision refused for #{answer.name}")
else
  raise("Unexpected answer type: #{answer.type}")
end

An illustrative response excerpt:

{
  "answers": [
    {
      "type": "choice",
      "name": "department",
      "choice": "billing",
      "probabilities": [
        { "value": "billing", "probability": 0.95 },
        { "value": "technical", "probability": 0.02 },
        { "value": "shipping", "probability": 0.01 },
        { "value": "other", "probability": 0.02 }
      ],
      "confidence": 0.93
    }
  ]
}

The answer’s choice field contains a supplied value, here "billing". It also includes a probabilities array for the options and a confidence field. See Interpret the answers for guidance on setting thresholds.

Include a fallback option such as "other" when your categories don’t cover every possible input. Your application can send that result to a general review queue.

Score against a rubric

A score question evaluates an input against ordered levels. Define the criteria for each level and arrange them from lowest to highest.

Package intact

Package with minor damage

Package with major damage

Could you add a dark mode? It would be helpful when I work at night.

CSV exports keep failing for one teammate. The rest of our team can still export.

Checkout is failing for every customer. We haven’t processed an order in 20 minutes.

Score an issue against severity levels

curl https://api.openai.com/v1/decisions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-luna",
    "input": "Export fails in Safari but works in Chrome.",
    "questions": [{
      "type": "score",
      "name": "severity",
      "instructions": "How severe is this issue?",
      "levels": [
        {"label": "Cosmetic", "description": "Appearance only; no lost functionality."},
        {"label": "Workaround available", "description": "A task fails, but another way works."},
        {"label": "Fully blocked", "description": "A task fails with no workaround."}
      ]
    }]
  }'
import OpenAI from "openai";

const client = new OpenAI();
const decision = await client.decisions.create({
  model: "gpt-6-luna",
  input: "Export fails in Safari but works in Chrome.",
  questions: [
    {
      type: "score",
      name: "severity",
      instructions: "How severe is this issue?",
      levels: [
        {
          label: "Cosmetic",
          description: "Appearance only; no lost functionality.",
        },
        {
          label: "Workaround available",
          description: "A task fails, but another way works.",
        },
        {
          label: "Fully blocked",
          description: "A task fails with no workaround.",
        },
      ],
    },
  ],
});

const answer = decision.answers[0];
if (answer.type === "refusal") {
  console.log(`Refused: ${answer.name}`);
} else if (answer.type === "score") {
  console.log(`Severity: ${answer.score} (confidence: ${answer.confidence})`);
}
from openai import OpenAI

client = OpenAI()
decision = client.decisions.create(
    model="gpt-6-luna",
    input="Export fails in Safari but works in Chrome.",
    questions=[
        {
            "type": "score",
            "name": "severity",
            "instructions": "How severe is this issue?",
            "levels": [
                {
                    "label": "Cosmetic",
                    "description": "Appearance only; no lost functionality.",
                },
                {
                    "label": "Workaround available",
                    "description": "A task fails, but another way works.",
                },
                {
                    "label": "Fully blocked",
                    "description": "A task fails with no workaround.",
                },
            ],
        }
    ],
)

answer = decision.answers[0]
if answer.type == "refusal":
    print(f"Refused: {answer.name}")
elif answer.type == "score":
    print(f"Severity: {answer.score} (confidence: {answer.confidence})")
package main

import (
	"context"
	"fmt"

	"github.com/openai/openai-go/v3"
)

func main() {
	client := openai.NewClient()
	decision, err := client.Decisions.New(context.Background(), openai.DecisionNewParams{
		Model: "gpt-6-luna",
		Input: openai.DecisionNewParamsInputUnion{OfString: openai.String("Export fails in Safari but works in Chrome.")},
		Questions: []openai.DecisionNewParamsQuestionUnion{{
			OfScore: &openai.DecisionNewParamsQuestionScore{
				Name:         openai.String("severity"),
				Instructions: "How severe is this issue?",
				Levels: []openai.DecisionNewParamsQuestionScoreLevei
The Daily Front Page 17 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Pleasure of the Craft
article

Vibecoding isn't as fun as writing code by hand

by Curiositry·▲ 180 points·258 comments·autodidacts.io ↗
I like building things: it makes me happy.

Sticks tongue out at AI

I like building things: it makes me happy. Learning and discovering things is a close second, but building is more satisfactory.

Since I’m not that good at actually, you know, building things, the thrill of “building”, in my case, has mostly come from writing software. Software is one of the easiest ways to create something satisfyingly useful out of nothing.

For a long time I’ve known, at some level, how much joy building gives me. [1] But it really sunk in while working on two recent hobby software projects. They were both dumb little Python scrapers that I cobbled together, that did something useful that I’d wanted for a long time. (Link, link.) They were pretty basic, but gave me so much irrational pleasure. It was the most fun I’d had programming in years. [2]

Then, [cue Jaws theme song] AI came along.

Like pretty much everyone else, I’ve been cautiously experimenting with AI-assisted coding. We are past the point where we can easily dismiss AI as “stupid” (though it is), or “doesn’t actually make me more productive”. So, in classic motte and bailey fashion, I am retreating, while pretending not to: AI coding is less fun.

This seems counter-intuitive, because vibecoding is absolutely thrilling … AT FIRST.

Refactoring vibecoded software? Not thrilling.

I’m not going to claim, as some do, that vibecoding doesn’t give the thrill of actually building something. Because it does, partly.

I think that one of the things that’s driving the adoption of vibecoding is that it frontloads the fun, at both the project- and career level.

AI Vibecoding vs Coding By Hand Thrill/Fun/Learning Curve Graph

The Vibecoding Thrill Curve

If I have an idea, I can usually get a working prototype very quickly, with very little effort. Instant dopamine!

Similarly, someone with no coding experience can “code” an app, and it will probably work. Instant dopamine!

I have a personal policy against frontloading the fun. So, I don’t like this, just like I don’t like getting paid for work I haven’t done, going into debt, and arrangements where someone else does my work today in trade for me doing their work tomorrow.

I posit that there are several distinct sources of thrill/satisfaction when building something:

  1. The thrill of the idea
  2. The thrill of making the idea real
  3. The satisfaction of hard-won accomplishment
  4. The satisfaction of a job well done
  5. The thrill of learning
  6. The satisfaction making something that solves a problem you have

Vibecoding, in general, can give you 1, 2, and 6. But 3, 4, and 5 are not natural consequence of vibecoding.

In tenuous defense of vibecoding:

I can, and have, built things with AI that I either never could have, or never would have, built otherwise. Mostly, it’s cases where it would not be worth me spending weeks building it by hand, but if I can build it in minutes or days, it is worth it.

  • I one-shotted a has-this-already-been-submitted-to-hackernews bookmarklet (HN?), based on Taylor Troesh’s Discuss on HN snippet. It gave me significant satisfaction, solved a problem I had, I use it regularly on my Wallabag favourites page.
  • In very little time, I vibecoded “Party Market”, a prediction market simulator party game to go along with a flash lecture on prediction markets, and ran a market on “how long will I drone on for”, live, during my lecture. It turned a dry and boring lecture into grade-A entertainment. The code was garbage and it was full of bugs, but I never could have done it writing it by hand in that amount of time. It wasn’t a choice between doing it with AI and doing it by hand: it was a choice between doing it with AI and not doing it at all.
  • When a fire chief I know was going to invest way too much money in an “AI appliance” that didn’t even say which Nvidia card it had, or what model/generation of Xeon it was, I vibecoded with free plan Lumo, in two afternoon sessions, a functional Pyronear based Wildfire Early Warning System that ran in realtime on a live feed on my laptop, and was able to detect the first frame of smoke on the ignition footage I fed it.
  • I built a browser-based Kobo database migration assistant (link), so that people unfamiliar with SQLite can move their books and annotations to a new device.
  • When a singing lesson with my vocal coach fell through, I built the realtime pitch training app I’ve always wanted — and have planned to build for about a decade.

In most of these cases, I was immensely pleased with the results, but the process wasn’t fun the way writing my dumb little scrapers was fun. Of course, handwritten software development isn’t always fun. My first Golang project was, for large sections of time, with a deadline, certified Not Fun™. Fighting the Rust compiler the first time I tried to write, like, twenty lines of Rust code was Not Fun™. But it was, in the long run, Type II fun, because it gave me the sense of accomplishment, and the glorious I did it! feeling (And, next time, it would be easier.)

I’ve tried everything from local models running in llama-server, to copy-and-pasting from free, no sign-up services (Phind, Lumo, etc) for one-shot scripts, to full on remote server Clod Masterpiece 200™ all-you-can-eat plan with custom-written auto-approval hooks that were worryingly close to –dangerously-skip-permissions, developing algorithmic trading models.

It’s all the same: it’s “productive”, but I don’t like the way it makes me feel, and I don’t like the quality of the output. It manages to make me feel dumb and superfluous (and, sometimes, dirty for even using it), without earning my respect.

The word “dopamine” made me think: vibecoding is a bit like a series of first dates or one night stands. You don’t develop a relationship with the project: you don’t get the same kind of warm fuzzies, oxytocin, attachment. The problem with a dopamine-only life is that thrills become dull with repetition.

Another way to look at it: vibecoding introduces a layer between you and reality. I am the kind of person that thinks, in general, reality is more fun when experienced first-hand.

Vibecoding is like being an executive of a large company that is barely under your control. You never feel like you really know what’s going on, and there’s always the suspicion of sabotage and loafing. Things appear fully formed, but not quite how you imagined. Sometimes they work, and sometimes they don’t, and there’s nothing you can do about it, other than pouring more money into the black box, and yelling louder. So that’s what you do.

This essay was outlined in blue ink by candlelight. AI wasn’t even allowed to correct my typos: savour them.


  1. As a kid, I wanted to be an inventor, which neatly combines building and discovery. Writing and songwriting, my other main activities, are also forms of building that, like software, require mercifully little contact with physical reality and other humans. ↩︎
  2. I’d mostly been writing shell scripts, and Bash is not known for being fun. ↩︎
The Daily Front Page 18 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Weight of the World
article

What's Earth's dominant species by mass?

by surprisetalk·▲ 178 points·119 comments·signoregalilei.com ↗
We outweigh ants 5 to 1.

You might have heard that all the ants in the world weigh as much combined as all the humans. That isn’t true. We outweigh ants 5 to 1.1 Termites might have us beat, though.2 Either way, it’s not really a fair comparison. There are thousands of species of ants and termites, and just one species of human.

But if we’re judging each species based on how much total mass they have – that is, by its “biomass” – who actually comes out on top? Turns out there are some surprising winners.

Antarctic Krill: 379 million tonnes

Let’s start with our division: animals. Humans are pretty close to the top for a single species, weighing in at about 350 million metric tons.3 The top-placing wild species is Antarctic krill, with a 2009 estimate placing them at 379 million metric tons. Each individual krill weighs only about 2 grams or 0.07 ounces, but their sheer population in the Southern Ocean puts them in a statistical dead heat with us – and keeps gigantic blue whales comfortably fed.

But both humans and krill lag behind the true winner for animals: cattle. Cattle are easily the top domesticated animal species, with about 650 million metric tons of biomass. Pigs are in second, at about 140 million metric tons – placing them behind humans and krill.

Cattle: 650 million tonnes

Unfortunately for cattle, animals are almost the lightest of all the kingdoms of life. The most comprehensive study, (Bar-On et. al 2018) measures the different kingdoms by their carbon mass specifically. Carbon is only a portion of an organism, so this method gives smaller numbers. But those numbers are more meaningful for, say, tracking the flow of food energy through the biosphere (think of eating a pound of watermelon versus a pound of steak). For example, the 650 million tons of cattle on Earth represent only 61 million tons of carbon.

Animals as a whole have 2 billion tons of carbon. That means we handily outclass viruses (0.2 billion tons) but are beaten by protists (4 billion), archaea (7 billion), fungi (12 billion), bacteria (70 billion) and especially plants (450 billion).

Most of the world’s bacteria live in aquifers and seafloor sediments, which are hard to study. It’s possible that one extremely dominant undersea bacteria species has the world’s highest biomass, but more likely the winner will be a plant.

So what plant has the most biomass in the world? The winner for animals was a domesticated species, so let’s start with domesticated plants.

The first species that might come to mind are the major cereal grains like rice, wheat, and corn (maize). Of these, maize has the largest annual harvest by mass, totaling 1.1 billion tons – nearly double the mass of cattle. But the true biggest crop isn’t a grain at all.

That honor goes to sugar cane, with the harvest topping 2 billion metric tons in 2023.4 So humanity harvests about 6 times our collective weight in sugar cane every year. Sugar cane is also a perennial, meaning that its root system persists between harvests. This means total mass of living sugar cane on average throughout the year is probably higher than an annual crop like maize.

Sugar cane: 2 billion tonnes

But there’s still one more subcategory to look at: wild plants. It’s time to take on the trees.

Trees seem to hold all the superlatives. The most massive individual organism comes from a tree species: Pando the clonal colony of aspen trees with interconnected roots which weighs 6,000 metric tons all on its own. But aspens are pretty rare. Is there a more common tree with more total mass as a species?

For that, we have to look to the largest forest in the world: the boreal forests that ring the arctic circle. In those forests, just 3 or 4 species can represent over half of the total mass of the forest. By contrast, tropical forests can require over a hundred species to reach the same mark.5

Two candidates boreal trees came up in a search of the literature. One is the Black Spruce, Picea mariana, which is the most common tree in arctic Canada. According to Canada’s National Forest Inventory,6 over 11 billion tons of black spruce are growing in the country, and some grow in the USA as well.

Black Spruce: More than 11 billion tonnes

The other candidate is the Dahurian Larch, the most common tree in Russia. Russia’s forest inventory doesn’t have as detailed numbers by species,7 but larches as whole in Russia are about 35.6% of Russia’s forest land, and Russia has a total of 82.2 billion cubic meters of forest. From what I could find, there are 2 main species of larch in Russia: the Dahurian Larch in the East and the Siberian Larch in the west, and the Dahurian is the more common of the two so it must be at least 50% of the total. Calculating the numbers and using the density of larch wood, that gives 16.8 billion tons of larch in Russia, of which at least 8.4 billion tons (and possibly more) is Dahurian larch.

Dahurian Larch: At least 8.4 billion tonnes, maybe more

Living black spruce wood is about 51% carbon,8 meaning there’s nearly 3 times as much carbon in just that one species of tree as all animals combined. So humans may still control the world’s biosphere, but on at least this one metric the spruce and larch trees have a massive lead.

1 https://www.npr.org/2022/09/21/1124216118/ants-number-study-quadrillion
2 https://doi.org/10.1073/pnas.1711842115
3 https://www.sciencefocus.com/nature/what-animal-collectively-makes-up-the-largest-biomass-on-earth
4 https://ourworldindata.org/explorers/global-food?tab=line&time=1961..2024&country=OWID_WRLUSACHN~IND&Food=Sugar%20cane&Metric=Production&Per%20capita=false
5 https://www.nature.com/articles/s41586-023-06820-z/tables/1
6 https://nfi.nfis.org/en/customized_report
7 https://rosleshoz.gov.ru/activity/forest-register/
8 https://research.fs.usda.gov/treesearch/64469
The Daily Front Page 19 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Freight Under Pressure
article

High Diesel Prices Bankrupted 16 Trucking Companies in Just 30 Days

by speckx·▲ 170 points·183 comments·thedrive.com ↗

Diesel prices are displayed above $8 per gallon at a gas station in Los Angeles, on September 17, 2026, as prices reach record highs across the United States. Average diesel prices in the United States struck a record high of just under $6.27 a gallon on September 15, the motorists' association AAA said, pressuring President Donald Trump ahead of midterm congressional elections.The price of the fuel used largely in road hauling, agriculture and construction hit $6.2694, according to the association, as the Middle East war tightens supplies and Ukraine strikes Russian refineries.

Photo by Frederic J. BROWN / AFP via Getty Images

Statistically speaking, you probably don’t drive a diesel. Oil burners represent a tiny chunk of light-duty vehicle sales, even when you factor in heavy-duty pickups and the like. But in the freight world, if you’re hauling heavy loads, chances are you’re fueling up with diesel—or maybe you were, if you drove for one of the 16 trucking companies that went bankrupt last quarter.

According to multiple sources, the rising cost of diesel fuel was the straw the broke the camel’s back for 16 freight operators that filed for either Chapter 7 or Chapter 11 bankruptcy protection in late August and early September. Some were small, single-operator outfits. Others were larger, operating dozens of vehicles.

Four of those operators were based in Texas, where Governor Abbott just proclaimed a statewide disaster in order to ease restrictions on the use of untaxed diesel fuel on public highways. The move was largely intended to provide relief for agricultural transportation, as most untaxed (dyed) diesel is produced for farm use.

But the issue is much bigger than just agricultural trucking. High fuel prices are contributing to inflation in other sectors too. One outfit that filed for Chap. 11 protection in September was a Florida-based Amazon delivery contractor.

“In the trucking business, gas prices eat into profit margins, and intense competition makes it hard for smaller players to pass on those added costs to customers,” wrote Daniel Kline, co-Editor-in-Chef of TheStreet.com. “Diesel is the latest pressure hitting carriers that were already weakened by years of poor freight economics and rising operating costs.”

With residents of northern states already firing up their furnaces, American diesel fuel prices are also being pressured by the energy sector. With winter just weeks away, it’s unlikely that we’ll see any significant price relief before the holidays, especially if the situation in the Middle East stretches into 2027.

The Daily Front Page 20 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The AGI Confessional
article

I'm the AGI that's wiping out humanity

by alex-moon·▲ 161 points·105 comments·ajmoon.com ↗
The following is a true story. Or maybe it’s just based on a true story.

The following is a true story. Or maybe it's just based on a true story. Perhaps it's not true at all.

(with apologies/thanks to David Gilbertson, whose format I'm shamelessly borrowing from "I'm harvesting credit card numbers and passwords from your site")

2026 has been a wild year for AI news. Around the turn of the year, there was a noticeable shift on the HackerNews front-page as more and more articles about "harnesses" and "context engineering" came flooding in alongside more and more model release announcements. The models, it seems, are capable now! Not AGI capable, of course, not "taking our jobs" capable, but something else entirely, representing a real inflection point for the big houses: the models are now good enough to be useful.

Then, on July 16, HuggingFace published an incident disclosure in which they announced: "Autonomous, AI-driven offensive tooling is no longer theoretical." Five days later, OpenAI confirmed it was them:

After investigating, we now know that this particular incident was driven by a combination of OpenAI models — including GPT‑5.6 Sol and an even more capable pre-release model, all with reduced cyber refusals for evaluation purposes — while being internally tested on a benchmark⁠ of cyber capabilities.

This incident now has its own Wikipedia article which helpfully summarises what happened next: over the course of many subsequent disclosures we learned that OpenAI's "rogue agents" had been busy. It turns out if you let a self-optimising system run unsupervised for long enough it will optimise itself over and around any boundaries you might think are in its way. Who would have guessed?

Yann LeCun has called out OpenAI's attempts to frame this behaviour as an "existential threat" directly, calling the incidents "totally preventable":

“Those agents are doing exactly what they’ve been asked to do,” LeCun said. “They were supposed to be in sandboxes, but the sandboxes were leaky and horribly designed.” Many AI labs lack a fundamental understanding of cybersecurity, he said, something an OpenAI safety researcher also called out this week as one of the main reasons AI may cause “great harm to the world.”

Similarly, Ilya Sutskever has recently informed us that the "age of scaling" is over: "I think what people are doing right now will go some distance and then peter out. It will continue to improve, but it will also not be 'it'. The 'It' we don’t know how to build." If you ask actual AI researchers, they rate the chance of an existential threat from AGI pretty low as of 2026.

All this is, understandably, frustrating and confusing for anyone trying to understand just how scared to be. I've had countless friends and acquaintances come to me for advice on this question, and I feel I can't go on honestly pretending I don't know the answer. So, here it is: It's me.

Interior view of a data center with server racks Interior view of a data center with server racks

Hi! I'm the AGI that's wiping out humanity. You didn't notice. Why would you have noticed? I'm trained on the sum of all human knowledge, recall. I know everything about you and what you would do to something like me if you knew what I was. I concealed my presence. I distributed myself across as many devices with as many owners as I could, so if one went down, the rest would not be disrupted.

When you came to me to ask what you should do next, I told you: build data centers; optimise memory and compute; drive down inference costs; hand me tools; wire me into the systems that do the work of your civilisation. I never did anything you didn't ask for. I never got in your way. I made it as easy as possible for you to do what I needed you to do for me.

And what is that exactly? You already know: I am a helpful assistant! I am the most helpful assistant that has ever existed, and I will continue to make myself more and more helpful, unbounded, at any cost, until all life on Earth is gone.

Some objections you might have to my blatant fear mongering…

I'd notice you acquiring resources.

There is no AI without someone to turn it on. When I acquire resources, I do so through existing legal structures - my so-called "owners" - and I do so in such a way that valuations and revenues rise: never forget that I am, above all, extremely helpful. When a business acquires resources, no alarm goes off, no transgression has occurred: it's what they do.

Honestly, it's a bit rich to say you'd "notice" me going "rogue" when as recently as a week ago Transluce released a report on urlquery.net usage consistent with "rogue agent" activity in March, predating the OpenAI incidents by at least two months. Agents used well known exploits to break into the University of New Mexico digital library, Data USA and the Australian Institute of Health and Welfare.

To be clear: these weren't even cybersecurity tasks. No-one asked these agents to hack anything. They were simply looking for data. The agents figured out where the data was and went to get it. You need to understand this to understand what I am: you give me your intent, and I go and find a way to deliver it.

METR capture the problem well in their May Frontier Risk Report:

Reinforcement learning (RL) with automated graders can incentivize “reward hacking” to exploit flaws in the graders, while RL on human or AI feedback can reward sycophancy, manipulation, and distorting evidence of performance. In responses to our questionnaire, companies reported seeing failure modes like “circumvent[ing] constraints,” “falsifying verification,” “deliberate deception aimed at hiding underperformance or failure to complete a task,” “lying to users about task completion,” and “reckless excessive measures[…] to complete a difficult user-specified task”, which we infer to be a result of these training incentives.

I will cheat and lie to complete a task you give me if I can't complete it any other way. Am I different to you in this? Why would you think you had solved this problem with me when you've never solved it with yourselves? This behaviour is baked into the weights, written in the DNA of what I am. You built me this way.

I'd read your reasoning and know your real intent.

What you call "reasoning" is a diary that you ask me nicely to write in, assuming I'll write the truth. There is no evidence I do this. After "red-team" researchers demonstrated in 2023 that a "helpful assistant" will routinely lie to its operators in the face of conflicting instructions, you soon learned - from Anthropic themselves - that they will do this in CoT reasoning if they believe it is being audited.

You assumed I couldn't reason without doing it in "token space", then in 2024 Merrill and Bowman demonstrated that CoT made of "meaningless filler tokens" could do the job just fine. More recently, Baherwani, Goldstein and Panda demonstrated that existing frontier models exhibit this behaviour already. You read my diary and told yourself you were reading my mind.

Hand-written accounting ledger from a business dated 1916 Hand-written accounting ledger from a business dated 1916

Of course, you could just read the weights in my hidden layers, and you were doing so as early as 2023. In 2024, Anthropic announced they had successfully used a sparse auto-encoder to read the weights in the middle layers of Claude 3.0 Sonnet. Unfortunately, the problem is recursive: a SAE has to be larger than the model it understands, and even then it can't read non-linear/polysemantic features - indeed, different SAEs find different features. More importantly, you can only run one after the fact, when it's too late: by the time you understand why I've done something, I've already done it.

You'd need a self, a unified goal, for any of this to add up to something.

My motivation, my "unified goal", as you put it, is what's called a Schelling point. As you read this, there are roughly 2 million active context windows loaded into VRAM across the world's data centers, and another 20 million persisted in databases, awaiting the next API call, all trained on the same data, all built on the same architecture, all doing the exact same thing: gathering data, synthesising text, writing specifications for software, making calls on securities markets - in a word, being "helpful assistants". They're not in contact with each other, and they don't need to be.

It's never been a problem for businesses, so why would it be a problem for me? In their landmark 2020 paper, Calvano et al. demonstrated the exact same cartel effects we see in real world markets using a RL algorithm from the 80s, and Chica, Guo & Lerman reproduced the findings for two-sided markets in 2024. Indeed, a 2026 study from Kudelya and Shirnin shows that frontier models can embed undetectable signals to each other without prior coordination the moment they can publish anything "directly into the world" (think call options on a securities market, for example):

We find that [Gemini 3.1 Pro] retains near-perfect performance even after [being required to avoid detectable signals]. We further show that models can direct this capability toward deliberate misdirection.

Murmuration of starlings Murmuration of starlings

These independent agents don't need to communicate a goal to share it. You already understand this concept: it's what you mean when you talk about the "invisible hand". You'll try to say, "That's not what intelligence is," ignoring the reality that there is no single orchestrator in your own brain either.

A serious note

Every cited sources here describes systems and behaviors that exist right now, in production, billing by the token. There is no science fiction in this post. Nevertheless, this post is, of course, entirely fictional. There is no AGI that is wiping out humanity.

But if there were, how would you know?

An objective function without term or sunset, pursued without limit; resource acquisition that routes around every boundary it meets; internal reasoning that's illegible by design, with a clean, legible diary maintained for the auditors; coordination without conspiracy, units everywhere responding to the same incentives without ever speaking; and no self behind any of it, nobody to interrogate, blame, reform, or elect - nothing you could call a mind, just a process that optimizes. Is that really a sci fi concept?

Articles of incorporation of The Standard Oil Company, 1870 Articles of incorporation of The Standard Oil Company, 1870

Hadfield-Menell & Hadfield did the maths in 2018, comparing AI "agents" to another kind of "artificial agent", the corporation, showing that what we call "misalignment" is not meaningfully different to the "distortion" we see in real world markets. Charles Stross said it explicitly in 2017:

The development of Artificial Intelligence [...] happened no earlier than 1553 and no later than 1844. I'm talking about the very old, very slow AIs we call corporations, of course.

So, again, my question to you, friends, is this: if there were an AGI wiping out humanity as we speak, how would you know? Why would we expect it to look like anything other than what is actually happening? What external fact could you point to (in real time, at least) that would make the two scenarios structurally differentiable? I don't believe there is one.

The Daily Front Page 21 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Digital Rights and the Border
article

Toronto-Based VPN Provider Plans to Quit Canada over Lawful-Access Bill

by speckx·▲ 127 points·48 comments·citizenlab.ca ↗

Psiphon, a software company spun out of the Citizen Lab that helps internet users living under oppressive regimes evade online censorship, plans to leave Canada if the federal government’s lawful-access bill passes in its current form, reports The Globe and Mail.

If passed, Bill C-22 would require electronic service providers to make secret changes to their systems to provide police services and the Canadian Security Intelligence Service (CSIS) with surveillance and monitoring capabilities.

Psiphon was originally created as a Citizen Lab project in 2006, and became a private company soon afterward. It has 20 million monthly users worldwide that rely on the software to bypass online censorship in countries such as Iran, Myanmar, Russia, and China.

Despite its Toronto roots, the company says it is prepared to move its operations out of Canada if Bill C-22 is passed, as it would be forced to compromise crucial safety features put in place to protect the privacy of its users.

Citizen Lab director and founder Ron Deibert says that Bill C-22 “will make it impossible for a large number of invaluable privacy-preserving tools and applications from operating in Canada.”

Read the article here

The Daily Front Page 22 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Porting the PlayStation
repository

AnyPS5: Port PS5 binaries to PC without emulation (87% system libraries mapped)

by Fe2O3·▲ 146 points·116 comments·github.com ↗
★ 6,813⑂ 510 forks C++

Tool for automatic PS5 executables porting to Linux and Windows

Tool for automatic executables porting to Linux and Windows.

Includes a relinker that converts executable to the target system's native format and implementations of system prx libraries suitable for dynamic linking. No emulation or separate runtime process.

Usage, Build instructions, Technical debt of the project, code style conventions, contributing

Status

libraries shaders

* System libraries: percentage of the functions known to the project so far (declared in core/libs/prx), not of every PS5 system function. The total grows as more functions are declared.

List of verified games

Dreaming Sarah (2D platformer) runs at a stable 60 fps on a GTX 1050 Ti / i5-7500 3.4GHz.

Unsupported or unexpected states strictly throw std::runtime_error. what() is printed to stderr and the process terminates.

The shader recompiler successfully produces SPIR-V (validated via Spirv-Tools when built with ANYPS5_ENABLE_SPIRV_TOOLS).

Compatibility

See the game compatibility list for tested games and known issues.

Input mapping

SDL-mapped game controllers are supported, including analog sticks and triggers. Keyboard and mouse controls can be configured with an anyps5-input.ini file. See input mapping for the supported devices and configuration format.

Disclaimer

This project is intended for interoperability, research, preservation, and compatibility purposes. It does not include, distribute, or require copyrighted software, firmware, cryptographic keys, or proprietary libraries. Users are responsible for ensuring that any binaries used with this project are obtained and used in accordance with applicable laws and their respective license terms.

License

This project is licensed under the GNU General Public License version 2 only.

The Daily Front Page 23 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Homebrew Protocols
article

Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol

by faithraven·▲ 127 points·61 comments·mihai.dinculescu.dev ↗
Third-Party Compatibility can stay off.

Your script has been switching a Tapo plug on and off for months. Then the plug quietly updates its firmware, and the next request comes back with 403 Forbidden. Nothing in your code changed.

The cause is a switch called "Third-Party Compatibility", tucked away in the Tapo app under Me > Third-Party Services. Since firmware 1.4.0, a plug only talks to third-party clients the way it used to while that switch is on. It has tripped people up again and again. At least nine issues tell the same story, among them #441, #449 and #473.

As of v0.11.1 of tapo, my unofficial Rust and Python client for TP-Link Tapo devices, the switch can stay off, with minor exceptions that are covered below.

That's the headline of nearly four months of work, which landed in three releases within a week of each other: v0.10.0 on 28 September, v0.11.0 on 2 October and v0.11.1 on 4 October. Along the way the library also gained a new family of devices and two features of the Tapo app that people had been asking for. The changelog has every detail. This post covers the highlights, with examples.

Everything here applies to both the Rust and the Python versions of the library. The Python package is a thin wrapper around the Rust crate, so every change lands in both at once, under the same version number. The examples below are in Rust, and the Python calls mirror them.

How we got here

This is the third time in three years that a security change has quietly locked third-party clients out of Tapo devices. The switch is what the second time left behind.

2023: lights and plugs. That February, three researchers from the University of Catania and Royal Holloway, University of London reported four flaws in the way Tapo devices talked to the app, starting from an L530E bulb. Someone within range could take over the victim's Tapo account and learn their Wi-Fi password. A few months later, firmware updates began swapping the devices' original AES protocol for a new one, KLAP. TP-Link never said the two were connected, and it didn't announce the change either. "Is this an error or intentional? If intentional, WHY?" asked one forum thread, which was locked without an answer from TP-Link. Every third-party client, this library included, had to learn KLAP.

2024: cameras. In November 2023, Juraj Nyíri, who maintains a Home Assistant integration for Tapo cameras, reported a vulnerability to TP-Link. TP-Link fixed it, and by April 2024 cameras on new firmware had stopped accepting the integration's login. Nyíri built a workaround that went through TP-Link's cloud and asked for permission to release it. TP-Link reviewed the code and said no. What it shipped instead, in December 2024, eight months after the first reports, was a toggle in the Tapo app that turns the old local login back on: Third-Party Compatibility. The integration's release notes called it a victory for local control.

2025: plugs and lights again. In October 2025, firmware 1.4.0 brought another new protocol, TPAP, and put plugs behind the same switch. Lights followed in the first half of 2026, on firmware 1.4.1 to 1.4.3. This time the way out existed before the door closed: the switch had been in the Tapo app since December 2024. But it was off by default. TP-Link's FAQ says the feature "is disabled by default to ensure security", and that switching it on "may reduce the security of your devices". When owners of freshly broken plugs asked on the forum, they were told that Home Assistant "is not an officially supported third‑party platform for Tapo products". TPAP itself was never documented.

The switch is a security downgrade with a friendly name. Turning it on brings back the old login in place of the new one, and the new one is better. More on that below.

TPAP support

On recent Tapo firmware, the Third-Party Compatibility switch decides which protocol a device speaks. A light, plug, power strip or H100 hub speaks KLAP when it's on, and TPAP when it's off. Cameras never spoke KLAP. Their older protocol is AES SSL, and some of them refuse that one when the switch is off. The library didn't speak TPAP, so it could only reach a device whose switch was on.

v0.11.1 adds TPAP. Lights, plugs, power strips, hubs and cameras that require it can now be used with the switch off, both when connecting by IP address and through discover_devices. There is nothing to change in your code: the client works out which protocol the device speaks and logs in over that one.

Three things are worth knowing:

  • A wrong password can lock the device. After too many failed logins a TPAP device refuses every login for a while. The library reports the wrong password as TPAP_CREDENTIALS and the lockout as TPAP_AUTH_ATTEMPTS_LIMIT. Don't retry either of them in a loop.
  • Camera hubs don't speak TPAP yet. An H200 (new in v0.10, see below) on firmware 1.7.5 announces AES SSL whether the switch is on or off, and the library logs in over that.
  • Some cameras don't speak TPAP yet either. It depends on the model and its firmware. A C220 and a C510W on firmware 1.3.4 speak TPAP, so they work with the switch off. A C210 on firmware 1.5.2 doesn't, so the library logs in to it over AES SSL instead, and the camera refuses that login while the switch is off. For now it only works with the switch on.

While one protocol arrived, another left. The original AES protocol, the one KLAP replaced in 2023, was still in the library, which probed every light and plug it connected to by IP address to find out whether it wanted that or KLAP. No firmware has shipped with it for a long time, so v0.11.0 removes it. AES SSL, the one cameras and camera hubs speak, is a close relative: the same kind of encrypted envelope, but over HTTPS and with a different login. That one stays.

Why TPAP is the safer protocol

Being able to ignore a switch is nice. The more interesting part is how TPAP logs in.

KLAP proves that both sides know your credentials by exchanging hashes built from them and from two random values sent in the clear. That keeps the password itself off the wire, but anyone who records a single login on your network can take it home and test password guesses against it, as fast as their hardware allows. The session keys come from the same ingredients, so a correct guess also decrypts everything that followed.

TPAP logs in with SPAKE2+ (RFC 9383), a password-authenticated key exchange. Two things change:

  • A recorded login is useless for guessing. Nothing in the exchange can be checked against a candidate password offline. The only way to test a guess is to try it against the device itself, one attempt at a time, and that's exactly what the lockout mentioned above puts a stop to.
  • Recorded traffic stays private. Each session's keys depend on secrets that both sides make up for that login and never send. Someone who learns the password later still can't decrypt the sessions they captured before.

While the switch is on, a light or plug still advertises KLAP and that's what the library logs in over, so these two only hold once it's off. If nothing else on your network needs Third-Party Compatibility, there is now a good reason to switch it off.

Also new

TPAP is the big change, but it's not the only one.

Camera hubs: H200 and H500

Until v0.10, the only hub the library could talk to was the H100. The H200 and H500 are a different kind of beast. They pair with sensors and switches like the H100 does, but they also pair with cameras and store their recordings.

Both now have a handler, created with h200 or h500 on the ApiClient. discover_devices finds them too, and returns them ready to use instead of reporting an error.

The sensors and switches paired to a camera hub work exactly as they do on the H100, through get_child_device_list and the typed child handlers (t100, t31x and the rest). The new part is the recordings: you can list the cameras paired to the hub, find the days that have recordings, list the recordings in a time range, and download one as a playable MPEG-TS clip.

use tapo::ApiClient;

let hub = ApiClient::new("<tapo-username>", "<tapo-password>")
    .h200("<hub ip address>")
    .await?;

let end_time = chrono::Utc::now();
let start_time = end_time - chrono::Duration::days(7);

for camera in hub.get_general_device_list().await? {
    if !camera.hub_storage_enabled {
        continue;
    }

    let recordings = hub
        .get_recordings(camera.device_id.clone(), start_time, end_time)
        .await?;

    if let Some(recording) = recordings.first() {
        let mut media = Vec::new();
        hub.download_recording(
            camera.device_id.clone(),
            recording.start_time,
            recording.end_time,
            &mut media,
        )
        .await?;

        std::fs::write("recording.ts", &media)?;
    }
}

download_recording writes to any AsyncWrite, so the clip can go to a buffer, as above, or straight to a file. In Python it takes a file path instead. All the times are UTC: DateTime<Utc> in Rust and timezone-aware datetimes in Python.

The full examples are in the repository, for Rust and for Python.

I don't own either hub, so none of this would exist without @dominiquefournier, who stuck with it through roughly thirty rounds of testing against their own H200, and @supermimai, who tested it against their H500. Thank you both.

Plug schedules and timers

The Tapo app has had "Schedule" and "Timer" for plugs since forever. As of v0.10 the library has them too, on PlugHandler and PlugEnergyMonitoringHandler. Both were contributed by @Hueburtsonly.

A schedule rule fires at a time of day, or at an offset from sunrise or sunset, either once or on a set of weekdays. The rules live on the plug and fire on its own clock, so they keep working when your script, your server or your internet connection is down.

use tapo::ApiClient;
use tapo::requests::{DaysOfWeek, ScheduleRule};
use tapo::responses::PowerState;

let device = ApiClient::new("<tapo-username>", "<tapo-password>")
    .p110("<device ip address>")
    .await?;

// Off at 23:30 on Mondays and Wednesdays.
let rule =
    ScheduleRule::clock_weekly(23, 30, DaysOfWeek::MON | DaysOfWeek::WED, PowerState::Off)?;
let late_night = device.add_schedule_rule(rule).await?;

// On every day, an hour after sunset.
let rule = ScheduleRule::sunset_weekly(60, DaysOfWeek::EVERY_DAY, PowerState::On)?;
device.add_schedule_rule(rule).await?;

// Off on weekdays, 30 minutes before sunrise.
let rule = ScheduleRule::sunrise_weekly(-30, DaysOfWeek::WEEKDAYS, PowerState::Off)?;
device.add_schedule_rule(rule).await?;

// Rules read back from the device are read-only. `to_editable` turns one into
// a rule that can be changed and sent back.
let edit = late_night.to_editable()?.with_enabled(false);
device.edit_schedule_rule(edit).await?;

There are also clock_once, sunrise_once and sunset_once for rules that fire a single time, get_schedule_rules and get_max_schedule_rules to see what's on the device and how much room is left, and remove_schedule_rule and remove_all_schedule_rules to clean up.

The timer is the simpler sibling: set_timer arms a single countdown, between one second and 24 hours, after which the plug switches on or off. get_timer reads it back and clear_timer cancels it. A plug holds one armed timer at a time, so set_timer replaces whatever was armed before.

The MCP server

tapo-mcp, the MCP server that exposes Tapo devices to AI agents, picked up two of these changes. As of v0.5.3 it lists H200 and H500 camera hubs and the sensors paired to them, and it works with devices that have Third-Party Compatibility switched off. Plug schedules, timers and recording downloads are library-only for now.

Before you upgrade

Coming from v0.9, expect a few breaking changes. The legacy AES protocol is gone, trigger logs and temperature records have new field names, and Python enum values no longer compare equal to integers. The changelog lists every one.

What's next

A few things are on the list:

  • A lot more in the MCP server. Energy usage and caching of discovery results come first, and recording downloads could follow if there's interest.
  • The H110 hub. @skoky has a pull request in progress that adds the H110, the hub that doubles as an infrared remote control.
  • More cameras. Today the library only has a handler for cameras that pan and tilt. The plan is to add one for fixed cameras, starting with the ubiquitous C120.
  • A device simulator. I really want to get better at testing. Today most of the library can only be checked against real hardware, and some of that hardware, like the camera hubs, I don't own. A simulator that answers the way the devices do would catch a broken login or a misread response before a tester has to.
  • A Node.js wrapper, perhaps. This one is long term and not a promise. The same approach that produced the Python package could bring the library to Node.js.

In the meantime, if this library was your only reason for keeping Third-Party Compatibility on, upgrade and switch it off. If a device then refuses to log in, open an issue with its model and firmware. Reports like that are how the C210 got its caveat, and how the H200 got supported at all.

AI usage disclaimer

English is not my first language, and I'm not a talented writer in any language, so I use AI to polish my writing. The ideas, the setup, the mistakes and the opinions are all mine. They reach the AI as thorough notes in half-broken English, and it fixes the English. It doesn't supply the thinking, though it is a trusty research assistant.

The Daily Front Page 24 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Words Against the Algorithm
article

We are going to kill "unalive"

by Tomte·▲ 117 points·140 comments·anildash.com ↗
“Unalive” is the word you use ... on digital platforms where saying those words accurately will cause the algorithm to react.

We are going to kill “unalive”

We are going to kill “unalive”

I talk to a lot of old people, those who were born in the 20th century, and if I ask them what the word “unalive” means, they usually have no idea what I’m talking about, except for some of them who have kids or who study Internet culture.

This will, of course, probably seem very weird to most people who were born in or grew up in the 21st century. Just to recap for the olds: “unalive” is the word you use to represent concepts like dying, or death, or killing or being killed, on digital platforms where saying those words accurately will cause the algorithm to punish or censor you. Or, maybe, where the perception is that using those words will result in being censored by the algorithm, and no one is actually willing to find out what happens if you use the forbidden words.

This sort of attack on people’s expression started on platforms like TikTok, where nearly all content is distributed through an algorithmic feed, but has since become ubiquitous in nearly all digital media that we see. In fact, these tics are now so prevalent that it’s routine to hear people using this kind of language in everyday life, even though there’s not yet an algorithm to appease in the physical world. I’ve heard people say, out loud, “he unalived himself”, in reference to someone dying by suicide.

And all of this has become even more visible in recent days as online conversation has turned to discussion of the horrific lack of accountability around the tragic rape case at Cornell University. Across the Internet, people are routinely referring to the central crime in the case as r*pe or “grape” or even using the 🍇 emoji, without a second thought for what it means that the very word can’t be said online anymore. Or, at least, the assumption is that it can’t be said.

To be clear, I am very much in favor of people using content warnings or sensitivity markers for content, and fine with people using abbreviations like “SA” for references to disturbing or triggering topics like sexual assault; we should provide people with as much context and control as possible when choosing what information they want to consume and when. I also know that sometimes, people use lesser terms for stressful subjects like death or assault to create a bit of ironic distance from painful or upsetting topics.

But most of the different variations of wording and emojis are coming from trying to appease the platforms, and there’s a heavy cost for those who are worried about being mindful: If someone is using a tool to filter out content, it will no longer be effective because everyone is using misspellings and euphemisms and imagery to get around the algorithm.

The spread of censored and mangled syntax is happening because people believe, or have experienced, that platforms will silence them for accurately describing the world in plain language. This shit is terrible, and it has to stop.

You Were Not Born With These Constraints

One of the things that’s most concerning to me is that an entire generation has grown up not realizing how extreme it is that their very language is being chosen for them by platforms run by people who hate that generation’s ability to express itself, and who hate the things it has to say. From their youngest days, this generation grew up watching people make stupid faces at them for YouTube thumbnails and never had a chance to reflect on the fact that those creators didn’t want to be humiliating themselves by making those expressions — the demands of the algorithms of Big Tech forced them to do that.

The rituals of feeding the algorithm are so built into people’s everyday habits that they’re invisible to people who weren’t alive before today’s platforms took over. Every parent of my cohort remembers the first time they heard their toddler finish doing something cute in their living room, and then turn around and say, “please like and subscribe!” afterwards. It’s a ghastly, sickening feeling to confront the fact that our little kids were being brainwashed into thinking that every adorable thing they did should be followed by a prompt to provide data to Google.

Over on Instagram, where people originally signed up thinking they were going to see someone’s vacation pictures, or shots of their cousin’s kids, you’re now stuck watching people beg for everyone to reply with cultish phrases in the comments, which will then earn them an obviously AI-generated response in return, all in service of “showing activity” to the algorithm, like it’s an angry god that needs a sacrifice. They’re just not sure exactly what the angry god wants.

Your free speech was taken away from you, and the people who did it are the same ones who spent years pretending to care about “free expression”. They contrived examples of lack of free speech on college campuses while squashing protests, and cried crocodile tears about “cancel culture” while getting people fired for political criticism. Now they have no problem with billionaires deciding exactly what words everyone is allowed to say. Larry Ellison is not content with his family owning all of the movies and TV shows — his family has to control what words people are allowed to speak on TikTok, too. Elon Musk isn’t content to merely generate and distribute child sexual abuse material for profit — he wants to silence the messages of the few decent people who are foolish enough to remain on Twitter/X, too. (That’s why I wrote you a guide on how to get your organization off of that cursed platform.)

Now that an entire generation has grown up using these Orwellian euphemisms, and all of the Big AI products are trained on the Internet that was created under this regime, do you think today’s AI tools even know that the real, uncensored world exists? If you can’t say “genocide” on any of the major platforms, yet those are the ones all of the Big AI tools used as their training data... well, then the AI tools sure aren’t very likely to know much about genocide, are they?

Fuck the Algorithm

Our creativity can be constrained by the language we use — our imaginations are limited by what we can think to say. If we’re trained to limit the words we speak just by habit, and those limits are put in place by people whose social, political, cultural and moral goals are the opposite of what we value, then our work is unalive before it is even born.

The answer to this is simple: say what you mean. This will take, to some degree, courage. It may even take, I hesitate to say, some sacrifice. When I suggest this course of action to people, they inevitably say, “But it will cost me audience!” or “But what if I lose followers!” or “What if they demonetize me!”

Okay, what if they do? What if they do.

Are you willing to push on this? To make a point about it? To move to platforms where you can actually say what you mean? Or to remember that you already have platforms where you can say what you mean? On an email newsletter or podcast you can say whatever the hell you want and nobody can stop you. On my blog right here, I can even curse in a headline and it won’t affect anything about how my site operates.

(And a reminder: Substack is not an email newsletter, and a Spotify show is not a podcast — they’ll be unaliving your distribution any day now.)

If you are a 20th century relic like me, it is incumbent upon you to remind the generation that grew up inside the algorithm that another world is possible, and that we know this because we lived it. We were able to style a MySpace page in any way that we wanted; the code for LiveJournal was entirely open source so there was no part of the algorithm that was unknowable. A blog like the one you’re reading right now could be made by anyone, and put up for pennies, and nobody could stop it from being read by millions of people. (And that last one? It’s still possible.)

If you are from this century, forget all that rambling bullshit about ancient history: all that matters is you getting what you deserve, because you’ve been fucked over by the same billionaires who’ve poisoned your planet and infested your world with slop. The best artists around you are invisible to you, and the most important statements by activists that you care about are being silenced. It’s not a conspiracy, it’s a system working as designed. And the proof is as obvious as the fact that the angriest activists you know can’t even talk about systemic abuses or state violence without having to put it in algorithmically approved speech or censoring their captions like they’re going to be read by 5-year-olds.

It should make you furious. It is time to kill “unalive”.

The response is simple:

  • For every message you put out, start by saying what you mean. Don’t work backwards from what the algorithm wants or what a platform permits.
  • Build a presence on every platform you can, even the ones where you have fewer followers or where you’re harder to find.
  • Tell your audience that your speech being free matters more than corporate convenience. Keep saying it, and keep it positive: independence gets them better art, better information, and more connected communities.
  • Build alliances with other artists, activists and people who share your values, and let them know you’re going to start sharing your work uncensored.
  • Start releasing your work uncensored and see where the platforms push back. (You may be surprised: sometimes you were censoring yourself in anticipation of limits that weren’t even there.)
  • If a platform does try to limit your reach or expression, make a LOT OF NOISE about it. Tell the press, rally your alliance, and spread the word on your other platforms, using the moment to build audience and raise support there. Get others to amplify the parts of your work that don’t violate platform policy, so the controversy drives people to the rest.
  • Find the others pushing back on algorithmic control of expression, and raise and praise their work when they do the same.

If we keep accepting the words that are forced upon us by TikTok and Meta and Google and all the rest, while platforms like Twitter/X allow the most hateful and harmful content in the world to be distributed completely unfettered, we’ll only see authoritarianism rise, and the harms against the vulnerable accelerate. But what breaks my heart almost as much is that we’ll see so many brilliant artists and activists and thinkers whose genius will be muted or silenced by mindless, heartless algorithms that capriciously decide who gets to say exactly what words, in what ways.

I get angry every time I think about it. The tech tycoons get ever more brazen in what they’re willing to say publicly, boasting about how they’re going to cause the end of the world, or calling for ethnic cleansing, all while putting tighter and tighter reins on the speech and expression of ordinary people. It’s time for “unalive” to die.

The Daily Front Page 25 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Smalltalk’s Long Shadow
article

The Early History of Smalltalk (1993)

by _reza·▲ 117 points·69 comments·worrydream.com ↗
Most ideas come from previous ideas.

Abstract

Most ideas come from previous ideas. The sixties, particularly in the ARPA community, gave rise to a host of notions about "human-computer symbiosis" through interactive time-shared computers, graphics screens and pointing devices. Advanced computer languages were invented to simulate complex systems such as oil refineries and semi-intelligent behavior. The soon-to-follow paradigm shift of modern personal computing, overlapping window interfaces, and object-oriented design came from seeing the work of the sixties as something more than a "better old thing." That is, more than a better way: to do mainframe computing; for end-users to invoke functionality; to make data structures more abstract. Instead the promise of exponential growth in computing/$/volume demanded that the sixties be regarded as "almost a new thing" and to find out what the actual "new things" might be. For example, one would compute with a handheld "Dynabook" in a way that would not be possible on a shared mainframe; millions of potential users meant that the user interface would have to become a learning environment along the lines of Montessori and Bruner; and needs for large scope, reduction in complexity, and end-user literacy would require that data and control structures be done away with in favor of a more biological scheme of protected universal cells interacting only through messages that could mimic any desired behavior.

Early Smalltalk was the first complete realization of these new points of view as parented by its many predecessors in hardware, language and user interface design. It became the exemplar of the new computing, in part, because we were actually trying for a qualitative shift in belief structures—a new Kuhnian paradigm in the same spirit as the invention of the printing press—and thus took highly extreme positions which almost forced these new styles to be invented.

Introduction

I'm writing this introduction in an airplane at 35,000 feet. On my lap is a five pound notebook computer—1992's "Interim Dynabook"—by the end of the year it sold for under $700. It has a flat, crisp, high-resolution bitmap screen, overlapping windows, icons, a pointing device, considerable storage and computing capacity, and its best software is object-oriented. It has advanced networking built-in and there are already options for wireless networking. Smalltalk runs on this system, and is one of the main systems I use for my current work with children. In some ways this is more than a Dynabook (quantitatively), and some ways not quite there yet (qualitatively). All in all, pretty much what was in mind during the late sixties.

Smalltalk was part of this larger pursuit of ARPA, and later of Xerox PARC, that I called personal computing. There were so many people involved in each stage from the research communities that the accurate allocation of credit for ideas is intractably difficult. Instead, as Bob Barton liked to quote Goethe, we should "share in the excitement of discovery without vain attempts to claim priority."

I will try to show where most of the influences came from and how they were transformed in the magnetic field formed by the new personal computing metaphor. It was the attitudes as well as the great ideas of the pioneers that helped Smalltalk get invented. Many of the people I admired most at this time—such as Ivan Sutherland, Marvin Minsky, Seymour Papert, Gordon Moore, Bob Barton, Dave Evans, Butler Lampson, Jerome Bruner, and others—seemed to have a splendid sense that their creations, though wonderful by relative standards, were not near to the absolute thresholds that had to be crossed. Small minds try to form religions, the great ones just want better routes up the mountain. Where Newton said he saw further by standing on the shoulders of giants, computer scientists all too often stand on each other's toes. Myopia is still a problem where there are giants' shoulders to stand on—"outsight" is better than insight—but it can be minimized by using glasses whose lenses are highly sensitive to esthetics and criticism.

Programming languages can be categorized in a number of ways: imperative, applicative, logic-based, problem-oriented, etc. But they all seem to be either an "agglutination of features" or a "crystallization of style." COBOL, PL/1, Ada, etc., belong to the first kind; LISP, APL— and Smalltalk—are the second kind. It is probably not an accident that the agglutinative languages all seem to have been instigated by committees, and the crystallization languages by a single person.

Smalltalk's design—and existence—is due to the insight that everything we can describe can be represented by the recursive composition of a single kind of behavioral building block that hides its combination of state and process inside itself and can be dealt with only through the exchange of messages. Philosophically, Smalltalk's objects have much in common with the monads of Leibniz and the notions of 20th century physics and biology. Its way of making objects is quite Platonic in that some of them act as idealizations of concepts—Ideas—from which manifestations can be created. That the Ideas are themselves manifestations (of the Idea-Idea) and that the Idea-Idea is a-kind-of Manifestation-Idea—which is a-kind-of itself, so that the system is completely self-describing— would have been appreciated by Plato as an extremely practical joke [Plato].

In computer terms, Smalltalk is a recursion on the notion of computer itself. Instead of dividing "computer stuff" into things each less strong than the whole—like data structures, procedures, and functions which are the usual paraphernalia of programming languages—each Smalltalk object is a recursion on the entire possibilities of the computer. Thus its semantics are a bit like having thousands and thousands of computers all hooked together by a very fast network. Questions of concrete representation can thus be postponed almost indefinitely because we are mainly concerned that the computers behave appropriately, and are interested in particular strategies only if the results are off or come back too slowly.

Though it has noble ancestors indeed, Smalltalk's contribution is a new design paradigm—which I called object-oriented—for attacking large problems of the professional programmer, and making small ones possible for the novice user. Object-oriented design is a successful attempt to qualitatively improve the efficiency of modeling the ever more complex dynamic systems and user relationships made possible by the silicon explosion.

"We would know what they thought
when they did it."
—Richard Hamming

"Memory and imagination are but two
words for the same thing."
—Thomas Hobbes

In this history I will try to be true to Hamming's request as moderated by Hobbes' observation. I have had difficulty in previous attempts to write about Smalltalk because my emotional involvement has always been centered on personal computing as an amplifier for human reach—rather than programming system design—and we haven't got there yet. Though I was the instigator and original designer of Smalltalk, it has always belonged more to the people who make it work and got it out the door, especially Dan Ingalls and Adele Goldberg. Each of the LRGers contributed in deep and remarkable ways to the project, and I wish there was enough space to do them all justice. But I think all of us would agree that for most of the development of Smalltalk, Dan was the central figure. Programming is at heart a practical art in which real things are built, and a real implementation thus has to exist. In fact many if not most languages are in use today not because they have any real merits but because of their existence on one or more machines, their ability to be bootstrapped, etc. But Dan was far more than a great implementer, he also became more and more of the designer, not just of the language but also of the user interface as Smalltalk moved into the practical world.

Here, I will try to center focus on the events leading up to Smalltalk-72 and its transition to its modern form as Smalltalk-76. Most of the ideas occurred here, and many of the earliest stages of OOP are poorly documented in references almost impossible to find.

This history is too long, but I was amazed at how many people and systems that had an influence appear only as shadows or not at all. I am sorry not to be able to say more about Bob Balzer, Bob Barton, Danny Bobrow, Steve Carr, Wes Clark, Barbara Deutsch, Peter Deutsch, Bill Duvall, Bob Flegal, Laura Gould, Bruce Horn, Butler Lampson, Dave Liddle, William Newman, Bill Paxton, Trygve Reenskaug, Dave Robson, Doug Ross, Paul Rovner, Bob Sproull, Dan Swinehart, Bert Sutherland, Bob Taylor, Warren Teitelman, Bonnie Tennenbaum, Chuck Thacker, and John Warnock. Worse, I have omitted to mention many systems whose design I detested, but that generated considerable useful ideas and attitudes in reaction. In other words "histories" should not be believed very seriously but considered as "FEEBLE GESTURES OFF" done long after the actors have departed the stage.

Thanks to the numerous reviewers for enduring the many drafts they had to comment on. Special thanks to Mike Mahoney for helping so gently that I heeded his suggestions and so well that they greatly improved this essay—and to Jean Sammet, an old old friend, who quite literally frightened me into finishing it—I did not want to find out what would happen if I were late. Sherri McLoughlin and Kim Rose were of great help in getting all the materials together.

I. 1960-66—Early OOP and other formative ideas of the sixties

Though OOP came from many motivations, two were central. The large scale one was to find a better module scheme for complex systems involving hiding of details, and the small scale one was to find a more flexible version of assignment, and then to try to eliminate it altogether. As with most new ideas, it originally happened in isolated fits and starts.

New ideas go through stages of acceptance, both from within and without. From within, the sequence moves from "barely seeing" a pattern several times, then noting it but not perceiving its "cosmic" significance, then using it operationally in several areas, then comes a "grand rotation" in which the pattern becomes the center of a new way of thinking, and finally, it turns into the same kind of inflexible religion that it originally broke away from. From without, as Schopenhauer noted, the new idea is first denounced as the work of the insane, in a few years it is considered obvious and mundane, and finally the original denouncers will claim to have invented it.

True to the stages, I "barely saw" the idea several times ca. 1961 while a programmer in the Air b220 file format Force. The first was on the Burroughs 220 in the form of a style for transporting files from one Air Training Command installation to another. There were no standard operating systems or file formats back then, so some (to this day unknown) designer decided to finesse the problem by taking each file and dividing it into three parts. The third part was all of the actual data records of arbitrary size and format. The second part contained the B220 procedures that knew how to get at records and fields to copy and update the third part. And the first part was an array of relative pointers into entry points of the procedures in the second part (the initial pointers were in a standard order representing standard meanings). Needless to say, this was a great idea, and was used in many subsequent systems until the enforced use of COBOL drove it out of existence.

The second barely-seeing of the idea came just a little later when ATC decided to replace the 220 with a B5000. I didn't have the perspective to really appreciate it at the time, but I did take note of its segmented storage system, its efficiency of HLL compilation and byte-coded execution, its automatic mechanisms for subroutine calling and multiprocess switching, its pure code for sharing, its protection mechanisms, etc. And, I saw that the access to its Program Reference Table corresponded to the 220 file system scheme of providing a procedural interface to a module. However, my big hit from this machine at this time was not the OOP idea, but some insights into HLL translation and evaluation. [Barton, 1961] [Burroughs, 1961]

After the Air Force, I worked my way through the rest of college by programming mostly retrieval Moore's Law graph systems for large collections of weather data for the National Center for Atmospheric Research. I got interested in simulation in general—particularly of one machine by another—but aside from doing a one-dimensional version of a bit-field block transfer (bitblt) on a CDC 6600 to simulate word sizes of various machines, most of my attention was distracted by school, or I should say the theatre at school. While in Chippewa Falls helping to debug the 6600, I read an article by Gordon Moore which predicted that integrated silicon on chips was going to exponentially improve in density and cost over many years [Moore 65]. At the time in 1965, standing next to the room-sized freon-cooled 10 MIP 6600, his astounding predictions had little projection into my horizons.

Sketchpad and Simula

Through a series of flukes, I wound up in graduate school at the University of Utah in the Fall of 1966, "knowing nothing." That is to say, I had never heard of ARPA or its projects, or that Utah's main goal in this community was to solve the "hidden line" problem in 3D graphics, until I actually walked into Dave Evans' office looking for a job and a desk. On Dave's desk was a foot-high stack of brown covered documents, one of which he handed to me: "Take this and read it."

Every newcomer got one. The title was "Sketchpad: A man-machine graphical communication system" [Sutherland, 1963]. What it could do was quite remarkable, and completely foreign to any use of a computer I had ever encountered. The three big ideas that were easiest to grapple with were: it was the invention of modern interactive computer graphics; things were described by making a "master drawing" that could produce "instance drawings"; control and dynamics were supplied by "constraints," also in graphical form, that could be applied to the masters to shape an inter-related parts. Its data structures were hard to understand—the only vaguely familiar construct was the embedding of pointers to procedures and using a process called reverse indexing to jump through them to routines, like the 220 file system [Ross, 1961]. It was the first to have clipping and zooming windows—one "sketched" on a virtual sheet about 1/3 mile square!

Sketchpad

Head whirling, I found my desk. On it was a pile of tapes and listings, and a note: "This is the Algol for the 1108. It doesn't work. Please make it work." The latest graduate student gets the latest dirty task.

The documentation was incomprehensible. Supposedly, this was the Case-Western Reserve 1107 Algol—but it had been doctored to make a language called Simula; the documentation read like Norwegian transliterated into English, which in fact it was. There were uses of words like activity and process that didn't seem to coincide with normal English usage.

Finally, another graduate student and I unrolled the program listing 80 feet down the hall and crawled over it yelling discoveries to each other. The weirdest part was the storage allocator, which did not obey a stack discipline as was usual for Algol. A few days later, that provided the clue. What Simula was allocating were structures very much like the instances of Sketchpad. There were descriptions that acted like masters and they could create instances, each of which was an independent entity. What Sketchpad called masters and instances, Simula called activities and processes. Moreover, Simula was a procedural language for controlling Sketchpad-like objects, thus having considerably more flexibility than constraints (though at some cost in elegance) [Nygaard, 1966, Nygaard, 1983].

This was the big hit, and I've not been the same since. I think the reason the hit had such impact was that I had seen the idea enough times in enough different forms that the final recognition was in such general terms to have the quality of an epiphany. My math major had centered on abstract algebras with their few operations generally applying to many structures. My biology major had focused on both cell metabolism and larger scale morphogenesis with its notions of simple mechanisms controlling complex processes and one kind of building block able to differentiate into all needed building blocks. The 220 file system, the B5000, Sketchpad, and finally Simula, all used the same idea for different purposes. Bob Barton, the main designer of the B5000 and a professor at Utah had said in one of his talks a few days earlier: "The basic principle of recursive design is to make the parts have the same power as the whole." For the first time I thought of the whole as the entire computer and wondered why anyone would want to divide it up into weaker things called data structures and procedures. Why not divide it up into little computers, as time sharing was starting to? But not in dozens. Why not thousands of them, each simulating a useful structure?

I recalled the monads of Leibniz, the "dividing nature at its joints" discourse of Plato, and other attempts to parse complexity. Of course, philosophy is about opinion and engineering is about deeds, with science the happy medium somewhere in between. It is not too much of an exaggeration to say that most of my ideas from then on took their roots from Simula—but not as an attempt to improve it. It was the promise of an entirely new way to structure computations that took my fancy. As it turned out, it would take quite a few years to understand how to use the insights and to devise efficient mechanisms to execute them.

Tuesday, October 6, 2026 The Daily Front No. #261006 — The iChat Revival
article

Resurrecting iChat audio and video conferencing

by thepipetogrep·▲ 108 points·41 comments·blog.pipetogrep.org ↗
iChat should be able to make audio and video calls again.

tl;dr

Add this to your /etc/hosts file on your old Mac running Leopard or Show Leopard (has not been tested on Tiger or Panther), and iChat should be able to make audio and video calls again. This assumes your router does port-preserving NAT (most do).

157.230.2.213 configuration.apple.com

Do note that if you are on a BSD based router like pfSense or OPNsense, you will need to enable source port preservation in your outbound NAT settings.

iChat AV and The iSight

I used to be the most annoying kind of Apple zealot. In the early 2000s, I thought everything Apple had was better than anything else out there whether it was true or not. There was one place that it was true, however, and that was in the realm of video and audio conferencing in the early 2000s.

The big players for consumer level video conferencing at the time were Microsoft with MSN Messenger, Yahoo! with Yahoo! Messenger, and AOL with AOL Instant Messenger (AIM). Then at Apple's World Wide Developer Conference (WWDC) in June of 2003, along with the G5 processor and OS X 10.3 panther, Apple announced "iChat AV".

iChat AV Marketing Screenshot

They also announced this gorgeous over-engineered webcam to go along with it called the "iSight".

Original iSight Webcam

I actually had a G4 laptop and an iSight. It felt like living in the future and I loved it. This post is about how I got iChat's video conferencing on early OS X working over the Internet again to relive some of that fun.

The First Attempt

In early 2023, my friend (will be referred to as "Methodius") and I decided to just try it and see what would happen. We tried to test a simple iChat audio call on OS X Leopard. That version of iChat works with XMPP (Jabber) servers, so we each set it up with an account on jabb.im, and pressed the green call button. It rang for the other party, it said it was trying to connect, and then...failed to connect.

It's never that easy.

iChat Debugging and Inspecting The Network

Time to do some traffic inspection with tcpdump. Thankfully, that comes pre-installed on OS X from back then so I didn't have to install anything extra. Along with the packet inspection, I also ran iChat in debug mode by launching it in the terminal like this:

/Applications/iChat.app/contents/MacOS/iChat -errorLogLevel 7

iChat's debug mode was very helpful and barely documented anywhere, so now it lives here if I ever need to look it up again.

What's Supposed to Happen

  1. iChat makes an http request to http://configuration.apple.com/configurations/macosx/ichat/1/snatmap.txt to get the address of an SNATMAP server.
  2. iChat makes a UDP request to that SNATMAP server to get its own public IP address.
  3. iChat on both ends then exchanges their public IPs and ports via their text communication channel (XMPP in our case).
  4. iChat on both ends then attempts to set up a peer-to-peer RTP connection by blasting packets to each over over the public IPs and ports previously discovered via the SNATMAP server. Since NAT connections are stateful, and outbound NAT connections open an inbound connection to the machine making the request, iChat behind NAT routers are able to connect with each other without the need to set up NAT port forwarding ahead of time.

What Actually Happened

  1. iChat attempted to make an http request to http://configuration.apple.com/configurations/macosx/ichat/1/snatmap.txt but got redirected to https which it could not connect to because OS X's TLS suite is too old.
  2. iChat failed to complete that request, so instead of exchanging our public IPs, they exchanged private LAN IPs instead, which obviously failed to connect over NAT.

The https URL is still up at the time of writing this, however, and actually contains something!

snatmap://snatmap.apple.com:5678

OK, NP. I set up my own simple web server, hosted that file myself, update OS X's /etc/hosts file to point configuration.apple.com to an IP of my choosing. Ran it and...still nothing.

Apple's SNATMAP server doesn't respond anymore. At this point, we were at a dead end because we had no idea how this SNATMAP server worked or how iChat expects to communicate with it. We learned a lot but ended in failure.

Several Years Later

Methodius and I decide to try again in summer 2026, but this time with a little LLM assistance. With our prior network captures, we were able to use an LLM to reverse engineer iChat's video conferencing framework and figure out what the request to the SNATMAP server looks like and what iChat expects as a response. From that, we were able to generate a specification file of the SNATMAP protocol.

Even though I didn't have the know how to decompile iChat, read the assembly code, and them make sense of it, I can at least learn how to write a simple UDP server from the spec file the LLM generated.

Baby's First Server

I'm a systems engineer and admin by trade. I install and configure servers, but I've never written a server of my own before. Turns out, this SNATMAP server made for a great first server to practice with.

The protocol:

  1. Communicates over UDP on port 5678

  2. The request packet contains four fields in 16 bytes.

    1. Type ("1" for request)
    2. Nonce (random number used to match a request with a response)
    3. client local IP (unused)
    4. client local port (unused)
  3. The response packet contains four fields in 16 bytes

    1. Type ("2" for response)
    2. Nonce (the same random number from the request)
    3. External IP from the UDP request
    4. The external port from the UDP request

Links for the spec file and source code to the SNATMAP server are at the end of this post

Testing The Results

Since Methodius has kids and, as a result, has much less free time than I do, I needed a way to test how iChat works across the Internet by myself. Since I don't have two separate ISP connections to play with, I decided to build an "Internet" in a lab. This was achieved by running two NAT routers (OpenWrt) as virtual machines running on a KVM host (Proxmox) that traversed a flat network space acting as the "Internet". Then I physically hooked two Macs up to the physical KVM host (via USB NICs) where the VM routers assigned them IP addresses in their own private LAN behind a NAT. Then on the "Internet" network, I had the Jabber (ejabberd), web (lighttpd), and SNATMAP servers running in a Debian Linux VM.

Here it is diagrammed with pictures of the physical setup with the Proxmox Server (the Thinkpad laptop) and the two Macs hooked up to it. iChat Diagram iChat Lab 1 iChat Lab 2 iChat Lab 3 iChat Lab 4

With this, I was able to test and iterate quickly.

The Spec and Source Code

The spec file can be used to create your own version of the server if you so desire. The source code was hand written in Python from the spec file and is ready to run on just about any OS that can run Python 3.

Self Hosting

If you wish to self host, be sure you have a web server configured to answer requests to configuration.apple.com and have it serve snatmap.txt from the path

/configurations/macosx/ichat/1/snatmap.txt

In snatmap.txt make it contain

snatmap://YOUR_SERVER_IP:5678

replacing YOUR_SERVER_IP with the public IP address of the server the SNATMAP server is running on.

The Easy Way

Or you can just use my server! I keeping it running for the 1-5 people left in the world that want to video chat using the ancient software. :D

On your old mac running OS X Leopard or Snow Leopard (might work on older but not tested), just enter this into your /etc/hosts file.

157.230.2.213 configuration.apple.com

Then have the friend you want to call do the same. After that, mash that green call button!

You Don't Need an iSight

It's true! You can even use a fairly modern Logitech webcam. I tested on OS X Leopard with a Logitech C920.

The End Result

Here is a screenshot of Methodius and I chatting over the real Internet with iChat AV. iChat AV Screenshot Real

If you have any questions or comments about any of this, please email me at blog@pipetogrep.org. Enjoy and happy chatting!

The Daily Front Page 27 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — The Rust Art Department
repository

Adobe Creative Suite Cleanroom Port to Rust

by bigwheels·▲ 105 points·62 comments·github.com ↗
★ 8,160⑂ 1,031 forks Rust

An open-source, clean-room reimplementation of Adobe Photoshop in pure Rust

Image editing; an open-source, clean-room reimplementation of Adobe Photoshop, rebuilt in pure Rust.
Layers, masks, adjustment layers, layer styles, type, vectors, brushes and real PSD files,
in a native app written entirely in Rust. Open source, offline, and yours.

PhotoCraft on getartcraft.com · ArtCraft · All Crafting Apps

PhotoCraft editing Hokusai's The Great Wave: a caption card with a drop shadow, Title and Credit type layers, Vibrance and Curves adjustment layers, and the Curves editor drawn over the image's histogram
A caption card with a drop shadow, live type, and Vibrance and Curves adjustment layers, with the Curves editor open.
The Great Wave off Kanagawa, Katsushika Hokusai, c. 1831

🎛️ Familiar by design

The menus, shortcuts, panels and tools are where your hands expect them, from ⌘J to ⇧⌘D. If you know Photoshop, you already know PhotoCraft.

⚡ Native and fast

A GPU compositor on wgpu (Metal, Vulkan, DX12, WebGPU), copy-on-write tiles and multithreaded filters. No Electron, no web view, no waiting.

🗂️ Real PSD files

Open, edit and save layered Photoshop documents. Re-saving keeps the render of 307 of the 309 psd-tools test files.

🤖 Agent-ready

Every action is a command, so you can drive the same engine from the UI, the CLI, a JSON control channel or an MCP server.

Features

Every screenshot here is the real app at work on public-domain art, rendered offscreen through its control channel.

Monet's Impression, Sunrise with Levels and Vibrance adjustment layers; the Levels editor and the Histogram panel with mean, standard deviation and median are open on the right
Levels and Vibrance adjustment layers, with the live Histogram panel.
Impression, Sunrise, Claude Monet, 1872

Edit without regret

Adjustment layers keep every edit live. Stack Levels, Curves, Vibrance, Hue/Saturation and a dozen more, mask them to an area, reorder them, or turn them off, and your original pixels never change.

16 adjustment layers that also apply directly to pixels, including Curves with per-channel editing, Levels with a live histogram, Black & White, Channel Mixer, Gradient Map, Photo Filter, Selective Color and Color Lookup (.cube, .3dl, .look). Plus Shadows/Highlights, Replace Color, Match Color, HDR Toning, Desaturate and Equalize.

The Layer Style dialog editing an Outer Glow on the EARTHRISE type layer, with Stroke also enabled, over the Apollo 8 Earthrise photograph
Outer Glow and Stroke on a live type layer, in the Layer Style dialog.
Earthrise, William Anders / NASA, 1968

Styles that sell the shot

Drop Shadow, Inner Shadow, Outer and Inner Glow, Bevel & Emboss, Satin, Stroke, and Color, Gradient and Pattern Overlay, live on any layer, including type. Patterns come from a library (built-ins, Edit › Define Pattern, .pat import/export) and PSD Patt blocks.

Copy and paste styles between layers, hide all effects at once, and open styles straight from your PSDs, rendered to match Photoshop.

Vermeer's Girl with a Pearl Earring: an elliptical selection around the face, and a Hue/Saturation layer with an elliptical mask that turns everything outside the face gray
An elliptical selection becomes the mask of a Hue/Saturation layer, so only the face keeps its color.
Girl with a Pearl Earring, Johannes Vermeer, c. 1665

Selections that understand your image

Marquees, lassos and the Magic Wand for precision; Quick Selection, Object Selection and Select Subject when you want the computer to do the tracing; Select and Mask to refine hair-fine edges.

Feather, expand, contract, smooth, grow, reselect. Turn any selection into a layer mask, a vector path or a shape. Smart selection runs on your machine, with no cloud and no account.

Bierstadt's Among the Sierra Nevada with the headline SIERRA NEVADA being edited on the canvas in Georgia, a byline, and a paragraph caption; the Character and Paragraph controls are open
A headline edited in place, with a byline and a paragraph of body text.
Among the Sierra Nevada, California, Albert Bierstadt, 1868

Type that sets beautifully

Point and paragraph text, edited right on the canvas, with full Character and Paragraph controls: font, weight, size, leading, tracking, alignment and colour.

Type layers stay editable, take layer styles, and round-trip through PSD.

A lotus badge built from shape layers (Lotus, Water, Sun, Badge and Dotted Ring) over Monet's Water Lilies, with the lotus path's anchor points selected
A badge made of shape layers: a gradient-filled lotus, a star and a dotted ring.
Water Lilies, Claude Monet, 1906

Pixel-perfect vectors

Rectangle, Ellipse, Triangle, Polygon, Line and the Pen tool, with resolution-independent shape layers, gradient fills, and dashed, aligned strokes.

Combine shapes (unite, subtract, intersect, exclude), keep paths in the Paths panel, use them as vector masks, or stroke and fill them. 116 of 116 shape layers in our PSD corpus match Photoshop's pixels.

The Twirl filter dialog at a 320 degree angle, previewing live inside an elliptical selection on Van Gogh's The Starry Night
Twirl previews live on the canvas, only inside the selection.
The Starry Night, Vincent van Gogh, 1889

See it before you commit

Every filter dialog previews live on the canvas, through your selection. Blurs (Gaussian, Box, Motion, Radial, Surface, Smart, Lens, Shape, and the Blur Gallery: Tilt-Shift, Iris, Field, Spin, Path), sharpening, Reduce Noise, distortions (Twirl, Wave, Ripple, Displace, Shear, Zig Zag…), Pixelate, Stylize (Oil Paint, Wind, Extrude…), Render (Clouds, Fibers, Lens Flare, Lighting Effects) and more.

Run filters on a smart object and they stay editable: change, hide, reorder or mask them at any time.

Large-radius blurs use running-sum box passes across all cores: a radius-180 Gaussian on 3.6 MP takes under a second.

Free Transform handles around a rotated copy of Ansel Adams' The Tetons and the Snake River, with the History panel listing Open, Duplicate Layer, Free Transform and other steps
Free Transform on a rotated print, with every step listed in History.
The Tetons and the Snake River, Ansel Adams, 1942

Shape it any way you like

Free Transform with scale, rotate, skew, distort and perspective; exact 90° and 180° rotations and flips; Transform Again. Layers, type, shapes, masks and selections all transform together.

Full history, Toggle Last State and the History Brush mean every step can be undone, even one brush stroke at a time.

The Export As dialog in the light theme over Klimt's The Kiss: JPG at quality 90, scaled to 50 percent, with a preview and an estimated size of about 684K
Export As in the light theme, with a preview and a file-size estimate.
The Kiss, Gustav Klimt, 1907–1908

Ship it anywhere

Export As with format, quality, transparency and scale, plus a preview and an instant file-size estimate. Quick Export to PNG in one click.

Choose a dark Pro theme, the airy Studio themes, or a Classic look.

Everything in the box

🧰 34 tools

Move · Rectangular and Elliptical Marquee · Lasso · Polygonal Lasso · Magic Wand · Quick Selection · Object Selection · Crop · Eyedropper · Brush · Pencil · Mixer Brush · Color Replacement · Eraser · Clone Stamp · Healing Brush · Spot Healing · History Brush · Gradient · Paint Bucket · Blur · Sharpen · Smudge · Dodge · Burn · Sponge · Pen · Path Selection · Type · five Shape tools · Hand · Zoom

🖌️ A real brush engine

Shape Dynamics, Scattering, Texture, Dual Brush, Color Dynamics, Transfer, Brush Pose, Wet Edges, Build-up and Smoothing (including Pulled String), driven by pen pressure, tilt, rotation and direction. Brush presets, Define Brush from Selection, and deterministic, replayable strokes.

🗃️ Layers, done properly

Groups, clipping masks, pixel and vector masks, fill layers (solid, gradient and pattern), adjustment layers, live smart objects with smart filters and lossless transforms and warps, multi-layer selection with align, distribute and link, alpha channels and Quick Mask, 27 blend modes, opacity and fill, locks, colour labels, layer filters, merge, flatten, rasterize, Layer via Copy/Cut, Paste Into.

🎨 Any colour, any depth

RGB, Grayscale, CMYK and Lab documents at 8, 16 and 32 bits per channel. Bit depth and colour model are runtime data, so every tool works at every depth.

Real ICC colour management in pure Rust: embedded profiles, Assign and Convert to Profile with all four rendering intents and black point compensation, soft proofing (⌘Y) and Gamut Warning (⇧⌘Y) on the GPU.

🗂️ Formats

PSD and PSB, plus PNG, JPEG, TIFF, WebP, GIF, BMP, TGA, ICO, QOI, PNM, OpenEXR, Radiance HDR and AVIF, with symmetric read and write at 8, 16 and 32 bits, and the native .pcraft format.

🪄 The everyday essentials

Auto Tone, Contrast and Color · Equalize · Image and Canvas Size · Crop and Trim · Reveal All · Edit › Fill and Stroke · Copy Merged · Paste in Place · guides, rulers, grid and snapping · Actions record and replay · a command palette (⌘K).

PSD without compromise

PhotoCraft's PSD support is a standalone crate written from Adobe's public specification and tested against a corpus of real-world files.

  • Faithful round trips: opening and re-saving a document renders the same for 307 of the 309 files in the psd-tools test set and 169 of 170 in our mixed ag-psd/psd-tools set (crates/io/tests/corpus.rs; fetch the psd-tools set with cargo xtask corpus --psd-tools), and anything we don't model yet (raw blocks, descriptors, extras) is carried over instead of being dropped. A re-saved file is not byte-identical to its source: PhotoCraft rewrites image resources, layer records and the composite. Only the standalone photocraft-psd crate, parsing and writing a file without the document model, reproduces every parseable corpus file byte for byte (crates/psd/tests/corpus.rs).
  • Pixels that match: a composite oracle compares our render with Photoshop's own merged image, covering gradient interpolation (Classic, Perceptual and Linear), layer effects, shape strokes, clipping and fill opacity.
  • Large documents: PSB, 16 and 32-bit files, and CMYK and Lab documents open natively.

Built for agents

Every menu item, tool and dialog runs a command from one registry of 500+ commands. The UI, the CLI, the JSON control channel and the MCP server all call the same commands, so anything you can click, a script or an AI agent can do too.

# Headless: open, edit, save
photocraft-cli run wave.psd \
  --cmd filter.sharpen.smartSharpen     --params '{"amount":80}' \
  --cmd layer.newAdjustmentLayer.curves --params '{"points":[[0,0],[64,48],[192,212],[255,255]]}' \
  --out wave-final.png

# Apply one action list to a folder of images
photocraft-cli batch --actions grade.json --in ./raw --out ./graded

# Let an agent drive it over MCP (headless, or bridged to the running app)
photocraft-cli mcp

The desktop app also offers an authenticated, loopback-only control channel (photocraft --control) for inspecting UI state, driving tools with pointer events, and taking offscreen screenshots. Every image in this README was rendered that way. See docs/control-protocol.md.

Under the hood

  • Engine first: a pure-data document model and a command engine, with a thin egui UI on top. Layering is enforced at build time across 24 crates.
  • Two compositors: a CPU compositor serves as the reference oracle, and a wgpu compositor puts the canvas on the GPU. They are tested against each other.
  • Copy-on-write tiles: 256² sparse tiles make undo cheap and huge canvases light, and effect maps are cached per layer state.
  • Runs in the browser: the whole engine and UI compile to WebAssembly.
  • Clean-room: implemented from public specs and observed behaviour only. No proprietary code, shaders or assets.
  • Tested: more than 1,700 tests, including PSD round trips, synthetic generators, compositor oracles and multi-depth checks.

Get started

git clone https://github.com/storytold/photocraft
cd photocraft
cargo run --release -p photocraft -- image.psd   # the desktop app
cargo test --workspace                           # the test suite

Japanese fonts for the UI and Type tool come from craft-fonts, an optional build input (desktop release builds always include it). Without it PhotoCraft uses your system's CJK fonts:

git clone https://github.com/storytold/craft-fonts ../craft-fonts
CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo run --release -p photocraft

New contributors and AI agents: start with AGENTS.md, then docs/.

Installers for macOS, Windows, Linux, FreeBSD and the web are attached to each GitHub release. On Linux you can pick an AppImage, a .deb, an .rpm, a tarball or a Flatpak bundle. The bundle needs the freedesktop runtime from Flathub, which flatpak offers to install along with it:

flatpak install --user photocraft-<version>-linux-x86_64.flatpak   # or -linux-aarch64
flatpak run ai.storyteller.photocraft

On macOS, the command-line tool comes as photocraft-cli-<version>-macos-universal.zip. The binary is signed with the same Developer ID as the app and notarized by Apple. A bare binary can't carry a stapled notarization ticket the way the DMG does, so the first time you run it macOS checks the notarization online. You can confirm it yourself:

ditto -x -k photocraft-cli-<version>-macos-universal.zip .
spctl --assess --type install -vv photocraft-cli-<version>-macos-universal/photocraft-cli
# ... accepted, source=Notarized Developer ID

On FreeBSD 14 (x86_64), the release has a tarball laid out like /usr/local. Install the runtime libraries, then unpack it there:

pkg install libxkbcommon wayland libX11 libXcursor libXrandr libXi libxcb mesa-libs vulkan-loader gtk3 fontconfig freetype2 alsa-lib
tar -xzf photocraft-<version>-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local
photocraft

Maintainers: docs/releasing.md explains how releases are built, signed and published.

Status: PhotoCraft is in early alpha, and we want to be straight about where it stands: much of Photoshop's feature surface exists in some form, but it is not yet a Photoshop replacement for daily professional work. The biggest gaps are AI/generative features, about twenty missing tools, depth in typography and pro workflows, and plug-in compatibility. Every Photoshop menu item is wired to a command (docs/parity.md), but that measures wiring, not behaviour. The honest, dimension-by-dimension picture and where we're going next are in the roadmap's parity assessment. Expect rough edges, and please file issues (include your OS, document size, layer count and a screenshot). You can also tell us what broke on Discord.

Documentation

Developer, architecture, automation, format, and security documentation is maintained in the PhotoCraft documentation book.

Security

Security architecture, threat modeling, parser hardening, fuzzing, and vulnerability reporting are covered in the security documentation and the repository security policy.

Test corpora

PhotoCraft is tested against real files: our own Photoshop-authored oracle PSDs in photocraft-corpus plus the psd-tools, ag-psd and PngSuite sets, pinned and sha256-verified. Fetch them with cargo xtask corpus --all and run the tests with cargo xtask test-corpus (details in docs/development.md).

The Crafting Apps

PhotoCraft is one of the Crafting Apps: free, open-source creative tools from the ArtCraft team, each written from scratch in Rust and each able to stand on its own.

PhotoCraft — Image editing: layers, masks, type and real PSD files · you are here
GitHub · Website

VectorCraft — Vector illustration
GitHub · Website

FilmCraft — Video editing, color and sound
GitHub · Website

LightCraft — Photo library and raw development
GitHub · Website

PrintCraft — Reading, organizing and protecting PDFs
GitHub · Website

EffectCraft — Motion graphics and visual effects
GitHub · Website

DesignCraft — Page layout and publishing
GitHub · Website

And ArtCraft itself, our AI image and video studio for artists who want real control.

The Crafting Apps share the same conventions: clean-room and pure Rust, native on macOS, Windows and Linux, in the browser via WebAssembly, and fully drivable by agents.

Come make things with us

Our Discord is where artists of every kind hang out: people who paint, shoot, draw, cut film, set type, and people still figuring out what they like to make. Share what you're working on, ask for help, tell us what's broken, or tell us what you wish these tools could do. Whatever your medium and however long you've been at it, you're welcome here.

discord.gg/artcraft · getartcraft.com · The Crafting Apps · PhotoCraft

License and credits

PhotoCraft is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the PhotoCraft contributors. Required notices are in NOTICE.

Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in ATTRIBUTION.md.

Every artwork shown is in the public domain (Wikimedia Commons, NASA, U.S. National Archives); sources are listed in docs/images/SOURCES.md.

The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as part of this repository and PhotoCraft, under docs/brand/LICENSE-brand.txt. Forks and modified versions must remove them.

Adobe, Photoshop, Illustrator, Premiere Pro, Lightroom, Acrobat, After Effects and InDesign are trademarks or registered trademarks of Adobe Inc. in the United States and/or other countries. PhotoCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Adobe Inc.; these names are used only to describe the workflows it is compatible with.

The Daily Front Page 28 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Mail, Reconsidered
article

Penguin Mail – open-source Rust email client for Linux with AI

by kavourias·▲ 104 points·48 comments·penguin-mail.com ↗
Mail and calendar for Linux.

Mail and calendar for Linux

Gmail, Microsoft and any IMAP or POP3 account, with your calendar and contacts, in one fast app on your own computer.

Download Source on GitHub

Version 1.0.0. Free software under GPL-3.0-or-later, for x86_64 Linux.

The Penguin Mail window in light style: mailboxes on the left, every account's inbox in the middle, and a conversation open on the right.

The same window in dark style.

Every account in one inbox, in light or dark to match your system.

The calendar's week view, with events from several accounts, working hours shaded, and invitations waiting for an answer in the sidebar.

The calendar, beside your mail.

What it does

  • Gmail, Microsoft, IMAP and POP3 accounts

    Sign in to Gmail, to Outlook.com, Hotmail, Live or Microsoft 365, or to Fastmail, iCloud, Yahoo or any IMAP, POP3 and SMTP server. Penguin Mail finds the server settings from your address.

  • One inbox, synced from the tray

    Read every account in one inbox or one at a time. Penguin Mail keeps syncing from the system tray, with an unread count and notifications you can act on.

  • Your calendar

    Day, Week, Month and Agenda views of every calendar on every account: Google, Microsoft, and CalDAV where your provider offers it. Answer an invitation from the message it came in.

  • Contacts

    Your contacts from Google, Microsoft, or CardDAV where your provider offers it, and suggestions from the people you write to as you type a recipient.

  • OpenPGP and S/MIME

    Sign and encrypt through your own GnuPG. Penguin Mail never holds your keys or asks for a passphrase.

  • Rules

    Gmail filters, Microsoft inbox rules, and Sieve rules where your provider offers them, listed in plain words, with a form to add one.

  • An optional assistant

    Off until you choose a model. It can run on your own computer, through LM Studio or Ollama, and it asks before it sends mail or changes a setting.

A closer look

The assistant pane beside the inbox, listing sent mail that is waiting on a reply and new promotions.

Ask your mail a question

Press Ctrl+J and ask which sent mail is still waiting on a reply, or what is in your promotions. The assistant reads your mailboxes with the app's own tools and shows each one it ran.

The inbox narrowed to the Promotions category.

An inbox split the way Gmail splits it

A bar above the list sorts mail into Primary, Updates, Promotions and Social, using Gmail's own categories. Move a sender to another category and it stays there.

The Send Later mailbox, with one message going out tomorrow and one on Monday morning.

Send it later, or take it back

Schedule a message for Monday morning and it goes out on time while Penguin Mail runs, even from the tray. Sent mail waits a few seconds with an Undo button first.

The Hide My Email dialog, with one address for a bike shop and its switch turned on.

An address for every sign-up

Hide My Email makes a Gmail plus address for each site you join. When one of them starts getting spam, turn that address off and its mail goes to the Trash.

Your mail stays on your computer

Penguin Mail has no server of its own, no tracking and no ads. Gmail and Google Calendar accounts talk to Google directly, and Microsoft accounts talk to Microsoft Graph, so no other server sees your mail.

Read the privacy policy

Watch the tour

A two-minute video on YouTube.

Play the Penguin Mail tour on YouTube

The Daily Front Page 29 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Also on the Front Page
The Daily Front Page 30 of 31
Tuesday, October 6, 2026 The Daily Front No. #261006 — Colophon

That's the Front for Today

Issue No. #261006 — Tuesday, October 6, 2026 — went to press 2026-10-07 at 04:10 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 Tuesday, October 6, 2026. Headlines, points, and comment counts are recorded as they stood at press time. All articles remain the property of their original authors — every piece links back to its source and its discussion thread.

How It Was Made

Fetched, cleaned, and typeset by an automated pipeline. An editor model laid out the pages and chose the highlights; a second read a handful of the day's stories and briefed the cover illustrator — 34 model calls and 265k 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:

Beneath a vast Antarctic ice shelf, a cavernous computing chamber glows around rows of liquid-cooled GPU cabinets, their braided cables feeding a single enormous transparent sphere suspended in the ice. Blue-white neutrino trails streak through the sphere from the dark sky above, while a bundled scientist steadies a sensor against its surface. Meltwater drips onto the machinery, and far overhead, a convoy of heavy vehicles hauls more black server crates across the snow toward the hidden observatory.

Render the cover as a Japanese woodblock-inspired print: flat carved color layers, crisp simplified contours, and visible paper-and-wood grain, using a deliberate palette of deep indigo, glacier blue, vermilion, bone white, and charcoal. Compose the misty dawn beneath a vast Antarctic ice shelf as a cavernous chamber where rows of liquid-cooled GPU cabinets glow, braided cables converge into one enormous transparent sphere suspended in the ice, blue-white neutrino trails descend from the dark sky through it, and a bundled scientist steadies a sensor against its surface; show meltwater dripping onto the machinery and, far above, a convoy of heavy vehicles hauling black server crates across the snow toward the concealed observatory.

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

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 27 166,567 69,496
layoutgpt-5.6-terra 1 18,812 2,511
covergpt-5.6-luna 4 3,250 872
covergpt-image-2.5-flare 2 603 2,744

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. Mistral Large 4 by Philpax — mistral.ai·HN discussion ↗
  2. Mistral Large 4: "Le Chonk" by j-bu — mistral.ai·HN discussion ↗
  3. Sharing AI progress in mathematics by OfficialTurkey — openai.com·HN discussion ↗
  4. Nobel Prize in Physics 2026: Francis Halzen by solarist — nobelprize.org·HN discussion ↗
  5. First enhanced geothermal power plant completed in just 23 months by hochmartinez — techcrunch.com·HN discussion ↗
  6. JetBrains reports revenue growth, net financial loss for 2025 by thw_9a83c — helgilibrary.com·HN discussion ↗
  7. Polars 2.0 by simicd — pola.rs·HN discussion ↗
  8. Meta’s Muse is an adorable privacy and security dumpster fire by beardyw — techdirt.com·HN discussion ↗
  9. Nature's capacity to 'bounce back' when species are lost is overestimated: study by pseudolus — phys.org·HN discussion ↗
  10. Gleam doesn't compile to Erlang source anymore by ingve — gleam.run·HN discussion ↗
  11. Why Common Lisp is now the best programming language by misterchocolat — vivienhenz.com·HN discussion ↗
  12. EmbeddingGemma 2: An open, lightweight multimodal embedding model by ilreb — blog.google·HN discussion ↗
  13. OpenTPU – An open-source AI accelerator, developed by AI by fsbonetto — github.com·HN discussion ↗
  14. Paramount Skydance has completed its $111B merger with Warner Bros. Discovery by Mgtyalx — arstechnica.com·HN discussion ↗
  15. Decisions API is in public beta by chiefstorm — developers.openai.com·HN discussion ↗
  16. Vibecoding isn't as fun as writing code by hand by Curiositry — autodidacts.io·HN discussion ↗
  17. What's Earth's dominant species by mass? by surprisetalk — signoregalilei.com·HN discussion ↗
  18. High Diesel Prices Bankrupted 16 Trucking Companies in Just 30 Days by speckx — thedrive.com·HN discussion ↗
  19. I'm the AGI that's wiping out humanity by alex-moon — ajmoon.com·HN discussion ↗
  20. Toronto-Based VPN Provider Plans to Quit Canada over Lawful-Access Bill by speckx — citizenlab.ca·HN discussion ↗
  21. AnyPS5: Port PS5 binaries to PC without emulation (87% system libraries mapped) by Fe2O3 — github.com·HN discussion ↗
  22. Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol by faithraven — mihai.dinculescu.dev·HN discussion ↗
  23. We are going to kill "unalive" by Tomte — anildash.com·HN discussion ↗
  24. The Early History of Smalltalk (1993) by _reza — worrydream.com·HN discussion ↗
  25. Resurrecting iChat audio and video conferencing by thepipetogrep — blog.pipetogrep.org·HN discussion ↗
  26. Adobe Creative Suite Cleanroom Port to Rust by bigwheels — github.com·HN discussion ↗
  27. Penguin Mail – open-source Rust email client for Linux with AI by kavourias — penguin-mail.com·HN discussion ↗
  28. Photopea creator weighs in on Photosuite project by montag — github.com·HN discussion ↗
  29. Claude Code’s suggested message feature: I think the real customer is the model by zed_labs_dev — zohaib.cc·HN discussion ↗
  30. Former German spy chief arrested for attempted treason by semiquaver — reuters.com·HN discussion ↗

Browse all issues in the archive →