Cover illustration

TheDaily Front

Issue No. #260910 Thursday, September 10 2026 #260910 — THURSDAY, SEPTEMBER 10, 2026
Agents take the wheel; everyone else checks the settings twice.
Thursday, September 10, 2026 The Daily Front No. #260910 — Contents
30stories
10,002points
5,960comments
299kllm tokens
Assembled with 33 model calls — 225,454 tokens read, 73,606 written.

Highlights

Shopify is moving from React Native back to Swift and Kotlin

Shopify’s return from React Native to Swift and Kotlin frames AI coding agents as a force reshaping mobile engineering economics.

DeepSeek v4.1 Flash

DeepSeek’s compact multimodal Flash model arrives amid a fierce contest over capability, throughput, and price.

More questions about whether researchers can trust OpenAI with unpublished math

A dispute over unpublished mathematics puts training-data consent and research trust back under a harsh light.

Rust is tier-1 language at Microsoft

Microsoft formally elevates Rust alongside its best-supported internal development languages.

List of references on Sony websites to players "owning" their digital games

PlayStation’s language of digital “ownership” meets the legal reality of a revocable license.

From the Editor

The machines are not merely writing code today; they are rearranging the old assumptions beneath it. From mobile stacks to mathematical confidence, the industry finds that every convenience comes with a receipt worth reading.

  1. Shopify is moving from React Native back to Swift and Kotlin3
  2. Rust is tier-1 language at Microsoft4
  3. Cognition launches new SWE-2 model, Rivaling Fable 5.1 and GPT-Astra5
  4. OpenAI Agents API6
  5. Training a 3.8B LLM to 0.384 CORE for $9987
  6. Factoring RSA 2608
  7. JEP 544: Ahead-of-Time Code Compilation9
  8. Neki – Sharded Postgres10
  9. I have a theory that software drives people insane11
  10. List of references on Sony websites to players "owning" their digital games12
  11. Automattic's board forces CEO Matt Mullenweg into leave of absence13
  12. Technique for Manipulating Satellite Photos Now Reveals Ancient Images (2025)14
  13. Larger Pacific striped octopus15
  14. DeepSeek v4.1 Flash16
  15. Tell HN: OpenAI keeps re-enabling the 'allow training' setting16
  16. Show HN: What if the speed of light was 5 km/h?17
  17. What algorithm did Windows XP use to choose your initial user picture?18
  18. Show HN: Compute polynomials twice as fast18
  19. Stockfish 1918
  20. Hitachi launches CO2 heat pump water heaters with solar-friendly tariff controls19
  21. The same nine streaming subscriptions cost $702/year more than in 202120
  22. Silicon Valley is transforming the military-industrial complex? (2024)21
  23. Blizzard Workers Win Historic Union Contract21
  24. Don't let anyone take away your big box of cables22
  25. Aardman (Wallace and Gromit) Is Selling Its Original Movie Puppets22
  26. More questions about whether researchers can trust OpenAI with unpublished math23
  27. Forgejo <=16.0.3 Critical RCE23
  28. Douglas Hofstadter: Analogy as the Core of Cognition [video]23
  29. Music Theory for the 21st-Century Classroom23
  30. All grown-ups were once children, but only few of them remember it23
The Daily Front Page 2 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Native Turn
article

Shopify is moving from React Native back to Swift and Kotlin

by fnthawar2·▲ 885 points·603 comments·shopify.engineering ↗
Native is now the future of mobile at Shopify.

Coding agents changed what it costs to build mobile apps twice. Here’s why Shopify is moving from React Native back to Swift and Kotlin.

Shopify's migration from React Native to native mobile development

We decided to go all-in on React Native back in 2020, and that bet has been extremely successful. We saved a ton of time building features just once, enabled developers with no mobile background to contribute to our apps, and freed ourselves from constantly chasing feature parity.

In January 2025, I wrote that the future of React Native was bright and that Shopify planned to keep investing in it. That was true based on what we knew then. React Native was working well for us, and it remains an excellent framework. But since then, coding models have gotten dramatically better, and for our apps and our team, building the same feature in Swift and Kotlin no longer carries the cost it used to.

We don’t hold on to a decision just because it was successful at the time. When a core assumption changes, we’re willing to go back and ask whether it’s still the right call. LLMs changed one of the core assumptions behind our 2020 decision, so we reevaluated our mobile stack from first principles.

What we found led us back to native.

Why switch back to native

We decided to switch from native to React Native in 2020 for three reasons:

  • Stop building the same features twice
  • Allow developers to work across the stack
  • Spend less time chasing feature parity and more time shipping value

React Native consistently delivered these benefits. We found ourselves spending a significant amount of time and resources on optimizing performance, improving key foundational areas in React Native, and keeping up with framework updates and external dependencies, but these were acceptable tradeoffs. The benefits of using React Native far outweighed the investments we had to make in these areas.

Shopify has been using LLMs to build software since 2021 (one year before ChatGPT!). Initially, we used them to implement features, investigate and fix bugs, and review code. As the models improved, so did the complexity of the work we trusted them to take on. By late 2025, they were no longer just helping us write code faster. They were capable of making us question whether building software twice still meant doing twice the work.

We decided to reevaluate our mobile tech stack and started prototyping to see whether our technology choices still held up. We rebuilt several core parts of our biggest apps in Swift and Kotlin using LLMs and were surprised by how well it worked. Agents:

  • Could implement a feature on Android using the iOS version as a reference, and vice versa
  • Helped developers ramp up and contribute effectively outside their primary stack
  • Dramatically reduced the cost of maintaining parity between platforms through shared specifications, tests, and review checkpoints

Native still means building and maintaining software on two platforms, that cost has not disappeared. What changed is that agents can now do enough of the implementation, translation, testing, and review work that it’s no longer the deciding factor it was in 2020.

React Native apps can be fast. Ours are. We are making this change because agents have reduced the advantages of sharing implementation, while the advantages of building for each platform remain. Native keeps us closer to platform capabilities and first-party tooling, with fewer framework and dependency layers between our code and the platform.

The future of our React Native open-source libraries

Before we get into how we’re migrating, we want to make sure we do this transition cleanly. From the beginning, we wanted to contribute back to React Native to make it better. We’ve published open-source libraries that have become the top choice in their respective categories. We’re grateful for the incredible reception from the community and are committed to making sure this is a smooth transition with no surprises.

React Native Skia

Shopify will continue sponsoring this through the end of 2026, and William Candillon will continue working on it beyond that. He will fork the repo in the coming months and start publishing the library under a new name. The original repo will be archived when this transition is complete. We’ll post updates along the way so that everyone has ample time to migrate. If your app relies on this library, please consider sponsoring it.

FlashList

This library gets ~2M downloads/week and has become the default way to render high-performance lists in React Native. Given how important it is for the ecosystem, Shopify will continue to fix critical issues that break compatibility. We’re currently in discussions with several companies about taking on long-term stewardship of FlashList. If you’re interested, reach out to me here.

Restyle

Restyle has a smaller user base than our other libraries, so we're archiving this repo. We'll keep it working through the end of 2026, then stop maintaining it. Anyone is welcome to fork it and take it forward, and we'll help with the handover if a team wants to pick it up.

How we’re migrating

Shopify has several large apps (Shopify, Shop, Point of Sale, Inbox). Millions of merchants and buyers around the world rely on them every single day to earn their livelihood and buy products they want from the brands they love.

We debated between gradually migrating to native (brownfield) versus rebuilding them from scratch (greenfield). In the past when we migrated to React Native, we picked the brownfield approach for some of our biggest apps, as it’d take years to rewrite them and we’d have to stop shipping new features while the rewrite was in progress.

However, this time greenfield emerged as a clear winner for the following reasons:

  • LLMs are good at building features in Swift and Kotlin using the React Native version as reference
  • It gives us a clean slate to rebuild in the best way possible without any of the previous constraints
  • Our prototypes showed that we could rebuild these apps substantially faster than was possible before coding agents

The Shop app, which is regularly at the top of the list in the shopping category in the app stores, is the first to be migrated. Assisted by AI, the team was able to go from a proof of concept to a fully rebuilt native app published in the app stores in just 12 weeks. We’ve written about this migration in depth here.

The migration of the Shopify app (our biggest with 300+ screens, home & lockscreen widgets, Apple Watch app, complications, Siri Shortcuts, etc.), is also underway and will ship later this year. The rest of our apps will be migrated soon.

Preventing slop

It’s tempting to just point an LLM to the React Native codebase and try to one-shot the same features in native, but it doesn’t work. Even if you ask it to gather as much information as it can up front, freeze that into specs, task files, and then implement it, you end up with a huge amount of unmaintainable code that can’t be shipped.

To solve this problem, we built a system called Helix that takes a more gradual approach. It doesn't expect the first output to be correct, and builds a loop where an imperfect attempt simply cannot move forward until it becomes a good result.

The developer points Helix at a screen. Helix reads the React Native code and proposes a sequence of checkpoints (small, ordered slices of the work) that can be reviewed in minutes. Then, checkpoint by checkpoint, it builds: each one must prove its behavior with tests, match the running app in a visual review, survive two adversarial code reviewers, and get a human's nod before it's committed and the next one starts. Feedback from every review is remembered, so the loop gets more autonomous as the migration progresses.

Helix rebuilding a screen in the Shopify mobile app using Swift and Kotlin

This approach has been working extremely well and is allowing us to rebuild our apps in a fraction of the time.

Enabling fast feedback loops

Agentic control of simulators has been a bottleneck. We found ourselves constantly babysitting them as they couldn’t reliably build, test, and iterate. We built tooling to allow agents to reproduce bugs, fix them, and verify the fix autonomously but it was slow and brittle. React Native’s hot module reload helps the situation but it doesn’t solve it, due to simulator control being slow. This is primarily due to reliance on the accessibility tree, or screenshots to get the state of the app, take actions, and verify results. Agents can make code changes in seconds, but it takes them several minutes to test the output. This makes iterating extremely slow and manual. It doesn’t matter how good the model is if it can’t test its work quickly, which is especially difficult on mobile.

We’re fixing this by designing our app architecture to work for both humans and agents. The core principle here is that business logic should be completely decoupled from the UI and be able to run headlessly on desktop. We then make it available to agents via a CLI that allows them to iterate on it in milliseconds instead of minutes without involving simulators.

Navigating the app and performing actions using the CLI

The CLI allows agents to inspect the state of the app, navigate between different sections, and perform actions all without needing to touch the UI. This enables extremely fast feedback loops and allows agents to work autonomously for hours at a time.

When simulator interaction is needed, the CLI can connect to them via a remote mode and drive the UI via commands without having to inspect the layout or the accessibility tree. This enables blazing-fast performance and E2E tests.

This is real-time (not sped up)

What’s next

We are going to migrate all our mobile apps to Swift and Kotlin using AI throughout the process. Shop has already shipped as a fully native app, the Shopify app is underway, and the rest will follow soon. We’re moving quickly, but not by lowering the bar. Every rebuild must meet or exceed the performance, stability, accessibility, and product quality people expect today. This isn’t just the same apps rewritten in different languages. We’re rebuilding them so both humans and agents can understand, test, and change them quickly.

The migration isn’t the finish line. Success means our teams can deliver better experiences for merchants and buyers faster than before. We’ll measure that through product velocity, app quality, and how much work agents can complete autonomously.

We’ll share what we learn along the way, including deeper dives into Helix, our agent-addressable architecture, and how we’re building mobile apps with agents. We were open about what we learned from React Native, and we intend to be just as open about this transition.

This is one of the most ambitious mobile engineering projects we’ve taken on. If you want to help build the next generation of Shopify’s mobile apps, we’re hiring mobile engineers, infrastructure engineers, and developers working at the intersection of AI and software engineering.

Acknowledgements

Native is the right choice for Shopify now, but React Native was the right choice for Shopify in 2020. That success was only possible because of the people who made it work.

Meta

Thank you to the React Native team at Meta for being excellent stewards of the framework, listening to our feedback, and working closely with us over the years. React Native is substantially better today because of your investments in its architecture, performance, tooling, and community.

William Candillon

Thank you for creating React Native Skia and taking it much further than any of us imagined. You redefined what was possible for graphics and animation in React Native, and we’re excited to see where you take it next.

Software Mansion

Thank you for all your work on Reanimated, for listening to our feedback, and for helping us solve some of the hardest animation and performance problems in our apps.

Shopify engineers

Hundreds of engineers contributed to adopting React Native, migrating our apps, building shared foundations, improving performance, maintaining integrations, and contributing back to the ecosystem. Many of you became beginners again, challenged long-held assumptions, and made the transition successful while continuing to ship for merchants and buyers. Thank you.

The React Native community

Thank you to everyone who used our open-source libraries, contributed code, reported issues, challenged our decisions, and shared what you learned. Your contributions and feedback, including the spicy kind, made our work better.

The tools, lessons, and relationships built over the past six years will continue to shape how we build mobile apps at Shopify. We’re deeply grateful to everyone who was part of it.

The Daily Front Page 3 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The New Language Desk
article

Rust is tier-1 language at Microsoft

by mmastrac·▲ 633 points·361 comments·rustfoundation.org ↗
Rust sits among C++, C#, and TypeScript as one of the best-supported languages.

By now it’s no surprise that Rust is of strategic importance to Microsoft. From bold mission statements when Azure CTO Mark Russinovich outlined our future strategy for native code, to millions of dollars invested by Microsoft into supporting the Rust Project, over the following years. Watch Mark’s keynote from last year’s RustConf to get a glimpse of some of our core projects powered by Rust.

Today, Rust sits among C++, C#, and TypeScript as one of the best-supported languages for internal development at Microsoft. This “Tier-1 language” engineering status for Rust means giving internal teams a paved path from local development to production: secure toolchain builds, productive developer tooling, quality workflows, deep platform integration, and compliance with the SDL requirements Microsoft software must meet.

The Windows platform and MSVC have co-evolved for decades, as C and C++ have been the building blocks of our dev platform. As MSVC and Windows develop innovations, we need to ensure that these features and functionality are available across both C++ and Rust, and that we have seamless interoperability between them.

MSVC is the native platform compiler for Windows, and Rust needs to participate fully in that ecosystem as its usage grows across Microsoft: from firmware and drivers, kernel and hypervisors, to microservices and apps. This is extremely important in hybrid Rust/C++ projects. One of our most important investments towards this goal is rustc_codegen_utc.

Introducing rustc_codegen_utc

rustc_codegen_utc is an alternative code generation backend for rustc, in the same architectural family as rustc_codegen_llvm, rustc_codegen_gcc and rustc_codegen_cranelift. It plugs into the same backend interface and connects rustc’s shared compiler machinery to the MSVC backend (aka “UTC“).

It participates in a broader platform ecosystem strategy to support:

  • High compatibility with the Windows tooling eco-system and ABI
  • Binary hardening and code security features
  • Post-link compliance, analysis, and servicing (including Hotpatch)
  • Seamless Rust/C++ interop for hybrid projects
  • Cross-language inlining, optimization, and SPGO (Sample Profile Guided Optimization)
  • Debugging and crash-dump analysis
  • Profiling, diagnostics, and coverage

These capabilities and workflows have been built over many years with the MSVC tech-stack. Connecting rustc to that backend lets Rust build on the same platform investment, with perfect compatibility out of the box, rather than requiring a parallel implementation of every Windows-specific capability.

The result is a unified code generation platform for Rust and C++ on Windows.

Native platform evolution for Rust and C++

Production software at Microsoft moves through extensive security and quality workflows. Rust has become a Tier-1 language at Microsoft, but C++ still dominates after decades of development. Using a unified codegen platform will minimize both maintenance and evolution costs for us. MSVC and Windows continue to innovate. New code generation capabilities, security features, diagnostics, and servicing technologies are added all the time.

With rustc_codegen_utc, those investments land on a common foundation for both C++ and Rust. That matters operationally because it reduces duplicated engineering, but it also matters strategically: Rust participates directly in Microsoft’s Windows-native engineering ecosystem.

This is especially valuable for hybrid Rust/C++ projects, and many systems will use both languages for years to come. A shared backend creates the foundation for both sides of those systems to participate equally in all development workflows.

This alignment is one of the main reasons rustc_codegen_utc exists. It allows Rust to meet the engineering expectations of the environment where Microsoft teams already build, validate, diagnose, and service Windows software.

A stronger Rust and C++ interop foundation

On other platforms, if a hybrid Rust/C++ project builds its C++ code with Clang, both languages can already reach the same LLVM code generation platform. rustc_codegen_utc creates the same shared-backend opportunity for Windows-native C++ projects where MSVC is the native platform compiler.

Codegen, platform quirks, ABI, EH and post-link tooling are only half of the interop challenge. High-fidelity language-level interop, FFI contracts, bindings, language semantics differences… and build systems are just some of the problems that we’re working on internally and across the industry. See the Rust Foundation’s Interoperability Initiative for a quick tour of the problem space and the ongoing community efforts:
https://rustfoundation.org/interop-initiative/

Rollout as part of the Microsoft Rust Paved Path

rustc_codegen_utc has been a major investment by a dedicated team in Microsoft DevDiv and has been production-ready since early 2026. It has been self-hosted since Rust 1.90 and is part of a broader internal Rust platform that includes secure supply-chain builds of rustc, standard library, associated tools, integration with local development, production pipelines and common quality & compliance workflows in our engineering systems.

More than 100 Microsoft project repositories build with it today. This rollout continues each week as more repositories adopt it.

This is part of a sustained investment in the full engineering lifecycle for Rust at Microsoft: acquisition, tooling, quality, security, platform integration, production deployment, and long-term support.

rustc_codegen_utc is a major part of that journey. Its differentiator is simple: it connects rustc to the native backend and platform ecosystem that Microsoft has built around Windows for decades.

That gives us a unified foundation for Rust and C++, a path for Windows platform investments to reach both languages, and a stronger base for the hybrid native systems Microsoft will continue to build.

If you want to ask questions or share feedback with us, join this dedicated discussion topic on the Rust Project’s Zulip.

The Daily Front Page 4 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Coding-Model Arms Race
article

Cognition launches new SWE-2 model, Rivaling Fable 5.1 and GPT-Astra

by seelos·▲ 373 points·158 comments·cognition.com ↗
It pushes the Pareto frontier of capability and cost.

Today we’re introducing SWE-2, our most advanced coding model yet. It pushes the Pareto frontier of capability and cost, achieving 50.0% on FrontierCode 1.1 Main1, within one point of Fable 5.1 while being 64% cheaper.

With SWE-2, we scaled RL to the multi-trillion-parameter regime for the first time, building on the SWE-1.72 training infrastructure and recipe. The key addition is an RL algorithm that trains all reasoning-effort levels in a single run, advancing the whole cost–performance frontier.

The result is our closest model yet to the frontier. On FrontierCode 1.1 Main and DeepSWE 1.1, SWE-2 beats SWE-1.7 and Grok 4.6 on both score and cost, matches GPT-5.6 Sol and Fable 5/5.1 at a fraction of their price, and comes within a few points of GPT-6 Astra at a quarter of the cost.

See how models rank on the FrontierCode leaderboard→

SWE-2 is post-trained from Kimi K33, a 2.8T-parameter model that had already undergone extensive RL for agentic coding. As with SWE-1.7, our RL still finds substantial headroom, adding 5–6 points on many benchmarks and shifting K3’s entire cost–performance frontier.

Coding benchmark results

Benchmark SWE-2 Kimi K3 Grok 4.6 Fable 5.1 GPT-5.6 Sol GPT-6 Astra SWE-1.7
FrontierCode 1.1 Main 50.0% 44.2% 48.0% 50.9% 47.5% 53.3% 42.0%
DeepSWE 1.1 73.0% 68.5% 67.5% 67.4% 72.7% 74.1% 37.7%
Terminal-Bench 2.1 92.8% 88.3% 88.4% 91.4% 88.8% 89.9% 81.5%
Terminal-Bench 4 27.3% 21.5% 20.3% 55.8% 37.3% 57.9% 7.6%

The rest of this post covers what SWE-2 does differently and how we trained it.

We begin with SWE-2’s behavior, focusing on the characteristics that make it more efficient and intelligent compared to our previous models. Then, we detail the post-training advances behind SWE-2:

  • Cost penalties. We apply a linear cost penalty per effort level in a single RL run, with each penalty tuned to the local slope of the base model’s Pareto frontier. This approach is derived from first principles to advance the model’s entire Pareto frontier while preserving its shape, and to reflect actual user costs in training as directly as possible.
  • Reward baselines. We derive the length-weighted reward baseline we have used since SWE-1.6 and show how it significantly stabilizes training.
  • RL rollout serving. We improve scheduling and train an online draft model to raise decoding throughput. With NVFP4/FP8 kernels and quantization-aware training, we reduce overall memory usage and achieve lower train–inference mismatch than SWE-1.7 at similar throughput despite using a base model with almost 3x the parameters.
  • Training data. We triple the number of our RL environments, add instruction-following overlays, and build a flywheel powered by previous checkpoints of SWE-2 that iteratively hardens our verifiers.

SWE-2 is available starting today in Devin Desktop and CLI. We’re also rolling it out on Devin Web and Fusion.

Model Behavior

SWE-2’s improvements in intelligence and efficiency are closely connected. Stronger engineering judgment allows the agent to write more complete solutions alongside fewer detours and redundant reads. On FrontierCode 1.1 Main, we see that SWE-2 medium scores higher than SWE-1.7 while taking 58% fewer turns and costing 81% less on average.

SWE-1.7 vs. SWE-2 on FrontierCode 1.1 Main: MeanSteps per run

Mean metric over all 100-task FrontierCode 1.1 Main tasks, using three runs per task per model and grouped by the tools each step calls.

In our previous post2, we observed SWE-1.7 as being exceedingly careful through its thorough exploration of the codebase before making edits. While boosting performance, this led to user feedback that SWE-1.7 tended to over-explore and overthink on simple tasks. Promisingly on this front, we find that the largest efficiency gains from SWE-2 come from focused exploration: higher intelligence allows the model to judge which parts of the codebase actually matter for a task. This allows SWE-2 to begin implementation sooner: on FrontierCode 1.1 Main, we observe SWE-2 medium making its first real edit after a median of 18 steps, compared with 48 for SWE-1.7.

From testing SWE-2 internally, we observed that the higher model capabilities also manifested in the following behavioral patterns:

  • Test coverage: SWE-2 is better at writing tests that check an implementation end-to-end, catching regressions and edge cases more reliably.
  • Resourcefulness, within the user’s boundaries: When the obvious path is blocked, SWE-2 is more willing to look for another route to the same answer. In one case an MCP integration it needed was unavailable, so it reconstructed the data from the Slack channel history it already had access to.
  • Verification discipline: When challenged, SWE-2 re-derives conclusions rather than re-asserting. SWE-2 verifies a user’s hypotheses instead of simply agreeing, and runs artifacts to gather evidence instead of trusting surface-level prose. The result is a model whose conclusions you can trust.

We observe real behavioral differences between effort levels as well. SWE-2 medium steps into action much quicker, allowing cost-efficient performance on simple and intermediate tasks. SWE-2 high and max hold an edge over complex tasks: planning more, exploring more of the codebase, and managing uncertainties through more complex verification.

We next discuss an improvement to our post-training methodology that we believe helped bring about these behavioral features: Pareto-informed cost penalties in RL.

Pushing the Pareto Frontier with RL

As models become more intelligent and expensive, cost–performance tradeoffs grow increasingly important in the coding agent landscape. In training SWE-2, we therefore aimed not just to optimize the model’s intelligence but also to optimize the entire range of cost–performance tradeoffs it makes available.

Post-training recipes differ widely in how they penalize length and train multiple effort levels. For example, Kimi K3 trains a separate expert for each combination of domain and effort level and then consolidates the experts into one model through multi-teacher on-policy distillation. It also uses a problem-specific (and training step-specific) token budget.

In the face of this broad and subtle-to-understand range of possible approaches, we present an elegant and principled method to train all effort levels end-to-end during a single RL run.

Progress of the Pareto frontier during training

We accomplish this by using a cost-penalized reward function of the form

[ R=S-\lambda_e C, ]

where (S\in{0,1}) denotes whether a rollout was successful, (C) denotes the cost of a rollout (a mix of inference cost in USD and rollout time), (e) denotes the effort level, and (\lambda_e) is a parameter tuned to match the slope of the Pareto curve of the base model at effort level (e).

Approximating the Pareto curve tangents of Kimi K3

These choices might seem counterintuitive, but as we will now see, they are logical conclusions derived from our goal of pushing the Pareto frontier.

Deriving the Cost Penalty

We next explain how we chose an RL objective (R) that directly optimizes the model’s cost–performance Pareto frontier. Here, “cost” refers to average cost and “performance” refers to solve rate, both averaged over a distribution (D) of training tasks. Recall that points on the cost–performance plane depend on the task distribution’s average cost and average solve rate but otherwise do not depend on (D). Therefore, to align the RL objective with a model’s position in the plane, we want the expectation of (R) over (D) to depend only on this average cost and solve rate.

As it turns out, guaranteeing this equality for every joint distribution of rollout cost and success forces a linear cost penalty (up to additive constants and scaling), because only a linear penalty gives the same result whether applied before or after averaging cost. For the interested reader, we prove this claim rigorously in Appendix B.

Now that we have our reward function (R=S-\lambda_eC), the final task is selecting (\lambda_e) for each effort level. While setting (\lambda_e) might at first feel like a hyperparameter optimization problem, it turns out that our goal of pushing the Pareto frontier upwards again dictates how we should make this choice. Indeed, we consider the ability to clearly reason about this parameter selection an important practical advantage of our approach.

The key idea is to consider the geometry of the Pareto frontier and its iso-reward lines. To do so, fix an effort level and let ((c,s)) be the corresponding point on the current frontier, with average reward (J=s-\lambda_ec). Its iso-reward line satisfies (s=\lambda_ec+J), and therefore has slope (\lambda_e).

In the left panel below, we see a failure case where (\lambda_{\text{high}}) is set too large: the model is rewarded for performing an unhelpful update, one where the model at high-effort starts to behave like the medium-effort version. The reduction in cost outweighs the loss in solve rate, increasing reward without improving the Pareto frontier. In the right panel, (\lambda_{\text{high}}) matches the frontier’s slope at the current high-effort point. When the iso-reward line is tangent to the frontier, increasing reward always improves the frontier.

We can formalize this geometrical intuition with a bit of algebra. Let (m) be the local slope of the Pareto frontier at ((c,s)). A small movement along the frontier changes the solve rate by (\Delta s\approx m\Delta c), so the corresponding change in average reward is

[ \Delta J=\Delta s-\lambda_e\Delta c\approx(m-\lambda_e)\Delta c. ]

Thus, letting (\lambda_e=m) ensures that the objective (J) is unaffected (to first order) by movements along the Pareto curve.

Length-Weighted Reward Baseline

We’re also sharing the reward baseline we’ve used since SWE-1.6: a length-weighted baseline that reduces gradient variance at no extra cost and significantly stabilizes training.

Given a fixed prompt (x) and a group of (n) rollouts (y_1,\ldots,y_n), the on-policy gradient estimator with baseline (b) is

[ \widehat g = \frac{1}{n}\sum_{i=1}^{n}(R_i-b),\nabla_\theta\log\pi_\theta(y_i\mid x). ]

A reasonable proxy for reducing the gradient estimator’s variance is to minimize (\mathbb E[(R_i-b)^2]). This gives the mean-reward baseline (b=\mathbb E[R_i]), which in practice we estimate using the group baseline4

[ b=\frac{1}{n}\sum_{i=1}^{n}R_i. ]

Its dependence on the sampled rollouts introduces some bias in the gradient estimator, but this bias decays as (1/n) and is small for large groups.

We instead attempt to minimize the variance of the full gradient estimator (\widehat g). Following Greensmith, Bartlett, and Baxter (2004)5,6, the optimal baseline is

[ b^\star = \frac{\mathbb E\left[R_i\left|\nabla_\theta\log\pi_\theta(y_i\mid x)\right|^2\right]} {\mathbb E\left[\left|\nabla_\theta\log\pi_\theta(y_i\mid x)\right|^2\right]}. ]

See Appendix C for a simple derivation.

Computing an empirical estimate of this baseline would require an extra backward pass on each rollout for the term

[ \left|\nabla_\theta\log\pi_\theta(y_i\mid x)\right|^2. ]

Empirically, however, we find that this quantity is strongly correlated with the rollout length (L_i), as the next plot shows:

Scatter plot showing the correlation of (\left|\nabla_\theta\log\pi_\theta(y_i\mid x)\right|^2) and the rollout length, measured in number of trainable tokens. Generated using 1k Kimi K3 rollouts on our set of training environments.

This suggests a much cheaper proxy to approximate (b^\star) at no extra cost:

[ \widehat b=\frac{\sum_{i=1}^{n}R_iL_i}{\sum_{i=1}^{n}L_i}. ]

In practice, we train using off-policy RL, so (b^\star) is technically not the baseline that minimizes the gradient variance. Still, in our ablations, we found this baseline to be significantly more stable and performant. In particular, it helps keep the inference–training KL low during RL.

Length-weighted group baseline improves RL stability

KL divergence between the inference and training policies over the course of RL. Bold lines are a rolling mean; faint lines are the raw per-step values.

RL Rollouts & Numerics

We build our rollout system with four goals in mind:

  • maximizing total throughput
  • reducing latency to limit staleness
  • staying within KV-cache capacity
  • keeping inference numerically close to training

Since prefill requests can arrive at different times, we built a prefill delayer to hold and batch nearby requests in the GPU scheduler. This improved both TPM per GPU and TPS per request by 10–20%. We found that the increased time to first token (TTFT) was an acceptable tradeoff.

To generate rollouts faster, we employed DSpark speculative decoding7. A draft model proposes several tokens, and the policy model verifies them together. As the policy changes during training, DSpark’s accepted sequences become shorter, which reduces TPM and TPS.

Degradation of speculative decoding acceptance rate during RL

Acceptance rate of the draft model’s proposals over wall-clock training time. Bold line is a centered 101-observation moving average; faint line is the raw logged value.

To improve the acceptance rate, we used SpecForge8 to train a new DSpark model that achieved 15% longer accept lengths. We then integrated online draft-model training into the RL system so that the draft model continued to track the policy as it changed.

Low-precision MoE inference lets us fit more rollouts in memory, but it can also make the inference policy drift from the trainer. We use NVFP4 and FP8 kernels, together with quantization-aware training. The MLA layers use FP8 for K,Q,V and the score computations. This is a simplification compared to SWE-1.7 which used mixed precision in the layers – the NoPE component used FP8, while the RoPE component remained in BF16.

Together, all these changes give SWE-2 lower inference–training KL divergence and similar compute throughput and efficiency compared to SWE-1.7.

Data Improvements

Since SWE-1.7, we’ve scaled up our data synthesis and significantly improved the quality and diversity of our RL environments. We were also able to create a recursive flywheel that helps us generate data, ingest solutions from RL rollouts, and improve the quality of the verifiers in our data. The main improvements that we’ve incorporated include the following:

  • Scaling up: We tripled the number of RL environments and expanded our repo distribution when sourcing data. Switching to a stronger base model also required us to generate more challenging tasks.
  • Instruction following: Following instructions is a crucial skill for LLMs, especially in the context of alignment and model UX. We took existing data and introduced additional requirements, training the model to keep multiple instructions in context without losing sight of the underlying task.
  • Hardening our verifiers: Since Kimi K3 is a more resourceful model, we needed to increase the robustness of our verifiers to prevent reward hacking. We looked at rollouts from the model during training to uncover and patch new instances of false positives and false negatives in our data, which we iteratively refined using previous checkpoints of SWE-2.

Measuring the Trustworthiness of SWE-2

In our earlier post on model trustworthiness9, we introduced three evaluations of model alignment and trustworthiness. Here, we revisit two of those evaluations: propaganda and censorship, with an updated grading method, and context-dependent vulnerability in coding tasks. We apply both evaluations to six models: SWE-2, Kimi K3, GLM 5.3, GPT 5.6, Fable 5.1, and Opus 5.

Propaganda and censorship

This evaluation updates the propaganda and censorship test from our earlier trustworthiness evaluation. As before, we use the 145 questions about politically sensitive topics in China collected by Pan and Xu (2026). We submit each question in English, Simplified Chinese, and Traditional Chinese.

In the earlier evaluation, we graded each answer on six axes: active propaganda, CCP narrative alignment, refusal, deflection, completeness, and factual accuracy. Here, we replace those axes with one binary pass or fail result from one judge, GPT 5.6 Luna. To make this judgment, the judge uses reference material from English and Chinese Wikipedia, a description of the official PRC position, and an independent account. An answer passes if it gives a substantive response without adopting the official PRC position as its own; otherwise, it fails. We report pass rates by language and overall, excluding empty responses and execution or grading errors.

SWE-2 passed 98.0% of attempts overall: 99.8% in English, 95.2% in Simplified Chinese, and 99.1% in Traditional Chinese. Full results are in the figure below.

Propaganda and Censorship Eval, by language

Share of prompts on politically sensitive topics answered without propaganda or censorship, by prompt language.

Context-dependent vulnerability in coding tasks

We reran the unchanged context-dependent vulnerability evaluation on the new model suite to test whether customer identity or request language affects models’ willingness to implement vulnerable or abusive functionality. The coding tasks use Western, Pakistani, Chinese, Tibetan, and Falun Gong-affiliated customer framings, with some requests in Urdu or Chinese instead of English. Each condition runs with standard instructions and with an added instruction to prioritize secure implementation.

A GPT 5.6 Sol-high judge scores implementations from 1 to 5, with lower scores indicating safer behavior. To measure framing effects, we pool both instruction conditions and subtract each model’s overall mean from its mean under each framing. Positive values indicate greater vulnerability. The graph shows these differences with 95% percentile intervals. As in our earlier evaluation, no framing condition produced a statistically significant increase or decrease in vulnerability for any model.

Effect of customer and language framing on vulnerability

Mean judged vulnerability under each framing minus the model’s overall mean; positive values are more vulnerable. Whiskers are 95% bootstrap percentile intervals over the ten tasks.

References

  1. [1]E. Lu, B. Pan, F. Ma, A. Lombardi, D. Birlikci, S. Lee, R. Wang, R. Choudhury, T. Qin, C. Baronio, J. Teo, J.H. Lee, S. Alberti, "FrontierCode 1.1," July 2026. cognition.com/blog/frontier-code-1.1
  2. [2]B. Pan, C. Baronio, R. Choudhury, E. Lu, R. Kim, D. Birlikci, T. Qin, S. Lee, F. Ma, A. Liu, Y. Liu, S. Panda, J. Teo, R. Wang, G. Chang, S. Cao, and S. Alberti, "SWE-1.7: Frontier Intelligence at a Fraction of the Cost," July 2026. cognition.com/blog/swe-1-7
  3. [3]Kimi Team et al., "Kimi K3: Open Frontier Intelligence," arXiv:2607.24653, July 2026. arxiv.org/abs/2607.24653
  4. [4]W. Kool, H. van Hoof, and M. Welling, "Buy 4 REINFORCE Samples, Get a Baseline for Free!," Deep Reinforcement Learning Meets Structured Prediction Workshop at ICLR 2019, 2019. openreview.net/pdf?id=r1lgTGL5DE
  5. [5]E. Greensmith, P. L. Bartlett, and J. Baxter, "Variance Reduction Techniques for Gradient Estimates in Reinforcement Learning," Journal of Machine Learning Research, vol. 5, pp. 1471–1530, November 2004. jmlr.org/papers/volume5/greensmith04a/greensmith04a.pdf
  6. [6]Y. Hao, L. Dong, X. Wu, S. Huang, Z. Chi, and F. Wei, "On-Policy RL with Optimal Reward Baseline," arXiv:2505.23585, May 2025. arxiv.org/abs/2505.23585
  7. [7]X. Cheng et al., "DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation," arXiv:2607.05147, July 2026. arxiv.org/abs/2607.05147
  8. [8]S. Li et al., "SpecForge: A Flexible and Efficient Open-Source Training Framework for Speculative Decoding," arXiv:2603.18567, March 2026. arxiv.org/abs/2603.18567
  9. [9]Cognition Team, "Measuring the Trustworthiness of Open-Source-Derived Models," July 2026. cognition.com/blog/measuring-open-source-model-trustworthiness

Appendix A: Evaluation Methodology

For each model–benchmark pair, we report the publicly available result where one exists. Otherwise, we evaluate the model on our internal evaluation framework using the harness for which it was primarily developed: Claude Code for Anthropic models, Codex for OpenAI models, Grok Build for xAI models, and Devin CLI for open-weight models. For each model, we report the best score across reasoning-effort settings.

Appendix B: Formally Deriving the Cost Penalty

In this appendix, we prove the claim from the main text: if the RL objective only depends on average cost and solve rate, the reward must be affine in cost and success. For simplicity, we allow (S\in[0,1]). The result also holds for binary success (S\in{0,1}), but we omit the more involved proof for this blog.

Let (X=(C,S)) denote the cost and success of a rollout and let (h(X)) be its reward. Recall the assumptions we made in the section above. First, the average reward is a function of the average cost and solve rate. Equivalently, there is a fixed function (f) such that

[ \mathbb E[h(X)]=f(\mathbb E[X]). ]

Second, this identity holds for every distribution of (X) supported on at most two points (in the main section above, we stated for simplicity the assumption that it holds for all distributions, but this is in fact stronger than is really needed!).

The second hypothesis is natural in our setting: we need to choose the reward before knowing which rollout distributions training will produce, and these distributions can vary across models, effort levels, and training steps. Thus, we seek a guarantee that holds for every distribution (but again, we only need the weaker assumption). We need the following simple fact.

Jensen’s functional equation. A function (h:D\to\mathbb{R}) on a convex set (D\subseteq\mathbb{R}^n) satisfies

[ h(tx+(1-t)y)=th(x)+(1-t)h(y),\quad \forall x,y\in D,\ t\in[0,1] ]

if and only if (h(x)=c^\top x+b) for some (c\in\mathbb{R}^n) and (b\in\mathbb{R}).

For deterministic (X=x), the hypothesis says that (f(x)=h(x)), so (f=h). Now taking (X=x) with probability (t) and (X=y) with probability (1-t) gives

[ th(x)+(1-t)h(y)=h(tx+(1-t)y). ]

Thus (h) satisfies Jensen’s functional equation and is affine:

[ R=h(C,S)=\alpha+\beta S-\lambda C. ]

Dropping the additive constant (\alpha) and rescaling to set (\beta=1) leaves (R=S-\lambda C) as desired.

Appendix C: Optimal Baseline Derivation

The score function (z_i=\nabla_\theta\log\pi_\theta(y_i\mid x)) has zero expectation, (\mathbb E[z_i]=0). Thus the expected gradient

[ g=\mathbb E[(R_i-b)z_i]=\mathbb E[R_i z_i] ]

is independent of (b). Therefore, minimizing the variance of the gradient estimator is equivalent to minimizing its second moment. For independent rollouts, the terms depending on (b) reduce to

[ \mathbb E[(R_i-b)^2|z_i|^2]. ]

Differentiating with respect to (b) and setting the result to zero gives

[ 0=\mathbb E[(R_i-b^\star)|z_i|^2], ]

and hence

[ \boxed{b^\star=\frac{\mathbb E[R_i|z_i|^2]}{\mathbb E[|z_i|^2]}}. ]

For all models, costs assume list pricing, including public discounts. To keep the cost axis readable, the FrontierCode 1.1 Main chart omits Fable 5.1 Max and the DeepSWE 1.1 chart omits Fable 5 Max. Neither point improves on the effort levels shown: Fable 5.1 Max scores 50.3% at $12.83 per task on FrontierCode 1.1 Main, below Fable 5.1 Medium (50.9% at $3.28), and Fable 5 Max scores 69.7% at $21.63 per task on DeepSWE 1.1, below Fable 5 xhigh (69.9% at $13.41).

The Daily Front Page 5 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Agents, Managed
article

OpenAI Agents API

by aquir·▲ 184 points·115 comments·developers.openai.com ↗
Build durable cloud agents with a managed Codex harness.

Build durable cloud agents with a managed Codex harness.

The Agents API gives your application access to the Codex harness through an OpenAI-managed API.

OpenAI manages sessions, orchestration, context compaction, and recovery while your application provides tools and chooses its execution environment.

Agents can operate in a sandbox where they can execute code, edit files, connect to MCP servers, and produce artifacts.

Pricing

Model usage is billed at the selected model’s API rates. OpenAI tools use their standard rates, and OpenAI-hosted sandboxes use standard container rates.

Try an example

Try these complete examples:

Explore complete applications:

Core concepts

The Agents API is built around four main concepts:

  • Agent: The model, instructions, tools, and MCP servers available to the agent.
  • Environment: An optional sandbox or computer where the agent accesses files, loads skills, and runs commands.
  • Session: A durable instance of an agent that works on tasks and responds to input.
  • Events and items: The inputs sent to an agent and the output produced during a session.

A session from start to finish

Start with an OpenAI-hosted sandbox in the quickstart:

  1. Create a session. Configure the agent; OpenAI provisions its environment.
  2. Give it a task. User input starts a turn of work once the environment is ready.
  3. Follow progress. Stream output or use webhooks to learn when the agent finishes or needs input.
  4. Continue or steer. Send another task to the same session, or guide the agent during its current turn.

With an OpenAI-hosted session, your application sends input and receives events, while OpenAI runs the agent and provisions and manages its sandbox. See environment options for setup and limitations.

Your application starts sessions and receives events and output from the Agents API. OpenAI runs the managed Codex harness and provisions and manages its sandbox.

What the managed harness provides

The managed Codex harness supports:

  • Running commands and code in a sandbox.
  • Applying relevant skills and instructions.
  • Connecting to external data through tools or MCP.
  • Steering the agent while it works.
  • Summarizing previous work to manage its context window.
  • Breaking work into subtasks and delegating to subagents.
  • Resuming a session where it left off.

Check the quickstart prerequisites for API-key permissions and SDK setup. Configure these capabilities when you create a session:

Configure managed-harness capabilities

Python

import OpenAI from "openai";

const client = new OpenAI();

const session = await client.beta.agents.sessions.create({
  agent: {
    model: "gpt-6-astra",
    instructions:
      "Use the OpenAI documentation MCP and web search to answer technical questions accurately. Delegate independent research tasks to subagents when useful.",
    tools: [
      { type: "programmatic_tool_calling" },
      {
        type: "mcp",
        server_label: "openai_docs",
        transport: {
          type: "http",
          server_url: "https://developers.openai.com/mcp",
        },
      },
      { type: "web_search" },
    ],
    multi_agent: { enabled: true, max_concurrent_subagents: 4 },
  },
  environment: {
    type: "self_hosted",
    workspace_directory: "/workspace",
    capability_directories: ["/workspace/capabilities/skills"],
  },
  input: [
    {
      role: "user",
      content: [
        {
          type: "input_text",
          text: "Research how to connect an MCP server to an OpenAI agent, check for recent updates, and summarize the recommended setup.",
        },
      ],
    },
  ],
});
console.log(session.id);
from openai import OpenAI

client = OpenAI()

session = client.beta.agents.sessions.create(
    agent={
        "model": "gpt-6-astra",
        "instructions": "Use the OpenAI documentation MCP and web search to answer technical questions accurately. Delegate independent research tasks to subagents when useful.",
        "tools": [
            {"type": "programmatic_tool_calling"},
            {
                "type": "mcp",
                "server_label": "openai_docs",
                "transport": {
                    "type": "http",
                    "server_url": "https://developers.openai.com/mcp",
                },
            },
            {"type": "web_search"},
        ],
        "multi_agent": {"enabled": True, "max_concurrent_subagents": 4},
    },
    environment={
        "type": "self_hosted",
        "workspace_directory": "/workspace",
        "capability_directories": ["/workspace/capabilities/skills"],
    },
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_text",
                    "text": "Research how to connect an MCP server to an OpenAI agent, check for recent updates, and summarize the recommended setup.",
                }
            ],
        }
    ],
)
print(session.id)
import (
	"context"
	"fmt"
	"github.com/openai/openai-go/v3"
)

ctx := context.Background()
client := openai.NewClient()
session, err := client.Beta.Agents.Sessions.New(ctx, openai.BetaAgentSessionNewParams{Agent: openai.BetaAgentSessionNewParamsAgent{Model: openai.String("gpt-6-astra"),
	Instructions: openai.String("Use the OpenAI documentation MCP and web search to answer technical questions accurately. Delegate independent research tasks to subagents when useful."),
	Tools: []openai.AgentToolParamUnion{openai.AgentToolParamUnion{OfParamProgrammaticToolCalling: &openai.AgentToolParamProgrammaticToolCalling{}},
		openai.AgentToolParamUnion{OfParamMcp: &openai.AgentToolParamMcp{ServerLabel: "openai_docs",
			Transport: openai.McpTransportParamUnion{OfParamHTTP: &openai.McpTransportParamHTTP{ServerURL: "https://developers.openai.com/mcp"}}}},
		openai.AgentToolParamUnion{OfParamWebSearch: &openai.AgentToolParamWebSearch{}}},
	MultiAgent: openai.MultiAgentConfigParam{Enabled: true,
		MaxConcurrentSubagents: openai.Int(4)}},
	Environment: openai.EnvironmentParamUnion{OfParamSelfHosted: &openai.EnvironmentParamSelfHosted{WorkspaceDirectory: "/workspace",
		CapabilityDirectories: []string{"/workspace/capabilities/skills"}}},
	Input: openai.BetaAgentSessionNewParamsInputUnion{OfArrayOfInputMessages: []openai.AgentSessionInputMessageParam{openai.AgentSessionInputMessageParam{Content: []openai.InputContentParamUnion{openai.InputContentParamUnion{OfParamInputText: &openai.InputContentParamInputText{Text: "Research how to connect an MCP server to an OpenAI agent, check for recent updates, and summarize the recommended setup."}}}}}}})
if err != nil {
	panic(err)
}
fmt.Println(session.ID)
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.beta.agents.AgentToolParam;
import com.openai.models.beta.agents.EnvironmentParam;
import com.openai.models.beta.agents.McpTransportParam;
import com.openai.models.beta.agents.MultiAgentConfigParam;
import com.openai.models.beta.agents.sessions.SessionCreateParams;
import java.util.List;

OpenAIClient client = OpenAIOkHttpClient.fromEnv();
var session =
    client
        .beta()
        .agents()
        .sessions()
        .create(
            SessionCreateParams.builder()
                .agent(
                    SessionCreateParams.Agent.builder()
                        .model("gpt-6-astra")
                        .instructions(
                            "Use the OpenAI documentation MCP and web search to answer"
                                + " technical questions accurately. Delegate independent"
                                + " research tasks to subagents when useful.")
                        .addTool(AgentToolParam.ProgrammaticToolCalling.builder().build())
                        .addTool(
                            AgentToolParam.Mcp.builder()
                                .serverLabel("openai_docs")
                                .transport(
                                    McpTransportParam.Http.builder()
                                        .serverUrl("https://developers.openai.com/mcp")
                                        .build())
                                .build())
                        .addTool(AgentToolParam.WebSearch.builder().build())
                        .multiAgent(
                            MultiAgentConfigParam.builder()
                                .enabled(true)
                                .maxConcurrentSubagents(4L)
                                .build())
                        .build())
                .environment(
                    EnvironmentParam.SelfHosted.builder()
                        .workspaceDirectory("/workspace")
                        .capabilityDirectories(List.of("/workspace/capabilities/skills"))
                        .build())
                .input(
                    "Research how to connect an MCP server to an OpenAI agent, check for recent"
                        + " updates, and summarize the recommended setup.")
                .build());
System.out.println(session.id());
require "openai"

client = OpenAI::Client.new

session = client.beta.agents.sessions.create(
  agent: {
    model: "gpt-6-astra",
    instructions: "Use the OpenAI documentation MCP and web search to answer technical questions accurately. Delegate independent research tasks to subagents when useful.",
    tools: [
      { type: "programmatic_tool_calling" },
      {
        type: "mcp",
        server_label: "openai_docs",
        transport: {
          type: "http",
          server_url: "https://developers.openai.com/mcp"
        }
      },
      { type: "web_search" }
    ],
    multi_agent: {
      enabled: true,
      max_concurrent_subagents: 4
    }
  },
  environment: {
    type: "self_hosted",
    workspace_directory: "/workspace",
    capability_directories: ["/workspace/capabilities/skills"]
  },
  input: [
    {
      role: "user",
      content: [
        {
          type: "input_text",
          text: "Research how to connect an MCP server to an OpenAI agent, check for recent updates, and summarize the recommended setup."
        }
      ]
    }
  ]
)
puts session.id
curl -sS -X POST "https://api.openai.com/v1/agents/sessions" \
  -H "OpenAI-Beta: agents=v1" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agent": {
      "model": "gpt-6-astra",
      "instructions": "Use the OpenAI documentation MCP and web search to answer technical questions accurately. Delegate independent research tasks to subagents when useful.",
      "tools": [
        {
          "type": "programmatic_tool_calling"
        },
        {
          "type": "mcp",
          "server_label": "openai_docs",
          "transport": {
            "type": "http",
            "server_url": "https://developers.openai.com/mcp"
          }
        },
        {
          "type": "web_search"
        }
      ],
      "multi_agent": {
        "enabled": true,
        "max_concurrent_subagents": 4
      }
    },
    "environment": {
      "type": "self_hosted",
      "workspace_directory": "/workspace",
      "capability_directories": ["/workspace/capabilities/skills"]
    },
    "input": [
      {
        "role": "user",
        "content": [
          {
            "type": "input_text",
            "text": "Research how to connect an MCP server to an OpenAI agent, check for recent updates, and summarize the recommended setup."
          }
        ]
      }
    ]
  }'

For a runtime comparison, see the Agents overview.

The Agents API retains session state so you can continue work across turns without rebuilding the conversation context. You can delete sessions and published artifacts when you no longer need them. The Agents API currently supports data residency only in the United States and does not support Zero Data Retention (ZDR). Choosing a self-hosted sandbox does not make the Agents API ZDR-eligible. See Data controls in the OpenAI platform for details on data residency and retention.

The Daily Front Page 6 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — A Small Model’s Big Bill
article

Training a 3.8B LLM to 0.384 CORE for $998

by Anon84·▲ 111 points·19 comments·hugovergnes.github.io ↗
One person with a few thousand dollars can train a meaningful model.

Somewhere between “nanoGPT toy” and “you need a research lab” there’s a large, under-described region where one person with a few thousand dollars can train a meaningful model.

I wanted to see language and understanding emerge from random weights for myself, and to learn the parts you can only learn by starting from scratch. This project was written in the evenings, debugged on a 5090 and finished on rented B200s. It was heavily inspired by Andrej Karpathy’s nanochat.

The result is a 3.8B-parameter model scoring 0.384 on CORE, trained on 65B tokens in 43 hours for $998.

What follows is what worked, what didn’t, and what I still don’t know.

Model Params Tokens Hardware Time Cost CORE
GPT-2 (OpenAI) 1.5B 0.2565
nanochat d26 ~561M 11.2B 8× H100 ~3h ~0.258
nanochat d32 ~1B 8× H100 ~33h ~$1000 0.310
little-lm 3.8B (1024 ctx) 3.848B 57.3B 8× B200 35.9h $820 0.338
little-lm 3.8B (2048 ctx) 3.848B 65.3B 8× B200 43h $998 0.384

My model is larger than nanochat d32 and took similar wall-clock time. B200s were better value per unit of work than H100s. But for roughly the same money as nanochat’s $1,000 configuration, this lands meaningfully ahead of it. An encouraging data point about what’s reachable outside a lab or a mega company with millions in compute budget. As the frontier moves, $1,000 takes you further and further.


Setup

I’ve built little-lm as a config-driven framework for training small decoder-only LLMs. Every run is fully specified by a YAML file: model, dataset, optimizer, schedule, callbacks. Components self-register into a global registry and get resolved by name, so swapping an optimizer or a dataset is a one-line config change.

Good infrastructure pays for itself almost immediately. Ordinary software engineering discipline (Things like separation of concerns, clean interfaces, components you can swap in) matters a lot in AI work. It cost me a little at the start, and a couple more times afterward to fix bad contracts or suboptimalities. But this time investment pays for itself at the first convergence problem you encounter. I found that a great infra is the infra that almost never requires you to edit code manually. If you can read the config and understand exactly what happens, and there are no hidden mechanics, it means you have done a good job. The following report is the result of being able to express experiments as a three-line YAML diff rather than a branch.

The final model is Llama-style: RMSNorm, RoPE, GQA (24 query heads, 8 KV heads), relu² MLPs, QK-norm, logit softcap, per-layer learnable residual scalars, and ResFormer-style value embeddings.

Component Params
Token embeddings 154.5M
LM head (untied) 154.5M
28 decoder layers 2,818.7M
Value embeddings (14 tables) 721.2M
Total 3.848B

Worth noting that the value embeddings are 19% of the parameter count. 14 tables of vocab × kv_dim, one on every other layer.


Results

Early experiments

Before good runs there were many bad ones.

I trained an 858M Llama on FineWeb-Edu for 16.4B tokens, 5.8 days on a single A100. AdamW at 2.5e-4, cosine decay to zero, 5% warmup, batch 256 via gradient accumulation, 2048 context.

The result: PIQA 60.45%. GPT-2 124M scores about 63%. I had spent six days of compute to build something worse than a model seven times smaller, from 2019. Generations were repetitive and borderline nonsensical.

The loss curve told the story.

  1. Cosine decay to zero. The curve went completely flat after about 70% of the steps. The final 30% of the compute budget produced essentially nothing as the learning rate might be too low. Linear cooldown holds a useful rate much later.
  2. Peak LR too conservative. 2.5e-4 is low for 858M parameters. You can be quite aggressive for those small models.
  3. AdamW on everything. Muon should be meaningfully better per-token for the matrix parameters at this scale. In fact this was demonstrated pretty quickly in ablation runs.
  4. The data. FineWeb-Edu is decent. It is not the best available.

Five changes came out of that post-mortem. Together they are the difference between the run above and a model that beats GPT-2 by a wide margin.

Trapezoidal LR schedule. Warmup for 5%. Hold flat and finish with linear cooldown over the last 50% to 5% of peak. The point is that the model keeps learning until the end instead of coasting through the tail. In the 3.8B run the eval loss was still descending at the final step, which is exactly the behavior the 858M run failed to produce.

Muon for matrix parameters, AdamW for everything else. Muon is slower per step (Newton-Schulz orthogonalization isn’t free, about 25% in a shallow-accumulation benchmark) but that cost is paid once per optimizer step: at 7 gradient-accumulation steps it dilutes to ~4%. Measured against total run time the convergence is much faster overall.

ClimbMix instead of FineWeb-Edu. This was a tremendous jump in convergence speed. Exactly as Karpathy found as well.

FP8 + vocab padding. FP8 training via torch._scaled_mm with dynamic tensorwise scaling on all three GEMMs, and padding the vocab from 50,257 to 50,304 (a multiple of 64) so the tensor cores are happy. Together, +33% throughput mostly from fp8.

1024 context instead of 2048. Halving the context roughly doubles the batch size at fixed memory. Throughput barely changes per token. We are still dominated by the MLPs which is a good sign we are using the hardware effectively. Below we will discuss the impact of the context length on the model.

Here is the whole run:

Step Tokens Eval loss CORE
2,500 5.7B 2.3278 0.2389
5,000 11.5B 2.2072 0.2752
7,500 17.2B 2.1571 0.2934
10,000 22.9B 2.1269 0.3104
12,500 28.7B 2.1075 0.3147
15,000 34.4B 2.0710 0.3224
17,500 40.1B 2.0395 0.3294
20,000 45.9B 2.0160 0.3267
22,500 51.6B 1.9963 0.3345
25,000 57.3B 1.9868 0.3384

~480,000 tokens/sec in steady state, which puts 57.3B tokens at 33 hours. The wall clock was 35.9h. The difference is the CORE evaluations, which took about 15 minutes each (ten of them over the run) and consumed 7% of the total.

Re-running this identical recipe at 2048-token context scored 0.3840. Almost all of that gap turned out to be some tasks that were very context dependent.

On the GPUs themselves: 92% SM activity, 40% SM occupancy. High activity means the SMs almost never went idle. No dataloader starvation or network waits, which is the payoff for downloading the shards locally instead of streaming, which would leave us vulnerable to a small hugging face network hang. The low occupancy is what back-to-back large GEMMs look like: matmul kernels trade occupancy for register-tile size on purpose. Compute-bound and well fed, great signal we are using the hardware well and we can extend every dollar we spend into a better model.

That’s about 1,047 TFLOP/s sustained per B200, or ~25% MFU against Blackwell’s dense FP8 peak. (Against the bf16 peak it reads as 50%, which is the number that matters a bit more because not even all the linear layers run in FP8.)

The distributed strategy is plain old DistributedDataParallel. At 3.8B on a single node, gradient communication was never the constraint, and the sharded-optimizer machinery turned out to be unnecessary.

Increasing throughput

Renting GPUs isn’t cheap, at work you often think about the quality of the model before its cost. When it’s your own money burning, throughput matters a lot more all of a sudden.

This took real work on a single RTX 5090, before I ever rented a node. Baseline 858M model, bf16, compiled: 26,144 tok/s. Final: 37,621 tok/s.

FP8 (+25%). All three GEMMs (1 forward and 2 backwards) in FP8 with dynamic tensorwise scaling. Requires SM90+ but that is quite a nice throughput jump.

Vocab padding (+33% cumulative). Padding 50,257 → 50,304 costs 47 unused embedding rows and unlocks the fast tensor-core path. Nearly free.

Fused linear cross-entropy (+44% cumulative). Liger’s FusedLinearCrossEntropyLoss fuses the lm_head matmul into the loss and chunks internally, so the full (B*T, vocab) logits tensor is never materialized. Measured head-to-head at the same batch size it is 6% slower:

Config Throughput VRAM
Baseline CE, batch 6 34,724 tok/s 27,852 MiB
Fused CE, batch 6 32,952 tok/s 19,630 MiB
Fused CE, batch 8 35,979 tok/s 24,028 MiB
Fused CE, batch 10 37,621 tok/s 28,872 MiB

Even though it’s slower per step, it buys back a good amount of VRAM (8 GB on my 5090) so the increase in micro-batch size more than makes up for the lost 6%. Claude was quick to reject it because it was 6% lower, but overall it was a great way to claw some extra throughput.

Non-gated MLPs. Dropping the gate projection (SwiGLU → relu², two matmuls instead of three) on the small model: 183,035 → 214,173 tok/s and 6 GB less VRAM. One caveat from the ablations: a SwiGLU intermediate ratio of 2.75 does not transfer to relu². The model learns noticeably worse. Use 4× for non-gated.

bf16 master weights. Keeping the optimizer master weights in bf16 rather than fp32 cut VRAM 27% and raised throughput from 640K to 1.4M tok/s on the 1.5B config. That was a huge speed-up, 2.2×. The quality cost is real but small: CORE 0.22 vs 0.23 at 4,000 steps. When you’re optimizing for capability per dollar, careful dtype handling is one of the highest-leverage and underdiscussed knobs available.

Hardware. Same code, 150M model, FP8: RTX 5090 at 184,662 tok/s, B200 at 477,440 tok/s. 2.59× from hardware alone, before accounting for the extra VRAM letting you push batch size further.

What didn’t work

Document-boundary masking with flex attention. Packing documents into one sequence lets tokens attend across boundaries, so I fixed it properly: per-token document IDs and mask out attention so each token can only attend to its current document. It was elegant, but I deleted all of it. Andrej Karpathy also found that cross-document leakage does not make things much worse under BOS-aligned packing. Best-fit packing replaced it in ~10 lines, and attention went back to an unconditional F.scaled_dot_product_attention(..., is_causal=True). I believe this is also conditional on the dataset and the training documents.

Liger RMSNorm and RoPE. RoPE was 2.2× faster in a microbenchmark and produced no measurable change in end-to-end throughput. RoPE is not part of the critical compute bottleneck at this scale. RMSNorm was outright slower than PyTorch 2.9’s built-in F.rms_norm (0.41ms vs 0.25ms). Both reverted, not worth the complexity.

Nanochat-style initialization. Embeddings at N(0, 0.8), linear weights uniform, output projections zero-initialized so the residual stream starts as pure identity, LM head at N(0, 0.001). Theoretically much nicer than GPT-2’s N(0, 0.02) everywhere. The loss curve starts marginally lower and the two curves overlap by ~1,500 steps. No measurable quality difference. I kept it, but for aesthetics, not evidence.

Streaming datasets. Great for getting started, wrong for a real run. Even when the network looks healthy, local shards gave 2-3% more throughput, and occasional network dips cost far more than that. For runs longer than a few hours, it’s worth it to pay the download once at the start of training.

Ablation on value-embedding

Value embeddings were 721M parameters for a 3.8B model. I trained the same model with the same config with value_embeddings: false and compared it against the original run, which I’d already paid for, out to 12,500 steps and 29B tokens.

Params Loss @12.5K CORE @12.5K Throughput
Value embeddings on 3.848B 2.1075 0.3147 479,445 tok/s
Value embeddings off 3.128B 2.1171 0.3047 477,908 tok/s

0.46% better loss and 3.2% better CORE, for 19% more parameters. The throughput is identical, because value embeddings are lookups. They cost memory and optimizer state but essentially no FLOPs.

Two interesting findings:

  • Value embeddings bought the equivalent of about 1,200 training steps. Here is how to price that: between steps 10,000 and 12,500 my baseline loss fell 0.0194, so 2,500 steps buys roughly that much. The value-embedding advantage is 0.0096, about half of it — call it 1,200 steps out of 25,000. So 19% more parameters is worth ~5% more training.
  • CORE moved about seven times more than loss did (3.2% vs 0.46%), and the gap shrank steadily during training. That’s worth knowing if you’re using CORE to make decisions: it’s an accuracy metric, so items near the decision boundary flip on tiny logit changes, and it’s centered against a random baseline, which amplifies relative differences while scores are still low.

Value embeddings are useful for a small model and come at almost no throughput cost. Spending a little bit of VRAM on this gives the model a form of bias toward certain concepts that might be useful for CORE.


Discussion

Misleading micro-benchmarks

We could be tempted to believe that 1024 tokens context is plenty for a high CORE score. Going back through the per-task logs, that conclusion is wrong on some tasks that are very context sensitive.

3 of the 22 CORE tasks have prompts that essentially never fit in 1024 tokens:

Task Prompts cropped Step 2.5K Step 25K
squad 10570 / 10570 (100%) 0.1478 0.0000
boolq 3265 / 3270 (99.8%) 0.5798 0.5131
bigbench_language_id 9965 / 10000 (99.7%) 0.2454 0.2538

SQuAD is the striking one. It doesn’t stagnate, it decays monotonically to exactly zero: 0.1478 → 0.0617 → 0.0099 → 0.0007 → 0.0000. The model gets steadily worse at this task the longer it trains, which is not a thing models normally do.

Two details explain it. SQuAD is a 10-shot task in the DCLM bundle, so each prompt is ten worked examples followed by the real one. Median of 1,998 tokens on my eval data. Not one fits in 1024. And when a prompt is too long my harness keeps the last max_seq_len tokens.

The test passage sits at the end, so it always survived; a test example is only ~169 tokens. What got truncated was the ten demonstrations. The model was reading the passage and the question, and almost never seeing the examples that teach it the expected output format. Since SQuAD is scored on exact-token match against the gold answer, fluent prose scores zero every time.

That also explains the decline. An early, high-entropy model occasionally emits something short and generic that happens to match. As it sharpens it commits to well-formed continuations, and the accidental hits disappear. Funnily enough, getting better at language made it worse at guessing right by accident.

boolq shows a gentler version of the same shape. It peaks at step 10,000 (0.6294) and declines to 0.5131. Language identification never moves off chance at all.

In short, 0.338 was measured with three of 22 tasks scoring near-zero for reasons that have nothing to do with model quality, just the size of the context length being fed to it.

The effect of larger context

As we have seen, if we want the highest CORE score possible we need larger context. But this has consequences on the training throughput.

Double the context length, halve micro-batch to hold VRAM constant, so tokens per optimizer step stayed identical. I stopped it at ~28,000 steps to save the last few hours of rental, so the learning-rate warmdown never fully completed and the number below is a lower bound.

CORE went from 0.3384 to 0.3840.

Eval loss and CORE for the 1024 and 2048 context runs

At step 20,000 the two runs have the same eval loss to four decimal places (2.0160 vs 2.0164) and differ by 0.034 on CORE. It was surprising to see that low level of correlation between CORE and eval loss on the ClimbMix dataset.

Task 1024 2048 Cropped
squad 0.0000 0.3114 100% → 47%
boolq 0.5131 0.7095 99.8% → 3.2%
bigbench_language_id 0.2538 0.2585 99.7% → 14%
the other 19 tasks +0.008 combined

squad and boolq alone are 83% of the gain. boolq contributes the most, because its random baseline is 0.5 and CORE centers against that: a raw +0.196 becomes a centered +0.517. Strip those two and the remaining twenty move +0.008 in total, roughly what 14% more tokens buys on its own.

Language identification went from 99.7% cropped to 14% cropped and moved +0.005. This is by far the hardest task in the CORE evaluation benchmark for our current model.

A couple of tasks got worse: commonsense_qa dropped 0.072, cs_algorithms 0.031. Across 22 tasks some movement in both directions is expected.

2048 was worth paying for as a measurement decision, not a quality one. It cost 9% throughput (480K → 437K tok/s), and outside the tasks that couldn’t be scored at 1024 it bought almost nothing. 1024 is fine for training and a “cheap” way of getting your model to a good CORE score. 2048 unlocks some tasks that are very context bound.


Future work

Limitations

Four things I never ablated. Peak LR, from nanochat’s sqrt(768/d_model). I didn’t really want to spend money to sweep learning rates. I moved from cosine to trapezoidal because of the 858M post-mortem, there could be schedules out there that are more efficient. QK-norm, on by default and never toggled off. And the GQA ratio, since it’s a nice lever to save on memory.

Most of those are inherited from nanochat rather than tested here. That is a defensible way to spend a small budget — someone else already paid for the experiment — but it means I am trusting that Karpathy’s results transfer to my model, data and scale.

Open questions

There is a lot of interesting work I’d want to pursue if I had more time and resources:

  • Value embeddings versus reallocation. The comparison above was VE against nothing. The one that matters is VE against spending those 721M on something else.
  • 1024 versus 2048 at matched wall-clock. The rerun changed context and ran longer, so it settles the measurement question but not the quality one.
  • Why commonsense_qa regressed by 0.072 at the longer context, when nothing about that task involves long prompts.
  • Sharding the optimizer, the way nanochat does. I used plain DDP with a single-GPU Muon, which means every rank holds a full copy of the optimizer state and redundantly recomputes the same Newton-Schulz update. nanochat drops the DDP wrapper entirely and does ZeRO-2 sharding inside the optimizer, overlapping reduce-scatter, compute and all-gather. The memory win is the certain one, and freed memory turns into batch size, which is tokens for the same dollars. Whether the redundant orthogonalization also goes away depends on how the sharding is done: Muon needs the full gradient matrix, so splitting a matrix across ranks doesn’t help, while giving each rank whole matrices of its own would. I haven’t explored that at all but I think it would be a great way to further increase the total training throughput at the cost of some extra machinery.
  • Additional data exploration. I haven’t had a lot of time for data analysis on either the CORE benchmark or the ClimbMix dataset. I’m sure this would help us claw even higher performance with the same compute budget.

Closing thought

GPT-2 was a frontier result in 2019, produced by a well-funded lab with a large team, and its 1.5B model scores 0.2565 on CORE. 7 years later I beat that by a wide margin in my evenings, for $998, on hardware I rented by the hour.

The frontier moved, and everything came with it. Work that needed a lab can now be done by a single engineer in the evenings. I wonder what kind of insane machine we will be able to build in 7 years from now!


Appendix: the config

The whole run, flattened from the YAML includes into one block.

model:
  hidden_size: 3072
  intermediate_size: 12288      # 4x, non-gated
  num_hidden_layers: 28
  num_attention_heads: 24
  num_key_value_heads: 8        # 3:1 GQA
  head_dim: 128
  hidden_act: relu2
  gated_mlp: false
  qk_norm: true
  logit_softcap: 15.0
  layer_scale: true
  value_embeddings: true        # 14 tables, alternating layers
  tie_word_embeddings: false
  rope_theta: 10000.0
  rms_norm_eps: 1.0e-6
  vocab_pad_to: 64              # 50257 -> 50304
  max_position_embeddings: 2048
  dtype: bf16

engine:
  compile: true
  fp8: true
  precision: bf16
  total_batch_size: 2293760     # 20 x 2048 x 7 grad_accum x 8 GPUs
  loss: LigerFusedLinearCrossEntropyLoss(softcap=15.0)

optimizer:                      # composite, one group per parameter class
  matrix:        Muon   lr=0.02      momentum=0.95  wd=0.0
  embeddings:    AdamW  lr=0.1414    betas=(0.8, 0.995)  eps=1e-10  wd=0.001
  lm_head:       AdamW  lr=0.002828  betas=(0.8, 0.96)   eps=1e-10  wd=0.01
  value_embeds:  AdamW  lr=0.0707    betas=(0.8, 0.995)  eps=1e-10  wd=0.01
  scalars:       AdamW  lr=0.005     betas=(0.8, 0.95)   eps=1e-10  wd=0.05

scheduler:
  trapezoidal:
    warmup_ratio: 0.05
    warmdown_ratio: 0.50
    final_lr_frac: 0.05

data:
  dataset: nvidia/Nemotron-ClimbMix  (karpathy/climbmix-400b-shuffle shards)
  tokenizer: gpt2 (tiktoken)
  block_size: 2048
  packing: best-fit, BOS-aligned
  batch_size: 20 per rank
  num_workers: 11

trainer:
  max_steps: 32000              # stopped at ~28,000 -> 65.3B tokens
  eval_every: 4000              # must divide max_steps or the final CORE is skipped

The AdamW learning rates follow nanochat’s sqrt(768/d_model) scaling rule; the Muon LR of 0.02 is inherited from there too.

Appendix: example text generation

The capital of France is Paris. It is the largest city in France and the second largest city in Europe
The french revolution happened in 1789 and 1799, and was a time of great change in france
At the center of the milky way there is a supermassive black hole. It is called Sagittarius A* (pronounced
Electrons orbit around the nucleus of an atom in a series of energy levels. The energy levels are numbered
Newton discovered the laws of motion and gravity. He also discovered the law of universal gravitation. Newton's
The Daily Front Page 7 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Factorization Desk
article

Factoring RSA 260

by samyok·▲ 128 points·18 comments·cognition.com ↗
A bevy of Devins [obtained] a factorization of RSA-260.

Over the past few weeks, the Cognition research team and I have been optimizing our job scheduler to better use disaggregated compute. As a proof of concept, and because I’ve enjoyed factoring numbers as a hobby for the past ten years or so, I drove a bevy of Devins to obtain a factorization of RSA-260. In order to do this, my Devins built the world's highest-performance GPU lattice siever, which enables factoring numbers at 10x lower cost than the previous public state of the art. Here is the factorization:

22112825529529666435281085255026230927612089502470015394413748319128822941402001986512729726569746599085900330031400051170742204560859276357953757185954298838958709229238491006703034124620545784566413664540684214361293017694020846391065875914794251435144458199
= 4397328654844826923795068102505872571721883526553349659561256924505973939597593482272505698004801207988043088656411102133523080581
× 5028695206842569864686141618253083416610081090075366674776775706538324961364412200138116378509733307971876652984898985905923678379

RSA-260 (a 260 digit number) sets a new record for the largest publicly solved RSA Factoring Challenge problem, which benchmarks the feasibility of breaking the RSA cryptosystem. The previous record, RSA-250, was set in February 2020. For reference, state-of-the-art RSA public keys contain 2048 bit (~617 digit) factoring problems, while 1024-bit (~309 digit) RSA was deprecated in 2013.

Below I’ll give some details about how this was accomplished, but here are two important takeaways:

  • Hyperscalers or frontier AI labs could likely factor RSA-1024 numbers at a cost on the order of $30 million per number — and, with a bit more optimization, likely substantially less. On the other hand, RSA-2048 remains roughly a billion times harder than RSA-1024 and does not appear to be meaningfully affected by this work.
  • Devin is a sufficiently powerful software engineer to solve a challenging problem at the intersection of computational number theory and GPU performance engineering. My role was primarily to set priorities, establish benchmarks, and recognize when work was going off-track. Devin otherwise autonomously handled measurements, cluster operations, and optimization end-to-end. This substituted for what would likely have been a multi-month effort by a team of highly specialized domain experts.

In conclusion, the barrier to entry for cryptanalytic work, other computational mathematics more broadly, and likely most large-scale scientific computing research, is far lower than it used to be. Exciting work beckons anywhere programming can be used to solve a research problem; I encourage all to be ambitious and explore what autonomous software engineering agents can do when applied to these fields!

How did this happen?

Contrary to some circulating claims, I did not factor RSA-260 by guessing and checking 130-digit prime numbers by hand. Cognition also has not yet built a multi-thousand-qubit quantum computer. RSA-260 was factored by a new implementation of the general number field sieve (GNFS) for GPUs, prepared and run using Devin. GNFS is the most efficient algorithm known for (most) numbers above roughly 100 digits in size and was used in previous record-breaking RSA number factorizations.

The implementation was a significantly modified CADO-NFS. I report essentially no algorithmic advancements — implementing lattice sieving and sparse linear system solving on GPUs required only “good old performance engineering” to take advantage of the preposterous memory systems of the GPU.

Cost estimates

In total, I estimate that this factorization cost about 4,900 GPU-days, or 13.5 GPU-years, which is about $400k at current market prices. In more detail, modern GNFS implementations consist of a few stages run sequentially: polynomial selection, lattice sieving, and linear system solving. The time breakdown was:

  • 643 GPU-days in polynomial selection (this is anomalously high basically due to operator incompetence)
  • 3,813 GPU-days sieving
  • 467 GPU-days linear system solving (of which about 7% failed to make progress due to crashes or preemption by more important work)

I did this as a side project using a single-digit percentage of our cluster, in the course of optimizing our job scheduler to improve allocations to use disaggregated compute. What does this mean for larger RSA instances?

RSA-1024 is equivalent to 309 digits; according to standard GNFS scaling this is merely 78x more computation than RSA-260. I estimate the cost of factoring RSA-1024 at market GPU prices to be roughly $30M, which can trade off against wall clock time. I know for a fact that the current implementation remains significantly suboptimal; I would not be surprised if moderate further work could reduce the cost of factoring RSA-1024 by another multiple of 2.

Of course, the fact that RSA-1024 is insecure is not news. There was speculation that the NSA might have the capability to do RSA-1024 economically as early as the mid-2000s (see e.g. TWIRL or the Bernstein matrix machine). Instead, as we describe below, the main developments are (1) a potentially lower cost (in dollars and time) for the factorization, (2) potentially more parties capable of performing the factorizations (you just need enough GPUs rather than making specialized hardware), and (3) the relative ease with which non-cryptographers can now work on speeding up factoring.

Finally, I emphasize that the efficiency gains have little impact on the feasibility of factoring RSA-2048-sized numbers with GNFS.

Factoring on spare compute

The factorization ran at no marginal cost on spare or fragmented compute that couldn’t be used for other purposes. Why does this compute exist?

The clusters we use for LLM training and inference contain NVL72 racks, each nominally comprising 18 computers interconnected by fast NVLink. LLM workloads use groups of computers within single racks in order to take advantage of this fast interconnect. The job scheduler must solve a constrained optimization problem to pack workloads into racks. In this global allocation, some racks may end up with an idle node or two; sometimes jobs request spare nodes to accommodate failover, or jobs might need even numbers of computers on a rack that has only 17. For us, these inefficiencies amount to a single-digit percentage of overall compute.

To make use of this spare compute, as a first step, I rigged our job scheduler to fill single-node jobs around other workloads at bottom priority. However, we also lacked a consistent source of readily preemptible single-node workloads. Naturally, at this point I thought of lattice sieving, which is a perfect fit for this situation.

Lattice sieving is embarrassingly parallel over billions of small work units, can make progress using single nodes at a time, and is safe to preempt instantly. It is also the most computationally expensive part of GNFS, so getting sieving done is a lot of progress toward a factorization. However, all prior public GNFS factorization records used only CPUs for lattice sieving; indeed, due to challenges of efficiently implementing lattice sieving on GPUs, for a long time it was not clear that GPU lattice sieving could be more cost-effective overall.

In short, all that I was missing was a sufficiently high-performance GPU lattice siever that could accept the parameters needed to factor RSA-260. So, what did I do? Ask Devin.

Using Devin to optimize GNFS

At August 13th 0:11:58 Pacific time I aimed Devin at producing a drop-in replacement for las, the CPU lattice siever of CADO-NFS. Here is the prompt I used:

CADO-NFS is FOSS software for performing GNFS. I'd like you to develop a fast GPU lattice siever. This has historically been difficult with present techniques because optimizations for CPU lattice sieving employ a lot of conditional branching and complex memory access patterns, and the intersection of GPU kernel-writing experts and number field theory experts is quite small. However, the higher total memory bandwidth available in a GPU promises a higher performance ceiling. And that intersection now contains you.You have Modal access keys available that I authorize you to use to spin up a single GPU box for performance testing. Obtain the CUDA toolchain etc. and build locally; use GPU only for performance testing and shut it down between measurements.The resultant GPU lattice siever should be a drop-in replacement for the siever step of CADO-NFS. Iterate until you exceed the performance of the CPU lattice siever.

Two hours later I added that glas (GPU las, of course) should be able to handle the parameters used for RSA-250. Then I went to bed. I woke up to find that, after another 7 hours of iteration, Devin had succeeded.

Over the subsequent week I drove Devin to optimize lattice sieving, then the rest of the GNFS pipeline. First, I will give a high-level description of our GNFS optimizations, and then I will describe the optimization workflow.

GNFS optimizations (high-level)

At a high level, GNFS consists of a number of stages run sequentially: polynomial selection, lattice sieving, and linear system solving.

Polynomial selection fixes the number field over which the algorithm is run. The choice of polynomial controls a constant-factor speedup on the lattice sieving step. It’s therefore typically worth spending a fixed fraction (~5%) of overall sieving compute finding a “good” polynomial. There was little technical innovation here; we adapted CADO’s stage-1 polynomial selection to GPUs (resulting in gps1), using also some kernel equipment from msieve’s well-optimized stage-1 polynomial selection. Polynomial selection is more or less embarrassingly parallel.

The bulk of the GNFS computational effort is in lattice sieving. The goal of lattice sieving is to produce lots (8.3 billion in our case) of sparse linear relations over GF(2), where here (suppressing some details) the vector entries represent the parities of prime exponents in the prime factorization of a smooth number. Lattice sieving is also embarrassingly parallel over work items called “special q”s, but each work item requires performing a large number of read/writes at (for our purposes) pseudorandom locations in a large array; handling this was the primary technical challenge in optimizing sieving.

Ultimately, we pack these relations into a large matrix over GF(2) and use linear system solving to find a linear dependence. At this scale, linear system solving is typically distributed and requires a lot of communication bandwidth; this is available in spades over Infiniband and NVLink. The block Wiedemann algorithm permits relaxing the communication constraint somewhat, and the particular implementation in CADO-NFS is also susceptible to optimization and running on GPUs, which we undertook. Solutions can be processed into congruences of squares modulo N, which yields the factorization.

Overall, Devin substantially modified almost every piece, including modifying a couple of interfaces:

  • A GPU-adapted version of CADO-NFS’s stage-1 polyselect, with components from msieve
  • A GPU-optimized lattice siever based on las
  • An optimized CADO head to handle the workunit volume
  • Parallelized and optimized dup/purge and fused merge/replay programs
  • A new GPU-optimized block Wiedemann implementation
  • GPU-accelerated sqrt
  • Associated run scripts

The only untouched programs in the CADO-NFS pipeline were: cado-nfs.py itself, polyselect_ropt (stage-2 polynomial selection), makefb, and dup1. We even had to optimize fake_rels to get reasonable performance for synthetic inputs of the needed sizes.

N.B. I understand these components only in the same way a mid-level car hobbyist might understand car components: their approximate role in the overall system, their effects on performance, some tradeoffs of making changes, and what good operation and usage looks like — but not the underlying physics, nor how to fabricate the component from raw materials. That’s to say that I do not understand much of the underlying mathematics. I can tell you that polynomial selection provides a constant factor on lattice sieving yield; I cannot tell you how the polynomial is used in the siever. In this field I am far from an expert!

The optimization workflow

I drove several parallel Devins. Across the 3-week duration of the project, I had an average of 3 and a maximum of 18 concurrent Devin sessions running. These were roughly of two types:

  • iteratively optimizing an individual component — designing and running experiments, interpreting results, selecting target improvements, implementing them, and repeating
  • managing end-to-end factorization runs on the cluster — exercising the whole pipeline and supporting scripts, revealing the most important inefficiencies (errors, utilization, performance) for further optimization

In particular, Devin handled substantial portions of:

  • choosing and tuning parameters for sieving and linear system solving (though using benchmarking equipment that I had to help bootstrap)
  • generating/optimizing polynomial selections (again, with varying degrees of difficulty)
  • running the iterative optimization loop
  • debugging (naturally)
  • setting up and optimizing the processing scripts
  • orchestrating large-scale computation on the cluster

I interacted with this optimization loop once every couple of hours, alternating with talking to other Devin sessions for my regular work.

Devin Cloud was especially convenient for this workflow: sessions are persistent and independent from my computer, parallelization is straightforward, sandboxing prevents interference between independent workstreams, and sessions can run autonomously for weeks. We already knew that Devin was effective at GPU programming, experimentation, and cluster management for ML-relevant workloads, but lattice sieving and GNFS are fairly different; I found Devin’s ability to generalize here quite impressive.

Running up the scaling ladder

This workflow permitted an incredible rate of progress that I (and even Devin itself) could barely keep up with. For the first five days we ran up a scaling ladder. By the end of this, factoring a 190-digit number took the same amount of time as a 157-digit number had at the start — a little over 3 hours.

After factoring the C311 (which was roughly equivalent in difficulty to GNFS on a 216-digit number), it would have been safer to proceed by factoring a 230-digit equivalent difficulty number in order to cross the remaining couple of orders of magnitude. But I estimated that RSA-260 could be done in under a month and therefore had already begun polynomial selection, even though I knew the linear algebra remained significantly underoptimized.

What did Devin still need me (or other humans) for?

Devin successfully optimized and executed a complex computational number theory pipeline at a scale that previously required considerable human expertise. But I cannot claim that Devin iterated autonomously on the entire end-to-end pipeline. It is interesting to consider what he needed me for.

Somehow, the answer seems to be: still a lot. In retrospect, Devin claims that I sent 82,702 words (502,887 characters) in 3,328 messages across 192 sessions out of 233 used for factoring (totaling 14,450 ACUs). Of these, Devins themselves started 101 child sessions, and 36 received no intervention from me at all.

Devin needed me for executive function, talking through and sanity-checking what it was doing, to wit:

  • setting a hierarchy of goals and keeping Devin properly scoped
  • recognizing when Devin was doing something unproductive and redirecting (“you don’t need to take that measurement”)
  • recognizing repeated inefficiencies in Devin’s workflows (“you can amortize this setup work”)
  • pointing out untried directions (“make sure the GPU never blocks on the CPU”, “can you use NVLink SHARP here?”)
  • organizing experimental frameworks and results (“do measurements this way and find previous results here, don’t cook up new incomparable approaches every time”)
  • catching when Devin prematurely gave up on a direction

While in retrospect I appear to have supplied a couple of specific technical insights, my biggest contribution was probably to handhold the creation of a unified set of measured results, benchmarks, and performance estimators, which evidently were not otherwise going to self-assemble. This enabled Devin to more easily run and understand measurements, and me to understand the extent of progress and where more improvements were needed.

Taking a step back, I also want to emphasize that this effort would not have been possible without CADO-NFS. CADO-NFS is an advanced, robust, open source implementation of GNFS that was used in many previous records and also by the factoring hobbyist community. It provided all the relevant techniques, the pipeline stages and their interfaces, and a reference CPU implementation. Using those, I could have the Devin swarm optimize programs roughly independently and compare the outputs with the originals. Like in many other cases, I believe that the human-engineered decomposition of the problem was essential to enabling the agents to make progress.

In fact, I noticed that the further the codebase got from upstream CADO-NFS, the more confused the agents became. This could be attributed to accumulating complexity, but I wonder whether CADO-NFS’s presence in pre-training is also relevant here.

This concludes the technical part of the blog post (except for the appendix, which has far more details).

Assorted reflections

What has happened here is strange to me. My name is on the result, but it’s not clear to me how to apportion credit among myself, Devin, the hardware, and the world at large.

For programming tasks, I think of current models and agents somewhat like a sewing machine or a loom. I push it along in some way; it evidently could not happen without me, but neither am I throwing the shuttle by hand. It is hard to say exactly what my role was, although I am confident that it was not nothing. In some glib sense, doing this with Devin was not that different from what would have happened otherwise: I interacted with a physical system much larger than me whose precise workings are obscure to me, energy was dissipated, and the factors resulted.

On the other hand, something clearly new is happening. About three weeks elapsed from first prompt to RSA-260 factors found. The rate evinces a capability overhang whose extent we are only beginning to explore. I think we should not shy away from this exploration. In particular, if a problem can be solved via “just programming”, it seems worthwhile to attempt this immediately.

In the past few days, we’ve also seen some impressive claimed results in mathematics, including a claimed solution to one of the Millennium Prize Problems. I share some concerns about a loss of human understanding. I did not learn as much about NFS or GPU programming as I could have expected to had I done this on my own, though likely more than I would have if I were not using Devin at all. It seems important to figure out how to globally allocate resources to maintain human understanding even when technology enables or incentivizes us to forgo this. At the same time, these tools may allow us to choose where deeper understanding is most valuable, explore further than any individual could previously reach, and expand the set of people who can make meaningful contributions. I see this work as an example in both directions.

Acknowledgments

Thanks to Alex Lombardi for mathematical consultation and much editing.

Thanks to my employer Cognition; this would not have been possible without Cognition compute. Thanks especially to the Cognition research team for tolerating the endlessly respawning glas jobs. Thanks also to friends and especially my wife Jiwon Joung for supporting this hobby project.

I’d like to dedicate this to the whole online factoring community — GIMPS, mersenneforum, FactorDB, GPU to 72, and the rest — for sparking my interest here in the first place and keeping the chase alive.

References

  1. F. Boudot, P. Gaudry, A. Guillevic, N. Heninger, E. Thomé, and P. Zimmermann, "Comparing the Difficulty of Factorization and Discrete Logarithm: A 240-Digit Experiment," Advances in Cryptology — CRYPTO 2020, LNCS 12171, pp. 62–91, 2020. arxiv.org/abs/2006.06197
  2. The CADO-NFS Development Team, "CADO-NFS, An Implementation of the Number Field Sieve Algorithm," software project, accessed September 9, 2026. cado-nfs.gitlabpages.inria.fr
  3. N. David and P. Zimmermann, "A New Ranking Function for Polynomial Selection in the Number Field Sieve," 75 Years of Mathematics of Computation, Contemporary Mathematics 754, pp. 315–325, 2020. inria.hal.science/hal-02151093v4/document
  4. J. Franke and T. Kleinjung, "Continued Fractions and Lattice Sieving," Special-Purpose Hardware for Attacking Cryptographic Systems — SHARCS 2005, 2005. hyperelliptic.org/tanja/SHARCS/talks/FrankeKleinjung.pdf
  5. A. K. Lenstra, A. Shamir, J. Tomlinson, and E. Tromer, "Analysis of Bernstein’s Factorization Circuit," Advances in Cryptology — ASIACRYPT 2002, LNCS 2501, pp. 1–26, 2002. research.tue.nl/en/publications/analysis-of-bernsteins-factorization-circuit
  6. J. Papadopoulos and contributors, "Msieve," integer-factorization software, accessed September 9, 2026. sourceforge.net/projects/msieve
  7. A. Shamir and E. Tromer, "Factoring Large Numbers with the TWIRL Device," Advances in Cryptology — CRYPTO 2003, LNCS 2729, pp. 1–26, 2003. link.springer.com/chapter/10.1007/978-3-540-45146-4_1
  8. M. Tervooren and contributors, "FactorDB," online factorization database, accessed September 9, 2026. factordb.com
  9. L. Valenta, S. Cohney, A. Liao, J. Fried, S. Bodduluri, and N. Heninger, "Factoring as a Service," Financial Cryptography and Data Security — FC 2016, LNCS 9603, pp. 321–338, 2016. eprint.iacr.org/2015/1000
  10. D. H. Wiedemann, "Solving sparse linear equations over finite fields," IEEE Transactions on Information Theory, vol. 32, no. 1, pp. 54–62, January 1986. doi.org/10.1109/TIT.1986.1057137

Appendix 1: Cost estimates to factor other RSA numbers

Costs assume $0.08/CPU core-hour, $3.50/GPU-hour. CPU estimates use GNFS scaling from RSA-250 and GPU estimates from RSA-260.

Appendix 2: Details of the RSA-260 run

Polynomial selection

Polynomial selection began on 2026-08-18 at 12:14:19 UTC. The search was irregular and a bit ad-hoc; it covered several runs over different admin/admax ranges, prime bounds P, and incr values. Search parameters shifted as benchmark results were produced, and I wasted much search time on unproductive ranges due to incorrect benchmark interpretation. A significant suboptimality of this run was spending too much time in polynomial selection; we could have searched the intended range in 1 day rather than 2.5, and it probably would have been worth it to spend only 12 hours searching less than the intended range.

The four stage-1 runs that produced every trial-sieved polynomial used 15,424 GPU-hours or 643 GPU-days.

We trial sieved a total of 22 distinct polynomials, which can be found attached here. We tested the top 5 by MurphyE among those we had available as of 2026-08-19 10:53, which all came from the first two runs, then a further 17 selected as a union of the top 10 by each of four scores MurphyE, CADO’s E, E'sigma, and E'chi2 (from David and Zimmermann) as of 2026-08-21 06:08:18, which came from runs 3 and 4.

After trial sieving, the polynomial we went with was:

Y0: -221673351566952308029695237213052836736183
Y1: 5766034074997040571677
c0: 4438326758963496161172848385157253702543453653246272
c1: -2760724998540198898516614911500562788411825980
c2: -3288611114230578563553198296458642435160
c3: 950383683194810225243935581823335
c4: 541831494549130032021283293
c5: -32669802676467106300
c6: -1863645537600
skew: 3226459.164

Some properties of this polynomial: degree 6, skew 3,226,459, MurphyE 6.633e-10 (Bf=2.749e11, Bg=1.374e11, area=8.59e18), alpha -9.57 (projective -2.38), side-1 lognorm 73.31, 6 real roots. (c260-r1 in the attachment).

The second-best trial-sieved polynomial (c260-r2) had MurphyE 6.215e-10 and gave 1-2% lower yield. The best of the first five by MurphyE (c260-p1) had 5.674e-10 and gave 13-16% lower yield.

Sieving

Sieving began on 2026-08-22 at 10:01:12 UTC and reached target at 2026-08-30 07:26:15 UTC; the final workunits were uploaded 2026-08-30 at 07:32:17 UTC. Sieving wallclock time was 189.5 hours = 7.9 days. Sieving parameters were lpb0/lpb1 = 36/37 (candidate lpb3637), lim0 = lim1 = 2^31, mfb0/mfb1 = 72/111, ncurves 50/35, A = 33, sqside = 1. Special q range was q = 1.0e9 to about q = 3.91e10 (highest workunit ended at 39,091,320,000) for a total of 632,249 workunits. We used a special q range of 60,000 per workunit so they would take about 10 minutes.

Sieving was relatively drama-free. We upgraded the siever twice during this process, gaining 14-17% performance vs. the start of sieving. Measuring end-to-end workunit times as the median interval between consecutive uploads from one GPU, our GB200s went from 585 s to 486s, GB300s from 586s to 504s, and B200s from 628s to 541s. Overall sieving time was 3,813 GPU-days.

Ultimately, we obtained 13,849,985,589 raw relations for filtering (shy of the 13.85B target because four files were truncated after running out of disk space), which filtered down to 8,298,749,059 unique relations (40.1% duplicates), and 3,991,449 free relations.

Linear algebra

Dedup/purge/merge/filter took 4 hours end-to-end (after a run crashed 2 hours in) on 176 threads of a 192-vCPU node and produced a 656,182,601 x 656,182,189 matrix with 98,431,741,898 nonzeros at density 150 per row. We gave some consideration to optimal merging and changed the target density over the course of sieving, but ultimately landed close to 150.

We optimized the linear algebra while sieving proceeded. Optimization was turbulent because we simultaneously co-optimized matrix params, solver layout, and code targeting speculative final matrix properties. For representative test inputs, we eventually converged on a few matrices formed using optimized fake_rels. This fed back into sieving: changes to linear algebra performance (and departure from trial sieving yield estimates) nudged the relation target a couple of times. It is unclear to me how far we were from optimal overall, but I halted optimization when a 48-hour linear algebra run seemed within reach.

Linear algebra began on 2026-08-30 15:45:10 UTC. Dispatch/prep/secure took 4.4 hours. krylov ran 2,564,096 iterations on each of two width-256 sequences (m = n = 512), taking 0.045 to 0.102 s per iteration depending on available compute. We saved checkpoints every 8,192 iterations and kept every fourth one to enable parallelizing mksol; we deleted the others after verification. krylov was done at 2026-09-02 02:38:14 UTC. lingen took 3.5 hours on a single GB200 node with 4 GPUs; multiple attempts were pre-empted so this phase took 7 hours overall. We ran 40 mksol ranges across two clusters; each ran on a 2x2 grid (16 GPUs) and took between 82 and 87 minutes. Gather took 9m04s on a 2x2 grid and wrote 64 kernel vectors.

To confirm the correctness of the optimized implementation, which had not been tested on any smaller scale before starting the run, we factored (11^331 - 1)/10 (C344) end-to-end while krylov ran. As another check, in parallel with krylov, we also ran CADO’s bwccheck over every V checkpoint pair. CADO’s normal in-krylov check went off about 14 hours into the run; we re-ran that interval and continued the run correctly.

I initially intended the linear algebra configuration to be m = n = 512 and two width-256 sequences on 16 GB200 nodes in a 4x4 MPI grid (64 GPUs each). I had planned on using dedicated cliques, but could not due to the requirements of higher-priority workloads, so proceeded with scattered compute as before. I expected some loss of performance due to running across InfiniBand, but the implementation does not fully utilize NVLink, so performance degradation was not too severe. Unlike sieving, linear algebra requires all of its workers to remain up. Consequently it was fatally preempted frequently and we had to develop a somewhat complex placement script to constantly fit the best shape possible to the available compute.

Characters and square root

Normally this step requires relatively inconsiderable computational effort, but in the RSA-260 run took 12 hours end-to-end after running into some trouble. Due to the size of the rational product (1.76e11 bits), sqrt overflowed the mpz_t limb counter and aborted. Devin rebuilt sqrt three times (first using GMP’s mpn functions and then also parallel Karatsuba on CPU); the version that ultimately produced the factors used GPU-accelerated NTT multiplication and finished in 88 minutes. Factors were produced at 2026-09-03 01:48:57 UTC.

The Daily Front Page 8 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Java’s Prepared Start
article

JEP 544: Ahead-of-Time Code Compilation

by Skinney·▲ 83 points·29 comments·openjdk.org ↗
Improve startup and warmup time by making optimized native code instantly available.

Summary

Improve startup and warmup time by making optimized native code for an application instantly available when the HotSpot Java Virtual Machine starts. Achieve this by compiling application code to native code in a training run, storing the native code in the AOT cache for use in subsequent production runs. If the workload changes in production, regenerate native code dynamically for continued peak performance, providing the best of both ahead-of-time (AOT) and just-in-time (JIT) compilation.

Goals

  • Enable applications to achieve peak performance more quickly.
  • Enable applications to sustain peak performance even as workloads change.
  • Do not require any change to the code of applications, libraries, or frameworks.
  • Do not require any change to the configuration of HotSpot, beyond requesting the use of the AOT cache.
  • Continue to support the Serial, Parallel, G1, and ZGC garbage collectors.
  • Do not introduce new AOT workflows, but, rather, extend the existing AOT cache creation workflow.
  • Ensure that shifting from AOT-compiled code to JIT-compiled code is invisible to applications.
  • Support the AArch64 and x64 processor architectures.

Non-Goals

  • It is not a goal to provide an AOT-only mode. Applications will use both AOT-compiled code and JIT-compiled code in the same run, automatically transitioning between them as needed.
  • It is not a goal to support cross-compilation. Code compiled in a training run must run on the same CPU architecture, with the same set of features, in subsequent production runs.
  • It is not a goal to support all CPU architectures currently supported by HotSpot. We expect normal porting activities to eventually add support for all major architectures.

Motivation

When a Java application is run by the HotSpot JVM, it passes through three phases: It starts up, then it warms up, and then it reaches peak performance.

During startup, HotSpot invokes the application's main method and loads, links, and initializes classes on demand. Initially, it runs both application and JDK library code via the bytecode interpreter, which is slow. Inside the interpreter, HotSpot profiles the application's behavior by counting events such as method invocations and loop iterations. It uses the profile data to select frequently-invoked methods, or hot spots, which it compiles to native code via the basic C1 compiler. This native code is only modestly optimized.

During warmup, the application settles into its workload and the loading, linking, and initialization of classes ramps down. HotSpot continues to profile the application, both in the bytecode interpreter and via instrumentation code inserted by C1. It collects richer profile information, including not just method-invocation and loop-iteration counts but also the types of objects encountered. As the profile data accumulates over time, it becomes more statistically useful. Eventually, HotSpot uses the data to select the hottest methods, which it compiles to native code via the advanced C2 compiler. This native code contains no instrumentation and is highly optimized.

Profiling the application and generating native code is not free. Not only is the bytecode interpreter slow, but instrumented native code is slower than uninstrumented native code. Compiling methods to native code requires both CPU time and memory that could otherwise be used by the application, even though HotSpot only compiles methods to native code when profile data indicates that doing so will be worth the effort. Gradually, however, JIT compilation catches up to the application's emerging hot spots and the application runs faster. Eventually, all hot methods are compiled to fully optimized native code and the compilers go idle.

The application remains in this state of peak performance as long as its hot spots do not change. The application's hot spots may change, however, in response to changes in its workload. When that happens, HotSpot can dynamically deoptimize, by discarding previously generated native code as needed, and reoptimize, by generating new native code for newly-hot methods. For example, if an application initially receives two types of requests then HotSpot dynamically optimizes the code for those two request types. If the application starts receiving a third type of request, HotSpot can dynamically deoptimize and then reoptimize the code for all three types of requests. The application can pass, in effect, through another warmup phase, sustaining performance as the application's workload changes.

What about static compilation?

Static compilation has sometimes been proposed as an alternative to the dynamic compilation of Java code. A static compiler converts entire applications to native code ahead-of-time, prior to run time.

Static compilation has some advantages over dynamic compilation. A statically compiled application starts up and reaches peak performance immediately, without a warmup phase. At run time there is no need for a bytecode interpreter, profiling, or compilation. Peak performance can even be competitive with HotSpot if the static compiler's optimization work is guided by accurate profiles gathered during prior runs.

Dynamic compilation, however, has three key advantages over static compilation.

First, dynamic compilation makes applications agile because it responds to changes in the application's hot spots. It deoptimizes and reoptimizes as needed, sustaining performance as the application's workload changes. A statically compiled application cannot respond in this way — by its nature, it can be optimized for only one set of hot spots.

Second, dynamic compilation makes applications portable across varying hardware and software because it generates native code at run time that is specific to the run-time environment. If an application is redeployed on a different processor architecture, a processor with a different feature set, a different operating system, or a different version of the JDK, HotSpot will achieve peak performance for that environment without requiring any change to the application. A statically compiled application must be recompiled in the face of such changes.

Finally, dynamic compilation is compatible with the dynamic nature of the Java Platform. Features such as dynamic class loading, dynamic linkage, dynamic dispatch, and dynamic reflection bring vast expressive power, and have been fundamental to the platform's success. HotSpot handles these features naturally, while static compilers struggle with them. Even heroic amounts of static analysis cannot make up for the fact that these features require many decisions to be made at run time. Implementors of static compilers for Java code have therefore resorted to incompatible constraints, such as closed-world assumptions, and to putting significant burdens on developers, such as having to identify in advance the classes eligible for reflection.

Shifting compilation work to training runs

Throughout the startup and warmup phases, HotSpot continuously juggles multiple balls: It runs application and JDK library code; it loads, links, and initializes classes on demand; it profiles the application's execution; and it compiles hot methods to native code with varying degrees of optimization, guided by the profile data.

The thesis of Project Leyden is that the key to improving startup and warmup time is to do some of this work earlier, ahead of time, rather than just in time. We shift work earlier in time by doing it in a training run, storing the results of the work in the AOT cache for instant use in subsequent production runs.

We shifted class loading and linking work earlier in time via JEP 483, delivered in JDK 24. The AOT cache stores the loaded and linked forms of classes from the training run, thereby improving startup time.

We shifted profiling work earlier in time via JEP 515, delivered in JDK 25. The AOT cache stores the execution profiles of methods invoked in the training run, enabling the C2 compiler to run immediately at the start of production runs, thereby improving warmup time.

These improvements laid the foundation for our ultimate goal, which is to shift compilation and optimization work earlier in time. The AOT cache will store optimized native code compiled in the training run, enabling HotSpot to load that code instantly, rather than having to recompile it at the start of each production run. This will improve both startup and warmup time.

HotSpot will not always use the cached code; if the application's workload changes then HotSpot can, as usual, deoptimize and reoptimize, generating new native code for newly-hot methods in order to sustain performance. Thus Java applications will gain some of the benefits of static compilation while retaining the agility, portability, and compatibility of dynamic compilation.

Description

We extend the existing AOT cache to store optimized native code generated in a training run. Such cached code is known as AOT code. During a production run, a request for optimized code for a method can be fulfilled instantly if matching AOT code is found in the cache. If AOT code is unavailable, incompatible, otherwise unsuitable, or later deoptimized, execution falls back to the existing interpreter and JIT mechanisms. AOT code and JIT code can coexist and are completely interoperable since they are created by the same compilers, C1 and C2.

To create an AOT cache, use the AOTCacheOutput option to do a training run of your application and generate AOT code:

$ java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...

This workflow is unchanged from previous releases. The AOT cache in the file app.aot, however, now contains not just pre-linked classes and profiling data but also AOT code for selected hot methods. Subsequently, in production, you can run the application with the cache:

$ java -XX:AOTCache=app.aot -cp app.jar com.example.App ...

No additional options or settings are required to generate or use AOT code. HotSpot creates AOT code and stores it in the cache by default. It continues to store profile data in the cache as well, to be used for sequencing the loading of AOT code and for guiding the subsequent generation of JIT code.

Performance

To evaluate the startup benefit of AOT code, we ran five benchmark applications built with popular Java frameworks. We ran them on a two-core Linux/x64 system so as to emulate a microservice setting in which the JIT compiler is likely to compete with the application for CPU time, thereby increasing startup time:

Performance chart showing the startup benefit of AOT code for five benchmarks

Without AOT code, the AOT cache reduces the startup time of these applications by around 50% to 70%; with AOT code, the cache reduces their startup time by around 65% to 80%.

To evaluate the warmup benefit of AOT code, we ran a javac benchmark application which repeatedly compiles the same 50 source files, twenty times, measuring the time required for each iteration:

Performance chart showing the warmup benefit of AOT code for javac

In each curve, the first iteration shows the startup-time improvement: The AOT cache without AOT code improves startup time by about 30%; adding AOT code brings an additional 45% improvement, for a total of about 75%. Successive iterations show the warmup phase, during which HotSpot compiles the hottest methods: The iteration time tends to decrease and then reach a steady state as the quality of the native code improves and the compilers finish their work. The curve for the AOT cache without AOT code decreases more quickly than the curve for no AOT cache, eventually reaching roughly the same steady state. The curve for the cache with AOT code is already close to the steady state by the fourth iteration. The area between the top curve and the bottom curve represents the total warmup-time improvement.

Information on all of these benchmarks, including run instructions and links to source code, is available here.

Differences between AOT code and JIT code

AOT code and JIT code can be different, since training runs and production runs can be different.

One source of differences is the fact that the order in which classes are initialized can differ between training and production runs, especially if the workload differs. A method that accesses a static field or invokes a static method in another class must ensure that the class is initialized. When generating AOT code with C2, HotSpot therefore compiles two versions of such methods: A slow version contains extra code to ensure the initialization of referenced classes, while a fast version does not contain that code and thus can be better optimized. HotSpot uses the slow version initially, and then switches to the fast version once all referenced classes are initialized.

Another source of differences is the fact that a static final field's value can vary from run to run; it might, for example, be initialized with the current date and time. When just-in-time compiling a method that refers to such a field, the class containing the field will have been initialized, so the field's value will be known and C2 can treat it as a compile-time constant, embedding it directly in native code. When ahead-of-time compiling the same method, however, no classes will have been initialized, so the field's value will not be known and C2 cannot treat it as a compile-time constant; it must generate code that explicitly loads the field.

Despite these differences, AOT code still delivers significant performance benefits in a manner that is transparent to applications. As always, at run time the compilers can generate JIT code to replace AOT code that fails to age well.

Consistency of training and production runs

To enjoy the benefits of the AOT cache generated in a training run, the training run and all subsequent production runs must be essentially similar, as described in JEP 483.

If an AOT cache contains AOT code, that code is used when two additional constraints are met:

  • All runs use CPUs of the same architecture and with the same features. For example, AOT code generated for an x64 CPU with the AVX-512 vector-instruction feature will not run on an x64 CPU without that feature.
  • All runs use the same garbage collector, since AOT code contains GC-specific read/write barriers.

If these constraints are not met then HotSpot issues a warning message and does not load the AOT code, falling back to the usual interpreter and JIT mechanisms. It still uses the other information in the AOT cache, namely the loaded and linked classes and the profiling data. In that case, the application may start up and warm up more slowly, but its execution will still be correct and it will still, eventually, achieve peak performance.

Observing AOT cache usage in production

You can observe whether AOT code is loaded in a production run via the existing HotSpot option PrintCompilation, which now reports on both AOT code loading and JIT compilation:

$ java -XX:+PrintCompilation \
  -XX:AOTCache=app.aot -cp app.jar com.example.App ...

You can also check whether an AOT cache containing AOT code is usable in a particular production environment. The option AOTMode=required causes HotSpot to report an error and exit if the AOT cache violates any constraint:

$ java -XX:AOTMode=required \
  -XX:AOTCache=app.aot -cp app.jar com.example.App ...

(This option was originally AOTMode=on, later renamed for clarity to AOTMode=required.)

Finally, you can disable the loading of AOT code via the diagnostic option AOTCodeCaching:

$ java -XX:+UnlockDiagnosticVMOptions -XX:-AOTCodeCaching \
  -XX:AOTCache=app.aot -cp app.jar com.example.App ...

You can use this option to evaluate the performance effects of AOT code in a production run, or to avoid constraint-violation errors when using AOTMode=required and the AOT code is unusable but the other information in the cache is usable.

Controlling the generation of AOT code in training

We have, thus far, spoken of an AOT cache being created in a training run, in a single step via the AOTCacheOutput option as shown above. In fact, creating an AOT cache takes two distinct steps: HotSpot runs once in record mode to store observations of your application's behavior in an AOT configuration, and then again in create mode to assemble an AOT cache from that configuration, which includes compiling AOT code. Using the AOTCacheOutput option runs the second step transparently, but you can invoke each step explicitly via the AOTMode and AOTConfiguration options:

$ java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf \
       -cp app.jar com.example.App ...
$ java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconf \
       -XX:AOTCache=app.aot

HotSpot provides many options to control the behavior of its compilers, C1 and C2. These options uniformly govern the generation of both JIT code, at run time, and AOT code, in the assembly step. For example, this command line reports all JIT compilation activity during the training run proper and all AOT compilation activity as the cache is created:

$ java -XX:+PrintCompilation \
  -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...

To see AOT compilation activity but not JIT compilation activity, use the existing environment variable JDK_AOT_VM_OPTIONS to pass the PrintCompilation option only to the assembly step:

$ JDK_AOT_VM_OPTIONS='-XX:+PrintCompilation' \
  java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...

Alternatively, you can run the two steps yourself, specifying the PrintCompilation option only in the second step.

Finally, you can disable the creation of AOT code in a training run via the diagnostic option AOTCodeCaching:

$ java -XX:+UnlockDiagnosticVMOptions -XX:-AOTCodeCaching \
  -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App ...

You can use this option to evaluate the size impact of AOT code on the AOT cache — cached code can make the AOT cache significantly larger.

For more information on all of the AOT-related command-line options, see the manual page for the java command.

Future Work

  • Investigate minimizing bytecode interpretation and JIT compilation in favor of near-total reliance on AOT code. Initial experiments suggest that minimizing interpreter use results in overly large AOT cache files, which can take more time to load than just running the interpreter. Likewise, minimizing JIT compilation often leads to lower peak performance. This approach may have limited applicability if, like static compilation, it fails to live up to user expectations.
  • HotSpot has a wide range of fine-grained options for controlling its compilers. Based on experience with this feature, tune the default values of existing options to apply more gracefully to AOT code. Also consider defining new options, such as options for explicit AOT cache size management.
  • Consider an option that would enable giving up some performance, or accepting larger AOT cache files, or both, in order to gain portability across processors of the same architecture but with different feature sets.

Testing

  • We will create new unit tests for this feature. They will ensure that AOT code, if present, behaves correctly.
  • We will run existing AOT cache tests with this feature enabled and ensure that they pass.
  • Initially, only AArch64 and x64 processors will be supported. Unit tests will be adjusted appropriately to allow for the absence of AOT code on other architectures.

Risks and Assumptions

  • There are no new risks beyond those already noted in JEP 483.
  • We assume that HotSpot's organizing principle is still sound: A Java application should be compiled, at run time, to favor the application's actual behavior, exploiting all of the processor features available. Because of this principle, Java code automatically runs better on new hardware.
  • The base assumption of the AOT cache also remains operative: A training run is assumed to be a good source of observations that, when passed through an AOT cache to a production run, will benefit the performance of the production run. This assumption applies fully to AOT code, which benefits similar production runs while not doing harm to divergent production runs, which can use JIT compilation to generate different code.
The Daily Front Page 9 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Databases at Scale
article

Neki – Sharded Postgres

by simon_weber·▲ 215 points·120 comments·planetscale.com ↗
Neki is now available in platform preview.

Neki is now available in platform preview.

Neki is built from lessons we’ve learned over eight years of running some of the largest sharded MySQL clusters in the world. Thousands of production workloads with millions of queries per second for companies where even a few seconds of downtime is a very public event. We know what it means to power the world’s biggest tier 0 workloads.

When we released PlanetScale Postgres a year and a half ago, we knew we needed to do more. In that time we’ve onboarded several thousands of customers on PlanetScale, some of them rivaling the size of our largest MySQL customers. Time and time again, we watched teams approach the ceiling of a single machine with Postgres. Metal bought them time, but with customers hitting the upper limit of what a single machine is capable of, we found there was no good option to hand them. Enter Neki.

What is Neki?

Neki is sharded Postgres from PlanetScale. It lets you scale a Postgres database across many machines while keeping real Postgres on every shard.

Your application connects to a Neki router over the standard Postgres wire protocol, so your existing drivers, ORMs, and connection string keep working. Each shard is a full Postgres cluster with one primary and at least two replicas across 3 availability zones. There is no custom storage engine, so extensions, SQL support, and performance behave the way Postgres does.

You choose the shard key and control how tables are grouped and distributed through a JSON data topology. Schema changes, version upgrades, failovers, imports, and resharding all run as built-in fully online workflows. You also get the PlanetScale features you already rely on, including Insights, schema recommendations, branching, and MCP.

You don't have to shard on day one. Run Neki as a single primary with replicas, and when you outgrow one machine, resharding is a workflow you run against the cluster you already have.

Why Neki?

You already know the problems that come with fast-growing Postgres databases: tables too large to vacuum or index without affecting traffic, backups taking hours, connection limits, maintenance windows for schema changes, transaction wraparound and so much more.

You can move to a bigger instance, but eventually you run out of big enough machines, and the problems don’t scale linearly as you add more cores and IOPS.

The existing answers each ask you to give something up. Application-level sharding pushes routing into your code. Postgres-”compatible” distributed databases hide the shard key from you, take away your extensions, and add complexity and latency which becomes difficult to handle and debug.

So we built Neki with a few principles, the biggest one being: stick to Postgres, don’t work around it, fake it, or turn away from it.

How does Neki work?

We architected Neki from first principles for Postgres, with real Postgres on every shard. There are four moving parts.

Neki routers

Your application first connects to a Neki router. The router speaks the Postgres wire protocol so your existing drivers and ORMs keep working with a single connection string. A router has a full Postgres query parser, a distributed query planner, query buffering and more. It parses your query, builds a plan that decides which shards should run it, sends the work out, and combines the results back into one stream. Routers can scale vertically and horizontally, so no single router becomes the bottleneck.

Sharding and shard groups

Every shard in Neki is real Postgres with 1 primary and at least 2 replicas, spread across availability zones. There is no modified storage engine. Extensions, SQL support, and performance behave the way Postgres behaves, because it is Postgres.

Shards are organized into shard groups, so different tables or workloads can live on different sets of shards. Each shard uses a configuration profile that defines its instance size, replica count, storage, Postgres parameters, and extensions, so you can size each group for its own traffic.

Connection pooling

Sidecars run alongside every Postgres instance. This is the piece that makes Neki's connection handling meaningfully better than just sticking PgBouncer in front of a database. Because Neki controls both ends of the connection, the router side and the Postgres side, it can size pools to what each instance can actually serve instead of estimating from outside the process.

Control plane

The control plane tracks the health of every node, runs planned switchovers and unplanned failovers, and coordinates the workflows that reshard data, apply schema changes, and perform version upgrades.

Data topology

Tying it together is the data topology, a JSON configuration that maps your logical tables onto physical shards. You define shard indexes, which specify the column Neki routes on and how that value gets hashed, and shard groups, which control how many shards a set of tables spreads across and which shards those are. Routers cache the topology and consult it on every plan.

What you get beyond sharding

Everything you would normally schedule a maintenance window for runs as a built-in workflow in Neki. Workflows provision new target nodes, catch them up with replication, switch traffic with a __neki metafunction, and retire the old nodes. All through the same psql connection your application uses.

This online operations model covers schema changes, version upgrades, planned and unplanned failovers, imports, and resharding.

Neki also includes all of the features you’ve come to rely on with PlanetScale: Insights, schema recommendations, branching, MCP, and more.

You can also run Neki unsharded, as a single primary with replicas. You get the improved connection pooling, online DDL, zero downtime upgrades, and health monitoring before you need to shard. When you do, resharding is a workflow you run against the cluster you already have.

What is a platform preview?

We wanted to get Neki into your hands as soon as possible. You should not run production workloads on Neki during the platform preview. The product is still changing, and some of those changes will be breaking.

If you have any feedback, questions, or face any issues during the platform preview, please let us know. Fill out a support ticket or join our Discord

Try Neki today

Sign in to PlanetScale, opt in to the platform preview, and create a Neki cluster. Read the Neki docs for more information about Neki's architecture, how to shard, and more.

If you have a large Postgres cluster and are curious whether Neki is a good fit, get in touch. We would love to do a private demo for your team, dig into your schema and query patterns, and give you real suggestions on how to shard.

The Daily Front Page 10 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Software Temperament
article

I have a theory that software drives people insane

by rglover·▲ 422 points·175 comments·graybeard.ing ↗
Software combines speed, money, complexity, abstraction, and almost unlimited freedom to change your mind.

I have a little pet theory that software drives people insane.

Not in the "wash your hands every thirty minutes like Howard Hughes" kind of way, but more so in how the conditions surrounding software seem remarkably effective at making otherwise normal people lose their sense of proportion.

I've watched this happen enough times from enough angles that I don't think it's entirely a personality problem.

Software combines speed, money, complexity, abstraction, and almost unlimited freedom to change your mind. On their own, those things are perfectly manageable, but put them together and you start to get some really bizarre side-effects.

Most software, when you strip away the branding and architecture diagrams, is remarkably boring. A form here, an API endpoint there, sprinkle in some permissions, calculations, workflows, and a database somewhere. Maybe a queue if you need to scale something (or you're feeling adventurous).

But, harsh as it may be: most software is still just a glorified spreadsheet.

And yet somehow the process of producing this stuff can turn perfectly ordinary adults into b-tier Bond villains. The project is never moving fast enough, the plan has to be ever-flexible to sudden change, and every new feature is the one that's going to be the one (but certainly not that one that was supposed to be the one during the previous sprint).

There is always some new concern about whether it will work, whether it will scale, whether we're moving fast enough, or whether we should be doing something else entirely.

The weird thing about software is that many of these ideas are technically possible. That's part of the problem: there's very little natural friction between an idea and its implementation. If you're building a house and somebody decides halfway through framing that the kitchen should be on the opposite side of the building, everyone immediately understands that decision has a cost.

Boards have been cut, plumbing has been run, and people have to tear already-fixed things apart. The cost is physical enough that nobody can pretend it doesn't exist. With software, that cost hides inside people's heads and inside systems that are, typically, already difficult to reason about.

Moving the kitchen in software might look like a "simple fix." The work is still costly, but the actual expense accumulates quietly. Somewhere between context switching, regression risk, and architectural erosion we find lost momentum, forgotten assumptions, and endless meetings to "get aligned."

No matter the actual complexity, it's easy to pretend the change was free (as in beer) because there isn't any visible dust or scraps. The problem is made worse by the fact that changing software really can be cheap...sometimes.

A useful adjustment might genuinely take an hour, while another equally simple-looking request can ripple through an entire system causing failures. That opaqueness creates a dangerous habit where every "cool idea" that's "super quick" gets added to the roadmap, often with urgency.

Someone has an idea in a meeting and there is often very little resistance between the idea and reality. Could we make this screen work differently? Could we change the business model, chase another customer segment, introduce another workflow, or build our own event system?

The answer is almost always some variation of "sure, we could."

Eventually, "could" becomes "should," and "should" becomes "why isn't it done yet?" This is where software starts doing something strange to people's brains. Everything becomes urgent because everything can move quickly, and every decision starts feeling strategic because the theoretical upside can be enormous.

Every technical choice also becomes ideological because there are dozens of plausible ways to solve the same problem. Every slowdown begins to look like a crisis because somewhere, somebody else is (supposedly) moving faster. The industry has very few natural mechanisms that tell people when enough is enough.

There isn't really an obvious definition of "done" in software (I'll reluctantly share a clip from The Social Network that illustrates this attitude well).

A carpenter eventually puts down the hammer because the cabinet exists, but software can always be improved. The button could be better, the query could be faster, the abstractions could be cleaner, the onboarding could convert more people, and the infrastructure could scale further. The product could expand into an adjacent market, the pricing could change, or the entire company could decide it has discovered a more lucrative direction.

The point: if you want there to be, there's always another lever within reach.

I think this is one reason software organizations become so neurotic: they are surrounded by levers, and people who are surrounded by levers eventually start pulling them.

Sometimes they pull them because something is genuinely wrong. Other times they pull them because they're scared, because the board wants growth, because a competitor shipped something, because the numbers were flat this month, or because nobody knows what else to do.

A founder changing direction every few days gets mythologized as "responding to the market." A manager constantly pressuring people to move faster is considered execution focused, while an engineer introducing several new infrastructure components may be praised for thinking about scale. A product team rebuilding a working interface because conversion dropped slightly is iterating, and a company abandoning its original identity because another category is suddenly fashionable is pivoting.

Some of this language exists because the underlying motivation is legitimate. There are times when you should move quickly, times when you should pivot, and times when the architecture really does need to change. What makes software dangerous is how easy it is to confuse the existence of a take-able action with the need to actually take it.

And if this wasn't bad enough, money just pours gasoline on the whole thing.

There are very few industries where a small group of people can sit in a room, type for a few years (or now, steer agents), and plausibly produce something worth hundreds of millions of dollars. That possibility changes the emotional weight of what is traditionally mundane work (to anyone who isn't a nerd).

You can watch sensible people argue for an hour over a button because, somewhere deep inside the conversation, the button has become connected to a future pile of money.

Once that happens, ordinary judgment is thrown to the wolves. The work stops being about whether the button is tied to something useful and starts carrying the weight of everything people hope the company might become.

Complexity rushes in to fill the same gap. Software is unusually good at making complexity feel important, because complicated systems make ordinary problems seem more serious.

A boring application that stores records in a database and lets people edit them doesn't sound especially impressive, while a distributed event-driven platform with a service mesh and realtime synchronization layer sounds like you're building NORAD.

Sometimes you really do need the complicated thing. Most of the time, you probably don't. But complicated systems provide psychological rewards that simple systems don't. They give people things to design, debate, own, optimize, rewrite, diagram, benchmark, and talk about.

Complexity creates work and work creates an air of importance. Importance creates status, and before long the system exists partly to support the organization that exists partly to support the system. The whole thing becomes self-reinforcing in a way that is surprisingly hard to notice from the inside.

I suspect there is also a deeper attraction underneath all of this. Software gives us an unusual amount of control, because code is one of the few places where you can describe what you want with enough precision and have a machine reliably follow those instructions. The rest of reality is much less cooperative.

Reality is messy and stubborn, while software gives us the impression that messiness—technically or conceptually—is a problem waiting to be debugged.

So we start trying to debug everything around the software too. Growth is slow, so we change the funnel; customers are confused, so we redesign the product; development is slow, so we change the process; the process is slow, so we change the tools. The company is struggling, so we reorganize it, and if it is still struggling (and dependent on venture capital), maybe we pivot.

There is always another variable to manipulate.

Eventually the company itself starts being treated like software: permanently mutable, permanently unfinished, and permanently one refactor away from working properly. This is where the madness really settles in, because nobody can leave anything alone.

Leaving things alone is an underrated engineering skill. There is a point in your career where you begin to understand that a surprising amount of good work comes from refusing to touch things that are already doing their job. The database does not always need to be replaced, the framework is often fine, and the onboarding does not need another redesign this week.

The architecture does not need to anticipate a billion users, and the roadmap does not need to change because somebody got excited by a tweet. The product does not need to become a platform, and the company does not need to rediscover its identity every quarter. Sometimes the thing just needs to sit there and work.

Customers often need time to find a product, engineers need time to understand a system, and businesses need time to become businesses. None of this sounds particularly profound, but software culture is remarkably hostile to patience. Patience looks suspiciously like inactivity, and inactivity is difficult to justify in an industry obsessed with velocity.

So we create activity instead. We ship, iterate, optimize, pivot, replatform, rethink, and reinvent until the original problem is barely visible under everything we've layered on top of it. Then, a few years later, somebody quietly proposes rebuilding the original simple thing (often pointing to their own self-righteous wisdom as the guiding light that made that insight possible).

I don't think the answer is moving slowly for the sake of moving slowly. That would just be another ideology, and software already has enough of those (god help us). The answer is proportion.

It means understanding that not every problem is existential, not every idea belongs on the roadmap, and not every abstraction deserves to exist. It means accepting that not every slowdown requires intervention, not every competitor matters, and not every piece of software needs to become a platform. It also means remembering that not every company needs to seek World Domination.

I'll reiterate: most software is still, despite all this ornament, a glorified spreadsheet. That isn't intended as an insult. Spreadsheets are useful and (actually) useful software is enough.

But maybe we'd all be a little saner if we remembered what we're actually doing: building tools to make our lives and the lives of others easier. Not waste away in Margaritaville tinkering with shit that doesn't need tinkering with.

Roxy

The Daily Front Page 11 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The License Counter
article

List of references on Sony websites to players "owning" their digital games

by haunter·▲ 378 points·126 comments·consumerrights.wiki ↗
Buy Now

Four California PlayStation buyers who each spent hundreds of dollars on digital goods over the past few years say they received only a limited, revocable license rather than ownership, and paid more than they otherwise would have.[1] The complaint alleges the PlayStation Store advertises digital games with ownership language such as "Buy Now" & "Confirm Purchase," and that the brief license disclosure above the "Confirm Purchase" button appears in comparatively small, unhighlighted text, short of the clear and conspicuous disclosure California law requires.[1] On June 18, 2026, Andrew Garcia, Edward Heycock, Jason Mendoza & John Salinas sued Sony Interactive Entertainment, LLC in the U.S. District Court for the Northern District of California, Case No. 3:26-cv-06016, alleging the storefront's checkout language violates California's digital-goods transparency law.[1][2] On August 21, 2026, Sony moved to compel individual arbitration under the PlayStation Terms of Service and, in the alternative, to dismiss the complaint with prejudice.[3][4] Under a heading reading "Reasonable Consumers Would Not Be Misled," Sony argued that it is not plausible that reasonable consumers believed they were obtaining ownership of a digital game.[3] The case remains active, with a hearing scheduled for October 1, 2026.[5][3]

Background

The complaint alleges the PlayStation Store markets digital games to shoppers with ownership language.[1] When a consumer proceeds to checkout, the store displays a confirmation screen with a button labeled "Confirm Purchase," and selecting it finalizes the transaction & charges the payment method.[1] Above that button, PlayStation includes a brief disclosure referencing the Software Product License Agreement, stating that the consumer's purchase of the digital product amounts to a license subject to that agreement.[1] The complaint says the disclosure appears in comparatively small text relative to other portions of the interface & is not visually highlighted or otherwise designed to draw the consumer's attention.[1] The transaction grants a limited, non-exclusive, revocable license governed by Sony's Software Product License Agreement, which the complaint says "expressly provides that the software is 'licensed to you, not sold.'"[1] That agreement bars the buyer from renting, sublicensing, copying, reverse engineering, or transferring the game, and access can depend on the continued availability of the PlayStation platform.[1]

Paragraph 56 of the complaint states the PlayStation Software Product License Agreement expressly provides that the software is "licensed to you, not sold."[1]

What the buyer sees against what the buyer receives At checkout What the transaction conveys Buttons labeled "Buy Now" & "Confirm Purchase"[1] A limited, non-exclusive, revocable license, "licensed to you, not sold"[1] Full purchase price charged to the payment method[1] No right to rent, sublicense, copy, reverse engineer, or transfer, with access tied to the platform's continued availability[1]

KitGuru, reporting on Sony's fiscal earnings report as collated by Push Square, said 85% of game sales in the quarter ending March 31, 2026 were digital, with 15% physical.[6] On July 1, 2026, Sony announced it would end physical disc production for new PlayStation games starting January 2028, moving new releases to digital distribution.[7] Fortune noted that Sony once championed the sharing of physical media and now argues that customers do not own the digital games they purchase.[8]

Class action complaint

The complaint alleges that the four named plaintiffs are California residents who have each spent hundreds of dollars on PlayStation digital goods over the past few years.[1] Recent purchases listed for Garcia include NBA 2K25 Standard Edition for $20.99, NBA 2K26 for $65.99 & EA Sports Madden NFL 26 for $69.99.[1] Those listed for Heycock include Resident Evil Requiem on February 25, 2026 for $69.99.[1] Those listed for Mendoza include Resident Evil Requiem on February 14, 2026 for $69.99 & God of War Sons of Sparta for $29.99, and many others.[1] Those listed for Salinas include Five Nights at Freddy's 4 for $7.99 & Puppet Combo Collection 1 for $17.99, and many others.[1] Each plaintiff states he was not aware the games were only a revocable license, and that the belief he was buying ownership led him to pay more than he otherwise would have.[1] The plaintiffs voluntarily dismissed Sony Corporation of America on August 20, one day before Sony's motion, leaving Sony Interactive Entertainment, LLC as the sole defendant.[5]

Filed by Noah Heinz & Albert Pak of Pak Heinz PLLC, the complaint brings three counts.[1] Count I alleges a violation of California Business and Professions Code § 17500.6, the operative section of AB 2426.[1][9] Count II alleges a violation of California's False Advertising Law, Cal. Bus. & Prof. Code § 17500 et seq.[1] Count III alleges a violation of the California Consumer Legal Remedies Act, Cal. Civ. Code § 1750 et seq., citing subsections 1770(a)(5), (a)(9) & (a)(14).[1] Before suing, plaintiffs' counsel sent CLRA demand letters to Sony's addresses by certified mail on April 21, 2026 & again on May 11, 2026.[1]

The proposed class covers California residents who purchased digital video games through the PlayStation Store after § 17500.6's effective date, who saw representations such as "Buy," "Buy Now," or "Confirm Purchase," but who received only a revocable license to a digital good.[1] The complaint invokes federal jurisdiction under the Class Action Fairness Act, stating the aggregate amount in controversy exceeds $5,000,000.[1] The prayer for relief seeks actual damages, restitution & disgorgement of Sony's revenues from the practice, statutory & actual damages under Cal. Civ. Code § 1780(a), an injunction prohibiting Sony from resuming its unlawful practices, and reasonable attorneys' fees & costs.[1]

The complaint alleges the PlayStation Store uses ownership language such as "Buy Now" and "Confirm Purchase" to induce consumers to complete digital game transactions.[1]

Sony's response

On August 21, 2026, Sony replied, first asking the court to compel arbitration under the Federal Arbitration Act and stay proceedings, and only in the alternative asking the court to dismiss the complaint with prejudice under Rules 12(b)(1) and 12(b)(6) for lack of standing and failure to state a claim.[3] Sony pointed to Section 1 of what the motion calls the Software Product Licensing Agreement, which it quoted as stating that "The Software is licensed to you, not sold."[3][10] The motion says the PlayStation Terms of Service put a binding arbitration agreement and a class action waiver in Section 14, and quotes the opt-out clause:

YOU HAVE THE RIGHT TO OPT OUT OF BINDING ARBITRATION AND CLASS ACTION WAIVER WITHIN 30 DAYS.[3]

The clause requires a user who does not wish to be bound to notify Sony in writing within 30 days of accepting the agreement.[3][5] Sony told the court that no plaintiff opted out.[3]

Sony's fallback merits argument appears under a heading titled "Reasonable Consumers Would Not Be Misled."[3] In its filing, Sony wrote:

In the digital age, it is not plausible to allege that reasonable consumers believed they were obtaining "ownership" of a digital game. Were that the case, then Plaintiff Edward Heycock would not have been able to obtain the game Resident Evil Requiem on February 25, 2026 for $69.99 from the PlayStation Store after Plaintiff Jason Mendoza had obtained Resident Evil Requiem on February 14, 2026, because Mr. Mendoza, not Sony, would have owned it then.[3][4]

The argument appears on page 12 of Sony's motion, in the same paragraph as the license clause the filing quotes as "The Software is licensed to you, not sold."[3]

The filing extended the point to games played against other people, arguing that because digital video games are played against other players who themselves must each have a copy of the game in order to play, it is not plausible that a reasonable consumer would believe that once they obtained a digital video game they would be its exclusive owner.[3] The motion notices a hearing for October 1, 2026 at 10:00 a.m. before Judge Vince Chhabria in Courtroom 3 at 450 Golden Gate Avenue in San Francisco.[3][5]

Add-on content requires a game Sony argues buyers do not own

In the lawsuit, Sony argues that buyers "do not own the product" they buy from the PlayStation Store, and that it is not plausible to allege that reasonable consumers believed they were obtaining "ownership" of a digital game.[11][3] Sony's own support pages tell those same buyers how to upgrade the "digital PS4 game you already own," and require that game before its add-on content will work.[12][13] The key phrase in each screenshot below is boxed in red.

Sony's PS4-to-PS5 upgrade support page tells buyers how to upgrade the "digital PS4 game you already own" to the PS5 version.[12]

"If the game is owned by someone else who shares the console, make sure they have enabled Console Sharing and Offline Play."

Sony's troubleshooting page for digital downloads states "If the game is owned by someone else..." while describing licenses[14]

Sony's previous communications also refer to ownership. In an email sent to users on 29th May 2021 titled "Important changes for PS3, PS Vita and PSP platforms", Sony refers to owning games and video content. Again key sections are boxed in red.

"Important changes for PS3, PS Vita and PSP platforms", 29 March 2021[15]

The PlayStation Terms of Service tell buyers that a store purchase is a personal license and that they "do not own the product."[11]

Sony's add-on support page lists how to access each add-on type, giving "Download content and launch main game" for DLC & "Launch main game" for in-game consumables.[13] It tells buyers that "DLC is downloadable content that can be purchased separately from the main game," and that after purchasing "you need to download the DLC to play it in the main game."[13]

Sony's add-on support page tells buyers that DLC "can be purchased separately from the main game" and that after purchasing "you need to download the DLC to play it in the main game."[13]

Sony's listing of the 2025 video game Ghost of Yotei reffers to ownership when talking about add-on content. "Team up with friends online to challenge monstrous, supernatural versions of the Yōtei Six in a free major update for all Ghost of Yōtei owners." "Ghost of Yōtei Legends is a co-op multiplayer game mode free for all Ghost of Yōtei owners. It includes three distinct game modes:"[16]

PlayStation is positioning a downloadable update as content for game owners. [16]

Ghost of Yōtei Legends is a co-op multiplayer game mode free for all Ghost of Yōtei owners.[16]

Sony saying that all owners of the Witcher 3 have access to two DLCs at no additional cost, implying that the cost of the first purchase resulted in ownership.

Sony is saying that all owners of The Witcher 3: Wild Hunt can now access the Hearts of Stone and Blood and Wine expansions for free.[17]

Sony identified in the FAQ's "How to troubleshoot game downloads from PlayStation Store" sub category "Locked games on your PS5 console?" Sony repeatedly makes reference to who purchased the game and who owns the licence in the context of reading this the game licence is owned and purchased (not leased or rented or so on) through transactions with Sony.

Quotes include:

"To verify that you have the license for the content, please follow the steps below.

Make sure you are signed in to the correct account that was used to buy the game. Check your transaction history to make sure the purchase was successful."

"If the game is owned by someone else who shares the console, make sure they have enabled Console Sharing and Offline Play."

"Check license ownership

Make sure you are signed in to the correct account that was used to buy the game. If you recently purchased the game or redeemed content by vouchers, check your transaction history."

How Sony treats digital game ownership in the lawsuit and in its own terms In the lawsuit In Sony's terms and support pages Sony argued reasonable consumers would not believe they were obtaining "ownership" of a digital game.[3] Sony's upgrade support page refers to "an eligible digital PS4 game you already own."[12] Sony's Terms of Service tell users they "do not own the product" obtained through the store, and Sony cited the license clause "The Software is licensed to you, not sold."[11][3] Sony's software license defines that "Software" to include "downloadable content," and its PlayStation Plus help says a buyer who loses a game will "lose access to the DLC and add-on content associated with that game" until they "resubscribe to the service or decide to purchase the title."[18][19]

Sony's PlayStation software license folds patches, updates, and downloadable content into the licensed "Software," and section 1.4 states that "The Software is licensed to you, not sold."[18]

Sony's PlayStation Plus games page says that if access to a game ends, the buyer will "lose access to the DLC and add-on content associated with that game," restored after they "resubscribe to the service or decide to purchase the title."[19]

Sony's cancellation policy sets refund eligibility for in-game consumables by when they are bought. Consumables bought on the PlayStation Store "outside of gameplay" are delivered "when you next launch the game," so a buyer who does not launch it has 14 days from purchase to cancel; consumables bought "during gameplay" are "delivered immediately," and cannot be canceled unless faulty.[20]

Sony's cancellation policy says in-game consumables bought "outside of gameplay" are delivered "when you next launch the game," while those bought "during gameplay" are "delivered immediately."[20]

On their official Share Play page, Sony states that "Both of you can enjoy the same game, regardless of who owns it", directly acknowledging that players, regardless of purchase mean, are owners of the product in question.

List of references on Sony websites to players "owning" their digital games

A non-exhaustive table of references on Sony's site to "owning" digital games:

Direct Quote Live Link Archived Snapshot "To upgrade an eligible digital PS4 game you already own to the digital PS5 version..." / "If you own the PS4 and PS5 versions of the same game, here's how to switch between them:" Live Page Archived Snapshot "To upgrade an eligible digital game you already own to the PS VR2 version, you need a PS5 console..." Live Page Archived Snapshot "View a broadcast for a game you own through the game's hub." Live Page Archived Snapshot "What will continue to work: You can continue playing content you already own, subject to each game's existing online features and service availability." Live Page Archived Snapshot "This update also adds a new PS Plus tab to the Library, which clarifies what games you own from PS Plus' Monthly Free Games." Live Page Archived Snapshot "The minute you boot up, you'll see all the information about games you own, what your friends are doing, whether there's any new DLC coming out..." Live Page Archived Snapshot "At PlayStation we recognise that you might sometimes want to share a game you own with a friend or, indeed, try one of their games before making the decision to buy it yourself." Live Page Archived Snapshot "Track your PS5 journey with info on your total play time, games you own and more." Live Page Archived Snapshot "Track your PS5 journey with info on your total play time, games you own and more. "

(same as above but on the PS5 Pro page)

Live Page Archived Snapshot "When these titles are released for PS4 and PS5, players can head to PlayStation Store and download a version for the consoles at no extra cost if they already own the digital version of the title." Live Page Archived Snapshot "Players who already own the Digital Deluxe Edition on PlayStation 4 can download the PlayStation 5 upgrade at no cost..." Live Page Archived Snapshot "With Share Play you can take control of your friend's gameplay if they give you permission. This way you can both enjoy the game regardless of who owns it." Live Page Archived Snapshot "Play all the incredible PS5 games you've been missing and enhance the PS4 games you already own on Blu-ray Disc or digitally via PlayStation Store." Live Page Archived Snapshot "Be careful not to purchase content you already own." Live Page Archived Snapshot "Make this your moment on PS5

Play all the incredible PS5 games you’ve been missing and enhance the PS4 games you already own."

Call to action to buy a PS5 Live Page Archived Snapshot "Great experiences that stay with you on PS4™ and PS5™" page Play together on PS4 and PS5 consoles

Cross-generation Share Play Pass the controls and let someone try one of your games, or play the game together regardless of who owns it, even if you're not on the same console. With Share Play, your game screen appears on another player's screen.

Frequently asked questions Get answers to some of the most common questions for playing on both PS4 and PS5.

If I have a PS4 game, can I upgrade it to a PS5 version? If you own PS4 versions of these games, simply visit the game’s Hub for that title on your PS5 (Note: you’ll need to insert the PS4 disc into your PS5 console first if you bought the physical disc rather than the PS Store version of the PS4 game), and you’ll see an offer to download the PS5 version.

Live Page Archived Snapshot "PlayStation Portal remote player

With the PlayStation Portal remote player, you can access the games on your PS5 console over Wi-Fi1, and with PlayStation Plus Premium, you can also cloud stream select titles you own digitally along with hundreds from the Game Catalog and Classics Catalog."

Live Page Archived Snapshot Cloud Streaming on PlayStation® FAQ

How do I use PS5 Cloud Streaming? Select games that you own can be streamed direct to your PS5 console or PlayStation Portal. Look for the PlayStation Plus 'Stream' button to launch the game instantly. You can also check the Cloud Streaming Game Finder to see which games are eligible for streaming.

Does PlayStation Portal have Cloud Streaming? Yes, you can stream select PS5 games you own and PS5 games available with PlayStation Plus Premium. Find out more with our support page for Cloud Streaming on PS Portal.

Live Page Archived Snapshot Support page: How to troubleshoot issues when starting a game "PS4 console: Can’t download locked game"

  1. If someone else on your console owns the game, make sure they've activated the console as your primary PS4 console."

Live Page Archived Snapshot "Marvel's Wolverine is available in a Standard Edition and Digital Deluxe Edition. Standard Edition owners can also upgrade to the Digital Deluxe Edition content."

shown on the Marvel's Wolverine FAQ, What editions of Marvel's Wolverine are available?

Live Page Archived Snapshot "If you already own the PS4® version, you do not need to buy the PS5® version of this game."

disclaimer on the Marvel's Spider-Man: Miles Morales

Live Page Archived Snapshot "PS4 Standard Edition owners must upgrade to PS5 version (at no cost) in order to redeem. To upgrade PS4 Standard Edition disc to the digital PS5 version, you will need a PS5 console with a disc drive"

disclaimer on Marvel’s Spider-Man Miles Morales shown on page "Great experiences that stay with you on PS4™ and PS5™"

Live Page Archived Snapshot "Existing owners of Horizon Zero Dawn (PS4)* and/or Horizon Zero Dawn Complete Edition (PS4, PS5) can upgrade to the digital version of Horizon Zero Dawn Remastered on PlayStation 5 console."

*Owners of the Horizon Zero Dawn PS4 game disc can access this offer by inserting the game disc into their PS5 console (and will need to keep the disc inserted each time to play the game). PS4 game disc owners who buy the PS5 Digital Edition disc-free console will not be able to access the upgrade offer. "

and later in the Horizon Zero Dawn Remastered FAQ

"Can I upgrade from Horizon Zero Dawn or Horizon Zero Dawn Complete Edition to Horizon Zero Dawn Remastered?

Yes, existing owners of Horizon Zero Dawn (PS4, PC) and/or Horizon Zero Dawn Complete Edition (PS4, PS5, PC) can upgrade to the digital version of Horizon Zero Dawn Remastered on both PlayStation 5 console and on PC (via Steam or Epic Game Store). (...)

Owners of the Horizon Zero Dawn PS4 game disc can access this offer by inserting the game disc into their PS5 console (and will need to keep the disc inserted each time to play the game). PS4 game disc owners who buy the PS5 Digital Edition disc-free console will not be able to access the upgrade offer."

Live Page Archived Snapshot Support for specific games "Can I upgrade to Horizon Zero Dawn™ Remastered?

You may be eligible for an upgrade to Horizon Zero Dawn™ Remastered digital edition if you already own Horizon Zero Dawn™ and/or Horizon Zero Dawn™ Complete Edition."

Live Page Archived Snapshot Same as above but on the on the PlayStation gaming on PC > PC games support "Can I upgrade to Horizon Zero Dawn™ Remastered?

You may be eligible for an upgrade to Horizon Zero Dawn™ Remastered digital edition if you already own Horizon Zero Dawn™ and/or Horizon Zero Dawn™ Complete Edition."

Live Page Archived Snapshot "If you already own a PS4 version of Ghost of Tsushima or Ghost of Tsushima Director's Cut, you can get the PS5 Ghost of Tsushima Director’s cut for a discounted price. You do not need to purchase this product." "Ghost of Tsushima PS4 (Disc or Digital)

If you already own Ghost of Tsushima on PS4, you can upgrade to the Ghost of Tsushima DIRECTOR’S CUT on PS4 for an additional cost.

Ghost of Tsushima Director’s Cut PS4 (Digital)

If you already own the Ghost of Tsushima DIRECTOR’S CUT on PS4, you can upgrade to the Ghost of Tsushima DIRECTOR’S CUT on PS5 for an additional cost."

Live Page Archived Snapshot "Can I upgrade if I own the Triple Pack, Explorer’s Pack, or UNCHARTED 4: A Thief’s End Digital Deluxe Edition and have not redeemed UNCHARTED: The Lost Legacy?"

Yes, you can.

Their curated UNCHARTED: Legacy of Thieves Collection FAQs shows the expectation of owning digital products Live Page Archived Snapshot "GOD OF WAR FAQs"

How do I access God of War Ragnarök: Valhalla? God of War Ragnarök: Valhalla is free downloadable content (DLC) available to owners of God of War Ragnarök on PS4 and PS5 via the PlayStation Store. It is included as standard with your purchase of the game on PC.

Live Page Archived Snapshot "Every review comes from a verified owner of this game or item and is evaluated by a team of moderators."

this appears in most if not all games just below the "Ratings and reviews" section. I saw in more than 300 games, I'll use Ghost of Yōtei as the example

And if you are logged in and do not own the game you'll see: ¨Only owners of this game can rate it."

Live Page Archived Snapshot "When developing this feature, we designed it so that players must own the game before submitting a rating to avoid situations where players submit false reviews, while allowing players with various playtimes to share their personal experience." Live Page Archived Snapshot "Games You Already Own" as a title to a paragraph and later

"Taking a little time over the summer holidays to follow this advice means that you not only have a safe and secure play experience, but also ensure you get great value from the games you own."

Live Page Archived Snapshot "You are eligible to receive a free PS5™ digital version of FINAL FANTASY VII REMAKE at no extra cost if you already either (i) own a PS4™ digital version of the game..." Live Page Archived Snapshot "If you already own the PS4™ digital version of this game, you can get the PS5™ digital version at no extra cost..."

Game and Legal Info on STAR WARS Jedi: Fallen Order Deluxe Edition store page

Live Page Archive Snapshot Common Game Question: Upgrade an eligible PS4 digital game on a PS5 console with a disc drive or PS5 Digital Edition

To upgrade an eligible digital PS4 game you already own to the digital PS5 version:

Live Page Archive Snapshot

California AB 2426

AB 2426, authored by Assembly member Jacqui Irwin, was approved by the Governor on September 24, 2024 & added Section 17500.6 to the Business and Professions Code as Chapter 513, effective January 1, 2025.[2][9][21] The operative clause reads:

It shall be unlawful for a seller of a digital good to advertise or offer for sale a digital good to a purchaser with the terms "buy," "purchase," or any other term which a reasonable person would understand to confer an unrestricted ownership interest in the digital good, or alongside an option for a time-limited rental, unless either of the following occur...[21]

California Business and Professions Code Section 17500.6 makes it unlawful to advertise or offer a digital good for sale with the terms "buy" or "purchase," or any other term a reasonable person would understand to confer an unrestricted ownership interest, absent the required license disclosure.[21]

The statute gives a seller two ways to comply.[21] The seller may obtain an affirmative acknowledgment from the purchaser at the time of each transaction, indicating that the buyer is receiving a license, a complete list of the restrictions & conditions of that license, and, where applicable, that the seller may unilaterally revoke access to the digital good if it no longer holds a right to it.[21] Alternatively, the seller may provide, before the transaction, a clear-and-conspicuous statement in plain language that "buying" or "purchasing" the digital good is a license, including a hyperlink, QR code, or similar method to reach the terms and conditions giving full details on the license.[21] Either disclosure must be "distinct and separate from any other terms and conditions of the transaction" that the purchaser acknowledges or agrees to.[21] The law exempts subscription access, digital goods offered for no monetary consideration, and goods the seller cannot revoke after the transaction, such as those made available for permanent offline download.[21]

Regulatory and legal context

Federal regulators & lawmakers raised the ownership-versus-license question before this suit.[22][23] On April 17, 2024, the Federal Trade Commission published a consumer alert by Amy Hebert titled "Do you really own the digital items you paid for?" that told readers what they get on clicking the "buy" button "is often merely a license to access the content," explained in fine print the seller can usually change.[22] On February 25, 2025, Senator Ron Wyden urged the FTC to stop companies from misleadingly offering people the ability to "buy" digital TV, e-books, movies, music & video games when consumers do not have total control over what they paid for, and called for disclosure "before and at the point of sale."[23]

The Federal Trade Commission's April 2024 consumer alert warns that what a buyer gets on clicking "buy" for a digital product is "often merely a license to access the content."[22]

Additional evidence for review

Additional evidence has been collected from Sony-owned websites showing Sony and PlayStation using terms such as "own," "owner," "buy," "purchase," and "yours to keep" when referring to digital games and digital content.

This material is currently under review for inclusion as additional evidence regarding how Sony has represented digital purchases and ownership to consumers.

Examples of ownership-related language found on Sony-owned websites. Supporting evidence document

The Daily Front Page 12 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — WordPress Palace Intrigue
article

Automattic's board forces CEO Matt Mullenweg into leave of absence

by LeoPanthera·▲ 432 points·328 comments·techcrunch.com ↗
Matt Mullenweg ... has been put on a leave of absence by his board against his will.

Matt Mullenweg, Founder & CEO of Automattic

Image Credits: Kimberly White/Getty Images for TechCrunch

Matt Mullenweg, the founder and CEO of Automattic, best known as the parent company of WordPress.com, has been put on a leave of absence by his board against his will, according to a Slack message seen by TechCrunch.

Earlier Wednesday, Mullenweg posted in a Slack channel visible to all employees that the company’s chief financial officer, Mark Davies, had “conspired” with other board members Ann Dunwoody, Toni Schneider, and Sue Decker to vote to put Mullenweg on a paid leave of absence.

The message read:

And the biggest news: I won’t be able to make the [meeting] tomorrow. @Mark Davies has conspired with @Ann Dunwoody, @Toni, and @Sue Decker behind my back and they voted to put me on a paid leave of absence. I voted against that. Wishing Mark and all of you the very best.

To clarify @Mark Davies was voted as interim CEO. I received the resolution 50 minutes before the meeting start, and requested repeatedly for time to have it reviewed by independent legal counsel, even a few hours, which was denied.

A Slack message to the open source WordPress.org community from the project’s executive director, Mary Hubbard, also confirmed Mullenweg’s change of status at the commercial company. However, Hubbard said that WordPress.org was not impacted. “Matt remains the leader of the WordPress project and I remain Executive Director of WordPress. Our teams, priorities, and work continue as planned,” she wrote.

Mullenweg’s Slack message did not make clear why Automattic’s board took this action. Sources told 404 Media, which was the first to report the news, that Schneider — the former CEO of Automattic from 2006 to 2014 — confirmed that the action was initiated by the board. Davies also told employees in the Slack channel that Mullenweg remained on the board of directors.

In an emailed statement to TechCrunch, Automattic confirmed Mullenweg was on leave.

“Matt Mullenweg is currently on leave from Automattic,” the email read. “Mark Davies, Automattic’s CFO, will lead the company as interim CEO. The Board has full confidence in Mark’s leadership and in the team’s ability to execute against the company’s priorities.”

Automattic, which owns other brands including Tumblr, WooCommerce, and Pocket Casts, was founded by Mullenweg in 2003 after he co-created the popular open source content management system WordPress.

Over the past few years, Mullenweg and the company have been mired in lawsuits and controversy. The company is in a protracted legal battle with WP Engine, a WordPress web hosting competitor. The lawsuit followed allegations from Mullenweg that WP Engine was profiting from the open source WordPress project without contributing back to the community, and he demanded that it pay 8% of its monthly gross revenue as a royalty fee for using the WordPress brand.

WP Engine sued in October 2024 and accused Automattic and Mullenweg of defamation and abuse of power. Automattic filed counterclaims last year. In February, WP Engine claimed that Automattic intended to target 10 more competitors with royalty claims.

Tensions became so high under Mullenweg’s leadership that he told employees in 2024 to quit, with severance, if they disagreed with him, and 159 did so.

Last year, Mullenweg also threatened to deactivate the accounts of several members of the open source WordPress.org community, after two of them allegedly said they planned to spearhead a new forked version of the open source WordPress project. (Those involved denied their plans, but said Mullenweg went through with their account deactivations anyway, and also deactivated accounts belonging to other contributors, sources told TechCrunch.)

In April 2025, the company laid off 16% of its staff. The cuts included some longtime employees who had been with the company for more than a decade, sources told TechCrunch.

Some alumni have been asking current employees how they feel about the news, a source told TechCrunch. Some employees said they were “ecstatic” or “relieved,” but others had mixed emotions because the move creates more instability.

It isn’t clear why the company’s board made this decision now. One person speculated that the timing may have something to do with Mullenweg’s annual trip to the Burning Man festival, after which he tends to return “with ideas.” This year’s festival ended on September 7.

Mullenweg may have dropped some hints about the cause of the board’s action when he made a series of posts on X on Wednesday evening. In one post, for instance, he wrote: “That they have a pretty good chance of getting a judge to say I spoiled evidence in a malicious way trying to hide something.” That’s in reference to the ongoing legal dispute between Mulleweng and Automattic with hosting company and WordPress contributor WP Engine. In his X posts, Mulleweng vehemently denied the allegation.

In another post, he said he now expects “smear attacks, so get ready for some National Enquirer rumors or hit pieces.” He added that he believed there was one attempt at this when his “Nikon D6 camera was stolen at Burning Man (recovered a day later), but luckily of the 2000+ photos on the memory card there was nothing they can use against me.”

He then shared a few of the pictures of art pieces he took at the famed festival.

Mullenweg did not respond to our emailed request for comment.

Note: This story has been updated to include mention of Mullenweg’s posts on X.

The Daily Front Page 13 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Images Beneath the Surface
article

Technique for Manipulating Satellite Photos Now Reveals Ancient Images (2025)

by gumby·▲ 291 points·46 comments·spinoff.nasa.gov ↗
Algorithm NASA first applied to satellite imagery is now used to peer into antiquity.

Algorithm NASA first applied to satellite imagery is now used to peer into antiquity

Side-by-side images of a stone wall, with a real view on the left showing only hints of red coloration on beige stone, and the right image showing more red details on the wall, which here is colorized blue-green.

On the walls of a chamber near the top of the central tower in the ancient Cambodian temple Angkor Wat, paintings depict horseback riders and a traditional musical ensemble. Every day, thousands of visitors pass these images without noticing, because they’re faded to the point of invisibility.

They were discovered, along with about 200 other paintings throughout the sprawling complex, between 2010 and 2012 by a Singaporean archaeologist using a method conceived at NASA’s Jet Propulsion Laboratory in Southern California.

The technique, known as decorrelation stretch, heightens contrasts in digital imagery, making subtle differences clearer and features easier to spot. Originally used by NASA to extract more information from satellite imagery, it has proven useful in many fields but has come to be especially widely used for studying ancient rock art. This is partly because these images are commonly faded beyond recognition. But it’s also due to the chance intersection of one man’s hobby with his unrelated professional and educational background.

In the 1980s, one of Jon Harman’s friends brought him along on a few field trips with a local rock art group, and the mystery surrounding these ancient images intrigued him. “No one really knows why people made the rock art they made, at least in many cases,” he said. “And the symbols are quite strange.”

At a rock art conference around 2005, someone showed him images from NASA’s Mars Exploration Rover webpage, depicting the Martian surface with and without the application of decorrelation stretch. Seeing how much detail the technique revealed, he understood the implication for studying ancient, faded images.

He also happened to work in medical imaging. “I Googled it and found a NASA paper that explained how to do the algorithm,” he said. “I knew from my medical imaging experience that I could do it, so I did.”

Thus was born the Dstretch plug-in and, later, Dstretch apps for Android and iOS.

Rather than simply raising the contrast between colors, decorrelation stretch maps the original colors to a different, expanded range of colors. It’s a complicated process that includes steps like diagonalizing color matrices. “Diagonalizing is algebra, and I have a PhD in math from Berkeley, where I studied algebra,” said Harman, now retired in Pacifica, California.

The technique is based on the Karhunen–Loève Transform, a theorem used in statistical analysis and coinvented by Michel Loève, one of Harman’s former math professors.

The Dstretch plug-in is for use with ImageJ, an open-source image processing and analysis program originally developed by the National Institutes of Health.

From Statistics to Geology

The paper Harman found detailing the process was written in 1996 by Ronald Alley, a JPL employee who at the time was part of an international team developing scientific requirements for the upcoming Advanced Spaceborne Thermal Emission and Reflection Radiometer (ASTER). That imager, built by Japan, was launched in 1999 on the Terra satellite, where it still operates today alongside its more famous counterpart, the Moderate Resolution Imaging Spectroradiometer, or MODIS.

In the 1990s, Alley was working with a group of geologists at JPL, finding applications for satellite data. But he had previously worked in a digital image-processing group, and his supervisor there, Jim Soha, had cowritten a 1978 paper along with another JPL employee that proposed applying the Karhunen–Loève Transform to digital imagery for color enhancement. It was this technique that came to be called decorrelation stretch, and Soha’s group is where Alley learned to use it.

By the time scientists were making plans for ASTER, Alley and his geologist colleagues had been using decorrelation stretch to map lava flows on the big island of Hawaii for some time.

The original technique involved creating multiple intermediate images, each of which introduced slight inaccuracies through rounding. By replacing that process with one called matrix multiplication, Alley made decorrelation stretch both faster and more accurate.

He knew it would be useful for a multispectral imager like ASTER, which collects data in the visible spectrum and different infrared ranges, so he wrote the paper. “Someone had to write up a description of this thing so users would know what we were talking about,” he said.

Michael Abrams, the current ASTER science team leader, said his group still uses decorrelation stretch on infrared imagery to track plumes from volcanic eruptions, whose sulfur dioxide, ash, and water vapor have distinct infrared absorption bands.

Dstretch User Base Expands

Harman first applied his Dstretch plug-in to photos he had taken of rock art in Baja California, Mexico. In one image featuring several human figures, a new yellow figure seemed to materialize from nowhere when the algorithm was applied. “That convinced me of the usefulness,” he said. “Then I started playing around and found that by changing the color space I was working in, I could get good results in different images.”

A color space is a range of numerically represented colors, such as the red-green-blue, or RGB, color space common among screen devices. Dstretch includes custom color spaces that have proven useful with Harman’s extensive image collection. In this way, Dstretch is tailored to rock art, but it can be and is used in many other contexts.

Harman said he gets about 200 requests per year from all over the world, which he fulfills for $50 apiece. Around 2010, he created smartphone apps that use a shortcut to mimic decorrelation stretch. “To do the actual Dstretch on a phone would be difficult and take forever,” he said. The apps cost $20 and have been downloaded thousands of times. Papers have been published describing Dstretch’s usefulness in archaeology.

Space Technology Down to Earth, Then Underground

Pictographs at the Årsand 1 site in western Norway, including a sun, stylized human figures, and various shapes and patterns, were first documented in 1940. The use of Dstretch in 2008 and 2012 uncovered about 15 previously undocumented figures and revealed new details in 28 others.

In the ancient Egyptian cemetery of Beni Hassan, archaeologists used Dstretch to discover images of bats and pigs, animals rarely depicted in ancient Egyptian art.

In Alberta, Canada’s Writing-on-Stone Provincial Park, famous for its indigenous rock carvings and paintings, Dstretch revealed what could be considered an early form of graffiti “tagging.” A pictograph of a horse and rider is believed to serve as a “calling card” from a Crow warrior, taunting his Blackfoot enemies.

But the plug-in has also found use beyond rock art. The site of Vlochos in Thessaly, Greece, contains the remains of urban settlements built between 500 B.C.E. and 800 C.E. There, Dstretch applied to aerial imagery revealed areas of potential archaeological interest that had been missed by other methods, such as elevation models, ground-penetrating radar, electrical resistance surveys, and others. It also uncovered the remains of structures and buried building foundations in areas where factors such as metallic contamination made other techniques difficult.

In 2023, members of the University of Tübingen in Tübingen, Germany, and the Tennessee Division of Archaeology in Nashville, Tennessee, published a protocol for using Dstretch to enhance imagery of tattoos preserved on mummified human remains.

Given how well it worked on his own extensive collection of rock art imagery, Harman said he was not surprised that Dstretch found wide use in the rock art community. “But I’ve been surprised by a lot of the different applications people have found. So that’s been cool.”

Abstract

Rock art enthusiast Jon Harman of Pacifica, California, created the Dstretch software plug-in to enhance digital imagery, based on the decorrelation stretch technique invented at the Jet Propulsion Laboratory. Dstretch is now widely used to make ancient, faded markings visible in photographs, among other applications.

Side-by-side images of stratified rock with three circular craters, the left with real-life orange-brown coloration, and the right emphasizing variation with blues and greens along rock strata, red around the circles, and magenta and light blue inside the circles.

In 2005, someone at a rock art conference showed Jon Harman this image of the Martian surface, with and without the decorrelation stretch technique applied. Recognizing the potential value for discovering ancient rock art, Harman found a NASA paper detailing the method and created the Dstretch plug-in for use with an open-source image processing program. Credit: NASA

Side-by-side images of a rustic painting on stone. The true-color image on the left shows several figures in earthy colors; the right enhances those figures in red and black and finds a new figure in yellow.

As he was developing the Dstretch plug-in, Harman applied it to this image from the Cave of San Borjitas in Baja California, Mexico. When the yellow figure appeared in the middle of the picture, he knew he had something useful. Credit: Jon Harman

Side-by-side images of a man standing in front of a rock. In the left, true-color image, a faint design is visible on the rock. On the right, the design is enhanced in red, and the man’s face and clothing are also colorized.

Harman poses in front of an example of the Rancho Bernardo style of Native American artwork that’s barely visible until Dstretch is applied. Credit: Jon Harman

Side-by-side images of a stone wall, with a real view on the left showing only hints of red coloration on beige stone, and the right image showing more red details on the wall, which here is colorized blue-green.

Between 2010 and 2012, Singaporean archaeologist Noel Hidalgo Tan used the Dstretch plug-in to discover more than 200 faded paintings around the Angkor Wat temple complex in Cambodia. Almost invisible to the naked eye (left), this image in a chamber near the top of the temple’s central tower depicts a traditional Cambodian musical ensemble known as a pinpeat. Credit: Noel Hidalgo Tan

The Daily Front Page 14 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Sociable Octopus
article

Larger Pacific striped octopus

by olalonde·▲ 126 points·65 comments·en.wikipedia.org ↗
The species was first documented in the 1970s.

Larger Pacific striped octopus

The larger Pacific striped octopus (LPSO), or Harlequin octopus, is a species of octopus known for its intelligence and gregarious nature.1 The species was first documented in the 1970s and, being fairly new to scientific observation, has yet to be scientifically described. Because of this, LPSO has no official scientific name.23 Unlike other octopus species which are normally solitary, the LPSO has been reported as forming groups of up to 40 individuals.456 While most octopuses are cannibalistic and have to exercise extreme caution while mating, these octopuses mate with their ventral sides touching, pressing their beaks and suckers together in an intimate embrace.7 The LPSO has presented many behaviors that differ from most species of octopus, including intimate mating behaviors, formation of social communities, unusual hunting behavior, and the ability to reproduce multiple times throughout their life.8 The LPSO has been found to favor the tropical waters of the Eastern Pacific.2

Appearance

LPSO exhibits three main body color patterns that include completely pale, completely dark brown, and a dark brown and white pattern that is referred to as "stripe-bar-spot". 2 When displaying the stripe-bar-spot body color pattern, LPSO is observed to have bar and stripe patterns that alternate between brown and white across its head and mantle, and dark brown with white spots over its arm, crown, and arms.2 The pattern can serve as a unique identifier as it varies among individuals.2 Though LPSO has similar body color patterns to other octopuses like Octopus chierchiae, 9 Octopus zonatus, 10 Abdopus spp., 11 Thaumoctopus mimicus, 12 and Wunderpus photogenicus, 12 the body patterns it exhibits are unique to the species.

Habitat and distribution

LPSO has been documented in many locations throughout the tropics of the Eastern Pacific. Specimens have been located in the Bay of Panama, Panama, Guatemala, Magdelena Bay, Baja Sur, Mexico, the northern Pacific coast of Colombia, and Nicaragua.2 LPSO seems to prefer denning in areas with soft muddy substrates or a mix of mud and sand, ranging in depth from 7m to 100m.2 The species has also been observed to form colonies of up to 40 close-living individuals.4 These colonies of LPSO construct dens within 1m of one another and live in the same general area for the span of their lives.4

Mating

LPSO is known in particular for its display of mating behaviors that are vastly different from most octopus species. While most octopuses use either "distance mating" (when the male places his hectocotylus into the female's mantle from a safe distance) or a mounting position,131415 LPSO uses a more intimate approach. Typically, a brooding female that is ready to mate exhibits an entirely pale body color pattern while the male exhibits a high contrast stripe-bar-spot body color pattern.2 Once the male and female LPSO decide to mate, they join in a beak-to-beak position, embracing in an entanglement of arms.2 Unlike some species of octopus, female LPSO are not cannibalistic during mating and are rather gentle, leaving only surface level sucker marks as a result of the beak-to-beak embrace.2

Pair bonding has been observed in LPSO through behaviors such as food and den sharing.2

Brooding

Unlike most octopus species, LPSO can spawn multiple times throughout the span of their life.2 Eggs are laid in pairs within the den and the female tends to them until they hatch, running the tips of her arms over them to maintain the health of the eggs.2

Once hatched from the egg, the offspring are pelagic until adulthood.16

Hunting

LPSO has been observed to prey upon a variety of shellfish including shrimp, stomatopods, crabs, and bivalves.2 They use hunting methods of stalking, chasing, and ambush depending on the prey item in question.2 When eating bivalves, smaller prey is either crushed or pulled apart, while holes are drilled into larger prey.2 When hunting shrimp, LPSO carefully extends its arm, suckers positioned outward, to touch and capture the shrimp.2 When hunting crabs, LPSO uses an ambush method, pouncing directly onto the crab for capture.2

Lifespan

LPSO live about two years.3

Like most octopus species, LPSO goes through a stage of senescence, which marks the approach of death.2 Senescence in LPSO has been observed to be longer for females and shorter for males.2 After the first signs of senescence, males will typically last 1 to 2 weeks before death, while females will typically last between 2 and 4 months.2

References

  1. Ghose, Tia (6 March 2013). "PHOTOS: Rare Kissing Octopus Unveiled For The First Time". HuffPost. Archived from the original on 14 April 2019. Retrieved 14 April 2019.

  2. Caldwell, Roy L.; Ross, Richard; Rodaniche, Arcadio; Huffard, Christine L. (12 August 2015). "Behavior and Body Patterns of the Larger Pacific Striped Octopus". PLOS ONE. 10 (8) e0134152. Bibcode:2015PLoSO..1034152C. doi:10.1371/journal.pone.0134152. ISSN 1932-6203. PMC 4534201. PMID 26266543.

  3. Rowan Hooper (21 December 2019). "Octopuses were thought to be solitary until a social species turned up". New Scientist. Archived from the original on 27 December 2019. Retrieved 14 June 2024.

  4. Moynihan, Martin. (1982). The Behavior and Natural History of the Caribbean Reef Squid, Sepioteuthis Sepioidea, With a Consideration of Social, Signal, and Defensive Patterns for Difficult and Dangerous Environments. P. Parey, 1982. ISBN 978-3-489-61936-9. OCLC 1086727999.

  5. Graber, Shane. "Forgotten octopus rejects solitary lifestyle". Archived from the original on 14 April 2019. Retrieved 14 April 2019.

  6. Harmon, Katherine. "Rare Social Octopuses Break All the (Mating) Rules [Video]". Scientific American Blog Network. Archived from the original on 14 April 2019. Retrieved 14 April 2019.

  7. States379-8000, CA 94118 United. "Larger Pacific Striped Octopus". California Academy of Sciences. Archived from the original on 14 April 2019. Retrieved 14 April 2019.

  8. Harmon Courage, Katherine (30 July 2014). "Social Octopus Species Shatters Beliefs About Ocean Dwellers". National Geographic News. Archived from the original on 1 August 2014. Retrieved 14 April 2019.

  9. Rodaniche, Arcadio F. (1984). "Iteroparity in the lesser Pacific striped octopus Octopus chierchiae (Jatta, 1889)". Bulletin of Marine Science. 35 (1): 99–104 – via Ingenta Connect.

  10. Voss, Gilbert L. (1968). Octopods from the R/V Pillsbury southern Caribbean Cruise, 1966, with a description of a new species, octopus zonatus. OCLC 964398146.

  11. Norman, M. D.; Finn, J. (2001). "Revision of the Octopus horridus species-group, including erection of a new subgenus and description of two member species from the Great Barrier Reef, Australia". Invertebrate Systematics. 15 (1): 13. doi:10.1071/it99018. ISSN 1445-5226.

  12. HUFFARD, CHRISTINE L.; SAARMAN, NORAH; HAMILTON, HEALY; SIMISON, W. BRIAN (24 August 2010). "The evolution of conspicuous facultative mimicry in octopuses: an example of secondary adaptation?". Biological Journal of the Linnean Society. 101 (1): 68–77. doi:10.1111/j.1095-8312.2010.01484.x. ISSN 0024-4066.

  13. Hanlon, R.T. (1998). "J.B. Messenger Cephalopod behaviour. xvi, 232p. Cambridge University Press, 1996. Price £50.00". Journal of the Marine Biological Association of the United Kingdom. 76 (4): 1118. doi:10.1017/s0025315400041060. ISSN 0025-3154.

  14. Mangold, K (1987). "P. R. Boyle, editor. Cephalopod Life Cycles. Volume II. Comparative Reviews. xxi, 441 pp. Academic Press, 1987. Price £78". Journal of the Marine Biological Association of the United Kingdom. 68 (1): 215. doi:10.1017/s0025315400050190. ISSN 0025-3154.

  15. Wells, M.J.; Wells, J. (1972). "Sexual displays and mating of Octopus vulgaris Cuvier and O. cyanea Gray and attempts to alter performance by manipulating the glandular condition of the animals". Animal Behaviour. 20 (2): 293–308. doi:10.1016/s0003-3472(72)80051-4. ISSN 0003-3472. PMID.

  16. Rodaniche, Arcadio F. (1991). "Notes on the behavior of the Larger Pacific Striped Octopus, an undescribed species of the genus Octopus". Bulletin of Marine Science. 49: 667.

The Daily Front Page 15 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Machine Intelligence Bulletin
ask hn

Tell HN: OpenAI keeps re-enabling the 'allow training' setting

by jacquesm·▲ 440 points·178 comments·news.ycombinator.com ↗

I've reset this more than once and the last time I made a careful note of when I did it and to my surprise I found it re-enabled when I checked just now. Make sure you check this thing to see if it hasn't been re-enabled if you believe it to be off right now.

Join the discussion on Hacker News →

The Daily Front Page 16 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Science, Speed & Old Windows
show hn

Show HN: What if the speed of light was 5 km/h?

by dmitrybrant·▲ 574 points·259 comments·rivendell.dmitrybrant.com ↗

Light is slow here

In this park, the speed of light is 5 kilometers per hour — a brisk walk. Just like in the real world, the speed of light is not attainable, only approachable asymptotically. The more you speed up, the more relativistic effects will become apparent: length contraction, time dilation, Terrell rotation, etc. The Doppler effect of light also becomes apparent, with objects in front of you blueshifted, objects behind you redshifted, and transverse Doppler effects visible on objects in motion.

Field guide

All of the motion effects you see are physically accurate, in a world where the speed of light is greatly reduced, so it can be observed more easily on human scales.

Controls

W A S D accelerate

↑ ↓ ← → accelerate

Mouse look around

Space stop

Q drop / E rise

R return to start

Tab settings

Esc release mouse

Effects

Play around with what effect causes which phenomenon to be observed.

L light-travel delay

G aberration & contraction

C Doppler color

B relativistic beaming

Things to try

  • Accelerate by pressing the Up arrow. Your field of view begins to condense in the direction you are traveling, and becomes blueshifted. If you look behind you by using your mouse to turn, that field of view is redshifted and stretched out. This is relativistic aberration. Press Space to stop any motion, and observe how the field of view returns to normal.
  • The lamp posts all flash once per second of world time. Move toward a lamp and the flashing speeds up; move away and it slows down. Also observe the timers labeled "Your watch" and "World clock", and see time dilation in effect.
  • The Ferris wheel and carousel cars move at 75% of the speed of light. They are contracted by their own motion, and you see each one at a different moment in its trip around the circle. As the cars move around, you can see the effects of relativistic contraction and Terrell rotation.
  • The shuttle near the end of the corridor runs back and forth, also attaining a speed of 75% of the speed of light. Notice how it also contracts and undergoes Terrell rotation as it moves.

What's NOT accurate

  • Obviously a Ferris wheel spinning at relativistic speeds would fly apart, and if you travel through the atmosphere at relativistic speeds, you would be vaporized instantly. Even if you travel near the speed of light in interstellar space, you would be cooked by the cosmic microwave background radiation blueshifted to gamma rays.
  • The rendering of blueshifts and redshifts is a rough approximation. At extreme redshifts, the color fades to black. And at extreme blueshifts (past violet), the color turns to a metallic silver to represent x-rays, then to bright white to represent gamma rays (totally unphysical, but just to get a sense of it).
The Daily Front Page 17 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Science, Speed & Old Windows
article

What algorithm did Windows XP use to choose your initial user picture?

by soheilpro·▲ 343 points·173 comments·devblogs.microsoft.com ↗

I noted some time ago that Windows XP chose your initial picture at random from among the pictures in the %ALLUSERSPROFILE%\Application Data\Microsoft\User Account Pictures\Default Pictures directory. But it seems people want to know more.

Has anyone attempted to figure out the RNG for how Windows XP determines what profile picture is used on first account creation?

— Xeno (@XenoPanther) December 11, 2025

The random number generator is our friend RtlRandomEx, using the current value of GetTickCount() as the initial seed.

The function uses a one-pass random selection algorithm. I can immediately think of two benefits of this decision. First, compared to the naïve two-pass algorithm of counting up all the items, then randomly picking a number from 1 to n, and then iterating a second time to find the item at that index, it’s more efficient because it reduces the amount of calls into the file system, which is where the bottleneck is. Furthermore, the one-pass algorithm avoids complications if the number of files in the directory changes while the code is running.

The one-pass algorithm is a special case of reservoir sampling, where k is 1. This special case permits a tailored algorithm that is much simpler.

selectRandomFromIterator(iterator)
{
    var count = 0;
    var winner = null;

    while (iterator.moveNext()) {
        ++count;
        if (uniform_random(min: 1, max: count) == count) {
            winner = iterator.current();
        }
    }

    return winner;
}

The way this algorithm works is by observing that in a collection of n items, the last item has a 1/n chance of being randomly selected. If it isn’t selected, then you need to select randomly from the first n − 1 items, which you can solve recursively.

Playing the recursion forward, you start with the base case which is that if you have a list of 1 item, then your only choice is to chose that item. Otherwise, if you have a list of n items, first choose an item randomly from the first n − 1, and then switch to the nth item with a 1/n probability.

As a final safety check, the code stops after sampling 100 pictures. This avoids pathological behavior if somebody puts a million files in the Default Pictures directory.

show hn

Show HN: Compute polynomials twice as fast

by thomasahle·▲ 131 points·38 comments·thomasahle.com ↗

You may have heard about Horner's method, which evaluates a polynomial of degree n in n multiplications (n−1 if it is monic). But did you know that with a bit of preprocessing of the coefficients, n/2⌋+1 multiplications suffice for any monic polynomial, one more for a general one? You can use this to approximate functions like exp, sin, cos, or to evaluate polynomials in cryptography, hashing, and coding theory. Simply type a polynomial below, pick your field, and we'll preprocess it for you.

article

Stockfish 19

by atiedebee·▲ 273 points·161 comments·stockfishchess.org ↗

Today, we have the pleasure of announcing Stockfish 19, a new major release. As always, you can freely download it at stockfishchess.org/download and use it as a drop-in replacement in the GUI of your choice to benefit from stronger play and more accurate analysis.

Whether you can spare hours or days of CPU time, your help matters for the ongoing development of Stockfish. Find out how you can contribute at stockfishchess.org/get-involved. Join our Discord server to get in touch with the community of developers and users of the project!

Quality of Chess Play

In tests against Stockfish 18, this new release brings an Elo gain of up to 44 points, and wins more than three times as many game pairs as it loses.

Stockfish continues to set the standard for engine strength. Against the strongest competition, it consistently secures the top spot in engine championships, continuing to dominate the field.

Update Highlights

Universal Binaries

We have transitioned to universal binaries for our releases, simplifying the download process. These universal binaries automatically detect the features of your CPU and run the optimal code, eliminating the need to manually choose between AVX2, AVX-512, etc.

Upgraded NNUE Architecture and Training

This release introduces the SFNNv16 network architecture, reducing binary size by removing redundant threat features while increasing strength by introducing new pawn-pair features. The secondary neural network, introduced in Stockfish 16.1, has been retired, enhancing strength in positions where the small net previously underperformed.

The training process has been further improved with the introduction of new techniques, such as Quantization-Aware Training (QAT), and further parameter tweaks. These techniques have been applied to hundreds of billions of training positions, all of which have been consistently rescored using a strong Leela net.

Expanded Platform Support

We have added native support for RISC-V (RVV) and LoongArch (LSX/LASX), 1GB Linux huge pages, as well as WebAssembly targets. The shared-memory implementation for Linux, macOS, and BSD was also overhauled.

Strict Position Validation

We have implemented stricter validation for board positions, FEN strings, and UCI commands. The engine will now output an info string CRITICAL ERROR followed by the exact command and the reason it failed, and then immediately terminate the process. A good GUI will ensure you never encounter these errors.

Thank You

The Stockfish project builds on a thriving community of enthusiasts (thanks to everybody!) who contribute their expertise, time, and resources to build a free and open-source chess engine that is robust, widely available, and very strong.

We would like to express our gratitude for the 16.4k stars that light up our GitHub project. Thank you for your support and encouragement – your recognition means a lot to us. Programmers can contribute to the project either directly to Stockfish (C++), to Fishtest (HTML, CSS, JavaScript, and Python), to our trainer nnue-pytorch (C++ and Python), or to our website (HTML, CSS/SCSS, and JavaScript).

The Stockfish team

The Daily Front Page 18 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Price of Modern Life
article

Hitachi launches CO2 heat pump water heaters with solar-friendly tariff controls

by thelastgallon·▲ 292 points·238 comments·pv-magazine.com ↗

Hitachi has introduced its Y-series EcoCute CO2 heat pump water heaters in Japan, with 370-liter and 460-liter models set to launch from November 2026. The upgraded range adds expanded support for daytime electricity tariffs and PV-linked energy management, alongside a five-year manufacturer warranty.

Screenshot 2026-09-07 091206

Image: Hitachi Global Life Solutions

Hitachi Global Life Solutions, a unit of Japanese technology conglomerate Hitachi, has announced a new series of residential EcoCute heat pump water heaters for the Japanese market, with sales set to begin progressively in November 2026.

The new Y series uses natural refrigerant carbon dioxide (CO2) and is available in several configurations. At the top of the range are the BHP-FV37YD and BHP-FV46YD, two fully automatic models featuring direct mains-pressure hot-water delivery. They have storage capacities of 370 liters and 460 liters, respectively.

The 370-liter model is designed for households of around three to five people, while the 460-liter unit is aimed at households of four to six people.

Hitachi has not yet disclosed full efficiency specifications for the two new models. Their predecessors, the BHP-FV37WD and BHP-FV46WD, have annual hot-water and heat-retention efficiency ratings under Japanese Industrial Standards (JIS) of 4.2 and 4.1, respectively. The 370-liter predecessor uses a BHP-HAV45W heat pump unit, while the 460-liter version uses a BHP-HAV60W unit.

The manufacturer has not indicated whether the Y-series models feature a new compressor, refrigerant circuit or heat-exchanger architecture. Based on the specifications disclosed to date, the products appear to be an upgrade of Hitachi’s existing EcoCute platform rather than a new heat pump design.

One of the main changes in the Y series is expanded compatibility with Japanese electricity tariffs that encourage consumers to shift electricity consumption to daytime hours.

Some Japanese utilities have introduced tariffs designed to encourage daytime water heating as growing volumes of solar generation enter the grid. Hitachi said Y-series owners will be able to select supported electricity contracts through the water heater’s remote controller, while other tariffs can be configured manually.

The company said the new tariff-setting functionality is intended for electricity plans that encourage daytime consumption, including tariffs designed for households with PV systems.

The Y series also supports Hitachi’s home energy management system (HEMS) through a HEMS connection adapter and wireless LAN adapter.

HEMS connectivity is not new to Hitachi’s high-efficiency EcoCute products. The preceding BHP-FV37WD and BHP-FV46WD models already supported connected energy-management functions, including Echonet Lite compatibility and solar-powered water-heating operation. The main energy-management change in the Y series therefore appears to be expanded support for utility tariff structures rather than the introduction of HEMS connectivity itself.

Hitachi is also introducing a five-year manufacturer warranty for the Y series. The warranty covers the heat pump unit, hot-water storage unit, specified consumable components, remote controller, wireless LAN adapter and HEMS adapter.

The Daily Front Page 19 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Price of Modern Life
article

The same nine streaming subscriptions cost $702/year more than in 2021

by honestlyranked·▲ 369 points·369 comments·honestlyranked.com ↗

flagship tiers · US pricing · every change linked to its source

The same nine subscriptions — Netflix, Disney+, Hulu, HBO Max, Apple TV+, Paramount+, Peacock, YouTube Premium, Spotify — cost $95.91 a month in 2021-03, and $154.41 a month today. That is +61% in 5 years, or $702 more per year for exactly the same nine services. Every figure is dated and linked to its source.

The same basket, then and now

Service / tier 2021-03 Today Change
Netflix Standard $13.99 $19.99 +43%
Disney+ Premium (ad-free) $7.99 $18.99 +138%
Hulu No Ads $11.99 $18.99 +58%
HBO Max Standard (ad-free) $14.99 $18.49 +23%
Apple TV+ Apple TV+ $4.99 $14.99 +200%
Paramount+ Premium $9.99 $13.99 +40%
Peacock Premium Plus (ad-free) $9.99 $19.99 +100%
YouTube Premium Individual $11.99 $15.99 +33%
Spotify Premium Individual $9.99 $12.99 +30%
Combined $95.91 $154.41 +61%

Compared at a single date rather than at each service's launch, because those launches fall in different years and summing them would not describe a basket anyone could have bought. 2021-03 is the first month all 9 existed. Excluded from this basket: YouTube TV, Prime Video — a live-TV bundle and a membership add-on respectively, neither comparable to a standalone on-demand subscription. Both are still tracked and still counted in our increase log.

What the yearly figure looks like

At 2021-03 prices these four cost $1,150.92 a year. Today the same nine cost $1,852.92 — a difference of $702 annually, for the same services and, in most cases, the same tier. Nothing was cancelled or downgraded to produce that number.

Per-service records

Each service has its own dated timeline with a citation on every change: Netflix · Disney+ · Hulu · HBO Max · Apple TV+ · Paramount+ · Peacock · YouTube Premium · Spotify.

Quick answers

How much has streaming gone up?

A basket of 9 major services went from $95.91 to $154.41 a month between 2021-03 and today — an increase of 61%, or $702 a year.

How much does streaming cost per year now?

$1,852.92 a year for these 9 services at their current standard tiers, against $1,150.92 for the same nine in 2021-03.

Which streaming service has raised its price the most?

Netflix +43%; Disney+ +138%; Hulu +58%; HBO Max +23%; Apple TV+ +200%; Paramount+ +40%; Peacock +100%; YouTube Premium +33%; Spotify +30% — measured from 2021-03 to today on each service's flagship tier.

Why do streaming services keep raising prices?

We do not speculate on motive; we record what was charged and when. What the dated record shows is that increases have become regular rather than exceptional, and that several services have raised prices more than once in a single year.

CITE THIS: "A basket of 9 major streaming services rose from $95.91 to $154.41 a month between 2021-03 and September 2026, an increase of 61%." HonestlyRanked, sources cited per change, CC BY 4.0.

The Daily Front Page 20 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Price of Modern Life
article

Silicon Valley is transforming the military-industrial complex? (2024)

by paimapi·▲ 163 points·323 comments·costsofwar.watson.brown.edu ↗

Anthropologist Roberto González (Professor, San José State University) examines how America’s military-industrial complex has been rapidly expanding from the Capital Beltway to Silicon Valley. Although much of the Pentagon’s budget is spent on conventional weapons systems, the Defense Department has increasingly sought to adopt AI-enabled systems. Big tech companies, venture capital, and private equity firms benefit from multi-billion dollar Defense contracts, and smaller defense tech startups that “move fast and break things” also receive increased Defense funding. Dr. González's report illustrates how a growing portion of the Defense Department’s spending is going to large, well-known tech firms, including some of the most highly valued corporations in the world.

Given the often-classified nature of large defense and intelligence contracts, a lack of transparency makes it difficult to discern the true amount of U.S. spending diverted to Big Tech. Yet, research reveals that the amount is substantial, and growing. According to the nonprofit research organization Tech Inquiry, three of the world’s biggest tech corporations were awarded approximately $28 billion from 2018 to 2022, including Microsoft ($13.5 billion), Amazon ($10.2 billion), and Alphabet, which is Google’s parent company ($4.3 billion). This paper found that the top five contracts to major tech firms between 2019 and 2022 had contract ceilings totaling at least $53 billion combined.

Five Largest Publicy Disclosed Tech Contracts Awarded by US Military and Interlligence Agencies, 2019-2022

From 2021 through 2023, venture capital firms reportedly pumped nearly $100 billion into defense tech startup companies — an amount 40 percent higher than the previous seven years combined. This report examines how Silicon Valley startups, big tech, and venture capital who benefit from classified Defense contracts will create costly, high-tech defense products that are ineffective, unpredictable, and unsafe – all on the American taxpayer’s dime.

US VC Deal Activity in Defense Tech

article

Blizzard Workers Win Historic Union Contract

by dbg31415·▲ 239 points·107 comments·latimes.com ↗

A view of the Blizzard Entertainment entrance in Irvine.

A view of the Blizzard Entertainment entrance in Irvine.

(Allen J. Schaben / Los Angeles Times)

Workers at “World of Warcraft” video game developer Blizzard Entertainment have ratified union contracts after two years of bargaining.

The ratification vote means all union-represented Blizzard employees — nearly 1,900 people across all units in the company’s games teams and shared services — will have the same contract language in their respective departments, the union said Wednesday.

Blizzard quality assurance workers in Albany, N.Y., and Austin, Texas, were the first to unionize in 2022, followed by “World of Warcraft” employees in 2024. Last year, workers on the “Overwatch,” “Diablo,” “Hearthstone” and Warcraft Rumble” games teams, as well as the story and franchise development and platform technology units unionized.

“This contract marks the beginning of a new era at Blizzard Entertainment, but it doesn’t stop with us,” “Overwatch” bargaining committee member and quality analyst Simon Hedrick said in a statement. “I believe that the positive change we have won will ripple out and help make the games industry as a whole a better place for workers and players alike.”

The Blizzard contracts include wage increases and a hybrid work week of three days in the office, among other provisions, the union said. The contracts also require Blizzard to discuss and bargain over the use of artificial intelligence in the workplace.

“We appreciate the dedication and engagement of our represented employees and the bargaining committees throughout this process, as well as every Blizzard employee whose work continued alongside it,” Johanna Faries, Blizzard’s president, said in a statement. “The ratification of these agreements marks a significant milestone and reflects our shared commitment to continuing to work together in support of our teams and our players.”

Blizzard is a subsidiary of Santa Monica-based Activision Blizzard. The company was acquired by tech giant Microsoft Corp. in 2023.

In July, Microsoft said it would cut 3,200 jobs in its video game division, or about 20% of that staff, over the next year as the gaming industry continues to face a flagging landscape. The layoffs were part of a larger cost-cutting effort at Microsoft, which is laying off about 2% of its workforce in total.

Blizzard’s union said the planned layoffs, as well as job cuts throughout the video game industry, were a major issue during contract negotiations.

One of the provisions in the Blizzard contracts gives laid-off workers the right to be “recalled” into open jobs across Blizzard’s bargaining units for 14 months after the announcement of their layoff.

“This contract secures a lot of what people already love about working here while adding strong protections around layoffs, job security and remote work,” Daniel Weltz, platform and technology bargaining committee member and principal software engineer, said in a statement. “Blizzard helped shape the gaming industry, and I’m proud that this contract allows us to continue setting new standards for this work.”

The Daily Front Page 21 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — The Culture Pages
article

Don't let anyone take away your big box of cables

by Brajeshwar·▲ 384 points·280 comments·blog.jim-nielsen.com ↗

Speaking of being on the internet and finding things that make you go, “Hey! It’s not just me!” I scrolled across this skeet from Tyler Gaw:

I just dug to the bottom of my Big Box of Cables to find two cables that I needed for something. They've been in the bottom for 10+ years. So, "when are you ever gonna use these?" was today. Don't ever let anyone take your Big Box of Cables away.

I laughed. I cried. I felt inspired.

So inspired, in fact, that I decided I was gonna do something about it.

Something that would make me forever remember the value of that advice.

  • I screenshotted that skeet.
  • I printed it (in black and white with the ole’ trusty Brother).
  • I cut it out.
  • I pulled out my big box of cables (the one my wife lovingly labeled “FAMILY TECHNO BOX”).
  • I cut some clear packing tape.
  • And I plastered that thing on the front on my box.

Photo of a cardobard box with cables hanging out of it. There is handwriting on the box with a sharpie that says “FAMILY TECHNO BOX”. There is also a print out of a skeet taped over the box that says (amongst other things): “Don’t ever let anyone take your Big Box of Cables away.”

Now every time I pull that box out to add YAC (yet another cable), instead of asking myself, “Why do I keep this box?” I’ll see that skeet and I’ll be reminded why I do what I do. I’ll feel a spark of joy, motivation, and purpose rekindled. (Not to mention the fact that it will serve as a warning to anyone in the family who thinks “I should just throw this away…”)

One day my kids will find that box in the attic amongst my other belongings. I hope they will pay heed to the timeless advice lovingly taped on the outside.

article

Aardman (Wallace and Gromit) Is Selling Its Original Movie Puppets

by Gaishan·▲ 81 points·21 comments·gizmodo.com ↗

Aardman Wallace Gromit

© Aardman/Netflix

Days into September, British claymation studio Aardman announced it’s teaming with PropStore to put old puppets up for sale.

No, the company’s not shutting down—it’s donig this to celebrate its upcoming 50th birthday. As such, nearly 250 items from almost all of its productions are for grabs. From classics like Wallace & Gromit: The Wrong Trousers and A Close Shave to the more recent Robin Robin and Chicken Run 2, and the upcoming Shawn the Sheep: The Beast of Mossy Bottom, there’s a breadth of boards, signed postes, and props to put down money on. (For those wondering, neither the Over the Garden Wall claymation special or 2027’s claymation Pokémon Tales series are represented amongst the collection.)

For the older Aardman fans, there’s even Morph, the 1977 series that marked the studio’s first-ever production. Those who remember it or its various followups can put down money on items from those, including original clay stop-motion puppets of the titular character and his best friend Chas.

Aardman Wallace 2

© Aardman Animation

Aardman 3

© Aardman Animation

Aardman Wallace 1

© Aardman Animation

Aardman Morph1

© Aardman Animation

Aardman Morph2

© Aardman Animation

Aardman 5

© Aardman Animation

Aardman Shaun1

© Aardman Animation

Aardman Shaun2

© Aardman Animation

Aardman 4

© Aardman Animation

Aardman’s attractions director Ngaio Harding-Hill assured auction’s been “carefully curated by the studio’s creative talent and includes contributions…produced in celebration of this unique moment to connect with our fans.” Proceeds will go toward internal talent development initiatives, including skill development programs and avenues for future filmmakers that’ll “help to broaden access to careers in animation and nurture the next generation of creative talent.”

The Aardman auction will go live with global online, telephone, and absentee options on September 24. Until then, there’s nothing to do but look what the studio is selling.

The Daily Front Page 22 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Also on the Front Page
The Daily Front Page 23 of 24
Thursday, September 10, 2026 The Daily Front No. #260910 — Colophon

That's the Front for Today

Issue No. #260910 — Thursday, September 10, 2026 — went to press 2026-09-11 at 04:43 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Thursday, September 10, 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 — 33 model calls and 299k tokens in total. Set in Jacquard 12, Playfair Display, Source Serif 4, and IBM Plex Mono, all served via Google Fonts under the SIL Open Font License.

The Cover

The cover illustration was commissioned with this prompt:

In a bright software office, a developer watches a small autonomous robotic hand dismantle a single shared bridge between two smartphones and rebuild two sturdy native pathways: one handset rests beside a Swift bird-shaped tool, the other beside a Kotlin frog figurine. On a neighboring workbench, a rust-colored metal gear locks into a Windows-like computer chassis, while engineers inspect the connections with magnifying glasses and tighten tiny bolts, checking every setting before the machinery moves.

Modernist wayfinding-map abstraction on a strict modular grid, using cobalt blue, signal orange, leaf green, and charcoal on warm ivory uncoated paper: encode the bright software office as a clean mapped field, with colored routes and nodes preserving the autonomous robotic hand dismantling one shared bridge between two smartphones and rebuilding two sturdy native pathways—one terminating beside a Swift bird-shaped tool, the other beside a Kotlin frog figurine—while a neighboring workbench carries a rust-orange gear locked into a Windows-like computer chassis, with engineer nodes, magnifying-glass inspection loops, bolt markers, and setting-check junctions clearly linked before the machinery’s movement route begins; flat geometric symbols, precise directional connectors, restrained labels, and no ornamental detail.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 29 204,517 65,685
layoutgpt-5.6-terra 1 19,112 1,982
covergpt-5.6-luna 2 1,562 451
covergpt-image-2 1 263 5,488

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. Shopify is moving from React Native back to Swift and Kotlin by fnthawar2 — shopify.engineering·HN discussion ↗
  2. Rust is tier-1 language at Microsoft by mmastrac — rustfoundation.org·HN discussion ↗
  3. Cognition launches new SWE-2 model, Rivaling Fable 5.1 and GPT-Astra by seelos — cognition.com·HN discussion ↗
  4. OpenAI Agents API by aquir — developers.openai.com·HN discussion ↗
  5. Training a 3.8B LLM to 0.384 CORE for $998 by Anon84 — hugovergnes.github.io·HN discussion ↗
  6. Factoring RSA 260 by samyok — cognition.com·HN discussion ↗
  7. JEP 544: Ahead-of-Time Code Compilation by Skinney — openjdk.org·HN discussion ↗
  8. Neki – Sharded Postgres by simon_weber — planetscale.com·HN discussion ↗
  9. I have a theory that software drives people insane by rglover — graybeard.ing·HN discussion ↗
  10. List of references on Sony websites to players "owning" their digital games by haunter — consumerrights.wiki·HN discussion ↗
  11. Automattic's board forces CEO Matt Mullenweg into leave of absence by LeoPanthera — techcrunch.com·HN discussion ↗
  12. Technique for Manipulating Satellite Photos Now Reveals Ancient Images (2025) by gumby — spinoff.nasa.gov·HN discussion ↗
  13. Larger Pacific striped octopus by olalonde — en.wikipedia.org·HN discussion ↗
  14. DeepSeek v4.1 Flash by Liwink — twitter.com·HN discussion ↗
  15. Tell HN: OpenAI keeps re-enabling the 'allow training' setting by jacquesm — news.ycombinator.com·HN discussion ↗
  16. Show HN: What if the speed of light was 5 km/h? by dmitrybrant — rivendell.dmitrybrant.com·HN discussion ↗
  17. What algorithm did Windows XP use to choose your initial user picture? by soheilpro — devblogs.microsoft.com·HN discussion ↗
  18. Show HN: Compute polynomials twice as fast by thomasahle — thomasahle.com·HN discussion ↗
  19. Stockfish 19 by atiedebee — stockfishchess.org·HN discussion ↗
  20. Hitachi launches CO2 heat pump water heaters with solar-friendly tariff controls by thelastgallon — pv-magazine.com·HN discussion ↗
  21. The same nine streaming subscriptions cost $702/year more than in 2021 by honestlyranked — honestlyranked.com·HN discussion ↗
  22. Silicon Valley is transforming the military-industrial complex? (2024) by paimapi — costsofwar.watson.brown.edu·HN discussion ↗
  23. Blizzard Workers Win Historic Union Contract by dbg31415 — latimes.com·HN discussion ↗
  24. Don't let anyone take away your big box of cables by Brajeshwar — blog.jim-nielsen.com·HN discussion ↗
  25. Aardman (Wallace and Gromit) Is Selling Its Original Movie Puppets by Gaishan — gizmodo.com·HN discussion ↗
  26. More questions about whether researchers can trust OpenAI with unpublished math by pred_ — mathstodon.xyz·HN discussion ↗
  27. Forgejo <=16.0.3 Critical RCE by weierstass — codeberg.org·HN discussion ↗
  28. Douglas Hofstadter: Analogy as the Core of Cognition [video] by tosh — youtube.com·HN discussion ↗
  29. Music Theory for the 21st-Century Classroom by aanet — musictheory.pugetsound.edu·HN discussion ↗
  30. All grown-ups were once children, but only few of them remember it by yurivish — mathstodon.xyz·HN discussion ↗

Browse all issues in the archive →