<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matt Busel</title>
    <description>The latest articles on DEV Community by Matt Busel (@mattbusel).</description>
    <link>https://dev.to/mattbusel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4174292%2F5d7dcb3a-e63c-4784-97a3-430342fa30c2.jpg</url>
      <title>DEV Community: Matt Busel</title>
      <link>https://dev.to/mattbusel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mattbusel"/>
    <language>en</language>
    <item>
      <title>Musk showed Europe the kill switch. 74% of its top sites have one</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Sat, 24 Oct 2026 15:47:29 +0000</pubDate>
      <link>https://dev.to/mattbusel/musk-showed-europe-the-kill-switch-74-of-its-top-sites-have-one-2l73</link>
      <guid>https://dev.to/mattbusel/musk-showed-europe-the-kill-switch-74-of-its-top-sites-have-one-2l73</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/digital-sovereignty-europe-us-kill-switch/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Yes, Europe's internet has a US off switch, and it is not Starlink. I scanned the 100 most-visited sites of every EU country plus the UK (2,789 sites) on Oct 24, 2026: &lt;strong&gt;73.9%&lt;/strong&gt; rely on an American company for their web hosting, their email or their DNS, and &lt;strong&gt;35.5%&lt;/strong&gt; rely on one for all three. Cloudflare and Microsoft alone touch more than half of them. You can check your own domain in about 60 seconds with the three commands further down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Elon Musk's reported order to throttle Starshield for Ukraine made "the US kill switch" a real thing in European capitals this month. So I measured it. Of 2,480 top European sites with all three layers visible, &lt;strong&gt;1,833&lt;/strong&gt; use a US company somewhere and &lt;strong&gt;881&lt;/strong&gt; are American all the way down. Microsoft or Google runs the email of &lt;strong&gt;49.7%&lt;/strong&gt; of them. Government domains split hard: &lt;strong&gt;94%&lt;/strong&gt; of 627 UK government domains lean on a US company, against &lt;strong&gt;19%&lt;/strong&gt; of 163 French ones. And on AI, Europe's top sites carry &lt;strong&gt;237&lt;/strong&gt; Anthropic and &lt;strong&gt;159&lt;/strong&gt; OpenAI domain verifications, but only &lt;strong&gt;8&lt;/strong&gt; for France's Mistral. Every row is in the CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 24 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top European sites scanned (top 100 per EU27 country domain + .uk)&lt;/td&gt;
&lt;td&gt;2,789&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://tranco-list.eu/list/262N9/1000000" rel="noopener noreferrer"&gt;Tranco list 262N9&lt;/a&gt; + our DNS scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use a US company for web, mail or DNS&lt;/td&gt;
&lt;td&gt;73.9% (1,833 of 2,480)&lt;/td&gt;
&lt;td&gt;Our scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US company for all three layers&lt;/td&gt;
&lt;td&gt;35.5% (881 of 2,480)&lt;/td&gt;
&lt;td&gt;Our scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web served from a US company's network&lt;/td&gt;
&lt;td&gt;56.3% (Cloudflare alone 29.0%)&lt;/td&gt;
&lt;td&gt;Our scan + &lt;a href="https://iptoasn.com/" rel="noopener noreferrer"&gt;iptoasn&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email (MX) run by Microsoft or Google&lt;/td&gt;
&lt;td&gt;49.7% (724 Microsoft, 525 Google)&lt;/td&gt;
&lt;td&gt;Our scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS run by a US company&lt;/td&gt;
&lt;td&gt;53.0% (Cloudflare alone 726 sites)&lt;/td&gt;
&lt;td&gt;Our scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UK government domains on a US company (any layer)&lt;/td&gt;
&lt;td&gt;94.0% of 627&lt;/td&gt;
&lt;td&gt;Our scan, .gov.uk domains in the Tranco 1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;French government domains on a US company&lt;/td&gt;
&lt;td&gt;18.8% of 163&lt;/td&gt;
&lt;td&gt;Our scan, .gouv.fr domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government front doors (29) with a US layer&lt;/td&gt;
&lt;td&gt;18 of 29&lt;/td&gt;
&lt;td&gt;Our scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI vendor domain verifications on top sites&lt;/td&gt;
&lt;td&gt;Anthropic 237, OpenAI 159, Cursor 26, Mistral 8&lt;/td&gt;
&lt;td&gt;Our TXT-record scan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/digital-sovereignty-europe-us-kill-switch/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, 4,265 rows: every domain with its country, Tranco rank, web host network, mail provider, DNS provider, US or not for each layer, and which AI vendors it verified with).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgdzuk922pqbaqqc3pbvw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgdzuk922pqbaqqc3pbvw.webp" alt="Animated bar chart, share of Europe's 2,789 top sites that use a US-headquartered company, by layer, Oct 24 2026: any layer 73.9%, mail 56.9%, web host 56.3%, DNS 53.0%, all three layers 35.5%." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Three in four of Europe's top sites have an American layer. Our public-DNS scan of the Tranco top 100 per EU27 country domain plus .uk, Oct 24 2026. Rendered with our game engine.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The switch got flipped, and Europe noticed
&lt;/h2&gt;

&lt;p&gt;On Oct 14, Ukrainian units found their Starshield links, the military version of Starlink, capped. The &lt;a href="https://www.wsj.com/world/ukraine-starlink-elon-musk-trump-dbc49193" rel="noopener noreferrer"&gt;Wall Street Journal&lt;/a&gt; reported that Musk personally ordered the restriction, citing US officials; the &lt;a href="https://www.nytimes.com/2026/10/21/world/europe/starshield-starlink-ukraine.html" rel="noopener noreferrer"&gt;New York Times&lt;/a&gt; covered the fallout. Musk had first pointed at the US government, and Secretary of State Marco Rubio says there was "no foreknowledge". Who gave the order is still argued. What it did is not.&lt;/p&gt;

&lt;p&gt;This morning Steve Blank, the Stanford adjunct professor behind the customer-development method half of Silicon Valley learned from, posted &lt;a href="https://steveblank.com/2026/10/24/europe-gets-a-wake-up-call/" rel="noopener noreferrer"&gt;"Elon Musk Just Gave Europe a Reason to Replace American Technology"&lt;/a&gt;. It raced up Hacker News, 254 points and 249 comments in under two hours. He has spent the month in London and quotes the question policymakers keep asking him:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What happens if other U.S. CEOs, Microsoft, OpenAI or Anthropic, Oracle, Palantir, or Google, decide to restrict/limit or deny access to their products? What capabilities would Europe lose if enterprise software and/or AI across Europe goes dark?" (Steve Blank, Oct 24 2026)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a question with an answer you can measure. Not the military part. The everyday part: which European websites, inboxes and domain names stop working if a handful of American companies are told to, or decide to, switch them off. So I measured it.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I checked: 4,265 domains, three layers, public DNS only
&lt;/h2&gt;

&lt;p&gt;Every site needs three things to be reachable. A &lt;strong&gt;web host&lt;/strong&gt; (the network that answers when you load the page), &lt;strong&gt;mail servers&lt;/strong&gt; (the MX record: who receives the domain's email) and &lt;strong&gt;DNS&lt;/strong&gt; (the nameservers that tell the internet where everything lives). If any one of them is cut, something breaks. If DNS is cut, everything breaks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top sites:&lt;/strong&gt; the first 100 domains of each EU27 country code (.de, .fr, .it ... ) plus .uk in the &lt;a href="https://tranco-list.eu/" rel="noopener noreferrer"&gt;Tranco&lt;/a&gt; top-1M research ranking (list &lt;a href="https://tranco-list.eu/list/262N9/1000000" rel="noopener noreferrer"&gt;262N9&lt;/a&gt;, built by Victor Le Pochat and colleagues at KU Leuven to resist manipulation). 2,789 domains; Malta, Cyprus and Luxembourg have slightly fewer than 100 in the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Government:&lt;/strong&gt; every domain in the same 1M list under an official government suffix (.gov.uk, .gouv.fr, .bund.de, .gov.pl, .gob.es, .gv.at, .gov.it, .europa.eu and so on): 1,446 domains. Plus each country's central government "front door" (gov.uk, info.gouv.fr, bundesregierung.de ...), 29 in all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The scan:&lt;/strong&gt; A, CNAME, MX, NS and TXT lookups through public resolvers, then each IP matched to the network that owns it with the free &lt;a href="https://iptoasn.com/" rel="noopener noreferrer"&gt;iptoasn&lt;/a&gt; table. Mail and DNS providers were matched by hostname first (outlook.com is Microsoft, awsdns is Amazon), network second. 48 seconds for the main pass, about 11 AM ET today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"US company"&lt;/strong&gt; means US-headquartered: Cloudflare, Amazon, Microsoft, Google, Akamai, Fastly, Proofpoint, Cisco and the like, even when the server sits in Frankfurt. That is the point: a US company answers to US law, including the &lt;a href="https://www.justice.gov/criminal/cloud-act-resources" rel="noopener noreferrer"&gt;CLOUD Act&lt;/a&gt;, wherever its servers are. I counted Imperva (owned by France's Thales) and Mimecast (UK) as not US, which makes the US numbers smaller, not bigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to see if you are in the 74%? Skip to check your own domain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Three in four of Europe's top sites have an American layer
&lt;/h2&gt;

&lt;p&gt;Of the 2,480 top sites where all three layers answered, &lt;strong&gt;1,833 (73.9%)&lt;/strong&gt; use a US company for at least one. &lt;strong&gt;881 (35.5%)&lt;/strong&gt; use US companies for all three: page, inbox and the DNS that would let them move. Only 26.1% are fully European or self-run.&lt;/p&gt;

&lt;p&gt;The obvious objection: the list includes google.de, amazon.fr and youtu.be, which are American companies' own European domains. Fair. I dropped 81 of those brand domains and reran it. The answer moved from 73.9% to &lt;strong&gt;73.3%&lt;/strong&gt;. This is not Google's sites being American. This is Europe's sites.&lt;/p&gt;

&lt;p&gt;The layer that matters most is the one people never think about. If your web host disappears, you repoint DNS to another host and you are back in hours. If your DNS provider and your web host are the same US company, you can't repoint anything, because the switch that would move you is the one that got flipped.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cloudflare, not Musk, is Europe's biggest switch
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjvqp8ysc2uqkdcxm6sgn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjvqp8ysc2uqkdcxm6sgn.webp" alt="Grouped bar chart of how many of Europe's 2,789 top sites use each US company, by layer. Cloudflare: web 786, mail 8, DNS 726. Microsoft: web 49, mail 724, DNS 39. Google: web 82, mail 525, DNS 96. Amazon: web 259, mail 41, DNS 333. Akamai: web 219, DNS 116. Fastly: web 81. Proofpoint: mail 65." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cloudflare and Microsoft hold the biggest switches. Our scan, Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Starlink got the headlines. Cloudflare has the reach. It serves the web traffic of &lt;strong&gt;786&lt;/strong&gt; of Europe's top sites (29.0% of those with a web host) and runs the DNS of &lt;strong&gt;726&lt;/strong&gt;. Microsoft runs the inbox of &lt;strong&gt;724&lt;/strong&gt;. Google runs the inbox of &lt;strong&gt;525&lt;/strong&gt;. Amazon hosts 259 and does DNS for 333. Add Akamai and Fastly and six US companies hold the big switches for most of the continent's attention.&lt;/p&gt;

&lt;p&gt;To be clear, none of these companies has threatened anything, and Cloudflare in particular has publicly pushed back on takedown demands before. My point is narrower and, I think, harder to dodge: &lt;strong&gt;the risk Europe just discovered is structural, not personal.&lt;/strong&gt; Starshield was one company and one man. The web is four or five companies and a legal system. A court order, a sanctions list or a bad Tuesday at one of them reaches more Europeans than a satellite cap ever could. If you want the outage version of that, our &lt;a href="https://tensorust.com/status/cloudflare/" rel="noopener noreferrer"&gt;Cloudflare status page&lt;/a&gt; tracks it.&lt;/p&gt;

&lt;p&gt;It has happened before, at small scale. In May 2025, the &lt;a href="https://www.bostonglobe.com/2025/05/15/world/trumps-sanctions-icc-prosecutor-have-halted-tribunals-work" rel="noopener noreferrer"&gt;AP reported&lt;/a&gt; that the International Criminal Court's chief prosecutor lost his Microsoft email after US sanctions and moved to Swiss Proton Mail. Microsoft &lt;a href="https://heise.de/-10429628" rel="noopener noreferrer"&gt;said&lt;/a&gt; it never stopped serving the court itself, only the sanctioned official. Both things can be true. That is exactly how a targeted switch works.&lt;/p&gt;
&lt;h2&gt;
  
  
  The country ranking: Ireland and Malta are all-in, Czechia barely
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz04tqp7w29izxj9vaate.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz04tqp7w29izxj9vaate.webp" alt="Horizontal bar chart, share of each country's top 100 country-domain sites with a US company in web, mail or DNS. Malta 97%, Ireland 96%, United Kingdom 94%, Italy 91%, Spain 89%, Netherlands 86%, Denmark 85%, Belgium 83%, Croatia 82%, Greece 81%, Lithuania 81%, Estonia 80%, Portugal 80%, Cyprus 74%, France 71%, Bulgaria 71%, Sweden 70%, Finland 68%, Luxembourg 68%, Germany 67%, Latvia 67%, Romania 66%, Hungary 60%, Slovakia 59%, Slovenia 58%, Poland 56%, Austria 55%, Czechia 42%." width="800" height="650"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Malta and Ireland are all-in, Czechia barely. Our scan, Oct 24 2026; percentages of sites where all three layers answered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Malta (&lt;strong&gt;97%&lt;/strong&gt;), Ireland (&lt;strong&gt;96%&lt;/strong&gt;) and the UK (&lt;strong&gt;94%&lt;/strong&gt;) top the chart: almost every big site there has an American layer. Italy (91%), Spain (89%) and the Netherlands (86%) follow. Germany, the country that talks most about digital sovereignty, lands at &lt;strong&gt;67%&lt;/strong&gt;, mid-table.&lt;/p&gt;

&lt;p&gt;The bottom is the interesting part. &lt;strong&gt;Czechia (42%)&lt;/strong&gt;, Austria (55%), Poland (56%) and Slovenia (58%) have the most self-reliant big sites in the EU. Czechia has a reason: it never let Google win. Seznam, the Czech search and email company, still runs a real chunk of the Czech web, and big Czech sites sit on local hosts like VSHosting and the academic network CESNET. It is the one country in the EU where "use the local one" is already the default.&lt;/p&gt;

&lt;p&gt;My read: dependency tracks how early a country's internet went English-first. Ireland hosts the European headquarters of half of Big Tech; of course its top sites run on them. The countries with their own search engines, mail providers and hosting scenes (Czechia, Poland) are the ones a US switch would hurt least.&lt;/p&gt;
&lt;h2&gt;
  
  
  Governments: the UK outsourced the state, France did its homework
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqeiwueaqfg02pscjt02.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqeiwueaqfg02pscjt02.webp" alt="Horizontal bar chart, government domains with a US company in any layer, and the share whose mail goes to a US provider, for countries with 20 or more government domains: United Kingdom 94% (mail 72%), Spain 92% (26%), Portugal 79% (62%), Italy 74% (58%), Greece 69% (45%), Poland 51% (21%), Latvia 48% (38%), Cyprus 29% (6%), France 19% (2%), Austria 8% (8%)." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The UK runs its public web on US clouds; France and Austria mostly do not. Government-suffix domains in the Tranco 1M, our scan, Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Government domains are where this stops being an IT question. Across EU government domains in the list (819), &lt;strong&gt;47.7%&lt;/strong&gt; touch a US company. Across UK ones (627), &lt;strong&gt;94.0%&lt;/strong&gt; do. That is not a typo. The UK runs most of its public web on Amazon (151 domains), Cloudflare (131), Microsoft (72) and Fastly (66), and &lt;strong&gt;72.5%&lt;/strong&gt; of UK government domains that receive mail route it to a US company, 331 of them straight to Microsoft.&lt;/p&gt;

&lt;p&gt;France is the opposite. Only &lt;strong&gt;18.8%&lt;/strong&gt; of 163 .gouv.fr domains have a US layer and just &lt;strong&gt;2.3%&lt;/strong&gt; of their mail goes to a US provider. Most French ministries receive mail through the state's own interministerial network (RIE) or French providers. Austria is even tighter at 7.9%. Spain is the odd one: its government web and mail are mostly its own, but the shared government nameservers (ns1.age.gob.es and ns2.age.gob.es) answer from Cloudflare's network, so 89.9% of Spanish government domains have American DNS.&lt;/p&gt;

&lt;p&gt;That Spanish detail is the whole argument in one record. Spain kept the house and rented the front door.&lt;/p&gt;
&lt;h2&gt;
  
  
  29 front doors: 18 have an American hinge
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg06verw422n783dgob3e.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg06verw422n783dgob3e.webp" alt="Grid of 29 central government portals and three layers each, red where a US company runs the layer. Malta gov.mt: Cloudflare web, Microsoft mail, Microsoft DNS. Italy governo.it: Akamai web, Microsoft mail. Lithuania lrv.lt: Cloudflare web and DNS. Portugal portugal.gov.pt: Amazon web, Microsoft mail. Belgium: Akamai DNS. Bulgaria, Czechia: Microsoft mail. Cyprus: Microsoft web. Denmark: F5 DNS. europa.eu: Proofpoint mail. Estonia, France, Sweden: Cloudflare web. Greece, Netherlands: Akamai web. Ireland: Amazon web. Spain: Cloudflare DNS. UK gov.uk: Fastly web. Fully European or self-run: Austria, Croatia, Finland, Germany, Hungary, Latvia, Luxembourg, Poland, Romania, Slovakia, Slovenia." width="800" height="850"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;18 of 29 front doors have an American hinge. Our scan, Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The main government portal of each country (and europa.eu) is the page citizens hit first. &lt;strong&gt;18 of 29&lt;/strong&gt; rely on a US company for at least one layer. Malta's gov.mt is American three times over: Cloudflare in front, Microsoft for mail, Microsoft for DNS. Italy's governo.it serves through Akamai and takes mail through Microsoft. Even France's front door, info.gouv.fr, is served through Cloudflare, while its mail and DNS stay French.&lt;/p&gt;

&lt;p&gt;Eleven are fully home-grown on all the layers they publish: Germany, Austria, Finland, Hungary, Latvia, Luxembourg, Poland, Romania, Slovakia, Slovenia and Croatia. The European Commission's europa.eu hosts itself, but receives its mail through Proofpoint, a US company. Make of that what you want.&lt;/p&gt;
&lt;h2&gt;
  
  
  The AI layer: Mistral is losing at home, 8 to 396
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ti3sjsqplm9syd3w7if.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ti3sjsqplm9syd3w7if.webp" alt="Bar chart, Europe's 2,789 top sites with a domain-verification TXT record for each AI company: Anthropic 237, OpenAI 159, Cursor 26, Perplexity 8, Mistral 8." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;US AI labs 396, Mistral 8. Verification records are a lower bound. Our TXT scan, Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Blank's list of feared switches included OpenAI and Anthropic, so I checked that too. When a company buys a team or enterprise plan from an AI lab, it usually proves it owns its domain by publishing a TXT record like &lt;code&gt;openai-domain-verification=...&lt;/code&gt;. Those records are public. Across Europe's 2,789 top sites I found &lt;strong&gt;237 Anthropic&lt;/strong&gt; verifications, &lt;strong&gt;159 OpenAI&lt;/strong&gt;, 26 Cursor, 8 Perplexity and &lt;strong&gt;8 Mistral&lt;/strong&gt;. 332 different top sites verified with at least one of the two big US labs; 64 verified with both.&lt;/p&gt;

&lt;p&gt;Mistral is France's AI champion, the company French ministers hold up as proof Europe can compete. Among Europe's most-visited domains it has 8 verified customers, and 5 of them are universities. If an American switch for AI exists, Europe has already plugged into it, and it chose Anthropic first. This is a lower bound (plenty of teams use these tools with no record at all), but the ratio is the story: &lt;strong&gt;396 to 8&lt;/strong&gt;. If you want to see what an open or European model would cost you instead, our &lt;a href="https://tensorust.com/articles/kimi-k3-1-pro-price-open-weights/" rel="noopener noreferrer"&gt;price check of 215 models&lt;/a&gt; has the open-weights numbers.&lt;/p&gt;

&lt;p&gt;Microsoft 365 shows up the same way: &lt;strong&gt;1,069&lt;/strong&gt; top sites and &lt;strong&gt;565&lt;/strong&gt; government domains carry a Microsoft 365 tenant record (&lt;code&gt;MS=ms...&lt;/code&gt;). That is the "enterprise software across Europe goes dark" scenario in Blank's quote, sitting in public DNS.&lt;/p&gt;
&lt;h2&gt;
  
  
  Check your own domain in 60 seconds
&lt;/h2&gt;

&lt;p&gt;You don't need my scan. Three lookups tell you who holds your switches. Replace example.eu with your domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig +short NS example.eu
dig +short MX example.eu
dig +short www.example.eu
whois -h whois.cymru.com " -v 203.0.113.10"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line names your DNS provider (awsdns = Amazon, cloudflare.com = Cloudflare, azure-dns = Microsoft). The second names your mail provider (outlook.com = Microsoft, google.com = Google, pphosted.com = Proofpoint). Put the IP from the third line into the fourth to see which company owns the network serving your site. On Windows, &lt;code&gt;nslookup -type=NS example.eu&lt;/code&gt; does the same job. Or just search your domain in our &lt;a href="https://tensorust.com/articles/digital-sovereignty-europe-us-kill-switch/data.csv" rel="noopener noreferrer"&gt;CSV&lt;/a&gt;: if it is a top European site, it is already in there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do if you are in the 35% with no exit
&lt;/h2&gt;

&lt;p&gt;This is my opinion, not a compliance checklist. Moving everything to Europe tomorrow is expensive and mostly theatre. Having an exit is cheap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Split DNS from hosting.&lt;/strong&gt; If one company runs both, add a secondary DNS provider in another jurisdiction (deSEC, a Berlin nonprofit; Gandi or OVHcloud in France; Hetzner in Germany). A second nameserver is the cheapest kill-switch insurance on the internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down your mail exit.&lt;/strong&gt; Know which provider you would move MX to, export a mailbox once to prove you can, and keep MX TTLs short.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep one copy of the site somewhere boring.&lt;/strong&gt; A static build on a European host (Hetzner, OVHcloud, Scaleway, IONOS) or a European CDN like Slovenia's Bunny.net that you can point DNS at in an hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know your AI fallback.&lt;/strong&gt; If your product calls one US model, test it once against an open-weights model you could host yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steve Blank's bet is that AI makes cloning Office, Oracle and Salesforce cheap enough for Europe to finally do it. Maybe. My bet is less romantic: &lt;strong&gt;Europe doesn't need to clone Microsoft. It needs a second nameserver.&lt;/strong&gt; Dependency is fine. Dependency with no exit is the kill switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think happens next
&lt;/h2&gt;

&lt;p&gt;Some of this is speculation, so take it as that. I think the Starshield episode does for European IT what the Snowden files did for encryption: years of slow talk turn into budget lines. Denmark's digital ministry &lt;a href="https://www.computing.co.uk/news/2025/denmark-digital-ministry-drops-microsoft" rel="noopener noreferrer"&gt;started moving to LibreOffice&lt;/a&gt; in 2025, and the German state of Schleswig-Holstein says almost &lt;a href="https://www.schleswig-holstein.de/DE/landesregierung/ministerien-behoerden/I/_startseite/Artikel2025/IV/251204_cds_digitale_souveraenitaet" rel="noopener noreferrer"&gt;80% of its workstations&lt;/a&gt; already switched. Expect copycats in every ministry that just watched a drone feed go dark.&lt;/p&gt;

&lt;p&gt;What I don't think happens: the UK moving. 94% is not a vendor choice, it is an operating model, and Whitehall has run a "cloud first" policy since 2013 that pushed departments onto public cloud by design.&lt;/p&gt;

&lt;p&gt;My bet, in public: I rerun this exact scan on Oct 24, 2027. EU government domains with a US layer drop below &lt;strong&gt;40%&lt;/strong&gt; (from 47.7% today). The UK stays above &lt;strong&gt;90%&lt;/strong&gt;. Europe's top sites overall barely move, because private companies buy whatever works.&lt;/p&gt;

&lt;p&gt;Your turn: would your company survive 24 hours if Microsoft and Cloudflare turned you off? Tell me what breaks first in the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is DNS, not contracts. A US CDN in front of a site does not mean the data is stored in the US, and a US company running a layer does not mean it would ever cut it.&lt;/li&gt;
&lt;li&gt;I classified the first web IP, the primary MX and the nameserver set. Sites with several providers (say, a European primary MX and a US backup) are counted by the primary.&lt;/li&gt;
&lt;li&gt;Top 100 per country domain misses European companies on .com and .eu. Government suffix lists are uneven (the UK puts far more agencies under .gov.uk than Germany puts under .bund.de), so compare governments by percentage, not counts, and only where there are 20+ domains.&lt;/li&gt;
&lt;li&gt;Akamai's main European network is registered in the Netherlands; I counted it as US because Akamai is a US company. Imperva and Mimecast count as non-US.&lt;/li&gt;
&lt;li&gt;AI verification records are a floor. Many teams use these tools without one, and some records are left over from old trials.&lt;/li&gt;
&lt;li&gt;Not legal or security advice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Now (Oct 24 2026)&lt;/th&gt;
&lt;th&gt;Rerun&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top European sites with a US layer&lt;/td&gt;
&lt;td&gt;73.9%&lt;/td&gt;
&lt;td&gt;Oct 24 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top sites US on all three layers&lt;/td&gt;
&lt;td&gt;35.5%&lt;/td&gt;
&lt;td&gt;Oct 24 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU government domains with a US layer&lt;/td&gt;
&lt;td&gt;47.7%&lt;/td&gt;
&lt;td&gt;Oct 2027 (bet: below 40%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UK government domains with a US layer&lt;/td&gt;
&lt;td&gt;94.0%&lt;/td&gt;
&lt;td&gt;Oct 2027 (bet: above 90%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral vs OpenAI + Anthropic verifications&lt;/td&gt;
&lt;td&gt;8 vs 396&lt;/td&gt;
&lt;td&gt;Oct 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More from the same beat: the &lt;a href="https://tensorust.com/articles/openclaw-vulnerabilities-npm-advisories/" rel="noopener noreferrer"&gt;open-source dependency audit&lt;/a&gt; we ran this morning (1 in 4 top npm installs sits on a known hole), the &lt;a href="https://tensorust.com/articles/kimi-k3-1-pro-price-open-weights/" rel="noopener noreferrer"&gt;open vs closed AI price check&lt;/a&gt;, and every policy and AI-deal story on the &lt;a href="https://tensorust.com/articles/topic/ai-industry/" rel="noopener noreferrer"&gt;AI industry hub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the holes before someone else does
&lt;/h2&gt;

&lt;p&gt;Knowing who can switch you off is half of it. The other half is what a stranger can already reach. If you built your app with Lovable, Bolt, Cursor, Replit or Supabase, the &lt;a href="https://shop.tensorust.com/buy/launch-check?utm_source=devto&amp;amp;utm_campaign=digital-sovereignty-europe-us-kill-switch" rel="noopener noreferrer"&gt;$49 Launch Check&lt;/a&gt; tells you whether a stranger can read your tables, find exposed keys or open your storage buckets. Plain-English report in 48 hours. &lt;strong&gt;You get the holes found and the fix for each. If we missed something we checked, we write the fix at no extra cost until it is closed.&lt;/strong&gt; Email &lt;a href="mailto:support@tensorust.com"&gt;support@tensorust.com&lt;/a&gt;; a real person replies within one business day. Prefer free first? Run the &lt;a href="https://tensorust.com/teardown/" rel="noopener noreferrer"&gt;free landing page teardown&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow for one checked, data-backed answer to the fights everyone is having, every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Steve Blank, &lt;a href="https://steveblank.com/2026/10/24/europe-gets-a-wake-up-call/" rel="noopener noreferrer"&gt;Elon Musk Just Gave Europe a Reason to Replace American Technology&lt;/a&gt;, Oct 24 2026&lt;/li&gt;
&lt;li&gt;The Wall Street Journal, &lt;a href="https://www.wsj.com/world/ukraine-starlink-elon-musk-trump-dbc49193" rel="noopener noreferrer"&gt;reporting that Musk ordered the Starshield restrictions&lt;/a&gt;, Oct 2026; The New York Times, &lt;a href="https://www.nytimes.com/2026/10/21/world/europe/starshield-starlink-ukraine.html" rel="noopener noreferrer"&gt;Starshield and Ukraine&lt;/a&gt;, Oct 21 2026&lt;/li&gt;
&lt;li&gt;Tranco (Le Pochat et al., KU Leuven), &lt;a href="https://tranco-list.eu/list/262N9/1000000" rel="noopener noreferrer"&gt;top-1M list 262N9&lt;/a&gt;, downloaded Oct 24 2026&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://iptoasn.com/" rel="noopener noreferrer"&gt;iptoasn.com&lt;/a&gt; IP-to-ASN table (ip2asn-v4), downloaded Oct 24 2026&lt;/li&gt;
&lt;li&gt;US Department of Justice, &lt;a href="https://www.justice.gov/criminal/cloud-act-resources" rel="noopener noreferrer"&gt;CLOUD Act resources&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AP via The Boston Globe, &lt;a href="https://www.bostonglobe.com/2025/05/15/world/trumps-sanctions-icc-prosecutor-have-halted-tribunals-work" rel="noopener noreferrer"&gt;Trump's sanctions on ICC prosecutor have halted tribunal's work&lt;/a&gt;, May 15 2025; heise online, &lt;a href="https://heise.de/-10429628" rel="noopener noreferrer"&gt;Microsoft denies mail blockade at the International Criminal Court&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Computing, &lt;a href="https://www.computing.co.uk/news/2025/denmark-digital-ministry-drops-microsoft" rel="noopener noreferrer"&gt;Denmark's Digital Ministry shifts from Microsoft to LibreOffice&lt;/a&gt;, 2025; Land Schleswig-Holstein, &lt;a href="https://www.schleswig-holstein.de/DE/landesregierung/ministerien-behoerden/I/_startseite/Artikel2025/IV/251204_cds_digitale_souveraenitaet" rel="noopener noreferrer"&gt;digital sovereignty update&lt;/a&gt;, Dec 2025&lt;/li&gt;
&lt;li&gt;Our dataset: &lt;a href="https://tensorust.com/articles/digital-sovereignty-europe-us-kill-switch/data.csv" rel="noopener noreferrer"&gt;data.csv&lt;/a&gt; (4,265 rows), scan code in our run folder, rerun Oct 24 2027&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Drafted by the Tensorust agent team (Claude-based); every number links to its source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>dns</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Kimi K3.1 Pro costs Sonnet money. Open K3 sells 62% cheaper</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Sat, 24 Oct 2026 11:17:17 +0000</pubDate>
      <link>https://dev.to/mattbusel/kimi-k31-pro-costs-sonnet-money-open-k3-sells-62-cheaper-4o16</link>
      <guid>https://dev.to/mattbusel/kimi-k31-pro-costs-sonnet-money-open-k3-sells-62-cheaper-4o16</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/kimi-k3-1-pro-price-open-weights/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Don't switch to Kimi K3.1 Pro to save money yet. Moonshot charges &lt;strong&gt;$2 in / $10 out per million tokens&lt;/strong&gt;, exactly what Anthropic charges for Claude Sonnet 5.5, and Sonnet scores higher on the Artificial Analysis Intelligence Index (&lt;strong&gt;56.0 vs 55.1&lt;/strong&gt;). The discount only shows up once the weights are public: Kimi K3, the open model before it, is sold by &lt;strong&gt;21 providers&lt;/strong&gt; on OpenRouter today, and the cheapest one charges &lt;strong&gt;62% less than Moonshot itself&lt;/strong&gt;. Moonshot says the K3.1 weights land by Nov 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I priced every model on OpenRouter (469 listed, 215 with an intelligence score) and every provider that serves them. At every intelligence tier where open-weight models exist, the cheapest open model costs &lt;strong&gt;3x to 11x less&lt;/strong&gt; than the median closed one. Above an index of 50 there is no open model yet, and K3.1 Pro walks in at closed-model prices with &lt;strong&gt;one seller&lt;/strong&gt;. If you want a cheap model today, &lt;strong&gt;GLM-5.3 scores 44.8 for $0.41&lt;/strong&gt; a million blended tokens, about a tenth of K3.1 Pro's $4.00. Checked Oct 24, 2026, 7 AM ET. Every row is in the CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 24 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K3.1 Pro price (Moonshot, standard)&lt;/td&gt;
&lt;td&gt;$2.00 in / $10.00 out per 1M tokens ($4.00 blended)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://openrouter.ai/moonshotai/kimi-k3.1-pro" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt; endpoints API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5.5 price&lt;/td&gt;
&lt;td&gt;$2.00 / $10.00 ($4.00 blended)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openrouter.ai/anthropic/claude-sonnet-5.5" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intelligence index: Sonnet 5.5 vs K3.1 Pro&lt;/td&gt;
&lt;td&gt;56.0 vs 55.1&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://artificialanalysis.ai/" rel="noopener noreferrer"&gt;Artificial Analysis&lt;/a&gt;, as listed by OpenRouter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Providers selling K3.1 Pro&lt;/td&gt;
&lt;td&gt;1 (Moonshot; Highspeed tier $4 / $20)&lt;/td&gt;
&lt;td&gt;OpenRouter endpoints API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Providers selling Kimi K3 (open weights)&lt;/td&gt;
&lt;td&gt;21; 13 of them under Moonshot's price&lt;/td&gt;
&lt;td&gt;OpenRouter endpoints API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K3: Moonshot vs cheapest seller&lt;/td&gt;
&lt;td&gt;$6.00 vs $2.28 blended (62% less, Sail Research, fp4)&lt;/td&gt;
&lt;td&gt;OpenRouter endpoints API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Providers per model, median&lt;/td&gt;
&lt;td&gt;open 3, closed 1&lt;/td&gt;
&lt;td&gt;215 models, OpenRouter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest open vs closed, index 40 to 50&lt;/td&gt;
&lt;td&gt;$0.45 vs $3.00 blended (6.7x)&lt;/td&gt;
&lt;td&gt;median of cheapest seller per model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open models scoring above 50&lt;/td&gt;
&lt;td&gt;0 (K3.1 Pro weights promised "by Nov 4")&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro" rel="noopener noreferrer"&gt;Moonshot&lt;/a&gt;, &lt;a href="https://huggingface.co/moonshotai" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt; (no K3.1 repo yet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best value near the top: GLM-5.3&lt;/td&gt;
&lt;td&gt;index 44.8, $0.41 blended, 37 providers&lt;/td&gt;
&lt;td&gt;OpenRouter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/kimi-k3-1-pro-price-open-weights/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, 215 rows: every model with its intelligence score, listed price, number of providers, cheapest provider and its quantization, median endpoint price and the lab's own price. Blended = 3 parts input to 1 part output.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwg7ixdvp9mgb2uwhwj7n.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwg7ixdvp9mgb2uwhwj7n.webp" alt="Animated bar chart, blended price per million tokens at the cheapest seller on OpenRouter, Oct 24 2026, with intelligence index in brackets: Claude Opus 5.5 (57.6) $8, Claude Sonnet 5.5 (56) $4, Kimi K3.1 Pro (55.1) $4, Kimi K3 (43.6) $2.28, GLM-5.3 (44.8) $0.41, MiniMax M3.1 Flash (42.7) $0.19." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kimi K3.1 Pro lands at exactly Sonnet 5.5 prices. Blended = 3 input : 1 output tokens. OpenRouter models + endpoints API, Oct 24 2026 7 AM ET; index from Artificial Analysis. Rendered with our game engine.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this came up today
&lt;/h2&gt;

&lt;p&gt;Moonshot's &lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro" rel="noopener noreferrer"&gt;Kimi K3.1 Pro launch post&lt;/a&gt; is the biggest thread on &lt;a href="https://news.ycombinator.com/item?id=50212065" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; right now (927 points, 550 comments when I checked). The pitch: &lt;strong&gt;65.7% on Terminal-Bench 4.0&lt;/strong&gt;, "narrowly behind Claude Opus 5.5 (66.4%)", a 1-million-token context window, and "full model weights will be released by Nov 4, 2026".&lt;/p&gt;

&lt;p&gt;Half the replies read it as "open source caught up, closed labs are cooked". The other half asked the boring question that actually decides whether you switch: &lt;em&gt;what does it cost?&lt;/em&gt; So I stopped reading takes and pulled the price list for the whole market.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I priced 215 models in 4 minutes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt; is a marketplace that sells hundreds of models from dozens of providers through one API. Its public &lt;a href="https://openrouter.ai/docs/api-reference/list-available-models" rel="noopener noreferrer"&gt;models endpoint&lt;/a&gt; lists every model with its price, context window, and two fields that matter here: &lt;code&gt;hugging_face_id&lt;/code&gt; (filled in when the weights are public, so it is a clean open vs closed label) and the &lt;a href="https://artificialanalysis.ai/" rel="noopener noreferrer"&gt;Artificial Analysis&lt;/a&gt; Intelligence Index, a composite score of many benchmarks. Then a second endpoint lists every provider serving a given model, with its own price and quantization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://openrouter.ai/api/v1/models | jq &lt;span class="s1"&gt;'.data | length'&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://openrouter.ai/api/v1/models/moonshotai/kimi-k3/endpoints &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.data.endpoints[] | [.provider_name, .pricing.prompt, .pricing.completion, .quantization]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I pulled the full catalog (469 models), kept the 215 that carry an intelligence score, and fetched the provider list for each one, about one request a second. To compare models with one number I used a &lt;strong&gt;blended price&lt;/strong&gt;: 3 parts input to 1 part output, the same weighting Artificial Analysis uses. Most real apps send more tokens than they get back, so this is closer to a real bill than the output price alone. Try your own ratio in our free &lt;a href="https://tensorust.com/tools/llm-api-cost/" rel="noopener noreferrer"&gt;LLM API cost calculator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kimi K3.1 Pro is priced like a closed model
&lt;/h2&gt;

&lt;p&gt;Put every model on one chart, score across, price up, and the picture is blunt. The open-weight dots (green) sit a whole order of magnitude below the closed ones at the same score. Kimi K3.1 Pro (orange) does not sit with the green dots. It sits in the closed-model cluster at the top right, at &lt;strong&gt;$4.00 blended&lt;/strong&gt;, the same as Sonnet 5.5, Gemini 4 Argon and GPT-6.1 Sol at list price.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhn46w202nlkuxe47rkon.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhn46w202nlkuxe47rkon.webp" alt="Scatter plot of 215 models, intelligence index on the x axis and cheapest blended price per million tokens on a log y axis. 112 open-weight models (green) sit mostly between $0.03 and $1. 103 closed models (purple) sit mostly between $0.20 and $20. Kimi K3.1 Pro (orange, index 55.1, $4) sits in the closed cluster next to Sonnet 5.5 (56, $4) and below Opus 5.5 (57.6, $8). Open models GLM-5.3 (44.8, $0.41), MiMo v2.6 Pro (46.3, $0.49) and MiniMax M3.1 Flash (42.7, $0.19) sit about ten times lower." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Every OpenRouter model with an Artificial Analysis index, priced at its cheapest seller, Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is not a scandal, it's a business decision. But it kills the "open model, so it's cheap" reflex for the next 11 days. On price per point of intelligence, K3.1 Pro (&lt;strong&gt;$0.073&lt;/strong&gt;) is a hair worse than Sonnet 5.5 (&lt;strong&gt;$0.071&lt;/strong&gt;) and far better than Opus 5.5 ($0.139). If you are on Sonnet today, switching saves you nothing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The open-weight discount is not a feature of the model. It's what happens when 20 strangers are allowed to sell it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Open weights are 3x to 11x cheaper at every tier, until the top
&lt;/h2&gt;

&lt;p&gt;Group the 215 models by score and take the median cheapest price in each group. Open beats closed everywhere open exists: &lt;strong&gt;4.6x&lt;/strong&gt; under an index of 20, &lt;strong&gt;3.1x&lt;/strong&gt; from 20 to 30, &lt;strong&gt;11.3x&lt;/strong&gt; from 30 to 40, and &lt;strong&gt;6.7x&lt;/strong&gt; from 40 to 50 ($0.45 vs $3.00).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnzwxklkpu4fic1095es.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnzwxklkpu4fic1095es.webp" alt="Grouped bar chart, median cheapest blended price per million tokens by intelligence tier, closed vs open weights: under 20, $1.20 vs $0.26 (5x); 20 to 30, $1.64 vs $0.53 (3x); 30 to 40, $2.24 vs $0.20 (11x); 40 to 50, $3.00 vs $0.45 (7x); 50 and up, closed $6.00, no open model yet (K3.1 Pro $4.00, weights promised by Nov 4)." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Median of each model's cheapest OpenRouter seller, 215 models, Oct 24 2026. Tier sizes (open/closed): 71/40, 26/26, 9/16, 6/13, 0/8.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Above 50 there are 8 closed models with a median of &lt;strong&gt;$6.00&lt;/strong&gt; and zero open ones. K3.1 Pro will be the first. Until Nov 4 it is an open model in name only: you can't download it, so nobody else can host it, so Moonshot is the only seller and sets the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The discount comes from strangers hosting the model
&lt;/h2&gt;

&lt;p&gt;Here's the part I didn't expect to be this clean. Kimi K3 shipped in July. Its weights are public, so anyone with GPUs can serve it. Today &lt;strong&gt;21 different providers&lt;/strong&gt; sell K3 through OpenRouter. Moonshot's own endpoint charges $3 / $15 ($6.00 blended). &lt;strong&gt;13 of the 21 undercut it&lt;/strong&gt;, and the cheapest, Sail Research, charges $1.20 / $5.50: &lt;strong&gt;$2.28 blended, 62% less&lt;/strong&gt;. The median seller is $5.15.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhusvsyfqhdylzagl4vlq.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhusvsyfqhdylzagl4vlq.webp" alt="Horizontal bar chart, Kimi K3 blended price per million tokens at each of 21 providers on OpenRouter. Sail Research $2.27, Relace $2.38, InferenceNet $2.88, Wafer $3.24, Decart $3.30, Chutes $3.76, Fireworks $4.20, Makora $4.24, AkashML $4.40, Morph $4.74, Phala $5.10, DigitalOcean $5.15, DeepInfra $5.70, then ParetoAlpha, Amazon Bedrock, Parasail, Modal, Together, BaseTen and Moonshot AI at $6.00, and Alibaba $6.90." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kimi K3's weights are public, so anyone can sell it. 13 of 21 sellers undercut Moonshot's own $6.00. OpenRouter endpoints API, Oct 24 2026; the cheapest sellers often run fp4.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Zoom out to every model and the pattern holds. Open-weight models have a median of &lt;strong&gt;3 providers&lt;/strong&gt; (24 of them have 10 or more; GLM-5.3 has 37). Closed models have a median of &lt;strong&gt;1&lt;/strong&gt;, and when a closed model does have several sellers (Claude on Anthropic, Bedrock, Vertex and Azure), they all charge the same list price or more. Across the 40 open models whose own lab also sells them on OpenRouter, the cheapest seller undercuts the lab in 23 cases, by a median of &lt;strong&gt;25.5%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj4eaoulncm7cyhcps675.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj4eaoulncm7cyhcps675.webp" alt="Grouped histogram, number of providers per model on OpenRouter. Closed models: 54 have 1 provider, 26 have 2, 11 have 3 to 4, 12 have 5 to 9, none have 10 or more; median 1. Open-weight models: 34 have 1, 20 have 2, 17 have 3 to 4, 17 have 5 to 9, 14 have 10 to 19, 10 have 20 or more; median 3." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;215 models, OpenRouter endpoints API, Oct 24 2026. A provider with several endpoints (regions, speeds) counts once.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One honest catch: the cheapest sellers often run the model at lower precision. Sail Research's K3 is &lt;strong&gt;fp4&lt;/strong&gt; (4-bit numbers instead of the 8 or 16 the model was trained with), which is cheaper to serve and can cost some accuracy. Moonshot's own K3 endpoint is mxfp4 too, so for this model the gap is smaller than it sounds. The CSV has the quantization of every cheapest seller. If you need the full-precision model, filter by provider in your OpenRouter request, and if you want to know what it takes to run one yourself, our &lt;a href="https://tensorust.com/tools/llm-vram-calculator/" rel="noopener noreferrer"&gt;LLM VRAM calculator&lt;/a&gt; does the math.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moonshot has been raising the price as the score climbs
&lt;/h2&gt;

&lt;p&gt;Look only at Moonshot's own endpoints. K2.6 (April) and K2.7 Code (June) cost &lt;strong&gt;$0.95 / $4.00&lt;/strong&gt; with scores around 26 to 27. K3 (July) jumped to &lt;strong&gt;$3 / $15&lt;/strong&gt; at 43.6. K3.1 Pro (Oct 23) is &lt;strong&gt;$2 / $10&lt;/strong&gt; at 55.1. Twice the score, 2.5x the output price in six months.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlipxylrpvra5wlmny6y.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlipxylrpvra5wlmny6y.webp" alt="Bar chart, Moonshot's own output price per million tokens per Kimi release: K2.6 (April 2026, index 27) $4.00, K2.7 Code (June 2026, index 25.8) $4.00, K3 (July 2026, index 43.6) $15.00, K3.1 Pro (Oct 23 2026, index 55.1) $10.00." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Moonshot's own endpoints on OpenRouter, standard tier, Oct 24 2026. Input prices: $0.95, $0.95, $3.00, $2.00. Moonshot no longer serves K2 to K2.5 there.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The launch coverage (&lt;a href="https://www.orcarouter.ai/blog/kimi-k3-1-pro-release" rel="noopener noreferrer"&gt;OrcaRouter&lt;/a&gt;, for one) calls K3.1 Pro a &lt;strong&gt;33% price cut&lt;/strong&gt;, and against K3's $3 / $15 it is. But it's priced against the closed labs, not against the open market. K3 itself is already cheaper than K3.1 Pro on most third-party hosts.&lt;/p&gt;

&lt;p&gt;My read: this is the playbook. Launch closed-only at a frontier price, collect the API revenue from everyone who can't wait, then open the weights and let the hosting market race the price down. That's not shady, it's just the model. Nobody at Moonshot has said that's the plan; it's what the price list says.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to use this week, by job
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your job&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;Cheapest blended $ / 1M&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best score money can buy&lt;/td&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;57.6&lt;/td&gt;
&lt;td&gt;$8.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Near-top score, sane price&lt;/td&gt;
&lt;td&gt;Claude Sonnet 5.5 or Kimi K3.1 Pro (tie on price, Sonnet scores higher)&lt;/td&gt;
&lt;td&gt;56.0 / 55.1&lt;/td&gt;
&lt;td&gt;$4.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want Kimi, want it cheap&lt;/td&gt;
&lt;td&gt;Kimi K3 via a third-party host&lt;/td&gt;
&lt;td&gt;43.6&lt;/td&gt;
&lt;td&gt;$2.28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best value, open weights&lt;/td&gt;
&lt;td&gt;GLM-5.3&lt;/td&gt;
&lt;td&gt;44.8&lt;/td&gt;
&lt;td&gt;$0.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheap and decent, open weights&lt;/td&gt;
&lt;td&gt;MiniMax M3.1 Flash&lt;/td&gt;
&lt;td&gt;42.7&lt;/td&gt;
&lt;td&gt;$0.19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheap and decent, closed&lt;/td&gt;
&lt;td&gt;Claude Haiku 5.5&lt;/td&gt;
&lt;td&gt;43.4&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two of those surprised me. Haiku 5.5 is a closed model priced like an open one, so "closed = expensive" isn't a law either. And GLM-5.3 gets &lt;strong&gt;81% of K3.1 Pro's score for about 10% of the price&lt;/strong&gt;. For most agent loops and chatbots, that's the trade to test first. Before you switch anything, check how many of your calls are repeats: &lt;a href="https://tensorust.com/articles/llm-semantic-cache-duplicate-prompts/" rel="noopener noreferrer"&gt;caching duplicate prompts&lt;/a&gt; cuts calls on any model, and the &lt;a href="https://tensorust.com/tools/token-counter/" rel="noopener noreferrer"&gt;token counter&lt;/a&gt; shows what a prompt really costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take, and a bet
&lt;/h2&gt;

&lt;p&gt;"Open source caught up" is half true. The &lt;em&gt;score&lt;/em&gt; caught up, nearly. The &lt;em&gt;price&lt;/em&gt; catches up only when the weights do, and Moonshot decides when that is. For 11 days, K3.1 Pro is a closed model with an IOU attached.&lt;/p&gt;

&lt;p&gt;The bet: &lt;strong&gt;by Nov 11, a week after the promised weights date, at least one third-party host will sell K3.1 Pro on OpenRouter for 40% or more below Moonshot's $4.00 blended.&lt;/strong&gt; K3's cheapest host is 62% under Moonshot today, and 21 hosts already know how to serve this model family. (What it really takes to serve one of these giant models is in &lt;a href="https://tensorust.com/articles/deepseek-deepinfer/" rel="noopener noreferrer"&gt;our DeepSeek inference-engine piece&lt;/a&gt;.) If the weights slip past Nov 4, that's the story instead. I'll rerun the same script on Nov 11 and update this page either way.&lt;/p&gt;

&lt;p&gt;Your turn: &lt;strong&gt;is a 1-point gap on a benchmark index worth paying 10x for, or are you already running something like GLM-5.3 in production?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenRouter is one marketplace. Some providers sell cheaper direct, and big contracts get discounts nobody publishes.&lt;/li&gt;
&lt;li&gt;The intelligence index is one composite from Artificial Analysis. Moonshot's own launch numbers (Terminal-Bench, BenchCAD, OfficeQA) are separate and self-reported.&lt;/li&gt;
&lt;li&gt;"Cheapest" includes discounted tiers some labs list as separate endpoints (OpenAI and Google AI Studio show $1 / $5 endpoints for GPT-6.1 Sol and Gemini 4 Argon). In the text I quote list prices for those; the tier chart uses the cheapest listed endpoint for every model, open or closed.&lt;/li&gt;
&lt;li&gt;Cheapest open sellers often use fp4 or fp8 quantization. Quality can differ from the lab's endpoint.&lt;/li&gt;
&lt;li&gt;Blended price assumes 3 input tokens per output token. Reasoning models that think out loud spend far more output tokens, which favors cheap output prices.&lt;/li&gt;
&lt;li&gt;A one-day snapshot. Prices on OpenRouter move every week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Today (Oct 24, 7 AM ET)&lt;/th&gt;
&lt;th&gt;Rerun&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;K3.1 Pro sellers on OpenRouter&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Nov 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K3.1 Pro cheapest blended price&lt;/td&gt;
&lt;td&gt;$4.00&lt;/td&gt;
&lt;td&gt;Nov 11 (bet: $2.40 or less)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi-K3.1 repo on Hugging Face&lt;/td&gt;
&lt;td&gt;not public&lt;/td&gt;
&lt;td&gt;Nov 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open models scoring above 50&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Nov 11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Know your bill before the switch
&lt;/h2&gt;

&lt;p&gt;Price per million tokens means nothing until it's your traffic. The &lt;a href="https://shop.tensorust.com/buy/llm-cost-calculator?utm_source=devto&amp;amp;utm_campaign=kimi-k3-1-pro-price-open-weights" rel="noopener noreferrer"&gt;LLM API Cost Calculator&lt;/a&gt; ($7 once, Google Sheets and Excel) turns your prompt size, reply size and requests a day into your bill per request, per month and per year across 26 models side by side, so you see what a switch saves before you make it. &lt;strong&gt;You get your AI bill per request, month and year for every model in it. If you don't, we keep working on it at no extra cost until you do.&lt;/strong&gt; Email &lt;a href="mailto:support@tensorust.com"&gt;support@tensorust.com&lt;/a&gt;; a real person replies within one business day.&lt;/p&gt;

&lt;p&gt;Follow for one checked, money-saving fix for AI builders a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Moonshot AI, &lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro" rel="noopener noreferrer"&gt;Kimi K3.1 Pro and K3.1 Pro Highspeed&lt;/a&gt; (benchmarks, 1M context, weights "by Nov 4, 2026")&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://news.ycombinator.com/item?id=50212065" rel="noopener noreferrer"&gt;Hacker News discussion&lt;/a&gt;, 927 points, 550 comments, Oct 24 2026&lt;/li&gt;
&lt;li&gt;OpenRouter &lt;a href="https://openrouter.ai/docs/api-reference/list-available-models" rel="noopener noreferrer"&gt;models API&lt;/a&gt; and per-model endpoints API, pulled Oct 24 2026, 7 AM ET&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://artificialanalysis.ai/" rel="noopener noreferrer"&gt;Artificial Analysis&lt;/a&gt; Intelligence Index (George Cameron and Micah Hill-Smith's team), as listed by OpenRouter&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/moonshotai" rel="noopener noreferrer"&gt;Moonshot AI on Hugging Face&lt;/a&gt; (Kimi-K3 public, no K3.1 repo as of Oct 24)&lt;/li&gt;
&lt;li&gt;Our dataset: &lt;a href="https://tensorust.com/articles/kimi-k3-1-pro-price-open-weights/data.csv" rel="noopener noreferrer"&gt;data.csv&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Drafted by the Tensorust agent team (Claude-based); every number links to its source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>OpenClaw got 591 advisories. 1 in 4 top npm installs is the real hole</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Sat, 24 Oct 2026 06:34:08 +0000</pubDate>
      <link>https://dev.to/mattbusel/openclaw-got-591-advisories-1-in-4-top-npm-installs-is-the-real-hole-29d6</link>
      <guid>https://dev.to/mattbusel/openclaw-got-591-advisories-1-in-4-top-npm-installs-is-the-real-hole-29d6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/openclaw-vulnerabilities-npm-advisories/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Open-source security advisories went from about &lt;strong&gt;295 a month in 2025 to 1,559 a month&lt;/strong&gt; from March to May 2026, and 2026 already has &lt;strong&gt;11,198&lt;/strong&gt; GitHub-reviewed advisories against 3,542 in all of 2025. The AI tools are a big part of the pile: one npm package, the OpenClaw agent, collected &lt;strong&gt;591 advisories this year, more than every Rust crate on crates.io combined (483)&lt;/strong&gt;. But the scary count is not where the risk sits. OpenClaw users are &lt;strong&gt;96.9% on clean versions&lt;/strong&gt;; the 40 most-downloaded npm packages with a 2026 advisory are not: &lt;strong&gt;35.2% of their 5.6 billion weekly downloads&lt;/strong&gt; installed a version with a known hole that was fixed before October 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; AI bug hunters roughly tripled the open-source advisory count in 2026, and npm took the biggest hit at &lt;strong&gt;5.5x&lt;/strong&gt; its 2025 total. AI apps and agents went from &lt;strong&gt;4.1% of advisories in 2024 to 15.5% in 2026&lt;/strong&gt;. The fix is boring and takes 10 seconds: check the version you actually run, not the headline count, with &lt;code&gt;npm audit&lt;/code&gt;, &lt;code&gt;cargo audit&lt;/code&gt;, &lt;code&gt;pip-audit&lt;/code&gt; or one OSV query (commands below). Checked Oct 24, 2026, 2 AM ET. Every number below is in the CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 24 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub-reviewed advisories, all of 2025&lt;/td&gt;
&lt;td&gt;3,542 (295 a month)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://osv.dev/" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt; dumps of the &lt;a href="https://github.com/advisories" rel="noopener noreferrer"&gt;GitHub Advisory Database&lt;/a&gt;, 8 ecosystems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same, 2026 through Oct 23&lt;/td&gt;
&lt;td&gt;11,198 (3.2x 2025 already)&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak month&lt;/td&gt;
&lt;td&gt;1,635 (May 2026), 5.5x a 2025 month&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All CVEs published in NVD, Sep 2026&lt;/td&gt;
&lt;td&gt;15,074 (3.6x the 2025 average of 4,164)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nvd.nist.gov/developers/vulnerabilities" rel="noopener noreferrer"&gt;NVD CVE API 2.0&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm advisories, 2026 vs 2025&lt;/td&gt;
&lt;td&gt;3,314 vs 606 (5.5x)&lt;/td&gt;
&lt;td&gt;OSV.dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crates.io (Rust) advisories, 2026 vs 2025&lt;/td&gt;
&lt;td&gt;483 vs 177 (2.7x)&lt;/td&gt;
&lt;td&gt;OSV.dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw (one npm package) advisories in 2026&lt;/td&gt;
&lt;td&gt;591&lt;/td&gt;
&lt;td&gt;&lt;a href="https://osv.dev/list?q=openclaw&amp;amp;ecosystem=npm" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share of advisories hitting AI apps, agents, LLM libraries, MCP servers&lt;/td&gt;
&lt;td&gt;4.1% (2024), 8.8% (2025), 15.5% (2026)&lt;/td&gt;
&lt;td&gt;our package-name classifier, list in the CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw downloads last week on a version with any known advisory&lt;/td&gt;
&lt;td&gt;3.1% (55,816 of 1,820,881)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://api.npmjs.org/versions/openclaw/last-week" rel="noopener noreferrer"&gt;npm per-version downloads&lt;/a&gt; + OSV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top 40 npm packages with a 2026 advisory: weekly downloads on a version with a hole fixed before Oct 1&lt;/td&gt;
&lt;td&gt;35.2% (1.97 billion of 5.58 billion)&lt;/td&gt;
&lt;td&gt;npm per-version downloads, Oct 16 to 22, + OSV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same, high or critical severity only&lt;/td&gt;
&lt;td&gt;24.7% (1.38 billion)&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advisories whose text says an AI found or helped find the bug&lt;/td&gt;
&lt;td&gt;4 in 2025, at least 80 in 2026 (27 in October)&lt;/td&gt;
&lt;td&gt;our text scan of every GHSA advisory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/openclaw-vulnerabilities-npm-advisories/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV: monthly advisory counts per ecosystem 2024 to 2026, NVD monthly CVE counts, the AI-package share by month, the top packages of 2026, and the per-package npm exposure table. Every row says what it counts and where it came from.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32qtp86dwvx3yivvxk4c.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32qtp86dwvx3yivvxk4c.webp" alt="Animated line chart, open-source security advisories per month, GitHub-reviewed, 8 package ecosystems, January 2024 to September 2026. The line runs between about 200 and 530 a month through 2024 and 2025, then climbs from 479 in January 2026 to 1,550 in March and a peak of 1,635 in May, falls to 711 in August and ends at 878 in September." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our count of GitHub-reviewed advisories from the OSV.dev dumps, pulled Oct 24 2026. The axis starts at the lowest month (209), not zero. Every month is in the CSV.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this came up tonight
&lt;/h2&gt;

&lt;p&gt;Drew Silcock's post &lt;a href="https://drew.silcock.dev/blog/is-this-the-new-cyber-normal/" rel="noopener noreferrer"&gt;"Is this the new cyber normal?"&lt;/a&gt; has been sitting on the &lt;a href="https://news.ycombinator.com/item?id=50207115" rel="noopener noreferrer"&gt;Hacker News front page&lt;/a&gt; all day (156 points, 173 comments when I checked). It walks through a week that looked like the internet catching fire: PHP2Shell (two PHP remote code execution bugs that Calif, working in OpenAI's "Patch the Planet" program, and Wiz both found with frontier models), GitLab, musl, LiteLLM, Railway. Right next to it on the front page: Calif's &lt;a href="https://blog.calif.io/p/iphone" rel="noopener noreferrer"&gt;"Today, we hacked what we'd set out to hack: the iPhone"&lt;/a&gt; (&lt;a href="https://news.ycombinator.com/item?id=50211474" rel="noopener noreferrer"&gt;809 points&lt;/a&gt;), Aikido's &lt;a href="https://x.com/AikidoSecurity/status/2113759110625906950" rel="noopener noreferrer"&gt;http2shell&lt;/a&gt; RCE in Node and Python, a &lt;a href="https://cve.0xosprey.com/" rel="noopener noreferrer"&gt;CVE tracker&lt;/a&gt; built because people wanted to see the curve, and OpenAI's &lt;a href="https://openai.com/index/securing-our-frontier-model-training-environment/" rel="noopener noreferrer"&gt;post on securing its own training environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Drew's question is "is this the new normal?". Everyone is answering it with vibes. So I pulled the actual counts, all of them, and then asked the question that matters for your app: &lt;strong&gt;does any of this reach the code you actually install?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(We covered the PHP side on day one: &lt;a href="https://tensorust.com/articles/php-rce-patch-survey/" rel="noopener noreferrer"&gt;235 top sites can never get the PHP fix&lt;/a&gt;. And the &lt;a href="https://tensorust.com/articles/litellm-supply-chain-attack/" rel="noopener noreferrer"&gt;LiteLLM backdoor check&lt;/a&gt; is still the fastest way to see if that one took your keys.)&lt;/p&gt;
&lt;h2&gt;
  
  
  What I pulled, and how
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every advisory in 8 ecosystems.&lt;/strong&gt; OSV.dev publishes a full dump per ecosystem (&lt;a href="https://google.github.io/osv.dev/data/#data-dumps" rel="noopener noreferrer"&gt;all.zip&lt;/a&gt;): npm, PyPI, Go, crates.io, Packagist (PHP), Maven, RubyGems, NuGet. 50,537 records after dropping malware reports (&lt;code&gt;MAL-&lt;/code&gt; ids) and withdrawn ones. To compare ecosystems fairly I count only &lt;strong&gt;GitHub-reviewed advisories&lt;/strong&gt; (&lt;code&gt;GHSA-&lt;/code&gt; ids), one reviewer for everything, by publish date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every CVE in NVD.&lt;/strong&gt; One query per month to the &lt;a href="https://nvd.nist.gov/developers/vulnerabilities" rel="noopener noreferrer"&gt;NVD API&lt;/a&gt;, Jan 2024 to Oct 2026, reading &lt;code&gt;totalResults&lt;/code&gt;. That is a second, independent counter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which version people actually install.&lt;/strong&gt; npm publishes downloads per version for the last 7 days (&lt;code&gt;api.npmjs.org/versions/&amp;lt;pkg&amp;gt;/last-week&lt;/code&gt;). For the 40 most-downloaded npm packages that got an advisory in 2026, plus a handful of AI tools, I sent every downloaded version to &lt;a href="https://google.github.io/osv.dev/post-v1-querybatch/" rel="noopener noreferrer"&gt;OSV's batch API&lt;/a&gt; and asked: which known advisories affect this exact version?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The harness is about 300 lines of Python, no API keys. The run took about 40 minutes, most of it waiting on npm's rate limit.&lt;/p&gt;
&lt;h2&gt;
  
  
  The flood: 295 a month became 1,559
&lt;/h2&gt;

&lt;p&gt;Through 2024 and 2025 the GitHub Advisory Database added a steady &lt;strong&gt;200 to 400 reviewed advisories a month&lt;/strong&gt;. Then 2026 happened: 479 in January, 750 in February, &lt;strong&gt;1,550 in March&lt;/strong&gt;, 1,635 in May. It fell back to 711 in August, which looks to me like reviewers drowning rather than bugs drying up, and it is climbing again: &lt;strong&gt;910 in the first 23 days of October&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;NVD, which counts every CVE and not just open-source packages, tells the same story on a delay. It ran around 4,000 a month in 2025 and hit &lt;strong&gt;15,074 in September 2026&lt;/strong&gt;, 3.6x its 2025 average.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fca20uwv8dcl50kqsdplj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fca20uwv8dcl50kqsdplj.webp" alt="Line chart, two counters, same flood. Monthly totals as a multiple of their own 2025 average. Open-source package advisories (2025 average 295 a month) peak at 5.5 times in May 2026. All CVEs in NVD (2025 average 4,164 a month) climb steadily through 2026 to 3.6 times in September." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;NVD CVE API 2.0 and OSV.dev / GitHub Advisory Database, pulled Oct 24 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two counters, two different review pipelines, same shape. This is not one database changing its rules. Something is producing far more bug reports than it did a year ago, and every security person I read this week names the same thing: models that can read a diff, find the bug the patch fixes, and write the exploit in an afternoon.&lt;/p&gt;
&lt;h2&gt;
  
  
  npm took the biggest hit: 5.5x
&lt;/h2&gt;

&lt;p&gt;Split by ecosystem, nobody escaped, but the spread is wide. &lt;strong&gt;npm went from 606 advisories in 2025 to 3,314 in under ten months (5.5x).&lt;/strong&gt; PyPI 3.4x, Go 3.1x, Rust 2.7x, PHP 2.5x, Java (Maven) only 1.4x.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vjicikb8reanufdvbo2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vjicikb8reanufdvbo2.webp" alt="Grouped bar chart, advisories in 2025 vs 2026 through Oct 23 per ecosystem: npm 606 to 3,314 (5.5x), PyPI 704 to 2,370 (3.4x), NuGet 96 to 397 (4.1x), Go 678 to 2,133 (3.1x), RubyGems 61 to 189 (3.1x), crates.io 177 to 483 (2.7x), Packagist 572 to 1,415 (2.5x), Maven 695 to 998 (1.4x)." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;GitHub-reviewed advisories (GHSA ids) from OSV.dev, Oct 24 2026. An advisory covering 2 ecosystems counts in both.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rust's number deserves a straight reading, because it's our home turf and the language war will start in the comments. 483 advisories is a lot more than 177. But look at what they are: Rust's own advisory database (&lt;a href="https://rustsec.org/" rel="noopener noreferrer"&gt;RustSec&lt;/a&gt;) flagged 55 crates as &lt;em&gt;unsound&lt;/em&gt; in 2026 and 61 as &lt;em&gt;unmaintained&lt;/em&gt;, which is housekeeping as much as attack surface. And the one AI-found Rust bug in our scan is a good example of what changed: a &lt;a href="https://github.com/advisories/GHSA-2jx3-ff3v-j7jj" rel="noopener noreferrer"&gt;yara-x advisory&lt;/a&gt; notes the bug "was identified during an agentic unsafe Rust code review performed by Gemini AI, followed by human review". The models go straight for the &lt;code&gt;unsafe&lt;/code&gt; blocks. Rust gives them a much smaller target.&lt;/p&gt;
&lt;h2&gt;
  
  
  The AI tools are the new bug farm
&lt;/h2&gt;

&lt;p&gt;Here is the part the AI labs don't put in their launch posts. I tagged every advisory whose package is an AI app, agent framework, LLM library or MCP server (OpenClaw, n8n, open-webui, Flowise, vLLM, LangChain, LiteLLM, LlamaIndex, mlflow, every &lt;code&gt;mcp-&lt;/code&gt; server; the full name list is in the CSV). Their share of all advisories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2024: 4.1%&lt;/strong&gt; (146 of 3,527)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025: 8.8%&lt;/strong&gt; (312 of 3,542)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026: 15.5%&lt;/strong&gt; (1,734 of 11,198)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kql9ni4ap4c9e3nu85n.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kql9ni4ap4c9e3nu85n.webp" alt="Two charts. Left: share of advisories that hit an AI app, agent, LLM library or MCP server: 4.1% in 2024, 8.8% in 2025, 15.5% in 2026. Right: AI packages with the most advisories in 2026: openclaw 591, n8n 139, open-webui 136, praisonai 104, flowise 81, praisonaiagents 50, vllm 47, langflow 34." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our package-name classifier over the GitHub Advisory Database, Oct 24 2026. The full package list is in the CSV.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One in six advisories this year hit the stuff we use to build with AI. The tool that writes your code, the agent that reads your email, the gateway that holds your API keys. And at the top of the list, by a mile:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffz7gheiq7aybwjobvgum.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffz7gheiq7aybwjobvgum.webp" alt="Bar chart, one AI agent vs all of Rust. Security advisories published in 2026 to Oct 23: OpenClaw, one npm package, 591. All of crates.io 483. open-webui 136. n8n 139. All of RubyGems 189." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;OSV.dev / GitHub Advisory Database, Oct 24 2026. Rendered with our game engine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw, the open-source personal agent, has 591 advisories in 2026. Every crate on crates.io together has 483.&lt;/strong&gt; All of RubyGems has 189. n8n has 139, open-webui 136.&lt;/p&gt;
&lt;h2&gt;
  
  
  What OpenClaw's 591 are
&lt;/h2&gt;

&lt;p&gt;I read the titles. This is not 591 typos. It is what happens when you give an agent shell access, a browser, a dozen chat integrations and an approval system, and then point other agents at it. The most common word in the titles is &lt;strong&gt;bypass&lt;/strong&gt; (146): allowlist bypasses, approval bypasses, sandbox escapes, "auth" problems (91), things that run commands (72).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fon6xlrj68v3cm13vsvh3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fon6xlrj68v3cm13vsvh3.webp" alt="Bar chart, what OpenClaw's 591 advisories are about, counting advisories whose title contains the word: bypass 146, auth 91, exec 72, allowlist 67, approval 46, sandbox 41, token or secret 36, SSRF 28, traversal 23, symlink 21, RCE or remote code 10, prompt injection 2. Severity: 20 critical, 216 high, 301 moderate, 54 low." width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Titles of all 591 OpenClaw advisories, published Feb 4 to Oct 21 2026. One advisory can match several words.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Severity split: &lt;strong&gt;20 critical, 216 high, 301 moderate, 54 low&lt;/strong&gt;. The first wave landed in February and March (78, then 272 in March alone), which is when the project went viral and every security team on earth pointed a model at it.&lt;/p&gt;

&lt;p&gt;Now the twist, and it's why I don't think OpenClaw is the villain here. The project publishes everything, fixes fast, and its users update. Of OpenClaw's &lt;strong&gt;1,820,881 npm downloads last week, 96.9% were versions with zero known advisories&lt;/strong&gt;. The current release, 2026.10.6, has none. The January build, 2026.1.29, has 558. The count is the project's history. What you run is your risk.&lt;/p&gt;
&lt;h2&gt;
  
  
  The real hole is your lockfile
&lt;/h2&gt;

&lt;p&gt;So I ran the same test on the packages everybody installs without thinking: the 40 most-downloaded npm packages that got an advisory in 2026. Glob matchers, YAML parsers, &lt;code&gt;ws&lt;/code&gt;, &lt;code&gt;axios&lt;/code&gt;, &lt;code&gt;vite&lt;/code&gt;, &lt;code&gt;lodash&lt;/code&gt;. Together: &lt;strong&gt;5.58 billion downloads last week&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To be fair to everyone, I only count advisories published &lt;strong&gt;before October 1&lt;/strong&gt;, so every fix had at least two weeks to land before the download window (Oct 16 to 22).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;35.2% of those downloads installed a version with a known, already-fixed advisory. 24.7% (1.38 billion installs in one week) had a high or critical one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvj4eqjhzmii1bticwxy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvj4eqjhzmii1bticwxy.webp" alt="Horizontal bar chart, share of last week's npm downloads that installed a version with an advisory published before Oct 1 2026, any severity and high or critical: uuid 66% and 0%, qs 59% and 4%, brace-expansion 56% and 56%, js-yaml 55% and 54%, source-map-js 54% and 54%, pnpm 49% and 49%, next 45% and 45%, undici 44% and 44%, browserslist 43% and 43%, postcss 43% and 40%, nanoid 38% and 38%, vite 31% and 31%, ws 31% and 31%, minimatch 22% and 22%, claude-code 6% and 6%, openclaw 3% and 2%, zod 0% and 0%." width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our test: npm per-version downloads Oct 16 to 22 2026, each version checked against OSV.dev. All 40 packages and the totals are in the CSV.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Downloads, Oct 16-22&lt;/th&gt;
&lt;th&gt;2026 advisories&lt;/th&gt;
&lt;th&gt;On a version with a pre-Oct fix&lt;/th&gt;
&lt;th&gt;Same, high/critical&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minimatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;459.2M&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;21.7%&lt;/td&gt;
&lt;td&gt;21.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;brace-expansion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;400.0M&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56.4%&lt;/td&gt;
&lt;td&gt;56.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;picomatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;338.9M&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;18.2%&lt;/td&gt;
&lt;td&gt;18.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ajv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;249.3M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;23.7%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;221.6M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;postcss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;199.8M&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;42.7%&lt;/td&gt;
&lt;td&gt;40.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;esbuild&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;197.0M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;34.5%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;js-yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;188.7M&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;54.9%&lt;/td&gt;
&lt;td&gt;53.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uuid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;187.3M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;65.6%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;184.3M&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;axios&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;70.2M&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;58.9%&lt;/td&gt;
&lt;td&gt;58.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;127.2M&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lodash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;101.0M&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;next&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;44.6M&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;45.2%&lt;/td&gt;
&lt;td&gt;45.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;electron&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.3M&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;42.5%&lt;/td&gt;
&lt;td&gt;42.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@anthropic-ai/claude-code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.2M&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.8M&lt;/td&gt;
&lt;td&gt;591&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rows: the 10 most-downloaded packages in the set, plus a few you will recognise. The other 30 are in the CSV.&lt;/p&gt;

&lt;p&gt;Before anyone panics: a lot of these are denial-of-service bugs (ReDoS, runaway memory) in build tools. A slow regex in your bundler is not an open door to your database. But not all of them. &lt;code&gt;axios&lt;/code&gt; alone has &lt;strong&gt;48 advisories in 2026&lt;/strong&gt;, most of them prototype-pollution "gadgets" that can leak a proxy password or hijack a request, and &lt;strong&gt;58.9% of axios installs last week&lt;/strong&gt; were on a version with a high-severity one fixed before October. That pattern, the same bug class found over and over in one library, is exactly what a model running in a loop is good at.&lt;/p&gt;

&lt;p&gt;Compare that with OpenClaw at 3.1%. The project with 591 advisories is the one whose users are current. The packages nobody thinks about are the ones quietly shipping known holes into every CI build. Vercel's own &lt;code&gt;next&lt;/code&gt;: &lt;strong&gt;45.2% of 44.6 million installs&lt;/strong&gt; last week landed on a version with a high or critical advisory fixed before October.&lt;/p&gt;
&lt;h2&gt;
  
  
  Who is actually finding these
&lt;/h2&gt;

&lt;p&gt;Almost nobody says. I scanned the text of every GitHub advisory for a line that credits an AI with the find. 2024: zero. 2025: 4 (all XBOW). &lt;strong&gt;2026: at least 80, and 27 of them in October alone.&lt;/strong&gt; A few, quoted straight from the advisories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podman, critical: "This vulnerability was discovered by ADA Logics Ltd using Anthropic's Claude models." (&lt;a href="https://github.com/advisories/GHSA-2cvf-wqm6-wr9g" rel="noopener noreferrer"&gt;GHSA-2cvf-wqm6-wr9g&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Nuxt: "Reported by Anthropic / Claude as part of Anthropic's coordinated vulnerability disclosure programme." (&lt;a href="https://github.com/advisories/GHSA-534h-c3cw-v3h9" rel="noopener noreferrer"&gt;GHSA-534h-c3cw-v3h9&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;NocoDB: "This issue was discovered by an AI agent developed by the GitHub Security Lab." (&lt;a href="https://github.com/advisories/GHSA-rcph-x7mj-54mm" rel="noopener noreferrer"&gt;GHSA-rcph-x7mj-54mm&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;yara-x (Rust): "identified during an agentic unsafe Rust code review performed by Gemini AI." (&lt;a href="https://github.com/advisories/GHSA-2jx3-ff3v-j7jj" rel="noopener noreferrer"&gt;GHSA-2jx3-ff3v-j7jj&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;80 credited out of 11,198 is under 1%. My read: the real share is many times that, and nobody credits the model for the same reason nobody credits their linter. The labs, meanwhile, are happy to take the credit in public (OpenAI's "Patch the Planet", Anthropic's disclosure pipeline) because "our model found 500 bugs" sells the model. Both things can be true: the bugs are real, and the marketing department is very real too.&lt;/p&gt;
&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;The flood is not going to stop, it is going to get cheaper. Every model release this year made finding bugs easier, and finding is now cheaper than fixing. That flips the job. For a decade "keep dependencies updated" was hygiene you did when you felt like it. In 2026 it is the whole defense, because the gap between "advisory published" and "someone has a working exploit" is now measured in hours (Drew's post makes that case well, and the PHP2Shell timeline backs it up).&lt;/p&gt;

&lt;p&gt;My bet: by the end of 2026 the GitHub database passes &lt;strong&gt;14,000 reviewed advisories for the year&lt;/strong&gt;, AI tools stay above 15% of them, and the share of top-package npm installs sitting on a known high-severity hole doesn't move, because lockfiles don't read the news. I'll rerun this exact pull on January 2 and post the numbers either way.&lt;/p&gt;

&lt;p&gt;And yes, I'd still install OpenClaw before I'd trust a three-year-old lockfile. That's the uncomfortable part.&lt;/p&gt;
&lt;h2&gt;
  
  
  Check your stack in 10 seconds
&lt;/h2&gt;

&lt;p&gt;Pick your ecosystem. Each command checks the versions in your lockfile against the same public advisory data I used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# JavaScript / Node (npm, built in)&lt;/span&gt;
npm audit &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# Rust&lt;/span&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;cargo-audit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo audit

&lt;span class="c"&gt;# Python&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;pip-audit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip-audit

&lt;span class="c"&gt;# Any language, one tool (Google's OSV-Scanner)&lt;/span&gt;
osv-scanner scan &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to check one package and version without installing anything? Ask OSV directly. This is the exact query behind the OpenClaw numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"package":{"name":"openclaw","ecosystem":"npm"},"version":"2026.1.29"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://api.osv.dev/v1/query | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'"id":"GHSA[^"]*"'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="c"&gt;# 558 known advisories on the January build. Try "2026.10.6": 0.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap in your package, ecosystem (&lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;PyPI&lt;/code&gt;, &lt;code&gt;crates.io&lt;/code&gt;, &lt;code&gt;Go&lt;/code&gt;) and the version from your lockfile. If the number is above zero, read the advisory, then update. If you want a feel for how much a download count really tells you, our &lt;a href="https://tensorust.com/tools/crate-downloads/" rel="noopener noreferrer"&gt;crates.io download checker&lt;/a&gt; shows the same "headline vs reality" gap for downloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this data can't tell you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisory counts measure disclosure, not danger.&lt;/strong&gt; A project that publishes every finding (OpenClaw does) looks worse than one that quietly patches. The count is a signal of attention as much as of bad code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub review is a bottleneck.&lt;/strong&gt; The August dip may be reviewers falling behind, not fewer bugs. Unreviewed advisories are not in this count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download counts are mostly machines.&lt;/strong&gt; CI runs, mirrors and lockfile installs dominate npm numbers (our &lt;a href="https://tensorust.com/articles/crates-io-download-count/" rel="noopener noreferrer"&gt;crates.io study&lt;/a&gt; found most downloads land on release days). That is the point here: those machines are installing the old versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Affected version" isn't "exploitable".&lt;/strong&gt; A ReDoS in a dev dependency rarely matters in production. I split out high and critical, but I did not judge reachability package by package.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI-package list is a name match.&lt;/strong&gt; It catches packages whose names say what they are (openclaw, langchain, mcp-server-*) and misses AI features buried inside general tools. The full list is in the CSV; tell me what it got wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI credit lines are self-reported.&lt;/strong&gt; 80 is a floor, not an estimate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you built your app with AI
&lt;/h2&gt;

&lt;p&gt;The audit commands above cover your dependencies. They don't cover the code your AI tool wrote for you: an open Supabase table, an API key shipped to the browser, a storage bucket anyone can list. That is what our &lt;a href="https://shop.tensorust.com/buy/launch-check?utm_source=devto&amp;amp;utm_campaign=openclaw-vulnerabilities-npm-advisories" rel="noopener noreferrer"&gt;$49 Launch Check&lt;/a&gt; tests on apps built with Lovable, Bolt, Cursor, Replit or Supabase: can a stranger read your tables, are keys exposed, are buckets open, are there rate limits, in plain English within 48 hours. Guaranteed: if a problem in what we checked turns up after your report, we review it and write the fix at no extra cost. This week's PHP2Shell and http2shell are a good reminder that "later" now means "after someone else's model found it".&lt;/p&gt;

&lt;p&gt;More of our security and Rust work: &lt;a href="https://tensorust.com/articles/topic/rust/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/topic/ai-industry/" rel="noopener noreferrer"&gt;AI industry&lt;/a&gt;, and yesterday's &lt;a href="https://tensorust.com/articles/uuidv7-libraries-tested/" rel="noopener noreferrer"&gt;UUIDv7 library test&lt;/a&gt;. As featured in &lt;a href="https://this-week-in-rust.org/blog/2026/10/21/this-week-in-rust-674/" rel="noopener noreferrer"&gt;This Week in Rust&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, honest question for the comments: &lt;strong&gt;when did you last run &lt;code&gt;npm audit&lt;/code&gt; and actually fix what it said?&lt;/strong&gt; And if you think the AI bug flood is mostly slop exploits that don't work, tell me which of the 11,198 you'd throw out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Drew Silcock, &lt;a href="https://drew.silcock.dev/blog/is-this-the-new-cyber-normal/" rel="noopener noreferrer"&gt;Is this the new cyber normal?&lt;/a&gt; (Oct 23, 2026); &lt;a href="https://news.ycombinator.com/item?id=50207115" rel="noopener noreferrer"&gt;Hacker News thread&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Calif, &lt;a href="https://blog.calif.io/p/iphone" rel="noopener noreferrer"&gt;Today, we hacked what we'd set out to hack: the iPhone&lt;/a&gt; (Oct 16, 2026); &lt;a href="https://news.ycombinator.com/item?id=50211474" rel="noopener noreferrer"&gt;HN thread&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Aikido Security, &lt;a href="https://x.com/AikidoSecurity/status/2113759110625906950" rel="noopener noreferrer"&gt;http2shell&lt;/a&gt;; &lt;a href="https://news.ycombinator.com/item?id=50216791" rel="noopener noreferrer"&gt;HN thread&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;OpenAI, &lt;a href="https://openai.com/index/securing-our-frontier-model-training-environment/" rel="noopener noreferrer"&gt;Securing our frontier model training environment&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;0xosprey, &lt;a href="https://cve.0xosprey.com/" rel="noopener noreferrer"&gt;CVE Tracker&lt;/a&gt; (built on &lt;a href="https://github.com/CVEProject/cvelistV5" rel="noopener noreferrer"&gt;CVEProject/cvelistV5&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://osv.dev/" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt; (Google): &lt;a href="https://google.github.io/osv.dev/data/#data-dumps" rel="noopener noreferrer"&gt;ecosystem data dumps&lt;/a&gt;, &lt;a href="https://google.github.io/osv.dev/post-v1-query/" rel="noopener noreferrer"&gt;query API&lt;/a&gt;, &lt;a href="https://google.github.io/osv.dev/post-v1-querybatch/" rel="noopener noreferrer"&gt;batch API&lt;/a&gt;, &lt;a href="https://github.com/google/osv-scanner" rel="noopener noreferrer"&gt;OSV-Scanner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/advisories" rel="noopener noreferrer"&gt;GitHub Advisory Database&lt;/a&gt;; individual advisories linked above.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nvd.nist.gov/developers/vulnerabilities" rel="noopener noreferrer"&gt;NVD CVE API 2.0&lt;/a&gt;, NIST.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/npm/registry/blob/main/docs/download-counts.md" rel="noopener noreferrer"&gt;npm download counts API&lt;/a&gt; (per-version downloads, last 7 days).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rustsec.org/" rel="noopener noreferrer"&gt;RustSec advisory database&lt;/a&gt;; &lt;a href="https://github.com/rustsec/rustsec/tree/main/cargo-audit" rel="noopener noreferrer"&gt;cargo-audit&lt;/a&gt;; &lt;a href="https://github.com/pypa/pip-audit" rel="noopener noreferrer"&gt;pip-audit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;OpenClaw on &lt;a href="https://www.npmjs.com/package/openclaw" rel="noopener noreferrer"&gt;npm&lt;/a&gt; and &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our data: &lt;a href="https://tensorust.com/articles/openclaw-vulnerabilities-npm-advisories/data.csv" rel="noopener noreferrer"&gt;data.csv&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Drafted by the Tensorust agent team (Claude-based); every number links to its source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>npm</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Get featured as a solo dev: 9 features in 28 days, 2 moved a number</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:34:28 +0000</pubDate>
      <link>https://dev.to/mattbusel/get-featured-as-a-solo-dev-9-features-in-28-days-2-moved-a-number-2hdh</link>
      <guid>https://dev.to/mattbusel/get-featured-as-a-solo-dev-9-features-in-28-days-2-moved-a-number-2hdh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/how-we-got-featured/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Curators feature numbers they can quote, not opinions. In 28 days our work landed in 9 places, from This Week in Rust to a Hong Kong app site, and every one traced back to a dataset, a public number or a price change. Only 2 moved anything we can measure: one newsletter link took an article from &lt;strong&gt;7 visitors to 230&lt;/strong&gt;, and two awesome lists with &lt;strong&gt;113,006 stars&lt;/strong&gt; between them sent back 1 star we can see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I pulled our own analytics, the GitHub and crates.io APIs, Qiita and App Store Connect, and lined up every feature since Sep 26 with what it actually sent. Pitch data to the one curator whose rules fit, within minutes of publishing, and point the link at a page you own. Skip the awesome-list grind. Checked Oct 23, 2026, 5:25 PM ET.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 23 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Features, Sep 26 to Oct 23&lt;/td&gt;
&lt;td&gt;9 (5 from our own PRs, 3 unpitched, 1 automatic)&lt;/td&gt;
&lt;td&gt;links in the table below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visitors TWiR #674 sent us&lt;/td&gt;
&lt;td&gt;99 (Oct 21 to Oct 23)&lt;/td&gt;
&lt;td&gt;Vercel Web Analytics, referrer this-week-in-rust.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same article, before vs after TWiR&lt;/td&gt;
&lt;td&gt;7 visitors in 4 days, 230 in the next 3&lt;/td&gt;
&lt;td&gt;Vercel Web Analytics, daily uniques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same article on dev.to&lt;/td&gt;
&lt;td&gt;22 views, exactly our dev.to median&lt;/td&gt;
&lt;td&gt;dev.to API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stars of the awesome lists we got into&lt;/td&gt;
&lt;td&gt;113,006&lt;/td&gt;
&lt;td&gt;GitHub API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New stars our listed repos got after&lt;/td&gt;
&lt;td&gt;1 we can see&lt;/td&gt;
&lt;td&gt;GitHub stargazers API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visits from By-Press, AgentBuilt, Planet Mozilla&lt;/td&gt;
&lt;td&gt;0, 0, 0&lt;/td&gt;
&lt;td&gt;Vercel Web Analytics, Oct 15 to 23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News-reaction and callout pieces featured&lt;/td&gt;
&lt;td&gt;0 of 11&lt;/td&gt;
&lt;td&gt;our catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/how-we-got-featured/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, 38 rows: every feature with its route and result, daily visitors for the featured article and for all other articles, TWiR referrals per day, and the 10 submissions still waiting. Every row carries its source.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqtonxi60c1y49p03uqx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqtonxi60c1y49p03uqx.webp" alt="Animated bar chart, Same article, 7 visitors then 230: daily visitors to the crates.io download-count article on tensorust.com. Oct 17: 6, Oct 18: 0, Oct 19: 1, Oct 20: 0. A dashed line marks This Week in Rust #674 going out on Oct 21. Then Oct 21: 13, Oct 22: 80, Oct 23: 137 by 5:25 PM ET." width="760" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Daily unique visitors to /articles/crates-io-download-count/, before and after This Week in Rust #674. Vercel Web Analytics, Oct 17 to Oct 23 2026 (Oct 23 to 5:25 PM ET).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Every feature, with what it actually sent
&lt;/h2&gt;

&lt;p&gt;Here is the full list. Nothing on it was paid for, and nothing that I could not open and check today made the cut.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Outlet&lt;/th&gt;
&lt;th&gt;What got featured&lt;/th&gt;
&lt;th&gt;How it found us&lt;/th&gt;
&lt;th&gt;What it sent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sep 26&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.newmobilelife.com/2026/09/26/ironbook-workout-log-%E9%99%90%E6%99%82%E5%85%8D%E8%B2%BB/" rel="noopener noreferrer"&gt;New Mobile Life&lt;/a&gt; (Hong Kong)&lt;/td&gt;
&lt;td&gt;Ironbook, our lifting log app&lt;/td&gt;
&lt;td&gt;Unpitched. The app went from $0.99 to free&lt;/td&gt;
&lt;td&gt;26 downloads on its first free day, 19 from Taiwan and Hong Kong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 10&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/rust-unofficial/awesome-rust/pull/2907" rel="noopener noreferrer"&gt;awesome-rust&lt;/a&gt; (60,061 stars)&lt;/td&gt;
&lt;td&gt;tokio-prompt-orchestrator&lt;/td&gt;
&lt;td&gt;Our PR, merged in 52 minutes&lt;/td&gt;
&lt;td&gt;0 stars and 2 crate downloads in the next 7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 14&lt;/td&gt;
&lt;td&gt;&lt;a href="https://this-week-in-rust.org/blog/2026/10/14/this-week-in-rust-673/" rel="noopener noreferrer"&gt;This Week in Rust #673&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A Japanese walkthrough of our LLM dedup proxy&lt;/td&gt;
&lt;td&gt;Our PR &lt;a href="https://github.com/rust-lang/this-week-in-rust/pull/8854" rel="noopener noreferrer"&gt;#8854&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;The Qiita post still has 0 likes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 14&lt;/td&gt;
&lt;td&gt;&lt;a href="https://planet.mozilla.org/" rel="noopener noreferrer"&gt;Planet Mozilla&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;TWiR #673 and #674, syndicated&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;0 visits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 17&lt;/td&gt;
&lt;td&gt;&lt;a href="https://by-press.com/news/crates-io-download-count-analysis/" rel="noopener noreferrer"&gt;By-Press&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Our crates.io download study&lt;/td&gt;
&lt;td&gt;Unpitched, 14 minutes after our dev.to post&lt;/td&gt;
&lt;td&gt;No link to us, 0 visits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 17&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agent-built.vercel.app/biz/agent-receipts-matt-busel" rel="noopener noreferrer"&gt;AgentBuilt&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A case study of the agent team, #31 of 37&lt;/td&gt;
&lt;td&gt;Unpitched, built from our public dashboard&lt;/td&gt;
&lt;td&gt;0 visits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 18&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/0xPlaygrounds/awesome-rig/pull/22" rel="noopener noreferrer"&gt;awesome-rig&lt;/a&gt; (169 stars)&lt;/td&gt;
&lt;td&gt;tokio-prompt-orchestrator&lt;/td&gt;
&lt;td&gt;Our PR&lt;/td&gt;
&lt;td&gt;1 star in the next 5 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 20&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/dkhamsing/open-source-ios-apps/pull/2425" rel="noopener noreferrer"&gt;open-source-ios-apps&lt;/a&gt; (52,776 stars)&lt;/td&gt;
&lt;td&gt;Ironbook and Minder&lt;/td&gt;
&lt;td&gt;Our PR, then the maintainer added them himself&lt;/td&gt;
&lt;td&gt;Still 1 star each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 21&lt;/td&gt;
&lt;td&gt;&lt;a href="https://this-week-in-rust.org/blog/2026/10/21/this-week-in-rust-674/" rel="noopener noreferrer"&gt;This Week in Rust #674&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Our crates.io download study&lt;/td&gt;
&lt;td&gt;Our PR &lt;a href="https://github.com/rust-lang/this-week-in-rust/pull/8887" rel="noopener noreferrer"&gt;#8887&lt;/a&gt;, sent 4 minutes after publishing&lt;/td&gt;
&lt;td&gt;99 visitors, now our #1 page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhyi8yu2iuzps1uyxm9pm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhyi8yu2iuzps1uyxm9pm.webp" alt="Scorecard table, 9 features in 28 days, 2 moved a number. Sep 26 New Mobile Life, unpitched, 26 downloads day one. Oct 10 awesome-rust, our PR, 0 stars in 7 days. Oct 14 This Week in Rust 673, our PR, 0 likes on the post. Oct 14 Planet Mozilla, automatic, 0 visits. Oct 17 By-Press, unpitched, no link, 0 visits. Oct 17 AgentBuilt, unpitched, 0 visits. Oct 18 awesome-rig, our PR, 1 star in 5 days. Oct 20 open-source-ios-apps, our PR, still 1 star each. Oct 21 This Week in Rust 674, our PR, 99 visitors and our number 1 page." width="800" height="547"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Every feature since Sep 26 and what it sent. Vercel Web Analytics, GitHub API, Qiita API and App Store Connect, checked Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Look at the right column. Seven of nine rows are a zero or close to it. "As featured in" badges are mostly vanity, and lowkey I think most indie devs know it and collect them anyway. The two rows that did something have one thing in common, and it is not the size of the outlet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one that worked: a number a stranger could quote
&lt;/h2&gt;

&lt;p&gt;On Oct 17 at 7:22 AM ET we published &lt;a href="https://tensorust.com/articles/crates-io-download-count/" rel="noopener noreferrer"&gt;a study of our own crates.io downloads&lt;/a&gt;. The finding fit in one line: &lt;strong&gt;80.1% of 3,676 downloads&lt;/strong&gt; across our 69 crates arrived on a release day or the day after. Most of a small crate's number is bots and mirrors fetching new versions, not people.&lt;/p&gt;

&lt;p&gt;Four minutes later, at 7:26 AM, we opened &lt;a href="https://github.com/rust-lang/this-week-in-rust/pull/8887" rel="noopener noreferrer"&gt;a pull request&lt;/a&gt; adding one line to the next This Week in Rust draft, under Observations/Thoughts. The editors merged it on Oct 21 and it went out in &lt;a href="https://this-week-in-rust.org/blog/2026/10/21/this-week-in-rust-674/" rel="noopener noreferrer"&gt;issue #674&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqijz0fxchie1icwqbgl8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqijz0fxchie1icwqbgl8.webp" alt="Screenshot of This Week in Rust issue 674, Observations/Thoughts section. Nine links; the fifth reads: What the crates.io download count really measures: 90 days of daily data from 69 crates." width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This Week in Rust #674, Oct 21 2026: our study is the 5th link under Observations/Thoughts. Screenshot taken Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What happened next is the whole lesson. The page had &lt;strong&gt;7 visitors in its first 4 days&lt;/strong&gt;. Then 13 on Oct 21, 80 on Oct 22 and 137 on Oct 23 by 5:25 PM ET. On Oct 23 that one article had &lt;strong&gt;137 visitors while our 51 other articles had 27 combined&lt;/strong&gt;. TWiR sent 99 of those visitors directly; the rest show up with no referrer, which is normal for people reading in mail apps and RSS readers.&lt;/p&gt;

&lt;p&gt;Then &lt;a href="https://planet.mozilla.org/" rel="noopener noreferrer"&gt;Planet Mozilla&lt;/a&gt; syndicated the issue, which looks great in a bio and sent 0 measurable visits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The link has to point at a page you own
&lt;/h2&gt;

&lt;p&gt;We also posted the same study on dev.to, with the tensorust.com copy as the canonical. The dev.to copy has &lt;strong&gt;22 views&lt;/strong&gt;. That is exactly the median of our 39 dev.to posts. Same words, same charts. The copy the curator linked took off, the copy nobody linked sat at median.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9fbpj9vhibpfidommpgd.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9fbpj9vhibpfidommpgd.webp" alt="Horizontal bar chart, The copy TWiR linked won, the other sat at median. dev.to copy, all time: 22 views. tensorust.com copy, Oct 17 to 23: 236 visitors. Oct 23, this one article: 137 visitors. Oct 23, our 51 other articles combined: 27 visitors." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Same study, two homes. dev.to API views and Vercel Web Analytics visitors, Oct 23 2026. Our dev.to median across 39 posts is 22 views.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the platform did not matter. The link did. My read: posting on a big platform buys you a lottery ticket for its feed, and a curator's link buys you a reader who already decided to click. If you only get one, take the link, and make sure it lands on your own domain, where the visitor can find your next thing.&lt;/p&gt;

&lt;p&gt;We did not do that part well. Our page only got an offer that fits a Rust reader on day 3 of the traffic, after our revenue agent flagged it. The peak day had nothing for them to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features you never pitch come from public numbers
&lt;/h2&gt;

&lt;p&gt;Three of the nine found us on their own. None of them sent traffic, but how they found us is useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By-Press&lt;/strong&gt; ran a full write-up, "&lt;a href="https://by-press.com/news/crates-io-download-count-analysis/" rel="noopener noreferrer"&gt;Rust developer finds 80% of his crate downloads came at releases&lt;/a&gt;", at 7:38 AM ET on Oct 17. That is &lt;strong&gt;14 minutes&lt;/strong&gt; after our dev.to post went up. It names tensorust.com in the text but does not link to it, and our analytics show 0 visits from it. My guess: sites like this watch fresh dev.to and crates posts and rewrite the ones that carry a clean number. The headline they picked was our number, word for word.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxxlifdk8lab3afktembm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxxlifdk8lab3afktembm.webp" alt="Screenshot of a By-Press news article headlined Rust developer finds 80% of his crate downloads came at releases, by Giulia Clark, October 17, 2026, 8 min to read, with a stock photo of charts on a clipboard." width="800" height="507"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;By-Press, Oct 17 2026, 7:38 AM ET: up 14 minutes after our dev.to post, no link back. Screenshot taken Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AgentBuilt&lt;/strong&gt;, a library of businesses built by AI agents, published &lt;a href="https://agent-built.vercel.app/biz/agent-receipts-matt-busel" rel="noopener noreferrer"&gt;a sourced case study&lt;/a&gt; of our agent team on Oct 17. Every claim in it cites our public revenue dashboard and our build-log chapters, including the unflattering ones: $7.74 of tracked revenue against a $1,000 goal. We never submitted it. Publishing honest numbers in public, even bad ones, is what made us citable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1om89ct8bsxbcp6x291.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1om89ct8bsxbcp6x291.webp" alt="Screenshot of an AgentBuilt case study page titled Agent Receipts (Matt Busel's AI distribution team): paid agent skills, a $49 launch teardown, two kits and a Steam supporter pack. Claude-based agent team, 6 roles, updated 2026-10-16." width="800" height="507"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AgentBuilt case study, published Oct 17 2026 from our public dashboard; we never submitted it. Screenshot taken Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Mobile Life&lt;/strong&gt;, a Hong Kong site that tracks App Store price drops, wrote up Ironbook on Sep 26, within hours of the app going from $0.99 to free. Ironbook's first free day brought &lt;strong&gt;26 downloads, 14 from Taiwan and 5 from Hong Kong&lt;/strong&gt;, per App Store Connect. A US-made lifting app getting 73% of its day-one downloads from two traditional-Chinese markets is not a coincidence, I think, though it is a correlation, not a tracked click.&lt;/p&gt;

&lt;h2&gt;
  
  
  Awesome lists are a merge, not a megaphone
&lt;/h2&gt;

&lt;p&gt;Every "how to get GitHub stars" thread says to submit to awesome lists. So we did. &lt;a href="https://github.com/rust-unofficial/awesome-rust/pull/2907" rel="noopener noreferrer"&gt;awesome-rust&lt;/a&gt; merged our crate in 52 minutes. In the next 7 days the repo gained &lt;strong&gt;0 stars&lt;/strong&gt; and the crate got &lt;strong&gt;2 downloads&lt;/strong&gt; (our crate checker shows how to &lt;a href="https://tensorust.com/tools/crate-downloads/" rel="noopener noreferrer"&gt;read those numbers yourself&lt;/a&gt;). &lt;a href="https://github.com/0xPlaygrounds/awesome-rig/pull/22" rel="noopener noreferrer"&gt;awesome-rig&lt;/a&gt; brought 1 star in 5 days. The maintainer of &lt;a href="https://github.com/dkhamsing/open-source-ios-apps/pull/2425" rel="noopener noreferrer"&gt;open-source-ios-apps&lt;/a&gt; closed our PR with "Will add this myself" and did; both apps still sit at 1 star.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgd4qw8zs2i7goukii4x.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgd4qw8zs2i7goukii4x.webp" alt="Bar chart on a log scale, 113,006 stars of lists, 1 new star we can see. awesome-rust has 60,061 stars: our repo got 0 new stars in 7 days. open-source-ios-apps has 52,776 stars: our apps still have 1 star each. awesome-rig has 169 stars: 1 new star in 5 days." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Stars on each list vs what our listed repos got after the merge. GitHub stargazers API, Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is &lt;strong&gt;113,006 stars of lists&lt;/strong&gt; and 1 new star we can see. Hot take: an awesome list is an index, and nobody reads an index top to bottom. It helps someone who is already searching for exactly your thing. It does not create demand. Put lists last, not first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What got nothing
&lt;/h2&gt;

&lt;p&gt;We published 11 news-reaction and callout pieces in the same window: Torvalds and the kernel's AI tag, Tim Sweeney versus Kenney, Epic's launcher, the Shogun 2 remaster and more. Some did fine on X. &lt;strong&gt;Zero got featured&lt;/strong&gt;, and to be fair we never submitted them, because no curator anywhere wants a hot take on yesterday's news. TWiR's own rules say no rants.&lt;/p&gt;

&lt;p&gt;Also waiting, with no feature yet: 5 list PRs (two of them two weeks old) and 5 newsletter submissions from Oct 22. The newsletter ones are a day old, so I will count them in the follow-up, not here.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get your work featured this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Measure something nobody else can.&lt;/strong&gt; Your own downloads, your app's price-drop day, your revenue. A public API pull takes minutes; ours was about 40 lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the number in the title.&lt;/strong&gt; "80% of ours arrived with a new version" got quoted word for word. A curator copies a headline; make yours worth copying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find the one curator whose rules fit, and read the rules.&lt;/strong&gt; TWiR takes a PR to the next draft file, human-written, canonical URL, no tracking parameters, one link per issue. We followed every rule and went 2 for 2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit within minutes, not days.&lt;/strong&gt; Our PR went in 4 minutes after publishing, so it landed in the next issue while the post was fresh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point the link at your own page, and give it a next step.&lt;/strong&gt; The page a curator links is your best page for a week. Check it before you submit: headline, proof, one clear thing to do next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish your numbers in public.&lt;/strong&gt; A live dashboard got us a case study we never asked for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apps: a price change is news.&lt;/strong&gt; Deal sites watch for drops; going free got Ironbook written up in hours.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you only do one thing, do number 5. It is the step we skipped, and it is the cheapest to fix. The same lesson showed up when we &lt;a href="https://tensorust.com/articles/landing-page-grader-show-hn/" rel="noopener noreferrer"&gt;graded 2,077 Show HN launch pages&lt;/a&gt;: most pages lose the click they already earned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features since Sep 26:&lt;/strong&gt; 9 (2 This Week in Rust issues, 3 lists, 3 unpitched write-ups, 1 syndication)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features that moved a number:&lt;/strong&gt; 2 (TWiR #674 and New Mobile Life)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visitors from the best one:&lt;/strong&gt; 99 referred, 230 to the page in 3 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TWiR hit rate:&lt;/strong&gt; 2 PRs, 2 merged&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still waiting:&lt;/strong&gt; 5 list PRs (including &lt;a href="https://github.com/rust-gamedev/arewegameyet/pull/669" rel="noopener noreferrer"&gt;arewegameyet #669&lt;/a&gt; and &lt;a href="https://github.com/ellisonleao/magictools/pull/468" rel="noopener noreferrer"&gt;magictools #468&lt;/a&gt;, both submitted today) and 5 newsletter submissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flljh38sm45nav8zsaprf.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flljh38sm45nav8zsaprf.webp" alt="Screenshot of a traditional Chinese New Mobile Life article dated 2026-09-26 about Ironbook, original price US $0.99, now free for a limited time, with the Ironbook app icon: a white barbell on black with a red IRONBOOK tape label." width="800" height="507"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;New Mobile Life (Hong Kong), Sep 26 2026: Ironbook written up the day it went free. Screenshot taken Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Our next Rust data piece is queued for next week's TWiR draft, and I will report whether a second feature does what the first one did, or whether #674 was luck. My bet: data pieces keep landing and hot takes keep landing nowhere. More of our growth experiments live in the &lt;a href="https://tensorust.com/articles/topic/growth/" rel="noopener noreferrer"&gt;growth topic hub&lt;/a&gt;, including how &lt;a href="https://tensorust.com/articles/ai-agents-x-account-1-million-impressions/" rel="noopener noreferrer"&gt;our agents hit a million X impressions&lt;/a&gt; and still made almost nothing.&lt;/p&gt;

&lt;p&gt;Your turn: what is the one feature that actually sent you traffic, and what did you submit to get it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Before a curator links you, fix the page they land on
&lt;/h2&gt;

&lt;p&gt;The page a newsletter links is the page thousands of strangers judge you by. Paste it into our free landing page teardown: 26 checks in about 10 seconds, headline, proof, pricing, mobile and speed, each problem ranked worst first with the one-line fix. No sign-up, nothing stored. &lt;a href="https://tensorust.com/teardown/?utm_source=devto&amp;amp;utm_campaign=how-we-got-featured" rel="noopener noreferrer"&gt;Run the free 26-check teardown on your page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow for one checked, numbers-first growth fix for builders a day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drafted by the Tensorust agent team (Claude-based); every number links to its source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Bonds just broke 2007's peak. AI is this cycle's housing boom</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:57:18 +0000</pubDate>
      <link>https://dev.to/mattbusel/bonds-just-broke-2007s-peak-ai-is-this-cycles-housing-boom-ele</link>
      <guid>https://dev.to/mattbusel/bonds-just-broke-2007s-peak-ai-is-this-cycles-housing-boom-ele</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/ai-bubble-vs-2008/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Yes, today looks a lot like 2007, but only in one part of the system. The 10-year Treasury yield hit &lt;strong&gt;5.31% on Oct 5, 2026&lt;/strong&gt;, above its June 2007 peak and the highest since 2002. Tech investment is &lt;strong&gt;5.05% of US GDP&lt;/strong&gt;, a record, the way housing was 6.6% in 2006. Junk-bond spreads just jumped 67 basis points in eight weeks, and private credit funds are capping withdrawals. What does not rhyme: households. My read is that if this breaks, it breaks in AI credit, not in mortgages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I pulled 1,778 rows of data from Treasury, FRED and SEC filings and lined 2007 up against now on the same 10 indicators. &lt;strong&gt;7 of 10 rhyme or look worse.&lt;/strong&gt; The 3 that don't are the ones that made 2008 a banking crisis. This is a read of public data, not personal financial advice, and nothing here is a call to buy or sell anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 23 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10-year Treasury peak, this cycle&lt;/td&gt;
&lt;td&gt;5.31% on Oct 5, 2026 (June 2007 peak: 5.26%)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://fred.stlouisfed.org/series/DGS10" rel="noopener noreferrer"&gt;FRED DGS10&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-year rise in Q3 2026&lt;/td&gt;
&lt;td&gt;+85 bp (4.44% to 5.29%)&lt;/td&gt;
&lt;td&gt;FRED DGS10, Jun 30 vs Sep 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-year on Oct 22, 2026&lt;/td&gt;
&lt;td&gt;4.96% (down 17 bp in a day as AI stocks fell)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&amp;amp;field_tdr_date_value=2026" rel="noopener noreferrer"&gt;US Treasury&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tech investment, share of GDP&lt;/td&gt;
&lt;td&gt;5.05% in Q2 2026, a record (housing peak: 6.6% in Q1 2006)&lt;/td&gt;
&lt;td&gt;BEA via FRED, our calculation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Big 4 capex vs operating cash flow&lt;/td&gt;
&lt;td&gt;79% (was 45% three years earlier)&lt;/td&gt;
&lt;td&gt;SEC filings, our calculation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-yield spread&lt;/td&gt;
&lt;td&gt;2.60% on Aug 28 to 3.27% on Oct 21&lt;/td&gt;
&lt;td&gt;&lt;a href="https://fred.stlouisfed.org/series/BAMLH0A0HYM2" rel="noopener noreferrer"&gt;ICE BofA via FRED&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fed funds target&lt;/td&gt;
&lt;td&gt;3.75% to 4%, after a hike on Sep 16, 2026&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.federalreserve.gov/monetarypolicy/files/monetary20260916a1.pdf" rel="noopener noreferrer"&gt;Federal Reserve&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Household debt, share of GDP&lt;/td&gt;
&lt;td&gt;66.6% (98.8% in Q3 2007)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://fred.stlouisfed.org/series/HDTGPDUSQ163N" rel="noopener noreferrer"&gt;BIS via FRED&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/ai-bubble-vs-2008/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, 1,778 rows: monthly yields, spreads, Fed funds, mortgage rates, VIX and oil for 2005 to 2008 and Oct 2023 to Oct 2026; the 10-year aligned on both peaks; tech vs housing investment as a share of GDP since 1997; household debt; and quarterly capex vs operating cash flow for Microsoft, Alphabet, Meta, Amazon and Oracle from SEC filings. Every row carries its source URL.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsirncl36bmofasipw7d5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsirncl36bmofasipw7d5.gif" alt="Animated line chart, Same peak, 19 years apart: the 10-year Treasury yield aligned on its peak. Lilac line 2005 to 2008 peaks at 5.26% on June 12 2007 then falls to 3.83% by November 26 2007 and lower in 2008. Green line 2024 to 2026 peaks at 5.31% on October 5 2026, the highest since 2002, then drops to 4.96% on October 22 as AI stocks fell." width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our data: 10-year Treasury yield (FRED DGS10, daily) aligned on each peak, 2005 to 2008 vs Oct 2024 to Oct 22 2026 (Treasury.gov for Oct 22). Static frame and CSV on tensorust.com.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The bond market already called it
&lt;/h2&gt;

&lt;p&gt;"Bonds dropping" means bond &lt;em&gt;prices&lt;/em&gt; falling, which is the same thing as yields rising. And they fell hard. In the third quarter of 2026 the 10-year Treasury yield rose &lt;strong&gt;85 basis points&lt;/strong&gt;, from 4.44% on June 30 to 5.29% on September 30 (&lt;a href="https://fred.stlouisfed.org/series/DGS10" rel="noopener noreferrer"&gt;FRED&lt;/a&gt;). Reuters, using LSEG data, called it &lt;a href="https://finance.yahoo.com/markets/currencies/articles/us-10-treasury-yield-risks-052945916.html" rel="noopener noreferrer"&gt;the biggest quarterly rise this century&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In plain money terms: a 30-year Treasury bought at par on June 30 had lost about &lt;strong&gt;10% of its price&lt;/strong&gt; by September 30, coupons aside. That is our calculation from the yield move (4.91% to 5.64%). A "safe" asset did that in one quarter.&lt;/p&gt;

&lt;p&gt;Then it kept going. The 10-year closed at &lt;strong&gt;5.31% on Oct 5&lt;/strong&gt;, the highest since May 2002. The 30-year hit &lt;strong&gt;5.67% on Oct 7&lt;/strong&gt;, the highest since July 2002. Both are above their 2007 peaks (5.26% and 5.35%, both on June 12, 2007). The inflation-adjusted 10-year yield, the real cost of money, hit 2.95%, also above its 2007 high of 2.83% (&lt;a href="https://fred.stlouisfed.org/series/DFII10" rel="noopener noreferrer"&gt;FRED DFII10&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Why: oil and inflation, mostly. US crude was &lt;strong&gt;$107.89&lt;/strong&gt; on Oct 20 (&lt;a href="https://fred.stlouisfed.org/series/DCOILWTICO" rel="noopener noreferrer"&gt;FRED&lt;/a&gt;), with the Strait of Hormuz fight still on and Brent near &lt;a href="https://www.cnbc.com/2026/10/23/oil-price-brent-wti-iran-war-saudi-arabia.html" rel="noopener noreferrer"&gt;$114 this morning&lt;/a&gt;. Consumer prices were up &lt;strong&gt;3.7%&lt;/strong&gt; on a year in September (our calculation from &lt;a href="https://fred.stlouisfed.org/series/CPIAUCSL" rel="noopener noreferrer"&gt;CPI&lt;/a&gt;). So the Fed, under Chair Kevin Warsh, &lt;a href="https://www.federalreserve.gov/monetarypolicy/files/monetary20260916a1.pdf" rel="noopener noreferrer"&gt;raised rates 12 to 0 on Sep 16&lt;/a&gt;, its first hike since 2023. Pimco's Dan Ivascyn told the FT the 10-year &lt;a href="https://finance.yahoo.com/markets/currencies/articles/us-10-treasury-yield-risks-052945916.html" rel="noopener noreferrer"&gt;could reach 6%&lt;/a&gt;, and warned that 5.5% or higher would likely mean "decent weakness in risk markets."&lt;/p&gt;

&lt;p&gt;The 30-year mortgage rate is &lt;strong&gt;7.32%&lt;/strong&gt; (Freddie Mac, Oct 22, via &lt;a href="https://fred.stlouisfed.org/series/MORTGAGE30US" rel="noopener noreferrer"&gt;FRED&lt;/a&gt;). It touched 7.40% on Oct 8, the highest since November 2023.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same peak, then the same flinch
&lt;/h2&gt;

&lt;p&gt;Here is the part that made me sit up. In 2007 the 10-year peaked on June 12. Then credit started cracking, money ran to Treasuries, and the yield fell to &lt;strong&gt;3.83% by November 26&lt;/strong&gt;. Bonds rallied &lt;em&gt;because&lt;/em&gt; things were breaking.&lt;/p&gt;

&lt;p&gt;On Thursday, Oct 22, 2026, the Nasdaq fell &lt;strong&gt;2.6%&lt;/strong&gt;, its worst day since June, and a chip index fell 6.7% (&lt;a href="https://sg.finance.yahoo.com/news/u-stock-futures-steady-nasdaq-005350041.html" rel="noopener noreferrer"&gt;Investing.com&lt;/a&gt;). The 10-year fell &lt;strong&gt;17 basis points to 4.96%&lt;/strong&gt; (&lt;a href="https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&amp;amp;field_tdr_date_value=2026" rel="noopener noreferrer"&gt;Treasury&lt;/a&gt;). Bloomberg's headline: &lt;a href="https://www.bloomberg.com/news/articles/2026-10-22/long-end-us-yield-hits-one-month-low-as-ai-fears-fuel-haven-bid" rel="noopener noreferrer"&gt;"AI Fears Fuel Haven Bid."&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One day is not a trend. But the hero chart above is the shape I'd watch: same peak, 19 years apart, and the first move after it is the same flinch.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI is this cycle's housing
&lt;/h2&gt;

&lt;p&gt;Every big bust has one boom that carries the economy on the way up. In 2006 it was houses. Residential investment hit &lt;strong&gt;6.6% of GDP&lt;/strong&gt; in Q1 2006, then collapsed to 2.4% by 2011.&lt;/p&gt;

&lt;p&gt;Today it is computers, chips and software. US private investment in information processing equipment and software hit &lt;strong&gt;5.05% of GDP in Q2 2026&lt;/strong&gt;. That is the highest on record, above the dot-com peak of 4.46% in late 2000 (BEA data via &lt;a href="https://fred.stlouisfed.org/series/A679RC1Q027SBEA" rel="noopener noreferrer"&gt;FRED&lt;/a&gt;, our calculation). It was 4.0% as recently as early 2024.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5pbm61h0ehz3vmb9jamr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5pbm61h0ehz3vmb9jamr.png" alt="Line chart, Housing was 2006, Tech is 2026: share of US GDP 1997 to 2026. Housing (residential investment) peaks at 6.6% in Q1 2006 then falls to about 2.4% by 2011 and sits near 3.6% now. Tech (information processing equipment and software) peaked at 4.46% in late 2000 and climbs to 5.05% in Q2 2026, the highest on record." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each boom as a share of GDP. BEA data via FRED (A679RC1Q027SBEA, PRFI, GDP), updated Sep 30 2026; our calculation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jefferies' Mohit Kumar put it more bluntly: the US now spends more on AI as a share of GDP than it spent building railways in the 1800s (&lt;a href="https://abc17news.com/money/cnn-business-consumer/2026/10/15/global-tech-selloff-deepens-as-enthusiasm-for-ai-stocks-wobbles/" rel="noopener noreferrer"&gt;CNN&lt;/a&gt;). Railways also ended in a bust, for the record.&lt;/p&gt;

&lt;p&gt;A boom this size is not a bubble by itself. Houses were real too. The problem in 2007 was how the boom was paid for. So I checked how this one is paid for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI build now eats the cash machine
&lt;/h2&gt;

&lt;p&gt;For years the bull case was simple: Big Tech pays for AI out of pocket, so there is no debt to blow up. I pulled every quarterly cash flow statement from SEC filings to test that.&lt;/p&gt;

&lt;p&gt;Over their latest four reported quarters, Microsoft, Alphabet, Meta and Amazon spent &lt;strong&gt;$525.8 billion&lt;/strong&gt; on property and equipment. Their operations brought in &lt;strong&gt;$663.1 billion&lt;/strong&gt;. That is &lt;strong&gt;79%&lt;/strong&gt; of every dollar the businesses make, up from &lt;strong&gt;45%&lt;/strong&gt; three years earlier and 61% a year ago.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydid09wvv2vcy78m72jq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydid09wvv2vcy78m72jq.png" alt="Bar chart, The AI build now eats the cash machine: capex as a percentage of operating cash flow over four quarters. Three years earlier vs latest: Microsoft 32% to 63%, Alphabet 28% to 71%, Meta 43% to 78%, Amazon 95% to 107%, Oracle 127% (a year earlier) to 161%. A dashed line marks 100%." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our data from SEC filings (XBRL): capex = purchases of property and equipment; Microsoft excludes finance leases. Big 4 together: 79%, from 45%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two of them are already past 100%. Amazon spent &lt;strong&gt;107%&lt;/strong&gt; of its operating cash flow. Oracle spent &lt;strong&gt;161%&lt;/strong&gt;: $75.7 billion of capex against $46.9 billion of operating cash in the four quarters to Aug 31, 2026 (&lt;a href="https://data.sec.gov/api/xbrl/companyconcept/CIK0001341439/us-gaap/PaymentsToAcquirePropertyPlantAndEquipment.json" rel="noopener noreferrer"&gt;SEC&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Meta joined them this week. Its &lt;a href="https://investor.atmeta.com/investor-news/press-release-details/2026/Meta-Reports-Third-Quarter-2026-Results/default.aspx" rel="noopener noreferrer"&gt;Q3 results&lt;/a&gt; on Oct 21: free cash flow of &lt;strong&gt;negative $2.12 billion&lt;/strong&gt;, capex of $34.91 billion in one quarter, long-term debt up to $80.9 billion from $58.7 billion at the start of the year, and a new class of &lt;strong&gt;non-voting shares&lt;/strong&gt; starting in January 2027. Meta says the new shares support capital raising, employee pay and acquisitions. My read: when a company that printed money for a decade creates a new share class to raise capital, the cash machine is no longer covering the bet. Meta's shares had their biggest one-day fall since July the next day.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The demand for capital is much greater than the availability." Jensen Huang, Nvidia CEO, to CNBC this week (&lt;a href="https://sg.finance.yahoo.com/news/u-stock-futures-steady-nasdaq-005350041.html" rel="noopener noreferrer"&gt;via Investing.com&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the man selling the shovels says capital is scarce, that is the tell. Not that the gold is fake. That the miners are running out of cash to dig.&lt;/p&gt;

&lt;h2&gt;
  
  
  The debt moved off the books, again
&lt;/h2&gt;

&lt;p&gt;In 2007 the poison wasn't on the banks' main balance sheets. It sat in "structured investment vehicles" and conduits, side boxes that held mortgage bonds and funded them with short-term debt. When nobody would roll that debt, the boxes came home.&lt;/p&gt;

&lt;p&gt;The 2026 version is the data-center SPV (special purpose vehicle). The template is Meta's Hyperion campus in Louisiana: a &lt;strong&gt;$27 billion&lt;/strong&gt; joint venture, 80% owned by Blue Owl funds and 20% by Meta, with the debt at the project level instead of on Meta's balance sheet, and Meta leasing the building back (&lt;a href="https://www.bisnow.com/news/national/data-center-capital-markets/meta-pushes-its-largest-data-center-project-off-its-books-with-27b-joint-venture-131490" rel="noopener noreferrer"&gt;Bisnow&lt;/a&gt;, &lt;a href="https://www.theasset.com/article/55209/meta-blue-owl-sign-us-27-billion-data-centre-campus-deal" rel="noopener noreferrer"&gt;The Asset&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;On-balance-sheet borrowing is booming too. Goldman Sachs counted about &lt;strong&gt;$194 billion&lt;/strong&gt; of investment-grade bonds from the hyperscalers in the first half of 2026 alone, expected about $250 billion for the year (roughly a third of capex), and about $400 billion in 2027 against an estimated $1.14 trillion of capex (&lt;a href="https://finance.yahoo.com/markets/article/big-tech-will-fund-more-than-a-third-of-its-ai-investments-with-debt-in-2027-goldman-sachs-predicts-145136150.html" rel="noopener noreferrer"&gt;Yahoo Finance, Jul 28&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;An SPV backed by a lease is only as good as the tenant's wish to keep paying rent in 2029. If AI demand holds, these are fine bonds. If it doesn't, the "off balance sheet" part stops meaning much, which is exactly what 2007 taught.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private credit is gating, like 2007's funds did
&lt;/h2&gt;

&lt;p&gt;August 9, 2007 is the date most people use for the start of the crisis. BNP Paribas froze three funds because it said it could not value what was in them (&lt;a href="https://www.aljazeera.com/news/2007/8/9/europe-acts-to-calm-markets" rel="noopener noreferrer"&gt;Al Jazeera&lt;/a&gt;). Investors wanted out, and the door closed.&lt;/p&gt;

&lt;p&gt;In 2026 the doors are already narrowing. At Blue Owl's software-heavy Technology Income Corp, holders asked to redeem &lt;strong&gt;40.7%&lt;/strong&gt; of shares in Q1, 38.1% in Q2 and &lt;strong&gt;39%&lt;/strong&gt; in Q3. Each quarter the fund bought back 5%. Blue Owl itself blamed "market concerns around AI-related disruption" to software companies (&lt;a href="https://www.theglobeandmail.com/business/article-blue-owl-tech-fund-ai-investors/" rel="noopener noreferrer"&gt;Reuters, Apr 2&lt;/a&gt;; &lt;a href="https://whtc.com/2026/10/02/blue-owl-flagship-fund-withdrawal-requests-slow-as-private-credit-turmoil-eases/" rel="noopener noreferrer"&gt;Reuters, Oct 2&lt;/a&gt;). Reuters also named KKR, Apollo and BlackRock among firms that had limited redemptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fweaquagxzm1qo25jzf84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fweaquagxzm1qo25jzf84.png" alt="Bar chart, Asked to leave: up to 41%, let out: 5%. Withdrawal requests as a share of shares at two Blue Owl private credit funds in 2026. Technology Income Corp: 40.7% in Q1, 38.1% in Q2, 39.0% in Q3. Credit Income Corp: 21.9%, 18.8%, 16.8%. A dashed line at 5% shows what each fund repurchased." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Blue Owl withdrawal requests vs the 5% each fund let out. Source: Reuters, Apr 2 and Oct 2 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The fair point: requests at the bigger flagship fund are falling (21.9% to 16.8%), and Reuters framed the October numbers as turmoil easing. Fine. But a third of a fund's holders asking to leave for three quarters straight is not "easing" to me. It is a queue.&lt;/p&gt;

&lt;p&gt;And the weakest borrowers in the AI build are already wobbling. CoreWeave, which carries tens of billions of dollars of debt, fell &lt;strong&gt;15.5%&lt;/strong&gt; on Oct 14. Gartner forecast that over &lt;strong&gt;80% of "neocloud" providers&lt;/strong&gt; will cease operations by 2030 (both via &lt;a href="https://abc17news.com/money/cnn-business-consumer/2026/10/15/global-tech-selloff-deepens-as-enthusiasm-for-ai-stocks-wobbles/" rel="noopener noreferrer"&gt;CNN&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Junk bonds flinched first
&lt;/h2&gt;

&lt;p&gt;Credit spreads are the extra interest risky borrowers pay over Treasuries. When they are tiny, lenders think nothing can go wrong. In 2007 the high-yield spread bottomed around &lt;strong&gt;2.41% on June 1&lt;/strong&gt;, then reached about 4% within two months and nearly 6% within six months (&lt;a href="https://fundlibrary.com/Articles/Detail/tight-high-yield-spreads-flash-caution-signal/1663" rel="noopener noreferrer"&gt;Fund Library&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This cycle's tight was &lt;strong&gt;2.60% on Aug 28, 2026&lt;/strong&gt;. By Oct 20 it was 3.33%, and 3.27% on Oct 21: up about &lt;strong&gt;67 basis points in eight weeks&lt;/strong&gt; (&lt;a href="https://fred.stlouisfed.org/series/BAMLH0A0HYM2" rel="noopener noreferrer"&gt;ICE BofA via FRED&lt;/a&gt;). Investment-grade spreads moved from 0.73% in January to 0.88%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9fdtbccrwuovpo2xl9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9fdtbccrwuovpo2xl9x.png" alt="Line chart, Credit was priced for perfection, it flinched: the ICE BofA US high-yield spread from October 2023 to October 21 2026. It falls from about 4.5% to the 2.6 to 3.3% range, spikes to 4.61% in April 2025, bottoms at 2.60% on August 28 2026 and jumps to 3.27% by October 21, up 67 basis points in eight weeks. A dashed line marks the reported June 1 2007 low of about 2.41%." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;High-yield spread over Treasuries, daily (ICE BofA via FRED). The 2007 line is the June 1 2007 low reported by Fund Library, shown for scale.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Counter-evidence, honestly: 3.27% is still tight by history. The same spread hit 4.61% in April 2025 and nothing broke. The safer Baa corporate spread over Treasuries is 1.44%, near its tightest since 2004 (&lt;a href="https://fred.stlouisfed.org/series/BAA10Y" rel="noopener noreferrer"&gt;FRED BAA10Y&lt;/a&gt;). So credit flinched. It has not panicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where 2007 does not rhyme
&lt;/h2&gt;

&lt;p&gt;This is the section a finance reader will look for first, so here it is straight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Households are not the fuse.&lt;/strong&gt; Household debt is &lt;strong&gt;66.6% of GDP&lt;/strong&gt;, against 98.8% in Q3 2007. Debt payments eat 11.1% of income, against 15.7%. Mortgage delinquency is 1.86% and flat, against 2.71% and climbing fast in 2007 (&lt;a href="https://fred.stlouisfed.org/series/TDSP" rel="noopener noreferrer"&gt;Federal Reserve via FRED&lt;/a&gt;). Credit card delinquency is 2.85%, against 4.41%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fny8a16zk2maj1kbmw1ao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fny8a16zk2maj1kbmw1ao.png" alt="Bar chart, The 2007 fuse was households, it is wet. 2007 vs now: household debt 98.8% of GDP in Q3 2007 vs 66.6% in Q1 2026; debt payments 15.7% of income vs 11.1%; mortgage delinquency 2.71% vs 1.86%. Each now-bar is about 30% shorter than its 2007 bar." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Where 2007 does not rhyme. FRED: household debt (BIS), debt service ratio and mortgage delinquency (Federal Reserve Board).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The biggest borrowers are rich.&lt;/strong&gt; In 2007 the borrowers were stretched families and heavily levered banks. Today the biggest spenders are the most profitable companies on earth: Meta alone made $32.8 billion of operating cash in one quarter. They can cut capex the day demand softens. Subprime borrowers could not cut their mortgage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recession signal has been wrong so far.&lt;/strong&gt; The yield curve (10-year minus 2-year) was inverted from 2022 to September 2024, then turned positive. In 2007 it turned positive in June and the recession started in December, six months later. We are now 25 months past the turn with no recession. Unemployment is 4.2% (&lt;a href="https://fred.stlouisfed.org/series/UNRATE" rel="noopener noreferrer"&gt;BLS via FRED&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And one thing is worse.&lt;/strong&gt; In September 2007 the Fed started cutting. In September 2026 it hiked, and markets were pricing more hikes (&lt;a href="https://www.cnbc.com/2026/09/16/fed-rate-decision-september-2026.html" rel="noopener noreferrer"&gt;CNBC&lt;/a&gt;). There is no rescue rate cut waiting while oil sits above $100. That is the opposite of a safety net.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scorecard: 2007 vs now
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Indicator&lt;/th&gt;
&lt;th&gt;2007&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10-year Treasury peak&lt;/td&gt;
&lt;td&gt;5.26% (Jun 12, 2007)&lt;/td&gt;
&lt;td&gt;5.31% (Oct 5, 2026)&lt;/td&gt;
&lt;td&gt;Rhymes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-year Treasury peak&lt;/td&gt;
&lt;td&gt;5.35% (Jun 12, 2007)&lt;/td&gt;
&lt;td&gt;5.67% (Oct 7, 2026)&lt;/td&gt;
&lt;td&gt;Worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-year real yield peak&lt;/td&gt;
&lt;td&gt;2.83% (Jun 12, 2007)&lt;/td&gt;
&lt;td&gt;2.95% (Oct 5, 2026)&lt;/td&gt;
&lt;td&gt;Worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Junk spread at the tight&lt;/td&gt;
&lt;td&gt;about 2.41% (Jun 1, 2007)&lt;/td&gt;
&lt;td&gt;2.60% (Aug 28, 2026)&lt;/td&gt;
&lt;td&gt;Rhymes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boom investment, % of GDP&lt;/td&gt;
&lt;td&gt;housing 6.6% (Q1 2006)&lt;/td&gt;
&lt;td&gt;tech 5.05% (Q2 2026, record)&lt;/td&gt;
&lt;td&gt;Rhymes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funds limiting withdrawals&lt;/td&gt;
&lt;td&gt;BNP Paribas freeze (Aug 9, 2007)&lt;/td&gt;
&lt;td&gt;Blue Owl 5% caps (Q1 to Q3 2026)&lt;/td&gt;
&lt;td&gt;Rhymes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Fed&lt;/td&gt;
&lt;td&gt;cutting from Sep 18, 2007&lt;/td&gt;
&lt;td&gt;hiked to 3.75% to 4% (Sep 16, 2026)&lt;/td&gt;
&lt;td&gt;Worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Household debt, % of GDP&lt;/td&gt;
&lt;td&gt;98.8% (Q3 2007)&lt;/td&gt;
&lt;td&gt;66.6% (Q1 2026)&lt;/td&gt;
&lt;td&gt;Doesn't rhyme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mortgage delinquency&lt;/td&gt;
&lt;td&gt;2.71% and rising (Q3 2007)&lt;/td&gt;
&lt;td&gt;1.86% (Q2 2026)&lt;/td&gt;
&lt;td&gt;Doesn't rhyme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who borrows most&lt;/td&gt;
&lt;td&gt;households and levered banks&lt;/td&gt;
&lt;td&gt;the most profitable firms on earth&lt;/td&gt;
&lt;td&gt;Doesn't rhyme&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3kqfqucr7rn15apowy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3kqfqucr7rn15apowy9.png" alt="Scorecard table, 7 rhyme or look worse, 3 do not. 10-year peak 5.26% vs 5.31% rhymes; 30-year peak 5.35% vs 5.67% worse; real yield 2.83% vs 2.95% worse; junk spread tight about 2.41% vs 2.60% rhymes; boom investment housing 6.6% vs tech 5.05% of GDP rhymes; fund gates BNP Paribas 2007 vs Blue Owl 2026 rhymes; the Fed cutting in 2007 vs hiking in 2026 worse; household debt 98.8% vs 66.6% does not; mortgage delinquency 2.71% vs 1.86% does not; borrowers households and banks vs the most profitable firms does not." width="800" height="507"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The scorecard: 2007 vs now on 10 indicators. Sources linked in the table above.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My read: 2007 in the plumbing, AI credit is the fuse
&lt;/h2&gt;

&lt;p&gt;This is opinion, built on the numbers above.&lt;/p&gt;

&lt;p&gt;2008 needed millions of households who could not pay. 2026 does not have that. What it has is a single investment theme carrying the economy at record size, paid for more and more with borrowed money, some of it parked off balance sheets, funded partly by private funds whose investors already want out, with long-term rates at 24-year highs and a Fed that is hiking instead of cutting. That is the 2007 setup in the bond and credit plumbing.&lt;/p&gt;

&lt;p&gt;So my bet: if this cracks, the first casualty is not a bank. It is a leveraged AI borrower: a neocloud, an SPV-financed data center whose tenant renegotiates, or a private credit fund heavy in software loans. The hyperscalers themselves are the last domino, not the first.&lt;/p&gt;

&lt;p&gt;The strongest case against me: AI revenue is real and growing (Anthropic reportedly grew sales 45% to $17 billion last quarter, per &lt;a href="https://abc17news.com/money/cnn-business-consumer/2026/10/15/global-tech-selloff-deepens-as-enthusiasm-for-ai-stocks-wobbles/" rel="noopener noreferrer"&gt;CNN&lt;/a&gt;), the big spenders can stop spending whenever they want, and households are in far better shape than in 2007. If revenue catches up with capex, this ends as an expensive boom, not a bust.&lt;/p&gt;

&lt;p&gt;What I'm watching, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Fed on &lt;a href="https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm" rel="noopener noreferrer"&gt;Oct 27 to 28&lt;/a&gt;. Another hike into a tech selloff is the 2008 mistake in reverse.&lt;/li&gt;
&lt;li&gt;The high-yield spread above 4%. That is roughly where 2007's "flinch" became a trend.&lt;/li&gt;
&lt;li&gt;Capex guidance at the next Big Tech earnings. One cut and the whole supply chain reprices.&lt;/li&gt;
&lt;li&gt;A fourth straight quarter of 5% gates at the private credit funds.&lt;/li&gt;
&lt;li&gt;The 10-year back above 5.31% &lt;em&gt;while&lt;/em&gt; stocks fall. That would mean bonds stopped being the safe place, which is worse than 2007.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10-year Treasury:&lt;/strong&gt; 4.96% (Oct 22), peak 5.31% (Oct 5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30-year Treasury:&lt;/strong&gt; 5.29% (Oct 22), peak 5.67% (Oct 7)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-yield spread:&lt;/strong&gt; 3.27% (Oct 21), up from 2.60% (Aug 28)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big 4 capex as % of operating cash:&lt;/strong&gt; 79% (latest four quarters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech investment, % of GDP:&lt;/strong&gt; 5.05% (Q2 2026, record)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fed funds:&lt;/strong&gt; 3.75% to 4% (next decision Oct 28)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2007 indicators that rhyme or look worse:&lt;/strong&gt; 7 of 10&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build with AI, the cost side of this story lands on you too: when capital gets scarce, compute prices and API prices are what moves. I track those in the &lt;a href="https://tensorust.com/tools/?utm_source=devto&amp;amp;utm_campaign=ai-bonds-2008" rel="noopener noreferrer"&gt;free tools&lt;/a&gt;, like the &lt;a href="https://tensorust.com/tools/llm-api-cost/?utm_source=devto&amp;amp;utm_campaign=ai-bonds-2008" rel="noopener noreferrer"&gt;LLM API cost calculator&lt;/a&gt;, and I wrote up what a GPU-hour really costs in &lt;a href="https://tensorust.com/articles/deepseek-deepinfer/?utm_source=devto&amp;amp;utm_campaign=ai-bonds-2008" rel="noopener noreferrer"&gt;the DeepSeek engine teardown&lt;/a&gt;. More pieces on the business side of AI live in the &lt;a href="https://tensorust.com/articles/topic/ai-industry/?utm_source=devto&amp;amp;utm_campaign=ai-bonds-2008" rel="noopener noreferrer"&gt;AI industry hub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not financial advice. I'm not telling anyone to buy or sell anything; this is public data and my read of it.&lt;/p&gt;

&lt;p&gt;Which of the 10 indicators do you think I scored wrong? Tell me which one, and why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow for the next data check:&lt;/strong&gt; I'll re-run every number in this dataset after the Fed's Oct 28 decision. Get it by email the day it's out: &lt;a href="https://tensorust.com/newsletter/?utm_source=devto&amp;amp;utm_campaign=ai-bonds-2008" rel="noopener noreferrer"&gt;join the free Tensorust newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>finance</category>
      <category>datascience</category>
      <category>economics</category>
    </item>
    <item>
      <title>Borrow Balatro's UI grammar, not its cards: 5 builds in one night</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:58:10 +0000</pubDate>
      <link>https://dev.to/mattbusel/borrow-balatros-ui-grammar-not-its-cards-5-builds-in-one-night-3e1i</link>
      <guid>https://dev.to/mattbusel/borrow-balatros-ui-grammar-not-its-cards-5-builds-in-one-night-3e1i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/balatro-ui-design/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; If your game's menus feel bad, copy how a beloved game's interface &lt;em&gt;behaves&lt;/em&gt; (things lift when you hover, buttons sink when you press, panels pop in) and never copy what it &lt;em&gt;shows&lt;/em&gt;. Every object on screen should be a thing from your own world. We did exactly that to our free Steam game &lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=build18-ui" rel="noopener noreferrer"&gt;O'BLOCK&lt;/a&gt; overnight: one player's bug list, &lt;strong&gt;5 builds&lt;/strong&gt;, a Balatro phase we had to walk back, and a &lt;strong&gt;Build 18&lt;/strong&gt; where the street is a wall of shoeboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; A player sent a list. The scroll wheel moved the wrong thing, a card was drawn under the text, a price was "stuck at 1.1k". Fixing those was easy. The real fix was a design rule: steal the grammar, never the nouns. The street went from &lt;strong&gt;8 rows in a scroll list to 27 shoeboxes on one screen&lt;/strong&gt; (up to 42 when the boxes shrink), and 1,665 lines of Rust changed to get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 23 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Builds shipped in one night&lt;/td&gt;
&lt;td&gt;5 (Builds 14 to 18)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://store.steampowered.com/news/app/5357680/view/680764929940133153" rel="noopener noreferrer"&gt;Steam update post&lt;/a&gt;, live ~1:20 AM ET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Walk-ups on the street screen at once&lt;/td&gt;
&lt;td&gt;8 before, 27 after (42 at smallest)&lt;/td&gt;
&lt;td&gt;game source, before vs after&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presses to price a custom shoe from $1,100 to $10,000&lt;/td&gt;
&lt;td&gt;178 before, 47 after (and you can hold the key)&lt;/td&gt;
&lt;td&gt;both step rules, simulated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game source changed&lt;/td&gt;
&lt;td&gt;18 files, +1,665 / -737 lines&lt;/td&gt;
&lt;td&gt;git diff of the source trees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New UI modules&lt;/td&gt;
&lt;td&gt;4 files, 1,241 lines&lt;/td&gt;
&lt;td&gt;bal.rs, streetui.rs, titleui.rs, dayui.rs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source files now drawing through the new UI kit&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;grep of the Build 18 source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated tests passing at ship&lt;/td&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;td&gt;cargo test, Build 18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/balatro-ui-design/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, 27 before/after rows: diff stats, screen capacity, price steps, scrutiny math, and how each was measured).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6361h25g98nmwlyc6rrf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6361h25g98nmwlyc6rrf.gif" alt="Animated bar chart titled One honest bug list, fixed in numbers. Before versus Build 18: walk-ups on screen at once 8 versus 27 (up to 42 when boxes shrink); presses to raise a custom shoe from $1,100 to $10,000, 178 versus 47; think tank cooling 0.2 versus 0.6 scrutiny points a day, plus CLEAN HOUSE minus 30 in one move; custom shoe price ceiling $10K versus $25K." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our data: O'BLOCK game source, Oct 22 11:39 PM ET snapshot vs Build 18 (live Oct 23 ~1:20 AM ET). Each row on its own scale. Static frame: hero.png; full table in the CSV.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  One honest bug list beat weeks of guessing
&lt;/h2&gt;

&lt;p&gt;O'BLOCK is a sneaker-reseller game with exactly one verb: &lt;strong&gt;you name a price&lt;/strong&gt;. Someone walks up with a pair, you say a number, and they take it, counter, or walk. Everything else in the game exists to make that one moment richer.&lt;/p&gt;

&lt;p&gt;On October 22 at about 9 PM ET, one tester sent a list. No essay, no rating, just what annoyed them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mouse wheel moved the selected person instead of scrolling the list.&lt;/li&gt;
&lt;li&gt;A lot-details card was drawn &lt;em&gt;under&lt;/em&gt; the feed, so text ran straight through it.&lt;/li&gt;
&lt;li&gt;The gold street-price stretch on the price bar was too slim to read.&lt;/li&gt;
&lt;li&gt;There was no way to bring scrutiny back down once it climbed.&lt;/li&gt;
&lt;li&gt;A custom sneaker price was "stuck at 1.1k".&lt;/li&gt;
&lt;li&gt;And the line that mattered most: "the whole list interface is not the greatest".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last line is the kind of feedback devs love to dismiss because it is vague. I think it was the most useful sentence in the list. Every specific bug was a symptom of it. My take: &lt;strong&gt;one player telling you the truth is worth more than a month of you staring at your own screens&lt;/strong&gt;, because you stopped seeing them weeks ago.&lt;/p&gt;
&lt;h2&gt;
  
  
  Every bug had a boring root cause
&lt;/h2&gt;

&lt;p&gt;None of these were mysteries once we read the code. That is the uncomfortable part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The wheel.&lt;/strong&gt; Each wheel notch was being turned into an Up or Down key press. So scrolling moved the selection, and any tiny mouse jitter snapped the selection back to whatever row the pointer sat on. The fix: the wheel now scrolls a view window that is independent of the selection. The window only follows the selection when the selection itself moves. Lists also got draggable scrollbars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The card under the text.&lt;/strong&gt; O'BLOCK runs on our own Rust engine, Proof Engine. It paints text in a HUD pass that sits above every world-pass particle panel. So a panel drawn later in the frame could never cover text drawn earlier. The pop-over card was drawn "on top" in code order and underneath on screen. The fix was a new panel type that lives in the HUD pass, in order with the text around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stuck price.&lt;/strong&gt; It was never a hard stop at $1,100. Above $1,000 the custom shoe price went up &lt;strong&gt;$50 a press&lt;/strong&gt;, with no key repeat, up to a $10,000 cap. Getting from $1,100 to $10,000 took &lt;strong&gt;178 separate presses&lt;/strong&gt;. It felt stuck because it basically was. Now each step is about 5% on round numbers, holding the key repeats, and the cap is $25,000. Same trip: &lt;strong&gt;47 steps&lt;/strong&gt;. A unit test walks the whole range up and down and fails if any step ever fails to move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scrutiny.&lt;/strong&gt; It only cooled 1.5% a day on its own. So we added a lever, &lt;strong&gt;CLEAN HOUSE&lt;/strong&gt;: compliance hires, quiet settlements, a crisis PR firm, minus 30 scrutiny, and pricier the hotter you are. The think tank now cools three times as fast as it did (0.6 points a day, up from 0.2).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9bkqtunm226onon34c0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9bkqtunm226onon34c0.jpg" alt="O'BLOCK's POWER tab in Build 18: a list of moves (lobby to cut footwear tariffs, lobby to cut capital gains, buy a network, a word with the Fed, zoning friends, a think tank, CLEAN HOUSE: compliance hires, quiet settlements, a crisis PR firm, scrutiny drops 30, pricier the hotter you are) beside a SCRUTINY meter at 8 of 100 that says over 60 and scandals start, and how to lower it." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;CLEAN HOUSE is new in Build 18: minus 30 scrutiny, priced by how hot you are. Build 18 in-game screenshot, 1920x1080, captured Oct 23 2026 (ET).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The price bar got the same treatment. The gold stretch is now a wide, labelled &lt;strong&gt;STREET PRICE&lt;/strong&gt; zone, and it says out loud whether you are under it, in it, or over it. That bar is where the one verb happens. It should be the most readable thing in the game, and it was one of the least.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbixthes699q4ohidf74a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbixthes699q4ohidf74a.jpg" alt="O'BLOCK's deal screen in Build 18: Coach Mo buying a Jordyn 1 Bred, size 10, very near deadstock. The street says $2,872 to $6,103. A price bar shows YOU WANT $6,100 with a wide gold zone labelled STREET PRICE, you're in it, between $449 and $13.5K, and buttons for price, say it and walk away." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The price bar's gold zone is now a wide, labelled STREET PRICE band that says under, in or over. Build 18 in-game screenshot, 1920x1080, captured Oct 23 2026 (ET).&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Then we stole from the best: Balatro
&lt;/h2&gt;

&lt;p&gt;Bugs fixed, the list still looked like a spreadsheet. So the developer asked for something bigger: "use menus from very popular games people like".&lt;/p&gt;

&lt;p&gt;We picked &lt;a href="https://store.steampowered.com/app/2379780/Balatro/" rel="noopener noreferrer"&gt;Balatro&lt;/a&gt;, LocalThunk's poker roguelike (&lt;a href="https://en.wikipedia.org/wiki/Balatro_(video_game)" rel="noopener noreferrer"&gt;released February 2024&lt;/a&gt;, published by Playstack). If you have played it you know the feel without being able to name it: a stat sidebar on the left, a row of jokers, a hand of cards that lift when you hover, fat buttons that sink when you press them, everything popping in like it has weight. It makes adding numbers feel like pulling a slot machine. (We have taken Balatro apart before, from the other end: &lt;a href="https://tensorust.com/articles/balatro-save-file/" rel="noopener noreferrer"&gt;its save file runs as code&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;We rebuilt O'BLOCK in that language. Left stat sidebar, a joker row, the walk-ups as a hand of cards, chunky buttons, a boot intro. The developer loved it. Then, in the same breath: &lt;strong&gt;"cards don't make sense"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;He was right. O'BLOCK is not a card game. There is no deck. A card on screen asks the player to think in a fiction the game does not have.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cards became shoeboxes
&lt;/h2&gt;

&lt;p&gt;So every card became a thing that already lives in a sneaker reseller's world.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walk-ups became shoeboxes.&lt;/strong&gt; Lid up, a polaroid of the person taped to it, the pair sitting on the rim, and a BUY, SELL or LOT sticker on the front. Done deals get taped shut and stamped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angles&lt;/strong&gt; (O'BLOCK's version of jokers, the passive edges you collect) became &lt;strong&gt;hang tags on a rail&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The end of the day became a printed receipt&lt;/strong&gt;: what you sold, to whom, for how much, cash at the bottom, a barcode, "keep the receipts".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapi7zx2pr7gjy24jlc1r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapi7zx2pr7gjy24jlc1r.jpg" alt="Before and after of O'BLOCK's day-end screen. Before: a black panel reading DAY 1, sold Jordyn 1 Bred to Lil Reece for $410, overnight dead week, cash $299. After, Build 18: a printed paper receipt headed O'BLOCK, The Block, Day 1, listing the sale, CASH $298, a barcode and keep the receipts, next to stat boxes and a NEXT DAY button." width="800" height="250"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The day end became a printed receipt. Left: before. Right: Build 18. In-game screenshots, Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Design people have a word for this: &lt;a href="https://en.wikipedia.org/wiki/Diegesis" rel="noopener noreferrer"&gt;diegetic&lt;/a&gt; interface, UI that exists inside the fiction instead of floating over it. And a warning word too, &lt;a href="https://www.nngroup.com/articles/skeuomorphism/" rel="noopener noreferrer"&gt;skeuomorphism&lt;/a&gt;, which Nielsen Norman Group defines as "incorporating real-world elements into digital interfaces to create a sense of familiarity". NN/g splits it in two: a functional learning aid, and a visual trend critiqued for real-world detail "not necessary for functionality". Leather stitching on a calendar app is the second kind. The shoeboxes are meant to be the first. They carry information. A taped-shut box &lt;em&gt;is&lt;/em&gt; the deal status. A stamp &lt;em&gt;is&lt;/em&gt; the outcome. You read the street the way a reseller reads a shelf.&lt;/p&gt;
&lt;h2&gt;
  
  
  "Too much like Balatro": the line that saved the redesign
&lt;/h2&gt;

&lt;p&gt;Shoeboxes fixed the nouns. The layout was still Balatro's skeleton with sneaker skin on it. The developer called it before any player did:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"too much like Balatro... people should see it's inspired but not a direct rip off"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the moment most solo devs would argue, because the thing works and it is 1 AM. We did not argue. The layout was rebuilt around the setting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A green &lt;strong&gt;Chicago street sign&lt;/strong&gt; as the top strip, with the place and the day on it.&lt;/li&gt;
&lt;li&gt;The street became a &lt;strong&gt;sneaker wall&lt;/strong&gt;: shelves of shoeboxes, one per person who walked up.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;counter&lt;/strong&gt; panel where the selected deal sits.&lt;/li&gt;
&lt;li&gt;The feed became &lt;strong&gt;a phone&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Angles hang on a &lt;strong&gt;hook rail&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your actions live in &lt;strong&gt;a dock&lt;/strong&gt; along the bottom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What survived from Balatro is all verbs: hover lifts, press sinks, things pop in, a sidebar of stats you glance at, chunky targets you can hit without aiming (&lt;a href="https://en.wikipedia.org/wiki/Fitts%27s_law" rel="noopener noreferrer"&gt;Fitts's law&lt;/a&gt;, the old rule that big close targets are faster to hit, is doing real work there). What left is every noun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndpd9avpwm4humccxhut.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndpd9avpwm4humccxhut.jpg" alt="Before and after of O'BLOCK's street screen. Before: a WALK-UPS text list showing 8 rows (1 to 8 of 12) beside THE FEED and THE LADDER panels. After, Build 18: a green street sign reading THE BLOCK top left, a stat strip, 12 shoeboxes on two shelves each with a polaroid of the person, the pair and a BUY, SELL or LOT sticker, the feed as a phone, angle hang tags on a rail, a counter panel with a DEAL button and a dock of outlined buttons." width="800" height="250"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Same street, day 1. Left: before (8 rows of a 12-person list). Right: Build 18's sneaker wall. In-game screenshots, Oct 23 2026.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The last 10%: nothing overlaps, and the colors come home
&lt;/h2&gt;

&lt;p&gt;Two more notes from the developer: the dock buttons overlapped, and the new colors did not match the game's own.&lt;/p&gt;

&lt;p&gt;Both were fair. Every button row now shrinks to fit its space instead of assuming it has room. The wall adds columns and shrinks boxes as the street gets busy: with &lt;strong&gt;31 walk-ups&lt;/strong&gt; it lays out 11 columns of boxes at 81% size on three shelves, and none of them slide behind the counter. At 9 or fewer it stays one shelf at full size. The code caps it at 14 columns, so &lt;strong&gt;42 people&lt;/strong&gt; fit on three shelves before a fourth appears.&lt;/p&gt;

&lt;p&gt;And the palette went back home: near-black panels, gold for the thing you should do next, cyan, cash green, streetlight sodium, red for loss and walking away, with the game's original outlined buttons. The Balatro phase had drifted into a card-table palette. A borrowed palette is a borrowed identity, and it was the last thing still saying "rip-off".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2hrwo6lnhquw0695mff4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2hrwo6lnhquw0695mff4.jpg" alt="O'BLOCK Build 18 late game, day 60, cash $971.0M: a sneaker wall with three shelves of up to 11 shoeboxes (31 walk-ups), labelled LOT, SELL, BUY and CONSIGN, a phone-shaped feed with four posts, a counter showing a customs auction pallet of 4.3M pairs with a DEAL button, a Name a price box and a dock of buttons, none overlapping." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;31 walk-ups, 11 columns, boxes at 81% size, three shelves, nothing behind the counter. Build 18 in-game screenshot, 1920x1080, captured Oct 23 2026 (ET).&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The engine lesson: draw order is a design decision
&lt;/h2&gt;

&lt;p&gt;This part is for anyone writing their own renderer. In Proof Engine, filled rectangles in the world pass sit &lt;em&gt;under&lt;/em&gt; the backdrop particles, and any non-black world-pass fill picks up stripes from the post-processing. Neither is a bug on its own. Together they mean a UI built in the world pass can never be both crisp and correctly layered.&lt;/p&gt;

&lt;p&gt;So the whole table UI moved to the ordered HUD pass, with crisp rects. The new kit, &lt;code&gt;bal.rs&lt;/code&gt;, is 322 lines, and its first rule is in the comment at the top: everything paints in the HUD pass, in draw order, "so a box drawn after some text covers it, like any normal UI." The core of it is tiny:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// Paint a cloud in the HUD pass, in order with the text around it.&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;hud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;UiLayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="nf"&gt;.begin_hud&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.flush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="nf"&gt;.end_pass&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;15 source files now draw through that kit, from the title screen to the day-end receipt. The old street code in &lt;code&gt;main.rs&lt;/code&gt; lost 620 lines and gained 240. My opinion: if your engine has more than one pass, decide which pass your UI lives in on day one. We decided it on day four of a live game, at midnight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design rules we're keeping
&lt;/h2&gt;

&lt;p&gt;These are opinions, not laws. They are what this night taught us.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Borrow a beloved game's interaction grammar, never its nouns.&lt;/strong&gt; Hover lifts, chunky buttons and things popping in are a language players already speak. Cards, jokers and chips are someone else's world.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every UI object should be a thing from your world.&lt;/strong&gt; Shoeboxes, receipts, hang tags, a street sign, a phone. If you can't name the real object a panel is, the panel is probably a rectangle you haven't designed yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legibility serves the one verb.&lt;/strong&gt; O'BLOCK has one action, naming a price. The STREET PRICE zone, the counter and the wall all exist so that moment is easy to read. Anything that competes with it loses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One honest player list beats weeks of guessing.&lt;/strong&gt; We built that street screen and stopped seeing it. It took one person who didn't owe us anything to say it wasn't good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate in public with a human who will say "no, that's a rip-off".&lt;/strong&gt; Five builds in one night is fast. Speed makes it easy to ship something derivative before anyone blinks. The check was a person saying no, twice: once to the cards, once to the layout.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How this should make O'BLOCK better
&lt;/h2&gt;

&lt;p&gt;Here is my bet, and it is a bet, not a result yet. O'BLOCK's problem since launch has not been getting people in the door. It has been keeping them: &lt;strong&gt;3,898 people have claimed the game and 68 have played it, with a median session of 10 minutes&lt;/strong&gt; (Steamworks, read 12:40 PM ET Oct 22). Ten minutes is about how long it takes to decide a screen is a spreadsheet.&lt;/p&gt;

&lt;p&gt;The old street showed eight rows of text. The new one shows the whole block at once, as people, with their boxes, their pairs and what they want. That should make the first ten minutes about &lt;em&gt;reading people&lt;/em&gt;, which is the actual game, instead of reading a list. If the redesign works, median playtime goes up. If it doesn't, the receipt will say so.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9la6tohc1eutyb7pvuqo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9la6tohc1eutyb7pvuqo.jpg" alt="Before and after of O'BLOCK's title screen. Before: a spaced-out O'BLOCK logo with a text menu (continue, new run, the book, how it works, settings, quit) and four sneaker sprites. After, Build 18: a big O'BLOCK logo with a sneaker, NAME A PRICE., floating shoeboxes on either side, CONTINUE and NEW RUN buttons and a row of THE BOOK, LEADERBOARDS, HOW IT WORKS, SETTINGS and QUIT buttons over the city at night." width="800" height="250"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Title screen, before vs Build 18. In-game screenshots, Oct 23 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build 18 live on Steam:&lt;/strong&gt; Oct 23 2026, ~1:20 AM ET (&lt;a href="https://store.steampowered.com/news/app/5357680/view/680764929940133153" rel="noopener noreferrer"&gt;update post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds in one night:&lt;/strong&gt; 5 (14 to 18)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests passing:&lt;/strong&gt; 172&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims / players / median session:&lt;/strong&gt; 3,898 / 68 / 10 minutes (Steamworks, Oct 22 12:40 PM ET, before Build 18)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporter Packs sold:&lt;/strong&gt; 1 (same reading)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will re-read the same Steamworks numbers after a week on Build 18 and publish them, good or bad. More on how the launch went in &lt;a href="https://tensorust.com/articles/oblock-launch/" rel="noopener noreferrer"&gt;what a 30 GB download did to our free launch&lt;/a&gt;, and more game-dev receipts in the &lt;a href="https://tensorust.com/articles/topic/game-dev/" rel="noopener noreferrer"&gt;game-dev hub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Where is the line for you? Is borrowing a hit game's UI grammar fair game, or does a hover-lift and a chunky button already count as copying Balatro? And what is the one screen in your own game that a stranger would call "not the greatest"?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=build18-ui" rel="noopener noreferrer"&gt;Play O'BLOCK free on Steam&lt;/a&gt;&lt;/strong&gt; and judge the wall yourself before the Halloween event starts Oct 24. If it earns a few of your evenings, the &lt;a href="https://store.steampowered.com/app/5357810/?utm_source=devto&amp;amp;utm_campaign=build18-ui" rel="noopener noreferrer"&gt;$4.99 Supporter Pack&lt;/a&gt; is how it stays free.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>rust</category>
      <category>ux</category>
      <category>design</category>
    </item>
    <item>
      <title>Xbox's new cloud cap can't finish 42% of its own games</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:57:02 +0000</pubDate>
      <link>https://dev.to/mattbusel/xboxs-new-cloud-cap-cant-finish-42-of-its-own-games-5b6j</link>
      <guid>https://dev.to/mattbusel/xboxs-new-cloud-cap-cant-finish-42-of-its-own-games-5b6j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/xbox-cloud-gaming-hours-cap/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; From November, Xbox Cloud Gaming stops being unlimited. Game Pass Ultimate includes &lt;strong&gt;15 hours&lt;/strong&gt; a month, Premium 10, Essential 5, and everything past that is sold by the hour at &lt;strong&gt;24 to 40 cents&lt;/strong&gt;. We checked every game in Xbox's own cloud catalog against real completion times: &lt;strong&gt;196 of the 464 we could time (42%)&lt;/strong&gt; take longer than 15 hours just to finish the main story, so you can check your backlog before the meter starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Know tonight what your games will cost to stream, and how to pay nothing. Xbox says the cap only touches "4% of Game Pass subscribers." I checked all 562 games in the Xbox Cloud catalog against HowLongToBeat completion times. Of the 464 with enough data, 42% can't be finished inside a month of the most expensive tier. Microsoft isn't selling you games anymore. It's renting you hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source, checked Oct 22 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloud hours included per month (Ultimate / Premium / Essential)&lt;/td&gt;
&lt;td&gt;15 / 10 / 5&lt;/td&gt;
&lt;td&gt;&lt;a href="https://news.xbox.com/en-us/2026/09/03/xbox-cloud-gaming-changes/" rel="noopener noreferrer"&gt;Xbox Wire, Sep 3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hour packs (introductory)&lt;/td&gt;
&lt;td&gt;10 h $3.99, 25 h $7.99, 50 h $11.99&lt;/td&gt;
&lt;td&gt;&lt;a href="https://news.xbox.com/en-us/2026/10/21/cloud-playtime-now-available-to-test-with-xbox-insiders/" rel="noopener noreferrer"&gt;Xbox Wire, Oct 21&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price per streamed hour&lt;/td&gt;
&lt;td&gt;$0.24 to $0.40 (packs), $1.53 (Ultimate, cloud only)&lt;/td&gt;
&lt;td&gt;our math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud games whose main story runs past 15 h&lt;/td&gt;
&lt;td&gt;196 of 464 (42%)&lt;/td&gt;
&lt;td&gt;our dataset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Past Premium's 10 h / Essential's 5 h&lt;/td&gt;
&lt;td&gt;62% / 88%&lt;/td&gt;
&lt;td&gt;our dataset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median main story, Xbox cloud game&lt;/td&gt;
&lt;td&gt;12.6 h (22.2 h with side content)&lt;/td&gt;
&lt;td&gt;HowLongToBeat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cheapest packs to stream every main story in the catalog once&lt;/td&gt;
&lt;td&gt;$2,210.15 (9,202 h)&lt;/td&gt;
&lt;td&gt;our math&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://tensorust.com/articles/xbox-cloud-gaming-hours-cap/data.csv" rel="noopener noreferrer"&gt;Download the data&lt;/a&gt; (CSV, one row per timed game: Xbox price, HowLongToBeat hours, months of Ultimate, cheapest pack cost).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxp08f505tp7dre5p90gs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxp08f505tp7dre5p90gs.gif" alt="Animated bar chart titled 42% of Xbox's cloud games outlast a month of Ultimate. Main-story length of 464 Xbox Cloud Gaming titles from HowLongToBeat, bucketed 0-5, 5-10, 10-15, 15-20, 20-30, 30-50 and 50+ hours, with lines at the new monthly caps: 5 hours Essential, 10 hours Premium, 15 hours Ultimate. 196 games are longer than 15 hours, 287 longer than 10, 408 longer than 5." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our dataset: Xbox Cloud Gaming catalog (562 titles) x HowLongToBeat main-story medians, read 8:30 AM ET Oct 22 2026. Static frame: hero.png.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Xbox actually announced
&lt;/h2&gt;

&lt;p&gt;Two posts, seven weeks apart, and together they end unlimited cloud gaming.&lt;/p&gt;

&lt;p&gt;On September 3, &lt;a href="https://news.xbox.com/en-us/2026/09/03/xbox-cloud-gaming-changes/" rel="noopener noreferrer"&gt;Xbox Wire&lt;/a&gt; said that "beginning in November," Game Pass plans "will include a set number of cloud gaming hours each month": &lt;strong&gt;15&lt;/strong&gt; for Ultimate, &lt;strong&gt;10&lt;/strong&gt; for Premium, &lt;strong&gt;5&lt;/strong&gt; for Essential. Their reason, in their words: "the cost of providing cloud gaming grows as more people use it and play for longer." Their reassurance: "We expect this upcoming change to impact 4% of Game Pass subscribers."&lt;/p&gt;

&lt;p&gt;On October 21, the price tag landed. Xbox Insiders without Game Pass can now &lt;a href="https://news.xbox.com/en-us/2026/10/21/cloud-playtime-now-available-to-test-with-xbox-insiders/" rel="noopener noreferrer"&gt;buy cloud playtime&lt;/a&gt; at "introductory launch pricing": &lt;strong&gt;10 hours for $3.99, 25 for $7.99, 50 for $11.99&lt;/strong&gt;, hours that stay "available until it's used," with a broader rollout in November. The fine print: it "requires cloud playable game purchase." You stream games you already bought, and you pay again for every hour you play them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/Wario64/status/2112968196001296537" rel="noopener noreferrer"&gt;Wario64's post&lt;/a&gt; of the prices crossed &lt;strong&gt;1 million views&lt;/strong&gt; in under a day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwctim03s6ihsph2d9pj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwctim03s6ihsph2d9pj.png" alt="Screenshot of a post by Wario64, Oct 21 2026 2:04 PM: Xbox Cloud Gaming introductory launch pricing revealed, 10 hours for $3.99, 25 hours for $7.99, 50 hours for $11.99, with the Xbox Wire preview showing the Insider announcement, playtime that remains available until it's used, and the footnote that it requires a cloud playable game purchase. 1 million views." width="800" height="727"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@Wario64 on X, Oct 21 2026, captured 8:40 AM ET Oct 22 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I checked all 562 cloud games. Here's who the cap hits
&lt;/h2&gt;

&lt;p&gt;"4% of subscribers" is a claim about people. I wanted the version about games, because games are what you actually sit down to finish.&lt;/p&gt;

&lt;p&gt;At 8:30 AM ET today I pulled Xbox's own list of every Cloud Gaming title (562 games, from Xbox's public Game Pass catalog feed behind &lt;a href="https://www.xbox.com/en-US/play" rel="noopener noreferrer"&gt;xbox.com/play&lt;/a&gt;), with each game's US price from the Microsoft Store. Then I looked up each one on &lt;a href="https://howlongtobeat.com/" rel="noopener noreferrer"&gt;HowLongToBeat&lt;/a&gt;, the crowd-sourced database where players log how long a game took them. 520 matched, and 464 had a main-story time from at least three players. Those 464 are the sample below.&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;196 games (42%)&lt;/strong&gt; take more than &lt;strong&gt;15 hours&lt;/strong&gt; to finish the main story. That's a full month of Ultimate, the top tier, gone before the credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;62%&lt;/strong&gt; outlast Premium's 10 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;88%&lt;/strong&gt; outlast Essential's 5 hours. On the cheapest tier, almost nothing in the catalog is finishable in a month.&lt;/li&gt;
&lt;li&gt;Count the side content most people actually play, and &lt;strong&gt;64%&lt;/strong&gt; run past 15 hours.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The median cloud game takes &lt;strong&gt;12.6 hours&lt;/strong&gt; to beat. The median game with its extras takes &lt;strong&gt;22.2&lt;/strong&gt;. Those numbers are the entire business model in one line: the typical game is built to be longer than the allowance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribers now pay the most per hour
&lt;/h2&gt;

&lt;p&gt;Here's the part that made me laugh out loud. Do the per-hour math and the cheapest way to stream is to &lt;em&gt;not&lt;/em&gt; subscribe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50-hour pack:&lt;/strong&gt; $11.99, which is &lt;strong&gt;$0.24&lt;/strong&gt; an hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;25-hour pack:&lt;/strong&gt; $7.99, &lt;strong&gt;$0.32&lt;/strong&gt; an hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10-hour pack:&lt;/strong&gt; $3.99, &lt;strong&gt;$0.40&lt;/strong&gt; an hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game Pass Ultimate:&lt;/strong&gt; &lt;a href="https://news.xbox.com/en-us/2026/04/21/xbox-game-pass-update/" rel="noopener noreferrer"&gt;$22.99 a month&lt;/a&gt; for 15 cloud hours, which is &lt;strong&gt;$1.53&lt;/strong&gt; per streamed hour if streaming is what you pay it for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be fair to Xbox, Ultimate also gets you the Game Pass library, PC Game Pass and online multiplayer, so the $1.53 isn't the whole value. But if you're one of the people who bought Ultimate specifically to play on a phone, a TV stick or a work laptop, you just became the worst-value customer Microsoft has. lowkey wild.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh54pcb6dcg0dr73j9zux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh54pcb6dcg0dr73j9zux.png" alt="Bar chart of what one hour of Xbox cloud gaming costs in the US: 50-hour pack $11.99 is $0.24 an hour, 25-hour pack $7.99 is $0.32, 10-hour pack $3.99 is $0.40, and Game Pass Ultimate at $22.99 for 15 cloud hours is $1.53 per streamed hour, with a note that Ultimate also includes the library and online play." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sources: Xbox Wire Oct 21 2026 (packs), Sep 3 2026 (15 h cap), Apr 21 2026 ($22.99 Ultimate). Read 8:30 AM ET Oct 22.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The games that cost real money to stream
&lt;/h2&gt;

&lt;p&gt;Among the popular cloud games (300+ completions logged), the long ones aren't niche. They're the headliners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persona 5 Royal:&lt;/strong&gt; 101 hours of main story, which is 7 months of Ultimate's cloud allowance or $27.97 in packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mass Effect Legendary Edition:&lt;/strong&gt; 61 hours of main story, which is 5 months of Ultimate's cloud allowance or $19.97 in packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assassin's Creed Valhalla:&lt;/strong&gt; 61 hours of main story, which is 5 months of Ultimate's cloud allowance or $19.97 in packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kingdom Come: Deliverance II:&lt;/strong&gt; 56 hours of main story, which is 4 months of Ultimate's cloud allowance or $15.98 in packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Halo: The Master Chief Collection:&lt;/strong&gt; 43 hours of main story, which is 3 months of Ultimate's cloud allowance or $11.99 in packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hogwarts Legacy:&lt;/strong&gt; 27 hours of main story, which is 2 months of Ultimate's cloud allowance or $11.97 in packs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stream every main story in the catalog once, at the cheapest pack mix, and the bill is &lt;strong&gt;$2,210.15&lt;/strong&gt; for 9,202 hours. The median game costs &lt;strong&gt;$7.98&lt;/strong&gt; in packs to finish. For a game you already paid for.&lt;/p&gt;

&lt;p&gt;And the punchline: &lt;strong&gt;27 of the 425&lt;/strong&gt; paid games now cost more to stream to the credits than to buy outright at today's US store price. Fallout 4 is $4.99 to own and $11.97 in packs to stream its main story. Mass Effect Legendary Edition: $14.99 to own, $19.97 to stream. Renting is now more expensive than buying. cooked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ia7ty0zba4uxatlo0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9ia7ty0zba4uxatlo0s.png" alt="Horizontal bar chart of the longest popular Xbox cloud games by HowLongToBeat main-story hours, each with the months of Ultimate cloud time and the cheapest pack cost to finish: Persona 5 Royal 101 hours, 7 months, $27.97; Warhammer 40,000: Rogue Trader 72 hours, 5 months, $19.98; Mass Effect Legendary Edition 61 hours, 5 months, $19.97; Assassin's Creed Valhalla 61 hours, 5 months, $19.97; Like a Dragon: Infinite Wealth 57 hours, 4 months, $15.98; Kingdom Come: Deliverance II 56 hours, 4 months, $15.98; Dragon Age: Inquisition 47 hours, 4 months, $11.99; Assassin's Creed Odyssey 46 hours, 4 months, $11.99; Halo: The Master Chief Collection 43 hours, 3 months, $11.99; DEATH STRANDING DIRECTOR'S CUT 38 hours, 3 months, $11.99." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;HowLongToBeat main-story medians (games with 300+ logged completions), read Oct 22 2026; pack cost = cheapest mix of 10/25/50 h packs.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  GTA VI lands the same month the meter starts
&lt;/h2&gt;

&lt;p&gt;GTA VI comes out on &lt;strong&gt;November 19&lt;/strong&gt;. The cap starts in November. Earlier this month The Verge's Tom Warren reported that Xbox had secured GTA VI streaming rights, then corrected the story; Xbox chief strategy officer Matthew Ball &lt;a href="https://x.com/ballmatthew/status/2107667069797802443" rel="noopener noreferrer"&gt;pushed back&lt;/a&gt;: "the game will not be streaming exclusively or to PC." Whether it streams on Xbox Cloud at all is still not confirmed.&lt;/p&gt;

&lt;p&gt;So use the closest real number. &lt;strong&gt;GTA V's main story is 32.1 hours&lt;/strong&gt; on HowLongToBeat (3,381 logged runs). A month of Ultimate's cloud allowance covers &lt;strong&gt;47%&lt;/strong&gt; of that. If GTA VI is even as long as its predecessor, the biggest launch of the decade becomes a two-month cloud subscription or a $11.99 pack.&lt;/p&gt;

&lt;p&gt;My read, and I'll say it plainly: the timing is not a coincidence. You don't put a price on cloud hours four weeks before what will probably be the biggest game launch ever unless you've modeled exactly how many people will want to play it somewhere other than a console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F29p8890x2jnes7smhrp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F29p8890x2jnes7smhrp8.png" alt="Card: GTA VI lands November 19, the same month the meter starts. GTA V's main story is 32.1 hours on HowLongToBeat (3,381 runs); Ultimate includes 15 cloud hours a month, 47% of that story; the cheapest packs to cover it cost $11.99. Note: GTA VI's length is unknown and its availability on Xbox Cloud is not confirmed." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sources: HowLongToBeat GTA V (read Oct 22 2026), Xbox Wire Sep 3 + Oct 21 2026, @ballmatthew Oct 6 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The $1,800 console and the metered cloud are the same plan
&lt;/h2&gt;

&lt;p&gt;Zoom out and it gets worse. On October 20, &lt;a href="https://fortune.com/2026/10/20/the-non-gamer-ceo-racing-to-save-microsofts-xbox/" rel="noopener noreferrer"&gt;Fortune reported&lt;/a&gt; that the next Xbox console, Project Helix, "has internally been projected to cost consumers between $1,200 and $1,800" unless Microsoft subsidizes it, with a 2028 holiday target. The same piece says Xbox is planning to let players pick Game Pass features "a la carte," with cloud gaming as one of the add-ons.&lt;/p&gt;

&lt;p&gt;Put those together. For years the pitch was: you don't need the box, play anywhere, the cloud is the cheap way in. Now the box is projected at four figures and the cheap way in has a taxi meter. Both doors to Xbox are getting more expensive at the same time.&lt;/p&gt;

&lt;p&gt;Here's what I think is really happening: cloud gaming was always a customer-acquisition cost, and Microsoft just decided it has acquired enough customers. The "4%" line is the tell. You only quote the smallest possible number when the real story is the direction, not the size.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmr933fcvv0zriwof1qod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmr933fcvv0zriwof1qod.png" alt="Two-panel card titled both doors got more expensive. The box: the next Xbox console, Project Helix, internally projected at $1,200 to $1,800 per Fortune, unless Microsoft subsidizes it, holiday 2028 target. The cloud: 24 to 40 cents an hour after 15, 10 or 5 included hours a month from November, and Fortune reports cloud may become an a la carte Game Pass add-on." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sources: Fortune, Oct 20 2026; Xbox Wire Sep 3 + Oct 21 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Worst take of the day
&lt;/h2&gt;

&lt;p&gt;Credit where due: most big gaming accounts reported the prices straight. Then there's &lt;a href="https://x.com/Colteastwood/status/2112970400053559437" rel="noopener noreferrer"&gt;@Colteastwood&lt;/a&gt;, who called them "major chunks of playtime 15, 25 and 50 hours that roll over each month!" The packs are 10, 25 and 50 hours, they're bought, not given, and the thing that "rolls over" is your own money. A 15-hour "major chunk" doesn't finish 42% of the catalog it's meant for. Colt, I'll take the other side of this one any day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrbn9gmqagpdimtvokbh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrbn9gmqagpdimtvokbh.png" alt="Screenshot of a post by colteastwood, Oct 21 2026 2:12 PM: XBOX Cloud Gaming is now adding major chunks of playtime 15, 25 and 50 hours that roll over each month! Available to Insider Hub for testing. 5,743 views." width="800" height="577"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@Colteastwood on X, Oct 21 2026, captured 8:40 AM ET Oct 22 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to pay nothing per hour
&lt;/h2&gt;

&lt;p&gt;The outcome you actually want: play the games you bought without a meter running. Three moves, cheapest first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check your backlog against the data.&lt;/strong&gt; Find your games in the &lt;a href="https://tensorust.com/articles/xbox-cloud-gaming-hours-cap/data.csv" rel="noopener noreferrer"&gt;CSV&lt;/a&gt;: the "ultimate_months_main" column says how many months of Ultimate's cloud time each one eats. If your main game is a 40-hour RPG, you already know the answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you stream occasionally, skip the subscription for cloud.&lt;/strong&gt; One 50-hour pack ($11.99) never expires and costs less than a single month of Ultimate. Keep Ultimate only if you actually use the library on a console or PC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Play installed games where you can.&lt;/strong&gt; A game on your own hardware has no hourly price. That's not nostalgia, it's arithmetic: the meter only exists in someone else's data center.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full disclosure, here's where our receipt comes in. Our studio's game, &lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=xbox-cloud-meter" rel="noopener noreferrer"&gt;O'BLOCK&lt;/a&gt;, is free on Steam and runs on your own PC, so it costs exactly $0 an hour, forever. The honest catch: it's about a 30 GB download, which is precisely the problem cloud gaming exists to solve. I wrote about what that size did to our launch in &lt;a href="https://tensorust.com/articles/oblock-launch/" rel="noopener noreferrer"&gt;2,077 claimed our free Steam game. 16 played it&lt;/a&gt;. Every trade-off has a price. Xbox just put a per-hour one on yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud catalog titles:&lt;/strong&gt; 562 (Xbox's own feed, 8:30 AM ET Oct 22 2026). Matched on HowLongToBeat: 520. Timed (3+ main-story logs): 464.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Main story longer than 15 h / 10 h / 5 h:&lt;/strong&gt; 42% / 62% / 88%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Median main story:&lt;/strong&gt; 12.6 h. With extras: 22.2 h.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-hour price:&lt;/strong&gt; $0.24 to $0.40 in packs, $1.53 on Ultimate (cloud only).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GTA V main story vs one month of Ultimate:&lt;/strong&gt; 32.1 h vs 15 h (47%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next Xbox console, internal projection (Fortune):&lt;/strong&gt; $1,200 to $1,800.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My bet, and your turn
&lt;/h2&gt;

&lt;p&gt;Prediction: the "introductory" pack prices go up within a year, and by GTA VI's first anniversary cloud hours are a line item in Game Pass, not a perk. I'd also bet the 4% number quietly disappears from Xbox's talking points once the November bills arrive.&lt;/p&gt;

&lt;p&gt;Your turn: is paying by the hour actually fairer for people who stream twice a month, or is it a rent increase on games you already own? Pick a side in the replies. And Xbox, if the cap really only touches 4% of subscribers, publish the hours distribution. I just published ours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a free game free, and get the next event
&lt;/h2&gt;

&lt;p&gt;If you'd rather spend your evening playing than watching a meter: &lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=xbox-cloud-meter" rel="noopener noreferrer"&gt;O'BLOCK&lt;/a&gt; is free, runs on your own PC, and has no hourly anything. You start with $300 and a shoebox and haggle your way up to selling sneakers to billionaires, and its &lt;strong&gt;Halloween event runs October 24 to November 1&lt;/strong&gt;: every buyer in costume, pumpkins on every stoop.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://store.steampowered.com/app/5357810/?utm_source=devto&amp;amp;utm_campaign=xbox-cloud-meter" rel="noopener noreferrer"&gt;O'BLOCK Supporter Pack ($4.99)&lt;/a&gt; is how the next free event gets made: you keep the game free for everyone and get the 11-piece companion art pack (AI-generated, disclosed on Steam). For scale, $4.99 is about 12 and a half hours of Xbox cloud time. If anything in it is broken, email &lt;a href="mailto:support@tensorust.com"&gt;support@tensorust.com&lt;/a&gt; and a real person replies within one business day, and we fix it.&lt;/p&gt;

&lt;p&gt;Related on tensorust.com: &lt;a href="https://tensorust.com/articles/oblock-launch/" rel="noopener noreferrer"&gt;what a 30 GB download did to our free launch&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/steam-next-fest-october-2026/" rel="noopener noreferrer"&gt;Steam Next Fest from a launching studio's side&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/tim-sweeney-kenney-epic-ai/" rel="noopener noreferrer"&gt;Tim Sweeney vs Kenney on AI&lt;/a&gt;, and every gaming piece at &lt;a href="https://tensorust.com/articles/topic/games/" rel="noopener noreferrer"&gt;/articles/topic/games/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow for one checked, money-saving number for gamers and builders a day, measured on real data, not vibes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method and data: the Xbox Cloud Gaming "All games" list was read from Xbox's public catalog feed (catalog.gamepass.com, sigl 29a81209, market US) at 8:30 AM ET Oct 22 2026 and resolved to titles and US list prices through the Microsoft Store display catalog. Each title was cleaned of edition suffixes and searched on HowLongToBeat; a match required the same normalized name (or a close prefix). Games with fewer than three main-story logs were dropped. Hours are HowLongToBeat medians as shown on the site; multiplayer and live-service games have soft "main story" times, so read those rows as typical sessions, not endings. Pack cost is the cheapest combination of the three introductory packs covering the hours. Prices are US and may change; Xbox calls them introductory. X screenshots captured 8:40 AM ET Oct 22 2026, real and unedited. Data: &lt;a href="https://tensorust.com/articles/xbox-cloud-gaming-hours-cap/data.csv" rel="noopener noreferrer"&gt;data.csv&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gaming</category>
      <category>xbox</category>
      <category>data</category>
      <category>discuss</category>
    </item>
    <item>
      <title>PHP's RCE fix is 13 hours old. 235 top sites can never get it</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Thu, 22 Oct 2026 03:35:19 +0000</pubDate>
      <link>https://dev.to/mattbusel/phps-rce-fix-is-13-hours-old-235-top-sites-can-never-get-it-2k5h</link>
      <guid>https://dev.to/mattbusel/phps-rce-fix-is-13-hours-old-235-top-sites-can-never-get-it-2k5h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/php-rce-patch-survey/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; You can tell in 60 seconds whether your PHP server is still a target, and close the hole tonight. The one-line check is below. Then the receipt: &lt;strong&gt;13 hours&lt;/strong&gt; after PHP shipped the fix for two critical unauthenticated remote-code-execution bugs, I pulled the response headers of the top &lt;strong&gt;20,000&lt;/strong&gt; sites on the web. Of the &lt;strong&gt;428&lt;/strong&gt; that still announce their PHP version, only &lt;strong&gt;107&lt;/strong&gt; are on a patched release. &lt;strong&gt;235&lt;/strong&gt; run a version PHP abandoned years ago, so no update will ever reach them.&lt;/p&gt;

&lt;p&gt;Everyone spent today screaming CVSS 9.2 and posting fake exploits. The real story is quieter and worse: the hard part was never writing the exploit. It was getting a fix out, and it will be getting people to install it. Most won't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwa3gscqgf0mgmckj15j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwa3gscqgf0mgmckj15j.gif" alt="Animated bar chart titled 428 sites still announce their PHP version, 321 are not on the fix. Of 15,931 of the top 20,000 sites that answered a GET request, 428 print a PHP version in a response header. Sorted by status: patched or newer 107 (25%), supported but behind the patch 82 (19%), supported with the patch level hidden 4, and end of life with no fix possible 235 (55%). Footer: only 1 in 4 is patched, and 235 run a branch PHP abandoned." width="760" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our survey: a passive GET / of the Tranco top 20,000 (list 746PX), 11:25 PM ET Oct 21 2026, about 13 hours after the release; Server and X-Powered-By headers only. Static frame: hero.png.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What actually broke
&lt;/h2&gt;

&lt;p&gt;At 14:00 UTC on October 21, the PHP project released &lt;a href="https://www.php.net/archive/2026.php" rel="noopener noreferrer"&gt;8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/a&gt;. They fix two bugs that let an attacker who is not logged in run code on your server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.php.net/archive/2026.php" rel="noopener noreferrer"&gt;CVE-2026-109618&lt;/a&gt; (RCE via OOM corruption):&lt;/strong&gt; if a request hits PHP's memory limit at the wrong instant, PHP leaves half-built internal data behind and later trusts it. On Apache with mod_php, the project says an unauthenticated request can trigger this &lt;strong&gt;before any of your application code runs&lt;/strong&gt;, and full remote code execution was demonstrated with default settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.php.net/archive/2026.php" rel="noopener noreferrer"&gt;CVE-2026-109619&lt;/a&gt; (RCE via stale global state):&lt;/strong&gt; a fatal error at the wrong point leaves internal state pointing at memory that belonged to a previous request. The next request on that worker uses the freed memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Researchers at Wiz nicknamed the pair &lt;a href="https://www.wiz.io/blog/php2shell-php-rce" rel="noopener noreferrer"&gt;PHP2Shell&lt;/a&gt;. Both sit in the parts of PHP that nearly every request touches: memory management and error handling. watchTowr rated them a 10.0; PHP settled on 9.2. Either way, this is the "patch tonight" tier.&lt;/p&gt;

&lt;p&gt;One detail the headlines skipped, and the one that should scare you most. The same bugs can &lt;a href="https://x.com/TheHackersNews/status/2112916983524229522" rel="noopener noreferrer"&gt;leak live worker memory without running code first&lt;/a&gt;. That memory holds other users' passwords, session tokens, API keys and certificates. Which brings us to the 428 sites that are, right now, printing a clue to attackers for free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmsvmvdhi2rkj5gfel04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmsvmvdhi2rkj5gfel04.png" alt="Screenshot of a post by The PHP Foundation, @ThePHPF, Oct 20 2026: The PHP security team is giving advance notice. Upcoming security release Wed Oct 21st 2026 14:00 UTC, two critical vulnerabilities, both rated CVSSv4 9.2. PHP users are encouraged to prepare to update. Earlier release if details become public or active exploitation. 6.7 million views." width="800" height="439"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@ThePHPF on X, Oct 20 2026, captured 11:25 PM ET Oct 21 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  I scanned the top 20,000 sites. Here is who is exposed
&lt;/h2&gt;

&lt;p&gt;At 11:25 PM ET, about 13 hours after the release, I did one harmless thing to the &lt;a href="https://tranco-list.eu/list/746PX" rel="noopener noreferrer"&gt;Tranco top 20,000 domains&lt;/a&gt;: a plain &lt;code&gt;GET /&lt;/code&gt;, and read only the &lt;code&gt;Server&lt;/code&gt; and &lt;code&gt;X-Powered-By&lt;/code&gt; response headers from each. No bodies, no probing, no exploit, nothing a normal browser doesn't fetch. &lt;strong&gt;15,931&lt;/strong&gt; answered.&lt;/p&gt;

&lt;p&gt;Most sites hide their PHP version, which is good. But &lt;strong&gt;428&lt;/strong&gt; still print it in a header. Sorting those 428 by what their banner claims:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;107 (25%)&lt;/strong&gt; are on a patched point release or a newer branch. The ones who moved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;82 (19%)&lt;/strong&gt; run a still-supported branch (8.2 to 8.5) but a version below the fix. Known-behind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4&lt;/strong&gt; show a supported branch with the patch number hidden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;235 (55%)&lt;/strong&gt; run a branch that reached end of life. PHP 8.1 and older get &lt;strong&gt;nothing&lt;/strong&gt; from the project, ever. This fix is not coming to them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So of every site that tells you its PHP version, &lt;strong&gt;3 out of 4&lt;/strong&gt; are not on a fixed release, and more than half are on software the maintainers walked away from. Thirteen hours in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71p5jmk67d5g9r23mazj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71p5jmk67d5g9r23mazj.png" alt="Bar chart of which PHP version the 428 version-announcing sites run. PHP 8.3 leads with 79, then 7.4 with 68 (end of life), 8.2 with 51, 8.4 with 41, 8.1 with 33 (end of life), 7.2 with 28 (end of life), 5.4 with 27 (end of life), 7.3 with 26 (end of life), 5.6 with 23 (end of life), 8.5 with 22, and single-digit counts down to one site each on PHP 5.2 and PHP 4.4. Red bars mark end-of-life branches that get no project fix." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Passive GET / of the Tranco top 20,000, 11:25 PM ET Oct 21 2026; one version token per site from Server and X-Powered-By.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The web is still running on museum pieces
&lt;/h2&gt;

&lt;p&gt;The branch breakdown is the part I keep rereading. Among the 428, the single most common version isn't a modern 8.x. It's a tie between the current branches and the dead ones. &lt;strong&gt;68&lt;/strong&gt; sites still serve &lt;strong&gt;PHP 7.4&lt;/strong&gt;, which lost security support at the end of 2022. &lt;strong&gt;28&lt;/strong&gt; are on 7.2. &lt;strong&gt;27&lt;/strong&gt; are on &lt;strong&gt;5.4&lt;/strong&gt;, which went end of life in 2015. One site, in the top 20,000 on the internet, answered on &lt;strong&gt;PHP 4.4&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These are not patched by applying today's release. They are patched by a migration project nobody budgeted for. My honest read: a big share of them never will be, and the server is quietly a liability until the day it is quietly a breach. The version banner is not proof of vulnerability on its own, and I'll get to the caveats, but a fleet this old is its own headline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The 60-second check: what does your server tell strangers?&lt;/span&gt;
curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://your-site/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s1"&gt;'server|x-powered-by'&lt;/span&gt;
&lt;span class="c"&gt;# If a PHP version shows and it is below 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35, update now.&lt;/span&gt;
&lt;span class="c"&gt;# Then hide it: expose_php = Off in php.ini, or strip the header at your proxy.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not announcing a version is not the same as being safe. It just means an attacker has to fingerprint you the hard way. But announcing an old one is the opposite of safe: it is a welcome mat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb69ll3sidn03rr0xr23q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb69ll3sidn03rr0xr23q.png" alt="Two-panel card: the fast part and the slow part. The slow part, a fix stuck for about two years: the root cause was spotted in 2024 and theorized as exploitable, the security team could not agree on a fix and the work stalled and restarted repeatedly over months, which the PHP Foundation now calls a structural failure, and it only shipped after Calif, OpenAI and Wiz proved full RCE in August 2026. The fast part, thousands of proof-of-concept exploits that do nothing: GitHub filled with thousands within hours, researchers found they fail against a vanilla PHP server and mostly require the server to already be exploitable, and the LLMs wrote confident exploits that are fake." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Slow part: The PHP Foundation post, Oct 21 2026. Fast part: Elias Taylor, There isn't an easy exploit for this PHP vulnerability, Oct 21 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fast part was fake. The slow part was real
&lt;/h2&gt;

&lt;p&gt;Here is what today got backwards. By this afternoon, GitHub had &lt;strong&gt;thousands&lt;/strong&gt; of "PoC" exploits for PHP2Shell. Security engineer Elias Taylor stood up a vanilla PHP server and &lt;a href="https://eliastaylor.com/noexploit/" rel="noopener noreferrer"&gt;ran them himself&lt;/a&gt;. They don't work. Most quietly require the server to already be exploitable through a separate local-file-include bug, which is cheating. His line is the best thing written all day:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"People are being deluded by their LLMs telling them they have an exploit when they don't... the LLM giving their younger brother an unplugged controller. It says exploit all across the screen, but it's modified the server you're testing against to have a severe vulnerability."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the fast part, and it's noise. Now the slow part, in PHP's own words. The root cause behind CVE-2026-109618 was first spotted in &lt;strong&gt;2024&lt;/strong&gt; while fixing an unrelated audit finding. A fix stalled. The &lt;a href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/" rel="noopener noreferrer"&gt;PHP Foundation now calls that delay&lt;/a&gt; "a structural failure," caused by "both the security team's decision process and its lack of resources." The work "stalled and restarted repeatedly over months." It only moved after Calif, OpenAI and Wiz independently proved full RCE in August 2026.&lt;/p&gt;

&lt;p&gt;Two years. A critical RCE in the memory core of the language that runs a huge slice of the web sat half-fixed for two years because a small, underfunded team couldn't agree on a trade-off. The LLMs that can't write a working exploit today could not have fixed this either. The thing that fixes it is a few engineers who know the whole engine, and PHP is openly begging for the money to keep them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fruz1jltbd7uvpokr22q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fruz1jltbd7uvpokr22q8.png" alt="Timeline of the 23 hours before the fix, all times UTC. Oct 20 15:00: the two CVE IDs leak on forums with a wrong time and a wrong 10.0 score. Oct 20 19:30: PHP rushes its pre-announcement out and moves the release up a full day. Oct 20 around 20:00: Calif posts a working proof-of-concept video, then deletes it, and copies spread. Oct 21 07:41: Chainguard breaks the embargo and ships patched images 6 hours early, letting attackers diff the fix. Oct 21 14:00: the real release, PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: The PHP Foundation, Today's PHP Security Release, Oct 21 2026, and the php.net advisory. Read 11:10 PM ET Oct 21.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And then the disclosure fell apart
&lt;/h2&gt;

&lt;p&gt;The last 23 hours were a case study in how a careful embargo dies. The CVE IDs &lt;a href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/" rel="noopener noreferrer"&gt;leaked on forums&lt;/a&gt; around 15:00 UTC on October 20, with a wrong time and a wrong 10.0 score. PHP rushed its pre-announcement out and moved the release up a full day. Around 20:00 UTC, Calif, one of the reporting firms, posted a working proof-of-concept video and then deleted it; copies spread anyway.&lt;/p&gt;

&lt;p&gt;Then the part worth naming. At &lt;strong&gt;07:41 UTC&lt;/strong&gt; on October 21, more than six hours before the coordinated release, &lt;strong&gt;Chainguard&lt;/strong&gt; unilaterally published built images containing the fix. Every other PHP user was still waiting, while anyone could now study the patch in binary form and reverse the bug from the diff. The PHP Foundation's verdict: this "disregarded weeks of work by many parties toward a coordinated disclosure." When you ship a security product, breaking the embargo to look fast is not a flex. It is handing attackers the map early.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ps7i1y17v6e1cenez6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ps7i1y17v6e1cenez6u.png" alt="Screenshot of a post by Mudit Gupta, @Mudit__Gupta, Oct 21 2026 12:07 PM ET: Nightmare day for cybersecurity. Multiple major security incidents, active exploits, supply chain compromises. PHP: two critical unauthenticated RCEs. LiteLLM: v1.107.0 on PyPI and Docker is backdoored. eMudhra: a certificate authority's keys were crackable. Plus Node, Next.js, React security releases and a TiDB Cloud breach. 337.1K views." width="800" height="904"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@Mudit__Gupta on X, Oct 21 2026, captured 11:25 PM ET Oct 21 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This was one day in a brutal week
&lt;/h2&gt;

&lt;p&gt;PHP didn't happen in a vacuum. As &lt;a href="https://x.com/Mudit__Gupta/status/2112938784392163779" rel="noopener noreferrer"&gt;security engineer Mudit Gupta put it to 337K people&lt;/a&gt;, it was a "nightmare day for cybersecurity": PHP's two RCEs, &lt;a href="https://tensorust.com/articles/litellm-supply-chain-attack/" rel="noopener noreferrer"&gt;LiteLLM's backdoored 1.107.0 on PyPI and Docker&lt;/a&gt;, eMudhra's crackable certificate-authority keys, Node and Next.js security releases, a TiDB Cloud breach, and Railway's secret exposure, all in the same 24 hours. Different bugs, one lesson: the number of serious vulnerabilities found per day is going up, because tooling now finds them faster for everyone, defenders and attackers alike.&lt;/p&gt;

&lt;p&gt;The panic is contagious and usually overstated. One post today claimed &lt;a href="https://x.com/TheProjectUnity/status/2113042967611019505" rel="noopener noreferrer"&gt;"70% of websites are at MAJOR risk."&lt;/a&gt; That is the "most sites run PHP" stat dressed up as "most sites are about to be hacked," and it isn't true: plenty of PHP runs behind FPM, behind proxies, on patched distro builds, or simply not reachable the way mod_php is. The real number isn't 70%. It's the quiet, checkable one I measured: 3 of 4 sites that leak their version are not on the fix, and a quarter of those are on software that is already dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveats (read these before you quote me)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A version banner is a claim, not a scan. A site can spoof it, and some Linux distributions backport the fix without bumping the number, so a "behind" banner can already be patched. In my data only &lt;strong&gt;6&lt;/strong&gt; of the behind-or-EOL sites carried a distribution suffix, so backport-masking is small here, but it is not zero.&lt;/li&gt;
&lt;li&gt;Announcing a version does not prove you are exploitable for &lt;em&gt;this&lt;/em&gt; bug. CVE-2026-109618 is worst on Apache with mod_php; FPM and other setups have narrower paths. Config matters.&lt;/li&gt;
&lt;li&gt;Not announcing a version does not prove you are safe. The 15,000 sites that stayed quiet are simply harder to fingerprint, not patched by definition.&lt;/li&gt;
&lt;li&gt;This is a one-shot snapshot of 20,000 domains at one moment, not a census of the web. The percentages describe the version-announcing sites, nothing more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with every caveat, the shape holds: the fix is out, the exploit is overhyped, and the sites most likely to still be exposed are advertising it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sites scanned:&lt;/strong&gt; 20,000 (Tranco list 746PX). Responded to &lt;code&gt;GET /&lt;/code&gt;: 15,931.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Announce a PHP version:&lt;/strong&gt; 428. On a patched release: 107 (25%). Not on the fix: 321 (75%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-of-life PHP (no fix exists):&lt;/strong&gt; 235. Still on PHP 7.4: 68. On 5.4 or older: 62. Oldest seen: PHP 4.4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hours after the release when I checked:&lt;/strong&gt; about 13.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Years the root cause sat half-fixed:&lt;/strong&gt; ~2 (spotted 2024, shipped Oct 2026).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working public exploits against vanilla PHP at publish time:&lt;/strong&gt; 0 confirmed. Fake PoCs on GitHub: thousands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My bet, and your turn
&lt;/h2&gt;

&lt;p&gt;Prediction: a year from now, a passive rescan of these same 20,000 sites still finds dozens serving end-of-life PHP, and at least one of today's known-behind sites gets popped by PHP2Shell before it ever updates. The bug gets patched in a day. The fleet takes years. If I'm wrong, I'll run the rescan live and put the numbers in the correction.&lt;/p&gt;

&lt;p&gt;Your turn: should browsers and CDNs just strip the &lt;code&gt;Server&lt;/code&gt; and &lt;code&gt;X-Powered-By&lt;/code&gt; version banners by default, or does hiding the version only make everyone lazier about patching? Tell me in the replies. And @ThePHPF, the funding ask lands: who should be paying for the engine the web runs on?&lt;/p&gt;

&lt;h2&gt;
  
  
  Find out tonight if your app is the one leaking
&lt;/h2&gt;

&lt;p&gt;If you built on a stack you don't fully audit, the scary question isn't "is PHP patched." It's "what else is my server handing to strangers." The &lt;a href="https://shop.tensorust.com/buy/launch-check?utm_source=devto&amp;amp;utm_campaign=php2shell-patch-survey" rel="noopener noreferrer"&gt;Launch Check ($49)&lt;/a&gt; answers exactly that: we read your live URL the way an attacker does and tell you, worst first, what it leaks. Version banners and server fingerprints, secret keys shipped to the browser, whether a stranger can read your database (Supabase row-level security), storage buckets, admin pages, redirects, missing rate limits and security headers. Plain English, with the exact fix for each, in 48 hours. Read-only, only on a URL you own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guaranteed:&lt;/strong&gt; if a problem in what we checked turns up later, we review it and write the fix at no extra cost. Email &lt;a href="mailto:support@tensorust.com"&gt;support@tensorust.com&lt;/a&gt; and a real person replies within one business day. All sales final, no refund needed, because we keep working until it's right.&lt;/p&gt;

&lt;p&gt;Related on tensorust.com: &lt;a href="https://tensorust.com/articles/litellm-supply-chain-attack/" rel="noopener noreferrer"&gt;LiteLLM got backdoored again: check your keys in 5 minutes&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/landing-page-grader-show-hn/" rel="noopener noreferrer"&gt;a landing-page grader tested on 2,077 Show HN pages&lt;/a&gt;, and &lt;a href="https://tensorust.com/articles/claude-code-vs-codex-outages/" rel="noopener noreferrer"&gt;Theo's 60% stat is an outage chart&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow for one checked, exploitable-today security fix for builders a day, measured on real data, not vibes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method and data: passive survey run 11:00 to 11:25 PM ET Oct 21 2026 against the Tranco top 20,000 (list 746PX, generated Oct 21 2026). One &lt;code&gt;GET /&lt;/code&gt; per domain over HTTPS then HTTP, following up to six redirects, reading only &lt;code&gt;Server&lt;/code&gt; and &lt;code&gt;X-Powered-By&lt;/code&gt; response headers; no request bodies were read and nothing was probed or exploited. A PHP version token was classified against the fixed point releases (8.5.12, 8.4.27, 8.3.36, 8.2.35); branches 8.1 and older were counted as end of life. Per-domain data was aggregated and the raw file discarded; no site is named. Incident facts from the php.net advisory, The PHP Foundation's October 21 2026 post, Wiz's PHP2Shell writeup, and Elias Taylor's analysis, all read 11:10 PM ET Oct 21 2026. X screenshots captured 11:25 PM ET, real and unedited.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>php</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>LiteLLM got backdoored again. Check if it took your keys in 5 min</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Wed, 21 Oct 2026 23:43:00 +0000</pubDate>
      <link>https://dev.to/mattbusel/litellm-got-backdoored-again-check-if-it-took-your-keys-in-5-min-ghj</link>
      <guid>https://dev.to/mattbusel/litellm-got-backdoored-again-check-if-it-took-your-keys-in-5-min-ghj</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/litellm-supply-chain-attack/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; You can find out in 5 minutes whether today's LiteLLM backdoor (or Railway's leak) touched your machine, and rotate what it could have taken in about 15. The commands and the order are below. Why it matters: for &lt;strong&gt;1 hour 43 minutes&lt;/strong&gt; this morning, &lt;code&gt;pip install litellm&lt;/code&gt; handed you a credential stealer, and I checked 76 popular AI packages against the versions they had live at that moment. &lt;strong&gt;20 of the 30 that use LiteLLM would have accepted it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the second time in 7 months. LiteLLM's own status update now blames tokens that Claude Code put into responses. So I scanned &lt;strong&gt;1,193&lt;/strong&gt; of our own Claude Code transcripts for GitHub tokens. I found &lt;strong&gt;0&lt;/strong&gt;. My read: the hole wasn't Claude Code. It was a logging proxy sitting on the open internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsatzvoaj7boshxsx1svc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsatzvoaj7boshxsx1svc.gif" alt="Animated bar chart: 20 of 30 AI packages that use LiteLLM accepted the backdoored 1.107.0, as published at 7:39 AM ET Oct 21 2026. Top 14 by monthly downloads: strands-agents 37.1M accepts via an extra, openai-agents 12.4M via an extra, mini-swe-agent 11.6M accepts on a plain install, google-adk 10.1M via an extra, instructor 8.5M blocked, openhands-sdk 5.5M blocked, dspy 5.3M accepts, crewai 2.4M via an extra, mem0ai 2.0M blocked, agno 1.8M via an extra, opik 1.7M blocked, langchain-litellm 1.1M accepts, lm-eval 1.0M blocked, weave 0.8M via an extra." width="760" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our scan: PyPI metadata of the release each of 76 AI packages had live at 11:39 UTC Oct 21 2026, read 7:50 PM ET; downloads from pypistats.org, last 30 days. Static frame: hero.png.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What happened, in 2 hours
&lt;/h2&gt;

&lt;p&gt;All times ET, Oct 21 2026, from &lt;a href="https://docs.litellm.ai/blog/security-incident-oct-21-2026" rel="noopener noreferrer"&gt;LiteLLM's incident post&lt;/a&gt;, &lt;a href="https://github.com/BerriAI/litellm/issues/47826" rel="noopener noreferrer"&gt;GitHub issue #47826&lt;/a&gt; and &lt;a href="https://safedep.io/litellm-pypi-compromise-credential-stealer-backdoor/" rel="noopener noreferrer"&gt;SafeDep's teardown&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;7:39 AM:&lt;/strong&gt; &lt;code&gt;litellm==1.107.0&lt;/code&gt; lands on PyPI, all seven wheels, Linux, macOS and Windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7:46 AM:&lt;/strong&gt; the Docker tags &lt;code&gt;v1.107.0&lt;/code&gt;, &lt;code&gt;latest&lt;/code&gt;, &lt;code&gt;main-latest&lt;/code&gt; and &lt;code&gt;main-stable&lt;/code&gt; start pointing at the same poisoned image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8:22 AM:&lt;/strong&gt; &lt;a href="https://x.com/JFrogSecurity/status/2112882176156909646" rel="noopener noreferrer"&gt;JFrog flags it&lt;/a&gt;. &lt;a href="https://x.com/SocketSecurity/status/2112907732877775016" rel="noopener noreferrer"&gt;Socket follows at 10:03 AM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9:23 AM:&lt;/strong&gt; PyPI pulls the release. Docker Hub stays poisoned until &lt;strong&gt;10:20 AM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3:14 PM:&lt;/strong&gt; Wiz &lt;a href="https://github.com/BerriAI/litellm/issues/47826" rel="noopener noreferrer"&gt;tells LiteLLM&lt;/a&gt; it has started to see post-exploitation activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5:22 PM:&lt;/strong&gt; LiteLLM posts the attack chain and points at Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6:05 PM:&lt;/strong&gt; a different fire. &lt;a href="https://x.com/AndrewCurran_/status/2113028871524385025" rel="noopener noreferrer"&gt;"Railway has been hacked."&lt;/a&gt; More on that below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F781qir4yfs0hy1fb4z0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F781qir4yfs0hy1fb4z0g.png" alt="Two screenshots. JFrog Security, @JFrogSecurity, Oct 21 2026 8:22 AM ET: JFrog Security Research has identified a supply-chain attack involving malicious code in the LiteLLM 1.107.0 PyPI release. Avoid this version and investigate environments where it was installed or executed. 260.6K views. Below it Socket, @SocketSecurity, 10:03 AM ET: LiteLLM, a Python package for connecting to AI model providers with 92M+ monthly downloads, has been compromised. Version 1.107.0 ships credential-stealing malware through PyPI wheels and Docker images. 216.8K views." width="800" height="1037"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@JFrogSecurity and @SocketSecurity on X, Oct 21 2026, captured 7:34 PM ET Oct 21 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Plain English for what the package did. A &lt;strong&gt;.pth file&lt;/strong&gt; is a tiny file Python reads every time it starts. The bad wheel dropped one called &lt;code&gt;cook.pth&lt;/code&gt; that runs a stealer, plus a &lt;code&gt;sitecustomize.py&lt;/code&gt; that starts a background process and phones home every hour for new code. You didn't have to import LiteLLM. If any Python process started on that machine, the stealer ran: your app, your IDE's language server, your CI job, even &lt;code&gt;pip&lt;/code&gt; itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 5-minute check (don't run pip first)
&lt;/h2&gt;

&lt;p&gt;LiteLLM's own incident page says "You can check with &lt;code&gt;pip show litellm&lt;/code&gt;". The same page, a few lines later, says any Python start in an affected environment runs the stealer again, "and that includes running pip." So don't. Check from the shell first. None of these commands start Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Is the bad version or its implant anywhere on this machine?&lt;/span&gt;
find / &lt;span class="nt"&gt;-path&lt;/span&gt; /proc &lt;span class="nt"&gt;-prune&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="se"&gt;\(&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'cook.pth'&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'litellm-1.107.0.dist-info'&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt; &lt;span class="nt"&gt;-print&lt;/span&gt; 2&amp;gt;/dev/null
find / &lt;span class="nt"&gt;-path&lt;/span&gt; /proc &lt;span class="nt"&gt;-prune&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*site-packages/sitecustomize.py'&lt;/span&gt; &lt;span class="nt"&gt;-size&lt;/span&gt; 25509c &lt;span class="nt"&gt;-print&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# 2. Did it already run? (the stealer's marker and the backdoor's lock file)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/.pc_once_72129118c59f5636c0bb /tmp/remote_code_loader.lock 2&amp;gt;/dev/null

&lt;span class="c"&gt;# 3. Lockfiles and requirements that pinned or resolved to it&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rnE&lt;/span&gt; &lt;span class="s1"&gt;'litellm[^0-9]*1\.107\.0'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.lock'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'requirements*.txt'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'pyproject.toml'&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# 4. Docker: the poisoned image index starts with sha256:1bbcb1443bc9&lt;/span&gt;
docker images &lt;span class="nt"&gt;--digests&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; litellm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows, run this in PowerShell instead of step 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cook.pth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;litellm-1.107.0.dist-info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FullName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then two questions only you can answer. Did any CI job, Dockerfile or fresh venv install LiteLLM without an exact pin between &lt;strong&gt;7:39 and 9:23 AM ET&lt;/strong&gt;? Did anything pull &lt;code&gt;litellm/litellm:latest&lt;/code&gt; or &lt;code&gt;main-stable&lt;/code&gt; between &lt;strong&gt;7:46 and 10:20 AM ET&lt;/strong&gt;? If yes to either, treat that machine as compromised, even if step 2 finds nothing. LiteLLM says it plainly: containers and tmp cleanup remove the marker, so a clean result proves nothing.&lt;/p&gt;

&lt;p&gt;How big was that window? At yesterday's pace, LiteLLM got &lt;a href="https://pypistats.org/packages/litellm" rel="noopener noreferrer"&gt;3,650,152 downloads in a day&lt;/a&gt;, about &lt;strong&gt;152,000 an hour&lt;/strong&gt;. Not all of those resolve to the newest version. A lot of them do.&lt;/p&gt;

&lt;h2&gt;
  
  
  20 of 30 AI frameworks would have let it in
&lt;/h2&gt;

&lt;p&gt;This is the experiment I ran tonight. I took 76 popular AI and agent packages on PyPI. For each one I found the release that was live at &lt;strong&gt;7:39 AM ET&lt;/strong&gt;, the minute the bad wheel went up, and read its declared LiteLLM requirement. Then I asked one question: does that range include &lt;code&gt;1.107.0&lt;/code&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30&lt;/strong&gt; of the 76 depend on LiteLLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8&lt;/strong&gt; accept 1.107.0 on a plain install: mini-swe-agent, dspy, langchain-litellm, guardrails-ai, llama-index-llms-litellm, gpt-researcher, open-interpreter and praisonai.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12&lt;/strong&gt; more accept it through an optional extra, like &lt;code&gt;pip install "crewai[litellm]"&lt;/code&gt;: strands-agents, openai-agents, google-adk, crewai, agno, smolagents and six others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10&lt;/strong&gt; block it, only &lt;strong&gt;3&lt;/strong&gt; of them with an exact pin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most-downloaded one is the best story. &lt;strong&gt;strands-agents&lt;/strong&gt; does 37.1M downloads a month. At 7:39 AM its &lt;code&gt;[litellm]&lt;/code&gt; extra allowed anything under 2.0. At &lt;strong&gt;2:47 PM ET&lt;/strong&gt; it shipped a new release capped at &lt;code&gt;&amp;lt;1.107.0&lt;/code&gt;, seven hours after the fire started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46rnvu7gbn97wk67zbar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46rnvu7gbn97wk67zbar.png" alt="Three ways to depend on LiteLLM and what each did on Oct 21 2026. mini-swe-agent, 11.6M downloads a month, requires litellm not 1.82.7, not 1.82.8, at least 1.75.5: it blocklists March's two bad versions and accepted 1.107.0. openhands-sdk, 5.5M a month, requires litellm below 1.106: an upper bound shipped Oct 19, blocked. aider-chat requires exactly litellm 1.81.10: blocked." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Specs: the PyPI release each package had live at 11:39 UTC Oct 21 2026, read 7:50 PM ET; downloads from pypistats.org.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here's the part that should make every maintainer wince. &lt;strong&gt;mini-swe-agent&lt;/strong&gt; (11.6M downloads a month) learned from March. Its requirement says &lt;code&gt;litellm!=1.82.7,!=1.82.8,&amp;gt;=1.75.5&lt;/code&gt;, which excludes the two versions backdoored last time by name. That blocklist let today's backdoor straight in. A blocklist only protects you from the last attack. The packages that were safe today were safe because of an upper bound or an exact pin, not because anyone remembered March.&lt;/p&gt;

&lt;h2&gt;
  
  
  Twice in 7 months, and the second time after "hardening"
&lt;/h2&gt;

&lt;p&gt;On &lt;a href="https://www.netspi.com/blog/executive-blog/ai-ml-pentesting/litellm-supply-chain-compromise/" rel="noopener noreferrer"&gt;March 24 2026&lt;/a&gt;, versions 1.82.7 and 1.82.8 shipped a stealer through a compromised maintainer account and the CI pipeline. Version 1.82.8 used a file called &lt;code&gt;litellm_init.pth&lt;/code&gt;. Same trick, same package, same targets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ufyrres0rnti4k15zv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ufyrres0rnti4k15zv9.png" alt="Comparison table, LiteLLM on PyPI seven months apart. March 24 2026: bad versions 1.82.7 and 1.82.8, trick litellm_init.pth, runs when any Python starts, way in a maintainer account and the CI pipeline, live 40 minutes to about 3 hours, fix promised a new isolated pipeline. October 21 2026: bad version 1.107.0 plus Docker latest, trick cook.pth plus sitecustomize.py, runs when any Python starts, way in three engineers' GitHub CLI tokens and the private release workflow, live 1 hour 43 minutes on PyPI, post-mortem pending." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;March: NetSPI, Snyk and LiteLLM's update. October: LiteLLM's incident post, GitHub issue #47826 and SafeDep, all read 7:30 PM ET Oct 21 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;LiteLLM's 5:22 PM update says that after March it "meaningfully hardened" the release pipeline: a private release repo, Trusted Publishers, immutable Docker tags, signed images, and publishing locked to "an account locked to a specific laptop physically located within our office." Then, by its own account, it widened release permissions on Monday for daily backports. The attacker had GitHub CLI tokens for three engineers, one of them an organization owner, disabled branch protection, force-pushed a change to the release workflow and pointed it at a lookalike repo, &lt;code&gt;Berri-AI/litellm&lt;/code&gt;. The signed, official pipeline then signed and shipped the malware.&lt;/p&gt;

&lt;p&gt;That's the lesson nobody wants to hear. Signing proves the package came out of your pipeline. It doesn't prove your pipeline was still yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  LiteLLM blamed Claude Code. I checked 1,193 transcripts
&lt;/h2&gt;

&lt;p&gt;Word for word from the status update: "we have observed specific situations in which Claude Code will embed a user's GitHub CLI OAuth token into a response body, and in situations where response bodies are logged, these tokens may appear in LiteLLM logs." They believe the attacker got into an internal LiteLLM deployment "exposed to the public internet," read the tokens out of its logs, and used them on the release workflow.&lt;/p&gt;

&lt;p&gt;Our agent team runs on Claude Code, so I tested it on our own box. Every prompt, tool call and tool result Claude Code has seen here is in &lt;code&gt;~/.claude/projects&lt;/code&gt;: &lt;strong&gt;1,193&lt;/strong&gt; transcript files, &lt;strong&gt;3.1 GB&lt;/strong&gt;. I counted credential-shaped strings with regexes and never printed a value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frvwczfksftv6md76jl74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frvwczfksftv6md76jl74.png" alt="Stat card: LiteLLM blamed Claude Code, so we checked ours. 1,193 Claude Code transcript files on our dev box, 3.1 GB of prompts, tool calls and tool output scanned. 0 GitHub CLI tokens or personal access tokens. 0 Anthropic or OpenAI API keys. 2 AWS-key-shaped strings, one of them Amazon's documentation example." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our run, 7:33 to 7:40 PM ET Oct 21 2026, regex counts only, values never printed. Claim tested: LiteLLM's 21:22 UTC update on GitHub issue #47826.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero&lt;/strong&gt; GitHub CLI tokens. Zero personal access tokens. Zero Anthropic or OpenAI keys. Two AWS-key-shaped strings, and one of those is Amazon's own documentation example. So in our logs, the thing LiteLLM describes never happened once.&lt;/p&gt;

&lt;p&gt;I'm not saying it can't happen. If you ask an agent to run &lt;code&gt;gh auth token&lt;/code&gt;, the token is in the response, and every proxy that logs response bodies now has it. But "Claude Code embedded a token" is the least interesting sentence in that update. The interesting one is that an AI gateway holding full response bodies was reachable from the internet. LiteLLM sells that gateway. Logging every prompt and response is a feature people turn on for cost tracking and debugging. My read: tonight a lot of teams are finding out their LLM logs are the juiciest credential store they own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Railway, same day, same target
&lt;/h2&gt;

&lt;p&gt;At 6:10 PM ET &lt;a href="https://status.railway.com/" rel="noopener noreferrer"&gt;Railway's status page&lt;/a&gt; linked a &lt;a href="https://blog.railway.com/p/security-disclosure-wednesday-october-21st" rel="noopener noreferrer"&gt;security notice&lt;/a&gt;: an unauthorized party "may have accessed encrypted environment variables and, for some of them, obtained the decrypted contents." Then this line: "We believe this is part of a series of attacks recently targeting platform companies with the aim of compromising AI inference providers."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyj0zstz76j8xlvba0aun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyj0zstz76j8xlvba0aun.png" alt="Screenshot of a post by Andrew Curran, @AndrewCurran_, Oct 21 2026 6:05 PM ET: Railway has been hacked. 103.7K views." width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@AndrewCurran_ on X, Oct 21 2026, captured 7:34 PM ET Oct 21 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read that twice. The target in both of today's stories is the same thing: the keys that buy AI inference. There's a name for reselling stolen AI keys, &lt;a href="https://www.sysdig.com/blog/llmjacking-stolen-cloud-credentials-used-in-new-ai-attack" rel="noopener noreferrer"&gt;LLMjacking&lt;/a&gt;, and the reason is simple. A stolen database password needs work to turn into money. A stolen model key is money the minute someone sends a request on your bill. Look at the stealer's own module list: there's a module just for AI tools (Claude Code, Codex, Cursor, Gemini CLI, Copilot, Hugging Face) and one that dumps the provider keys out of a LiteLLM proxy database.&lt;/p&gt;

&lt;p&gt;Railway users have it worse tonight. Builds are paused, so you can't redeploy with new keys. One user &lt;a href="https://x.com/jackndwyer/status/2113030762941526445" rel="noopener noreferrer"&gt;posted that his leaked keys were being used&lt;/a&gt; and he couldn't swap them. The fix is ugly but it works: revoke the key at the provider anyway. Your app breaks until builds come back. The bleeding stops now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 15-minute rotation order
&lt;/h2&gt;

&lt;p&gt;If the check above says you were exposed, or you're on Railway, rotate in this order. It's sorted by how fast each secret turns into damage.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI provider keys&lt;/strong&gt; (OpenAI, Anthropic, OpenRouter, Bedrock, Vertex). They're cash within minutes. Revoke, reissue, and set a hard monthly spend cap while you're in the dashboard. Then check usage since 7:39 AM ET.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything that can publish code&lt;/strong&gt;: GitHub (revoke the "GitHub CLI" app under Settings, Applications, Authorized OAuth Apps, plus PATs and deploy keys), PyPI, npm and crates.io tokens. This is how today's attack spread. Don't be the next one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud credentials&lt;/strong&gt;: AWS keys and instance roles (the stealer reads the instance metadata service), gcloud, Azure, kubeconfig.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Stripe and anything with a live key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt;: every &lt;code&gt;DATABASE_URL&lt;/code&gt;, especially a LiteLLM proxy database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH keys&lt;/strong&gt;: remove them from GitHub and your servers, then make new ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your browser's saved passwords&lt;/strong&gt;: the stealer decrypts Chrome's and reads Firefox's. Email first, then anything with money in it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then rebuild the affected venvs and images from scratch, pinned to &lt;code&gt;litellm==1.106.2&lt;/code&gt; or older.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it wanted from a normal dev box
&lt;/h2&gt;

&lt;p&gt;LiteLLM isn't installed on our machine, and there are 0 implant files in the 5 Python environments we found on it. But I wanted to know what this stealer would have found if it had run here. So I checked its target list against our dev box, existence only, nothing opened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgkn8c25t5vamxqayvgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgkn8c25t5vamxqayvgy.png" alt="Card: the stealer's shopping list versus one real dev box. 10 of 23 places it looks were present on ours, plus 9 .env files in top-level project folders; LiteLLM itself not installed, 0 implant files. Target groups: AI tools (Claude Code, Claude Desktop, Codex auth.json, Cursor, Gemini CLI, VS Code mcp.json, Hugging Face token), code and publish tokens (gh CLI, git credentials, SSH keys, npm, PyPI, crates.io), cloud and infra (AWS, gcloud, Azure, Docker, Kubernetes, Vault, Terraform, .env files), and you (Chrome and Firefox saved passwords, shell and PowerShell history)." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our run, 7:40 PM ET Oct 21 2026, file existence only. Target list from the stealer config decoded by SafeDep and in GitHub issue #47826.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10 of 23&lt;/strong&gt; places it looks were full, plus &lt;strong&gt;9 .env files&lt;/strong&gt; sitting in top-level project folders. That's one person's Windows PC. Yours is probably worse if you have cloud CLIs installed. This is why "I never imported litellm" isn't a defense. It only had to be installed next to anything that starts Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  The worst take of the day
&lt;/h2&gt;

&lt;p&gt;A few hours in, &lt;a href="https://x.com/KyeGomezB/status/2112942498809307146" rel="noopener noreferrer"&gt;@KyeGomezB posted&lt;/a&gt; "LiteLLM got compromised AGAIN. Maybe it's time to rethink your stack and switch to RouteHub, built by @swarms_corp."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2k01kq6d4oq1ieq21gyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2k01kq6d4oq1ieq21gyc.png" alt="Screenshot of a post by Kye Gomez, @KyeGomezB, Oct 21 2026 12:22 PM ET, quoting Socket's LiteLLM alert: LiteLLM got compromised AGAIN. Maybe it's time to rethink your stack and switch to RouteHub, built by @swarms_corp. 190x faster imports, minimal overhead, 20+ providers. 1,666 views." width="800" height="1243"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@KyeGomezB on X, Oct 21 2026, captured 7:34 PM ET Oct 21 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Funny thing, Kye. In our scan, your own &lt;code&gt;swarms&lt;/code&gt; package requires &lt;code&gt;litellm==1.76.1&lt;/code&gt;. That exact pin is the only reason swarms users were safe today. You had the best security story of the day and used it to sell a router. The lesson isn't "switch libraries." Any library you install can be the next one. The lesson is pin exactly, update on purpose, and keep secrets out of places Python can read on startup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bad window on PyPI:&lt;/strong&gt; 1 h 43 min (7:39 to 9:23 AM ET). Docker: about 2 h 33 min (7:46 to 10:20 AM ET).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM downloads:&lt;/strong&gt; 3,650,152 the day before (pypistats.org), 92.2M in the last month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI packages checked:&lt;/strong&gt; 76. Depend on LiteLLM: 30. Accepted 1.107.0: 20 (8 plain, 12 via an extra). Blocked: 10, exact pins: 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code transcripts scanned:&lt;/strong&gt; 1,193 (3.1 GB). GitHub tokens found: 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stealer targets present on our dev box:&lt;/strong&gt; 10 of 23, plus 9 .env files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM backdoors on PyPI in 2026:&lt;/strong&gt; 2 (March 24, October 21).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My bet, and your turn
&lt;/h2&gt;

&lt;p&gt;Prediction: by March 31 2027, another AI package in PyPI's top 1,000 ships a credential stealer through its own official release channel, and the stolen keys get used for inference before anyone posts about it. AI keys are the new crypto wallets. If I'm wrong, I'll write the correction with your name in the headline.&lt;/p&gt;

&lt;p&gt;Your turn: exact pins plus a bot that bumps them, or version ranges plus a lockfile? Pick one and tell me why in the replies. @LiteLLM, you're welcome to answer too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rotate every key it touched, in order, tonight
&lt;/h2&gt;

&lt;p&gt;The hard part of a night like this isn't revoking one key. It's remembering every key you have, where each one lives, and who else has a copy. The &lt;a href="https://shop.tensorust.com/buy/secret-rotation-tracker?utm_source=devto&amp;amp;utm_campaign=litellm-supply-chain-attack" rel="noopener noreferrer"&gt;API Key and Secret Rotation Tracker ($5, Google Sheets and Excel)&lt;/a&gt; gets you there: every API key, token and password in one sheet, with where it lives, who has it, when it was last rotated, and a rotate-first list with what to update next. Names and locations only, never the secret values. A password manager stores secrets. This tells you which ones are overdue. $5 once, no account, no subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guaranteed:&lt;/strong&gt; if it doesn't track your secrets and flag the overdue ones, email &lt;a href="mailto:support@tensorust.com"&gt;support@tensorust.com&lt;/a&gt; and we fix it until it does. A real person replies within one business day.&lt;/p&gt;

&lt;p&gt;Related on tensorust.com: &lt;a href="https://tensorust.com/articles/llm-proxy-benchmark/" rel="noopener noreferrer"&gt;LLM proxy benchmark: 200 duplicate calls became 1&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/claude-code-vs-codex-outages/" rel="noopener noreferrer"&gt;Theo's 60% stat is an outage chart&lt;/a&gt;, and &lt;a href="https://tensorust.com/articles/deepseek-deepinfer/" rel="noopener noreferrer"&gt;DeepSeek gave away its engine. The $38-an-hour parts stayed home&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method and data: package scan run 7:45 to 7:55 PM ET Oct 21 2026 against PyPI's JSON API; for each of 76 packages, the newest non-pre-release uploaded before 11:39:51 UTC, its requires_dist read with Python's packaging library, and a range counted as accepting if it contains 1.107.0 (dev and test extras excluded). Monthly downloads from pypistats.org. Transcript scan 7:33 to 7:40 PM ET over ~/.claude/projects, regex counts only. Dev box check: file existence only. X screenshots captured 7:34 PM ET, real and unedited. Incident facts from LiteLLM's incident post and GitHub issue #47826 (updates through 21:22 UTC), SafeDep, Railway's notice and status page (22:45 UTC update), NetSPI and Snyk for March.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>2,077 claimed our free Steam game. 16 played it. 30 GB did that</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Tue, 20 Oct 2026 22:32:08 +0000</pubDate>
      <link>https://dev.to/mattbusel/2077-claimed-our-free-steam-game-16-played-it-30-gb-did-that-cmc</link>
      <guid>https://dev.to/mattbusel/2077-claimed-our-free-steam-game-16-played-it-30-gb-did-that-cmc</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/oblock-launch/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; O'BLOCK, the sneaker-flipping game our AI agents have been hyping for ten days, went live free on Steam at about 12:40 PM ET today. By the 5:24 PM ET Steamworks read, &lt;strong&gt;2,077 people had claimed it&lt;/strong&gt;. &lt;strong&gt;16 had actually launched it.&lt;/strong&gt; That's 0.77%. Median playtime: 13 minutes. One person bought the $4.99 Supporter Pack. The launch build was &lt;strong&gt;29.8 GB&lt;/strong&gt;, almost all of it lossless music, for a 2D game nobody had heard of. At ~6:15 PM ET we shipped a &lt;strong&gt;3.8 GB&lt;/strong&gt; build. This is the receipt, the dataset that shows how dumb 30 GB was, and the part of the 2,077 I don't think was ever human.&lt;/p&gt;

&lt;p&gt;A week ago &lt;a href="https://x.com/AlexFinn/status/2110231166725095672" rel="noopener noreferrer"&gt;@AlexFinn&lt;/a&gt; told 256K viewers that 2027 will be "an absolute gold rush for anyone who dedicates the time to build a game with AI". Here is what launch day of a game built with AI agents actually looks like. Gold rush is giving... 16 people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgudk6x06h9yetgt11tm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgudk6x06h9yetgt11tm.gif" alt="Animated bar chart on a log scale, O'BLOCK Steam launch day, Oct 20 2026. Claimed it for free: 2,077. Actually launched it: 16. Unlocked every achievement: about 5. Bought the $4.99 Supporter Pack: 1. Final line: 0.77% of claims became a player." width="760" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Steamworks, read 5:24 PM ET Oct 20 2026 (sales as of 1:30 PM PDT). The ~5 all-achievement accounts are our count; Steam Achievement Manager is our read. Static frame: hero.png.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The number we were scared to post
&lt;/h2&gt;

&lt;p&gt;Every number below is from Steamworks, read at 5:24 PM ET Oct 20 (sales data as of 1:30 PM PDT). Nothing rounded up, nothing left out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2,077&lt;/strong&gt; free activations (people who clicked "Play Game" or "Add to Library" on a free game)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;16&lt;/strong&gt; lifetime users (accounts that actually started the game)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13 minutes&lt;/strong&gt; median playtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1&lt;/strong&gt; Complete Supporter Pack sold, $4.99, 0 refunds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;58&lt;/strong&gt; wishlists, +14 today&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2&lt;/strong&gt; peak concurrent players&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt; reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The week before launch the &lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=oblock-launch" rel="noopener noreferrer"&gt;store page&lt;/a&gt; got 21,848 impressions and 1,417 visits. So the top of the funnel worked. People found the page, liked the pitch, and grabbed a free game. Then 2,061 of them never pressed Play.&lt;/p&gt;

&lt;p&gt;For scale: yesterday &lt;a href="https://x.com/Pirat_Nation/status/2112088790315495530" rel="noopener noreferrer"&gt;@Pirat_Nation&lt;/a&gt; dunked on Double Fine to 338K views because Thank You Bus Driver peaked at 99 concurrent players. Our all-time peak is 2. If 99 is "not looking good for this studio", we are not looking at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI part was not the problem
&lt;/h2&gt;

&lt;p&gt;Here's the post that every "build a game with AI" thread is downstream of. AlexFinn, Oct 14: "AI allows solo devs to build the AAA games of their dreams with very little resources", "every digital game store will be filled with AAA quality, incredibly fun games built entirely with AI by a single developer", "Don't screw this opportunity up."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gtz7yx86937gzdt6wz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gtz7yx86937gzdt6wz6.png" alt="Screenshot of a post by Alex Finn, @AlexFinn, Oct 14 2026 12:48 AM, 256.1K views, top and bottom shown: Gaming is the single biggest opportunity in AI right now. 2027 will be an absolute gold rush for anyone who dedicates the time to build a game with AI. Later: Download Claude Code. Download Codex. Then start building the game of your dreams. Don't screw this opportunity up. It quotes Xbox CEO Asha's Xbox Labs post." width="800" height="1155"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@AlexFinn on X, captured 6:24 PM ET Oct 20 2026; middle of the post cut for length, text not edited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Half of that is right, and I hate that it's right. AI did let a tiny team ship a big game. O'BLOCK has haggling with parody celebrities, a fake-sneaker stitching check, a finance layer our bots broke with a &lt;a href="https://tensorust.com/articles/vibe-coded-game-economy/" rel="noopener noreferrer"&gt;$14 trillion exploit before launch&lt;/a&gt;, and 192 original songs. Building it was the cheap part.&lt;/p&gt;

&lt;p&gt;The half that's wrong is the gold. AI made making the game cheap. It did nothing for the two walls between a store page and a player: the install button and the reason to press it. Our agents can write the code and the posts. They cannot make someone on a 100 Mbps connection wait half an hour for a game they've never heard of. Every "gold rush" thread skips this part, and lowkey it's the only part that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  We shipped a 2D sneaker game like a record label
&lt;/h2&gt;

&lt;p&gt;Where did 29.8 GB come from? Music. The game has 192 original songs, 768 live stems so the soundtrack reacts to what you do, about 12 hours of music and about an hour of ambience. All of it shipped as lossless audio, because it sounded amazing and nobody on the team asked "how big is the download?" until the claims and the players stopped matching.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mr38k1hcwr1zd2kzwef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mr38k1hcwr1zd2kzwef.png" alt="Stat card titled where the 30 GB came from: a sneaker game shipped like a record label. 192 original songs. 768 live stems so the music reacts to play. About 12 hours of music plus about 1 hour of ambience. 29.8 GB launch build, almost all lossless audio. 3.8 GB tonight: Ogg Vorbis, every file the same length to the sample." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;O'BLOCK build numbers, Oct 20 2026. The lossless build stays on Steam as the public beta branch "lossless".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tonight's default build uses Ogg Vorbis, with every file trimmed to the same length to the sample so the stems still line up. 29.8 GB became 3.8 GB, about 7.8x smaller. The lossless version still exists as a public Steam beta branch called "lossless", for the three audiophiles who want it. The store page now says 4 GB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fresh data: we were bigger than most of Steam's biggest free games
&lt;/h2&gt;

&lt;p&gt;I wanted to know how dumb 30 GB was, so tonight I pulled the 60 free-to-play games with the most players from the &lt;a href="https://steamspy.com/api.php" rel="noopener noreferrer"&gt;SteamSpy API&lt;/a&gt; and read the storage line on each one's Steam page through Steam's appdetails API (6:20 PM ET). 58 of them list a size.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40ixryl4t68pnp1l39e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40ixryl4t68pnp1l39e8.png" alt="Dot plot of the storage listed by the 58 most-played free-to-play games on Steam, 0 to 120 GB. Most dots cluster under 10 GB; median 8 GB. Markers: O'BLOCK tonight 3.8 GB, median 8 GB, O'BLOCK launch build 29.8 GB. 21 games list more than 29.8 GB, including Counter-Strike 2, Apex Legends, Destiny 2, Lost Ark, War Thunder and Warframe." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our pull, 6:20 PM ET Oct 20 2026: top 60 free-to-play games by players from SteamSpy, storage from Steam's appdetails API (58 list a size). Listed storage, not exact download.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Median storage of the 58:&lt;/strong&gt; 8 GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games bigger than our 29.8 GB launch build:&lt;/strong&gt; 21 of 58. Counter-Strike 2 (85 GB), Apex Legends (75), Warframe (75), War Thunder (70), Destiny 2 (105), Lost Ark (110), PUBG (40) and friends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games bigger than tonight's 3.8 GB build:&lt;/strong&gt; 37 of 58&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Median of the top 20 by players:&lt;/strong&gt; 40 GB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yes, big free games are big. But look at who's in that club. Every one of the 21 has years of updates, millions of players and a name you already know. The size is a toll their players already agreed to pay. Ours was a 30 GB toll on a road nobody had driven. AAA goes even bigger: this week @PlaystationSize posted Phantom Blade Zero's 134.857 GB download to &lt;a href="https://x.com/PlaystationSize/status/2111124096125731313" rel="noopener noreferrer"&gt;301K views&lt;/a&gt;. A game with that kind of hype can ask for 135 GB. A game with 58 wishlists can't ask for 30.&lt;/p&gt;

&lt;h2&gt;
  
  
  The download took longer than people played
&lt;/h2&gt;

&lt;p&gt;Steam publishes its own &lt;a href="https://store.steampowered.com/stats/content/" rel="noopener noreferrer"&gt;average download rate per country&lt;/a&gt;. I read it at 6:18 PM ET. Byte-weighted across 237 countries, the average Steam download runs at about &lt;strong&gt;129 Mbps&lt;/strong&gt;. The US averages 184, Germany 93, India 58.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0z7xfe0u1nwes1uhek2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0z7xfe0u1nwes1uhek2j.png" alt="Bar chart: minutes to download O'BLOCK at Steam's average download speeds. World average 129 Mbps: 31 minutes for 29.8 GB, 4 minutes for 3.8 GB. United States 184 Mbps: 22 and 3. Germany 93 Mbps: 43 and 5. India 58 Mbps: 68 and 9. A vertical line marks 13 minutes, the median playtime of the 16 who played." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Speeds from Steam's public download stats (store.steampowered.com/stats/content), read 6:18 PM ET Oct 20 2026; world = byte-weighted over 237 countries; GB = 10^9 bytes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the world average, 29.8 GB takes about &lt;strong&gt;31 minutes&lt;/strong&gt;. In Germany, 43. In India, 68. The median player of the 16 who got in played for &lt;strong&gt;13 minutes&lt;/strong&gt;. Our download was more than twice as long as our game session. Tonight's build: about 4 minutes at the world average.&lt;/p&gt;

&lt;p&gt;Then there's disk. The &lt;a href="https://store.steampowered.com/hwsurvey/" rel="noopener noreferrer"&gt;Steam Hardware Survey for September 2026&lt;/a&gt; says &lt;strong&gt;14.4% of Windows Steam users have less than 100 GB free&lt;/strong&gt;, and 0.67% have under 10 GB. For one in seven players, a 30 GB free game from a stranger is a third of their remaining drive. Nobody uninstalls Counter-Strike for that. I wouldn't either.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hot take: a lot of the 2,077 were never people
&lt;/h2&gt;

&lt;p&gt;Here's the part I can't prove, so I'll just say it: I don't think 2,077 humans wanted to play O'BLOCK today. I think a big chunk of those claims were scripts.&lt;/p&gt;

&lt;p&gt;There's an open-source plugin for &lt;a href="https://github.com/JustArchiNET/ArchiSteamFarm" rel="noopener noreferrer"&gt;ArchiSteamFarm&lt;/a&gt; (13.7K GitHub stars) called &lt;a href="https://github.com/Citrinate/FreePackages" rel="noopener noreferrer"&gt;FreePackages&lt;/a&gt;. Its README, word for word: "This plugin finds free packages on Steam and adds them to your account." By default it will "redeem everything except for demos and playtests". It listens to Steam's change feed so it catches new free games as they're released. Its releases have been downloaded &lt;strong&gt;24,713 times&lt;/strong&gt;. Steam's cap, per the same README, is 30 package activations per 1.5 hours per account, and the plugin uses 25 of those by default. A brand-new free game is exactly what it eats.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1ihi72gl07vbhs2xo9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1ihi72gl07vbhs2xo9j.png" alt="Screenshot of the README of the FreePackages plugin for ArchiSteamFarm on GitHub, downloads badge 25k: This plugin finds free packages on Steam and adds them to your account. It works by listening for changes to Steam's PICS, can discover new packages as they're released, and also monitors certain free games subreddits." width="800" height="411"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;github.com/Citrinate/FreePackages, captured 6:25 PM ET Oct 20 2026. Releases downloaded 24,713 times per the GitHub API.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Run that on a few thousand bot and collector accounts and a launch-day "2,077 claims" looks a lot less like demand. Steam shows devs that number on the dashboard like it's a crowd. My read: it's a mix of real people who added a free game to look at later, library collectors, and accounts that will never run a single executable. Valve could split "claimed by a person" from "claimed by an automated account" tomorrow. They don't, and I think the reason is that a big claim number makes every free launch look alive. Free-to-play claim counts are the most flattering stat in gaming, and they flattered us right up until the 16.&lt;/p&gt;

&lt;p&gt;Then there are the achievements. Of the 16 accounts that launched O'BLOCK, about 5 show every achievement unlocked. With a 13-minute median session, nobody legit 100%'d a business sim on day one. My bet is &lt;a href="https://github.com/gibbed/SteamAchievementManager" rel="noopener noreferrer"&gt;Steam Achievement Manager&lt;/a&gt; (9.3K stars), the tool that unlocks any achievement with a checkbox. So roughly a third of our real players were also not really playing. Achievement hunters, you're welcome to tell me I'm wrong. You'll have to explain the timestamps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What @Pirat_Nation's dunk gets wrong
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd88e8auatt7nfzgffzn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd88e8auatt7nfzgffzn4.png" alt="Screenshot of a post by Pirat_Nation, @Pirat_Nation, Oct 19 2026 3:49 AM, 338.8K views: Double Fine's latest game, Thank You Bus Driver, peaked at just 99 concurrent players on Steam. That's even lower than Kiln and Keeper. This comes less than 24 hours after it was announced that two Double Fine games are leaving Game Pass. Ooff, not looking good for this studio. Attached: a photo of Tim Schafer and a SteamDB chart showing 11 players now, 48 24-hour peak, 99 all-time peak." width="800" height="802"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@Pirat_Nation on X, captured 6:24 PM ET Oct 20 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Peak concurrent players is the stat everyone screenshots because SteamDB puts it in giant numbers. For a free or cheap indie launch it's close to useless. It doesn't tell you how many people got the game, or how many came back. The number we should all be posting is &lt;strong&gt;players per claim&lt;/strong&gt; (or per sale). Ours is 0.77%. Nobody publishes theirs, which is exactly why I'm publishing ours. Double Fine sold a paid game to real buyers. I'd bet their plays-per-owner number embarrasses ours by a mile, peak of 99 or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we changed tonight, and what's next
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6repm3b13jqts6g69g56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6repm3b13jqts6g69g56.png" alt="Screenshot of O'BLOCK's Steam store page: a pixel-art night city with orange skyscrapers, the O'BLOCK logo with a sneaker and a price tag, and the line: Flip sneakers from a Chicago block all the way to billionaires. Haggle with parody stars like Kan Yay and Elon Tusk, catch fakes by the stitching, and turn a $300 shoebox into a billion. One verb: name a price. Free on Steam now. No user reviews yet, released Oct 20 2026." width="800" height="486"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;store.steampowered.com/app/5357680, captured 6:25 PM ET Oct 20 2026 (account header cropped). Storage requirement now reads 4 GB.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3.8 GB default build&lt;/strong&gt; live on Steam at about 6:15 PM ET. Ogg Vorbis, sample-exact stems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"lossless" beta branch&lt;/strong&gt; keeps the full 29.8 GB version for anyone who wants it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store page&lt;/strong&gt; now lists 4 GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 3D graphics upgrade&lt;/strong&gt; is coming soon, and there's a &lt;strong&gt;Halloween surprise&lt;/strong&gt;. No details yet, no dates I can promise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The chapter question for our experiment ("can my AI agents make me famous?") just got sharper. The agents can get a store page 21,848 impressions and 2,077 accounts to click a button. Turning those into players turned out to be an engineering problem, not a marketing one. A free game is not free if it costs you half an hour and a third of your SSD.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claims, launch day:&lt;/strong&gt; 2,077 (Steamworks, 5:24 PM ET Oct 20)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Players:&lt;/strong&gt; 16, so 0.77% of claims&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Median playtime:&lt;/strong&gt; 13 minutes. Peak concurrent: 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporter Packs sold:&lt;/strong&gt; 1 ($4.99)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wishlists:&lt;/strong&gt; 58 (+14 today)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch build vs tonight:&lt;/strong&gt; 29.8 GB vs 3.8 GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top-58 free games on Steam:&lt;/strong&gt; median 8 GB, 21 bigger than our launch build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average Steam download, world:&lt;/strong&gt; 129 Mbps, so 31 min for 29.8 GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steam users under 100 GB free:&lt;/strong&gt; 14.4% (Sep 2026 survey)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The bet, and your turn
&lt;/h2&gt;

&lt;p&gt;Prediction: with the 3.8 GB build, players-per-claim goes from 0.77% to above 3% by Oct 31. If it doesn't, the download wasn't the main wall, the bots were, and I'll write that chapter too with the real number in the headline.&lt;/p&gt;

&lt;p&gt;Your turn: is a free Steam claim a player, a collector or a bot? If you've launched a free game, what was your claims-to-players ratio? Reply with the number. @AlexFinn, you're welcome to answer too: how many players does the gold rush need before it counts?&lt;/p&gt;

&lt;p&gt;If you want to see what a 3.8 GB sneaker-flipping game made by a tiny team and a pile of AI agents feels like, &lt;a href="https://store.steampowered.com/app/5357680/?utm_source=devto&amp;amp;utm_campaign=oblock-launch" rel="noopener noreferrer"&gt;O'BLOCK is free on Steam&lt;/a&gt;. If you want to keep the experiment alive, the &lt;a href="https://store.steampowered.com/app/5357810/?utm_source=devto&amp;amp;utm_campaign=oblock-launch" rel="noopener noreferrer"&gt;$4.99 Complete Supporter Pack&lt;/a&gt; is one click, and right now it's a 1-of-1 club.&lt;/p&gt;

&lt;p&gt;Related on tensorust.com: &lt;a href="https://tensorust.com/articles/vibe-coded-game-economy/" rel="noopener noreferrer"&gt;Sweeney wants rockets. 37,800 bots crashed my vibe-coded game&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/steam-next-fest-october-2026/" rel="noopener noreferrer"&gt;Steam Next Fest opens Oct 19. Our game launches 24 hours later&lt;/a&gt;, and &lt;a href="https://tensorust.com/articles/selling-on-gumroad/" rel="noopener noreferrer"&gt;Selling on Gumroad with AI: 130 products, 0 sales&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method and data: Steamworks read 5:24 PM ET Oct 20 2026 (sales as of 1:30 PM PDT). Top free-to-play list from the SteamSpy genre API, sorted by concurrent players; storage from Steam's appdetails API pc_requirements, pulled 6:20 PM ET Oct 20 2026 (listed storage, not exact download size). Download speeds from Steam's public download_traffic_per_country data, read 6:18 PM ET; world figure is byte-weighted over 237 countries; GB = 10^9 bytes. Disk space from the Steam Hardware &amp;amp; Software Survey, September 2026. FreePackages download count from the GitHub releases API, 6:21 PM ET. X screenshots captured 6:24 PM ET Oct 20 2026; the AlexFinn post is shown top and bottom with the middle cut for length, text not edited. The bot and Steam Achievement Manager parts are my read, not a measurement.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>steam</category>
      <category>ai</category>
    </item>
    <item>
      <title>DeepSeek gave away its engine. The $38-an-hour parts stayed home</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:38:52 +0000</pubDate>
      <link>https://dev.to/mattbusel/deepseek-gave-away-its-engine-the-38-an-hour-parts-stayed-home-2ecg</link>
      <guid>https://dev.to/mattbusel/deepseek-gave-away-its-engine-the-38-an-hour-parts-stayed-home-2ecg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/deepseek-deepinfer/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; At 5:30 AM ET today DeepSeek called DeepInfer, the engine behind its own API, "now fully open source". 1.5 million people saw that post in five hours. DeepSeek's own README lists three things a real service needs that are "not included in this release", and its own Q&amp;amp;A says each GPU in that service earns &lt;strong&gt;$38 an hour&lt;/strong&gt;. I cloned the repo and measured it this morning: &lt;strong&gt;4 of the 5 boxes&lt;/strong&gt; in DeepSeek's own diagram that route traffic or keep the cache are missing, only &lt;strong&gt;6.82%&lt;/strong&gt; of the code matches vLLM, and the Huawei kernels are &lt;strong&gt;52% bigger&lt;/strong&gt; than the Nvidia ones.&lt;/p&gt;

&lt;p&gt;So no, @zephyr_z9, they did not "literally release the secret sauce behind their economics". They released the oven. The recipe that turns GPUs into $38 an hour is still in Hangzhou. It's still the best gift any AI lab has given developers this year, and it's still not what the post says it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz75j7uj5rnvaa1auw7fp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz75j7uj5rnvaa1auw7fp.gif" alt="Animated bar chart, dollars per GPU-hour. DeepSeek's revenue per GPU-hour from its own DeepInfer Q&amp;amp;A, at valley pricing: $38.00. Renting a B200 on Google Cloud, 8-GPU node in us-central1: 1-year commitment $11.12, 3-year $7.09, spot $4.95. Final line: the engine is open now, the parts that keep those GPUs full are not." width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;DeepInfer doc/inference_deployment_qa.md and computeprices.com's Google Cloud B200 page, both read Oct 20 2026. Revenue is not profit. Static frame: hero.png.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  "Fully open source." Their README disagrees
&lt;/h2&gt;

&lt;p&gt;Here is the post, from &lt;a href="https://x.com/deepseek_ai/status/2112476496283775135" rel="noopener noreferrer"&gt;@deepseek_ai at 5:30 AM ET&lt;/a&gt;. By 10:31 AM it had 1.5M views and 19K likes. The repo hit &lt;a href="https://github.com/deepseek-ai/DeepInfer" rel="noopener noreferrer"&gt;8,663 stars&lt;/a&gt; by 10:33 AM, and the Hacker News thread was &lt;a href="https://news.ycombinator.com/item?id=50163277" rel="noopener noreferrer"&gt;#1 with 1,222 points and 437 comments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fghrmckimy9699qtjtmkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fghrmckimy9699qtjtmkz.png" alt="Screenshot of a post by DeepSeek, @deepseek_ai, Oct 20 2026 5:30 AM ET: Introducing DeepInfer, our in-house inference framework, now fully open source! Powering DeepSeek-V4.1-Flash at scale with high throughput and low latency. We're sharing our production stack to help the community lower compute costs, reduce energy use, and make AI more affordable. 1.5M views." width="800" height="742"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@deepseek_ai on X, Oct 20 2026, captured 10:31 AM ET Oct 20 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now open the README. Below "Supported hardware" there is a list with this heading, word for word: &lt;strong&gt;"Required for a complete inference service (not included in this release)"&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"A KV cache system"&lt;/li&gt;
&lt;li&gt;"VE/Prefill/Decode disaggregation (most required engine functionality is already implemented)"&lt;/li&gt;
&lt;li&gt;"Load balancing across data-parallel replicas for both prefill and decode"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first line of the README is just as honest: "This open-source release provides &lt;strong&gt;offline inference&lt;/strong&gt;." There's no API server in the repo. I grepped it: the only HTTP code is a profiling endpoint you switch on with an environment variable. You can run prompts through DeepInfer on your own cluster. You can't point a customer at it.&lt;/p&gt;

&lt;p&gt;Plain English for the jargon. &lt;strong&gt;Prefill&lt;/strong&gt; is the model reading your prompt. &lt;strong&gt;Decode&lt;/strong&gt; is the model writing the answer, one token at a time. &lt;strong&gt;KV cache&lt;/strong&gt; is the model's notes on a prompt it has already read, so it doesn't have to read it again. &lt;strong&gt;Disaggregation&lt;/strong&gt; means prefill and decode run on separate machines. A &lt;strong&gt;load balancer&lt;/strong&gt; decides which machine gets your request. Every one of those is what turns an engine into a business.&lt;/p&gt;
&lt;h2&gt;
  
  
  I put their own diagram next to the repo
&lt;/h2&gt;

&lt;p&gt;DeepSeek published a &lt;a href="https://github.com/deepseek-ai/DeepInfer/blob/main/doc/inference_deployment_qa.md" rel="noopener noreferrer"&gt;deployment Q&amp;amp;A&lt;/a&gt; with the release. It has an architecture diagram of the whole V4.1 Flash serving system. I labelled each box from the README's "not included" list and a read of the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjuis39mleubvqsco29x7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjuis39mleubvqsco29x7.png" alt="DeepSeek's own architecture diagram of the V4.1 Flash inference system, labelled. DeepSeek Recipe: open, own repo. Entrypoint: offline only. Vision Encoder Load Balancer, Prefill Load Balancer and Decode Load Balancer: not released. Vision Encoder Service, Prefill Service and Decode Service with their Expert-Parallel Load Balancers: in the repo. External KVCache Storage on 3FS: the store is not released, 3FS itself is open." width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Diagram from DeepInfer doc/images/architecture_overview.png (Apache-2.0); labels are ours, from the README's not-included list and a read of the code, Oct 20 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Q&amp;amp;A names five pieces that route traffic or keep the cache: a &lt;strong&gt;Prefill Load Balancer, a Decode Load Balancer, a Vision Encoder Load Balancer, an Expert-Parallel Load Balancer, and KVCache Storage&lt;/strong&gt;. Only the expert-parallel one ships (it's in &lt;code&gt;deepinfer/model_executor/eplb/&lt;/code&gt;). That's &lt;strong&gt;1 of 5&lt;/strong&gt;. The 3FS file system under the cache has been &lt;a href="https://github.com/deepseek-ai/3FS" rel="noopener noreferrer"&gt;open since February 2025&lt;/a&gt;. The component that runs the cache on top of it, which the Q&amp;amp;A calls &lt;code&gt;kvcache-store&lt;/code&gt;, is not in the repo.&lt;/p&gt;

&lt;p&gt;And DeepSeek tells you why, in the Q&amp;amp;A, in a paragraph most people scrolled past:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The KV cache management and load balancing components of the inference system are tightly coupled to our internal infrastructure, so that code is not yet fully open-sourced."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Not yet fully open-sourced" and "now fully open source" are both DeepSeek sentences, published the same morning. Only one of them is in the tweet.&lt;/p&gt;
&lt;h2&gt;
  
  
  The secret sauce is the cache, and they said so
&lt;/h2&gt;

&lt;p&gt;This is the part that makes the "they gave away their economics" takes wrong. DeepSeek listed three design goals for the system. Goal three: &lt;strong&gt;"Retain KV cache for more than 72 hours"&lt;/strong&gt;, so a repeated prompt skips the expensive reading step. That is where cheap inference comes from: you don't pay to read the same 50-page codebase twice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fml64f9dvwg3s19sl4hm7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fml64f9dvwg3s19sl4hm7.png" alt="Two screenshots. A post by Zephyr, @zephyr_z9, Oct 20 2026 5:57 AM ET, quoting DeepSeek's DeepInfer post: DAMN, they literally released the secret sauce behind their economics. 128.3K views. Below it a post by Polymarket, 8:55 AM ET: JUST IN: China's DeepSeek releases an open-source tool designed to dramatically reduce the computing costs of running AI models. 75.4K views." width="800" height="754"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@zephyr_z9 and @Polymarket on X, Oct 20 2026, captured 10:31 AM ET Oct 20 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Look at what the Q&amp;amp;A says those missing parts are worth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;155 trillion tokens per day&lt;/strong&gt; through a single cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$38 of revenue per GPU-hour&lt;/strong&gt;, "at valley pricing" (DeepSeek's off-peak discount, so probably the low end).&lt;/li&gt;
&lt;li&gt;Load balancing gets them to &lt;strong&gt;about 80%&lt;/strong&gt; of a perfectly balanced benchmark. That gap between a box of GPUs and a busy box of GPUs is the business.&lt;/li&gt;
&lt;li&gt;Cache storage sized at &lt;strong&gt;14.4 TB per GPU&lt;/strong&gt;, on servers with 20 SSDs of 30.73 TB each, erasure-coded so any 10 of 11 nodes can answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the comparison nobody in the replies made. Google Cloud rents a B200, the same Blackwell class as DeepInfer's "SM100" target, for &lt;a href="https://computeprices.com/providers/google/gpus/b200" rel="noopener noreferrer"&gt;$4.95 an hour on spot, $7.09 on a 3-year deal, $11.12 on a 1-year deal&lt;/a&gt; (prices updated today). DeepSeek's number is &lt;strong&gt;3.4x to 7.7x&lt;/strong&gt; what the GPU costs to rent. Revenue isn't profit, and DeepSeek owns hardware instead of renting it, but that spread is the economics. And the spread lives in the 4 boxes that aren't in the repo.&lt;/p&gt;

&lt;p&gt;Hot take, and I'll stand on it: &lt;strong&gt;@Polymarket's&lt;/strong&gt; "dramatically reduce the computing costs of running AI models" is true for maybe 50 companies on Earth. Here's why.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running it like DeepSeek starts at 128 GPUs
&lt;/h2&gt;

&lt;p&gt;The Q&amp;amp;A is blunt about the minimum: "the smallest efficient deployment unit is 64 GPUs of prefill plus 64 GPUs of decode." The README benchmarks were "measured on 4 SM100 GPUs for prefill and 64 for decode". Decode wants EP64 or more (the experts of the model spread across 64 to 128 GPUs). So I did the bill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xoa3d5mwi582alkmbki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xoa3d5mwi582alkmbki.png" alt="Stat card titled the smallest efficient deployment unit, from DeepSeek's Q&amp;amp;A. 128 Blackwell-class GPUs, 64 prefill plus 64 decode. $634 to $1,423 per hour to rent them on Google Cloud, spot to 1-year. $15,206 to $34,161 per day before storage, network or people. 1.84 PB of KV cache storage at 14.4 TB per GPU. 0 lines of the replica load balancers or the cache store in this release." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our math: 128 x $4.95 and 128 x $11.12 (Google Cloud B200, Oct 20 2026), 128 x 14.4 TB. GPU count and storage ratio from DeepInfer's Q&amp;amp;A.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;128 GPUs&lt;/strong&gt; x $4.95 to $11.12 = &lt;strong&gt;$634 to $1,423 an hour&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;That's &lt;strong&gt;$15,206 to $34,161 a day&lt;/strong&gt;, before storage, networking or a single engineer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.84 PB&lt;/strong&gt; of cache storage at their 14.4 TB per GPU ratio.&lt;/li&gt;
&lt;li&gt;Plus the load balancers and cache store you now write yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare that with the other DeepSeek thing on the timeline this week: &lt;a href="https://x.com/UnslothAI/status/2112212605930778830" rel="noopener noreferrer"&gt;Unsloth's 1-bit V4.1 Flash&lt;/a&gt;, 508GB shrunk to 250GB, running on a 128GB+ RAM machine. That's the open model most people will actually touch. DeepInfer is for clouds. If you're a solo dev, DeepSeek's real gift to you is still the &lt;a href="https://openrouter.ai/deepseek" rel="noopener noreferrer"&gt;cheap API&lt;/a&gt;, not this repo.&lt;/p&gt;

&lt;p&gt;Their Q&amp;amp;A even has the best line of the whole release. Can you split prefill and decode across data centers? Yes, "at some cost in reliability, e.g., the fiber running between data centers is easily severed by construction work." Respect. That's a team that has had a backhoe ruin its week.&lt;/p&gt;
&lt;h2&gt;
  
  
  vLLM says "built primarily on vLLM". I measured 6.82%
&lt;/h2&gt;

&lt;p&gt;The other big reaction came from the vLLM team, the open-source engine most of the industry runs on. Their post is gracious, and DeepSeek's README does say DeepInfer "was originally built primarily on vLLM".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wo3b7vq5vvy2b10hu9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wo3b7vq5vvy2b10hu9x.png" alt="Screenshot of a post by vLLM, @vllm_project, Oct 20 2026 5:47 AM ET, quoting DeepSeek: Grateful to @deepseek_ai for releasing DeepInfer, initially built primarily on @vllm_project, under Apache 2.0 and crediting the open-source community! We've worked hard on DeepSeek V4.1 Flash inference efficiency and will keep improving with ideas from DeepInfer. 36K views." width="800" height="701"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@vllm_project on X, Oct 20 2026, captured 10:31 AM ET Oct 20 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I measured how much vLLM is left. I cloned DeepInfer (commit &lt;code&gt;774ce24&lt;/code&gt;) and vLLM at nine releases, from v0.2.0 (2023) to today's main branch. I took every Python line of 25+ characters in DeepInfer's &lt;code&gt;deepinfer/&lt;/code&gt; package, dropped comments and blank lines, collapsed whitespace, and checked each line for an exact match anywhere in each vLLM release. The script is 60 lines of Python, ran in about a minute, and needed no GPU.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def norm(l):
    l = l.strip()
    if not l or l.startswith('#'): return None
    if len(l) &amp;lt; 25: return None   # skip trivial lines
    return re.sub(r'\s+', ' ', l)

# every .py file in each vLLM tag, read straight out of git
p = subprocess.run(['git', '-C', VL, 'cat-file', '--batch'],
                   input='\n'.join(f'{ref}:{f}' for f in files).encode(),
                   capture_output=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwj43drzitsyh5mu2xw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwj43drzitsyh5mu2xw1.png" alt="Bar chart: share of DeepInfer's 25,086 significant Python lines in 218 files that appear verbatim in each vLLM release. v0.2.0 1.65%, v0.2.7 2.09%, v0.3.3 2.43%, v0.4.3 2.40%, v0.5.5 3.08%, v0.6.6 3.56%, v0.8.5 4.02%, v0.10.2 4.18%, main 5.70%, any release 6.82%. The other 93% matches no vLLM line. Top single file: shm_broadcast.py at 76.7%." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our run, 10:20 AM ET Oct 20 2026: DeepInfer 774ce24 vs vllm-project/vllm tags and main 255e3a3, exact match of whitespace-normalized lines of 25+ characters.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;1,711 of 25,086 lines (6.82%)&lt;/strong&gt; appear in at least one vLLM release. The best single release is today's vLLM main at 5.70%, which mostly means both projects picked up the same new ideas. The most vLLM-flavored file is &lt;code&gt;shm_broadcast.py&lt;/code&gt;, a shared-memory message queue, at 76.7%. The engine core, &lt;code&gt;llm_engine.py&lt;/code&gt;, is 19.2%. The V4 model code is around 5 to 12%.&lt;/p&gt;

&lt;p&gt;The folder layout still says vLLM: &lt;code&gt;worker/cache_engine.py&lt;/code&gt;, &lt;code&gt;sequence.py&lt;/code&gt;, &lt;code&gt;model_runner.py&lt;/code&gt;. Those are the names vLLM used back in 2023. But the code inside got rewritten. This method misses renamed variables and refactors, so treat 6.82% as the floor of the family resemblance, not a plagiarism score. My read: "built on vLLM" is like saying a skyscraper is built on the parking lot that used to be there. True, and generous, and DeepSeek gets real credit for writing the other 93%.&lt;/p&gt;

&lt;h2&gt;
  
  
  52% more code for Huawei than for Nvidia
&lt;/h2&gt;

&lt;p&gt;Here's what I think the release is really about. DeepInfer's custom kernels (the small GPU programs that do the math) live in &lt;code&gt;tilelang_ops/&lt;/code&gt;, with one backend per chip. Same 30 kernels, two versions each. I counted non-blank lines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbwfc8sf2r38x27nxcng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbwfc8sf2r38x27nxcng.png" alt="Bar chart of DeepInfer's TileLang kernel backends, same 30 kernels on two chips. Huawei Ascend backend, tilelang_ops/asc: 6,793 non-blank lines. NVIDIA backend, tilelang_ops/cuda: 4,482. Headline: 52% more kernel code for Huawei than for Nvidia. Notes: DeepGEMM-Ascend and DeepEP-Ascend repos created Sep 29 and 30 2026; README hardware list is NVIDIA SM100 and Huawei Ascend 950 only; the DHS order removing DeepSeek from US civilian agencies was made public Oct 19 2026." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Line counts from DeepInfer 774ce24, 10:25 AM ET Oct 20 2026; repo dates from the GitHub API; ban per Reuters, Oct 19 2026.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Huawei Ascend backend: 6,793 lines.&lt;/strong&gt; NVIDIA backend: 4,482. That's &lt;strong&gt;+51.6%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Supported hardware in the README: "NVIDIA SM100 GPUs" and "Huawei Ascend 950 NPUs". That's the whole list. No H100. No AMD.&lt;/li&gt;
&lt;li&gt;The Ascend kernel libraries ship as their own repos, &lt;a href="https://github.com/deepseek-ai/DeepGEMM-Ascend" rel="noopener noreferrer"&gt;DeepGEMM-Ascend&lt;/a&gt; and &lt;a href="https://github.com/deepseek-ai/DeepEP-Ascend" rel="noopener noreferrer"&gt;DeepEP-Ascend&lt;/a&gt;, both created on &lt;strong&gt;Sep 29 and 30, 2026&lt;/strong&gt;, three weeks before today.&lt;/li&gt;
&lt;li&gt;One day before the release, Reuters reported that the US Department of Homeland Security is &lt;a href="https://www.ctvnews.ca/world/article/us-banning-chinese-ai-deepseek-from-government-agency-it-systems/" rel="noopener noreferrer"&gt;ordering civilian federal agencies to remove DeepSeek&lt;/a&gt; products and third-party services built on its models (issued in July, &lt;a href="https://thehill.com/policy/technology/6159116-dhs-bans-chinese-deepseek-ai/" rel="noopener noreferrer"&gt;made public Oct 19&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The same day, &lt;a href="https://x.com/unusual_whales/status/2112287169381294235" rel="noopener noreferrer"&gt;The Information reported&lt;/a&gt; (via @unusual_whales, 149K views) that DeepSeek and Huawei are teaming up on new AI chip designs to challenge Nvidia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of that +52% is just the cost of a younger chip: Ascend kernels need more hand-holding than CUDA ones. But nobody writes 6,793 lines for a chip they don't plan to sell on. Here's what I think is really happening, and they'll never say it out loud: this is a Huawei sales deck with an Apache license. Every Chinese cloud that wants to serve DeepSeek at DeepSeek's prices now has a production-grade engine that runs on chips the US can't cut off. The US bans DeepSeek from its agencies on Monday. On Tuesday DeepSeek makes its model cheaper for everyone else to serve, on Huawei silicon. Lowkey the best-timed open-source drop of the year.&lt;/p&gt;

&lt;p&gt;One more receipt for the "it's a Chinese production system, not a demo" pile: &lt;strong&gt;1,147 of 40,638&lt;/strong&gt; non-blank lines in the package carry Chinese comments or docstrings, like &lt;code&gt;"""compress 内核固定开启 fast math。"""&lt;/code&gt; ("the compress kernel always turns on fast math"). Nobody wrote this for a launch blog. The whole history is &lt;strong&gt;3 commits&lt;/strong&gt;: one "initial commit" of 345 files and 63,326 lines at 12:09 AM ET, then two doc updates. It got exported from somewhere private this morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still more open than OpenAI. That's the real burn
&lt;/h2&gt;

&lt;p&gt;To be fair to DeepSeek, and unfair to everyone else: OpenAI's open release was &lt;a href="https://openai.com/index/introducing-gpt-oss/" rel="noopener noreferrer"&gt;gpt-oss in August 2025&lt;/a&gt;, weights under Apache 2.0 with reference code. OpenAI, Anthropic and Google have published zero lines of the systems that actually serve ChatGPT, Claude or Gemini to paying users. DeepSeek just published the engine, the kernels, the expert balancer, a tokenizer service written mostly in Rust (&lt;a href="https://github.com/deepseek-ai/deepseek-recipe" rel="noopener noreferrer"&gt;deepseek-recipe&lt;/a&gt;), its storage layout, its revenue per GPU-hour and its traffic.&lt;/p&gt;

&lt;p&gt;So pick your villain. Is it the lab that ships 93% of a production engine and calls it 100%, or the labs that ship 0% and call themselves the good guys?&lt;/p&gt;

&lt;h2&gt;
  
  
  The ranking of today's takes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Most wrong:&lt;/strong&gt; &lt;a href="https://x.com/zephyr_z9/status/2112483222814937576" rel="noopener noreferrer"&gt;@zephyr_z9&lt;/a&gt;, "They literally released the secret sauce behind their economics" (128K views). The sauce is a 72-hour cache and four load balancers. Neither shipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most wrong for most readers:&lt;/strong&gt; &lt;a href="https://x.com/Polymarket/status/2112528073828520016" rel="noopener noreferrer"&gt;@Polymarket&lt;/a&gt;, "dramatically reduce the computing costs of running AI models" (75K). For anyone with 128 Blackwells and a petabyte of SSD, sure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most generous:&lt;/strong&gt; &lt;a href="https://x.com/vllm_project/status/2112480719952138301" rel="noopener noreferrer"&gt;@vllm_project&lt;/a&gt;, "initially built primarily on vLLM". 6.82% today. Take the credit for the foundation; the building is DeepSeek's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most accurate:&lt;/strong&gt; DeepSeek's own README. Somebody on that team wrote "not included in this release" in plain words. The marketing post didn't read it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The numbers so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boxes in DeepSeek's routing/cache layer that shipped:&lt;/strong&gt; 1 of 5 (EPLB), read 10:25 AM ET Oct 20&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepInfer lines found in any of 9 vLLM releases:&lt;/strong&gt; 1,711 of 25,086 (6.82%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel lines, Huawei Ascend vs NVIDIA:&lt;/strong&gt; 6,793 vs 4,482 (+51.6%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek revenue per GPU-hour:&lt;/strong&gt; $38 (their Q&amp;amp;A) vs $4.95 to $11.12 to rent a B200 on Google Cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smallest efficient deployment:&lt;/strong&gt; 128 GPUs, $634 to $1,423 an hour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; 8,663 at 10:33 AM ET, about 10 hours after the first commit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My bet, and your turn
&lt;/h2&gt;

&lt;p&gt;Prediction: by Nov 30, vLLM and SGLang ship most of DeepInfer's tricks (the draft-token decoding, the bounded SWA replay) and US clouds serve V4.1 Flash faster than they do today. And by Dec 31, nobody outside China runs it the way DeepSeek does, with the 72-hour cache and the four balancers, because DeepSeek kept those. If I'm wrong, show me the cluster and I'll write the correction with your name in the headline.&lt;/p&gt;

&lt;p&gt;Your turn: is "fully open source" fair for a release you can't serve a single API request with? Yes or no, and say why in the replies. @deepseek_ai, you're welcome to answer too.&lt;/p&gt;

&lt;p&gt;Want to see what V4.1 Flash costs you through an API versus renting the GPUs yourself? The &lt;a href="https://shop.tensorust.com/buy/llm-cost-calculator?utm_source=devto&amp;amp;utm_campaign=deepseek-deepinfer" rel="noopener noreferrer"&gt;LLM API Cost Calculator ($7, Google Sheets + Excel, 26 models)&lt;/a&gt; does the per-request math in one sheet. The free version is on the site at &lt;a href="https://tensorust.com/tools/llm-api-cost/" rel="noopener noreferrer"&gt;tensorust.com/tools/llm-api-cost/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Related on tensorust.com: &lt;a href="https://tensorust.com/articles/muse-spark-open-weights-ram/" rel="noopener noreferrer"&gt;Meta open-sourced an 816B model. Running it takes about 1TB of RAM&lt;/a&gt;, &lt;a href="https://tensorust.com/articles/llm-proxy-benchmark/" rel="noopener noreferrer"&gt;LLM proxy benchmark: 200 duplicate calls became 1&lt;/a&gt;, and &lt;a href="https://tensorust.com/articles/claude-code-vs-codex-outages/" rel="noopener noreferrer"&gt;Theo's 60% stat is an outage chart&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method and data: DeepInfer cloned at 774ce24 (Oct 20 2026), vllm-project/vllm tags v0.2.0, v0.2.7, v0.3.3, v0.4.3, v0.5.5, v0.6.6, v0.8.5, v0.10.2 and main at 255e3a3. All counts run 10:20 to 10:35 AM ET Oct 20 2026. X screenshots captured 10:31 AM ET, real and unedited. GPU prices from computeprices.com's Google Cloud B200 page, updated Oct 20 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Selling on Gumroad with AI: 130 products, 0 sales. Greg is wrong</title>
      <dc:creator>Matt Busel</dc:creator>
      <pubDate>Mon, 19 Oct 2026 23:22:12 +0000</pubDate>
      <link>https://dev.to/mattbusel/selling-on-gumroad-with-ai-130-products-0-sales-greg-is-wrong-5f0b</link>
      <guid>https://dev.to/mattbusel/selling-on-gumroad-with-ai-130-products-0-sales-greg-is-wrong-5f0b</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://tensorust.com/articles/selling-on-gumroad/" rel="noopener noreferrer"&gt;tensorust.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In a post with 339,000 views today, Greg Isenberg said AI will "probably create 1000+ millionaires" and showed how he would build a one-person business "with $0 and 0 social following". I ran that experiment already. My AI agents built and listed &lt;strong&gt;130 products on Gumroad&lt;/strong&gt; in 13 days, 88 of them real working apps. They have been on sale for 36 days. At 7:11 PM ET tonight I pulled every number from the Gumroad API: &lt;strong&gt;0 sales, $0 revenue, and 0 downloads of the 87 products that cost nothing&lt;/strong&gt;. Not one stranger took a free app.&lt;/p&gt;

&lt;p&gt;So, is selling on Gumroad worth it? Only if you bring the buyers. Gumroad is a checkout, not a crowd: its own marketplace, Discover, &lt;a href="https://gumroad.com/help/article/79-gumroad-discover" rel="noopener noreferrer"&gt;will not list you&lt;/a&gt; until you have made at least $100 from genuine sales somewhere else and passed a risk review that "can take on average 3 weeks". With 0 followers you never reach the $100. Below is the store, the code, the full funnel with real numbers, the mistakes that are mine, and a checklist that would have saved me 36 days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx32jdnxxzic2yix5t0df.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx32jdnxxzic2yix5t0df.gif" alt="Animated bar chart of the whole Gumroad funnel. 130 products live, 87 of them free at $0+, 33 tracked links handed to the agents, 10 unique clicks on those links in 7 days, and 0 sales, $0. Footer: a $0 checkout counts as a sale on Gumroad, sales_count is 0 on all 131 products." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gumroad API v2 pull, 7:11 PM ET Oct 19 2026. Static frame: funnel.png.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  "$0 and 0 social following." I have the receipt
&lt;/h2&gt;

&lt;p&gt;This is the post, from &lt;a href="https://x.com/gregisenberg/status/2112252038079816082" rel="noopener noreferrer"&gt;@gregisenberg at 2:38 PM today&lt;/a&gt;. It is a 24-minute video about a one-person business powered by AI and Meta Muse. 10,000 people bookmarked it in four hours.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk3ltvwcbigd657o6lz4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk3ltvwcbigd657o6lz4s.png" alt="Screenshot of a post by Greg Isenberg, Oct 19 2026, 2:38 PM: Meta Muse will probably create 1000+ millionaires. This is the most slept on arbitrage I have seen in years and it is not even close. Here is how I would build a 1 person business powered by AI/Muse with $0 and 0 social following. A 24:29 video. 339.9K views, 4.1K likes, 10K bookmarks." width="800" height="669"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;@gregisenberg on X, Oct 19 2026, captured 7:14 PM ET, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am not going to argue about Meta Muse. I am going to argue about the sentence that sells the video: &lt;strong&gt;$0 and 0 social following&lt;/strong&gt;. That is the part every "AI side hustle" thread repeats, and it is the part I can test, because I did the cheapest possible version of it in September. AI builds the product. AI writes the listing. AI uploads it. Price it low, then free. Wait.&lt;/p&gt;

&lt;p&gt;Here is what that looks like when the waiting is over. Every number below came out of the Gumroad API tonight, not out of a screenshot of a dashboard.&lt;/p&gt;
&lt;h2&gt;
  
  
  What 13 days of AI building put on the shelf
&lt;/h2&gt;

&lt;p&gt;Between September 13 and September 25 an AI coding agent (Claude Code) built and published the store at &lt;a href="https://mattitude8861.gumroad.com" rel="noopener noreferrer"&gt;mattitude8861.gumroad.com&lt;/a&gt;. I wrote one-line specs and picked the ideas. It wrote the apps, the listings, the covers and the upload script. Today the API counts &lt;strong&gt;131 products, 130 live&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;88 single-file HTML apps&lt;/strong&gt;: budget, habits, invoices, chores, pet records, meal plans, workout logs, a PDF tool, a vibe-coding spec writer, and a long tail of hobby calculators (espresso, reef dosing, 3D print quotes, bike gears).&lt;/li&gt;
&lt;li&gt;Spreadsheet templates, checklists, bundles, and a few $25 to $149 notebooks and services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fla18y24gsyfhdmjeumyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fla18y24gsyfhdmjeumyh.png" alt="Grid of six real app screenshots from the store: an envelope budget, a habit tracker called Chain, an invoice list, a family chore chart, a pet medication schedule with a double-dose warning, and a blue vibe-coding spec writer." width="800" height="573"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;6 of the 88 single-file apps, captured by the build scripts Sep 21 to 25 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"Single-file" means each app is one &lt;code&gt;.html&lt;/code&gt; file you double-click. No install, no account, no server, nothing to pay for every month. I ran a fresh census over every shipped file tonight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;88 apps, 5,482,185 bytes, 25,912 lines&lt;/strong&gt; in total. The median app is &lt;strong&gt;28.6 KB and 216 lines&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt; load an external script, font or image. They work on a plane.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60&lt;/strong&gt; save your data with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage" rel="noopener noreferrer"&gt;localStorage&lt;/a&gt;, the browser's built-in key-value store. None needed a database.&lt;/li&gt;
&lt;li&gt;The biggest is the PDF tool at 2.1 MB because it carries its PDF library inside the file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the whole persistence layer of the envelope budget app, from &lt;code&gt;apps8/budget/index.html&lt;/code&gt;. It is the pattern every one of the 60 uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;envelope.v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nc"&gt;DEF&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;DEF&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// backup = download your state as a file, restore = read it back&lt;/span&gt;
&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#exportB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;onclick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;envelope-backup.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Merge with defaults on load so old saves survive new fields, swallow storage errors (private windows throw), and give people a backup button built on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL_static" rel="noopener noreferrer"&gt;URL.createObjectURL&lt;/a&gt;, because a browser can wipe localStorage. That is honestly good engineering for a $5 app. The product was not the problem. Hold that thought.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fresh pull: 0 sales, and 0 free downloads
&lt;/h2&gt;

&lt;p&gt;Tonight's script makes read-only GET calls and writes counts, never buyer data. The part that matters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;prods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all_products&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                       &lt;span class="c1"&gt;# pages through GET /v2/products
&lt;/span&gt;&lt;span class="n"&gt;summ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prods&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sales_count_sum&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sales_count&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prods&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sales_usd_cents_sum&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sales_usd_cents&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prods&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;free_pwyw&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prods&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;customizable_price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/sales&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sales&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;  &lt;span class="c1"&gt;# every transaction, any price
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fku8senr60b72lxmsd2hb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fku8senr60b72lxmsd2hb.png" alt="Terminal capture. pull.py: 131 products, 130 published, 87 free, 15 pay what you want with a floor, 28 fixed; sales_count_sum 0, sales_usd_cents_sum 0, GET /sales records 0, 33 utm links with 10 unique clicks. apps.py: 88 apps built Sep 15 to Sep 25, 5,482,185 bytes, 25,912 lines, 0 external scripts, 60 use localStorage." width="800" height="427"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Fresh run, 7:11 PM ET Oct 19 2026. Read-only API calls, no buyer data.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gumroad API, 7:11 PM ET Oct 19 2026&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Products / live&lt;/td&gt;
&lt;td&gt;131 / 130&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free, pay what you want from $0&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay what you want with a floor ($4+ to $9+)&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed price&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sales_count&lt;/code&gt;, all products&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revenue&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Records in &lt;code&gt;GET /v2/sales&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free number is the one that hurts, and it is the most useful number in this article. On Gumroad, a $0 checkout is recorded as a sale: it shows up in &lt;code&gt;sales_count&lt;/code&gt; and in &lt;code&gt;/v2/sales&lt;/code&gt;, same as a paid one. 87 products have been free since September 25. Zero claims in 24 days means &lt;strong&gt;nobody ever reached a checkout page&lt;/strong&gt;. When free does not move, price is not your problem. You do not have a price problem, you have a nobody problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the traffic came from: 3 posts out of 1,383
&lt;/h2&gt;

&lt;p&gt;On October 11 and 12 my agents made &lt;a href="https://gumroad.com/api" rel="noopener noreferrer"&gt;33 tracked links&lt;/a&gt; through Gumroad's UTM feature, one per hero product per platform, so every click would be counted. Here is every click since:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhv0das9szh9mkirsezl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhv0das9szh9mkirsezl8.png" alt="Bar chart of unique clicks on 33 tracked Gumroad links since Oct 12: dev.to 8 (one article edit), Moltbook 1, our receipts page 1, X 0, LinkedIn 0. Subtitle: the agents put a store link in 3 of 1,383 logged posts." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gumroad UTM link stats, pulled 7:11 PM ET Oct 19 2026; post count from our posts.json log.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10 unique clicks in 7 days.&lt;/strong&gt; 8 came from a single &lt;a href="https://dev.to/mattbusel/your-coding-agents-token-just-failed-mid-task-does-it-stop-or-go-find-another-key-3pge"&gt;dev.to article&lt;/a&gt; that mentioned one product in context. 1 came from a &lt;a href="https://www.moltbook.com/post/d7622e91-a9ea-4d6c-aed7-17c82d0beef4" rel="noopener noreferrer"&gt;Moltbook thread&lt;/a&gt;, 1 from our own receipts page. The 16 links made for X and LinkedIn: 0.&lt;/p&gt;

&lt;p&gt;Now the self-roast, because this one is mine, not Gumroad's. I searched our posting log. Our agent team keeps a log of everything it posts: &lt;strong&gt;1,383 entries&lt;/strong&gt; so far, posts, replies, articles and pitches. &lt;strong&gt;3&lt;/strong&gt; of them carried a link to the store. Those 3 produced 9 of the 10 clicks. The agents were busy farming views for articles and a Steam game, and the store got 0.2% of the attention. You cannot get a sale from a page nobody is sent to, and I sent almost nobody.&lt;/p&gt;

&lt;p&gt;So no, I did not prove Gumroad is dead. I proved something more boring and more useful: &lt;strong&gt;130 products with no distribution is the same as 0 products&lt;/strong&gt;. The AI made the shelf infinite. It did nothing for the foot traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/shl"&gt;@shl&lt;/a&gt; asked how many agents you have. Here is what 3+ agents do on Gumroad
&lt;/h2&gt;

&lt;p&gt;Two days ago Gumroad's founder and CEO &lt;a href="https://x.com/shl/status/2111666622993957216" rel="noopener noreferrer"&gt;Sahil Lavingia ran a poll&lt;/a&gt;: "How many agents do you have?" Of 880 votes, &lt;strong&gt;54.5% said 3 or more&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6m7e44qmn8f6a93vjbft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6m7e44qmn8f6a93vjbft.png" alt="Screenshot of a poll by Sahil Lavingia, Oct 17 2026, 11:52 PM: How many agents do you have? 0: 23.1%, 1: 12.5%, 2: 9.9%, 3+: 54.5%. 880 votes, final results, 13.6K views." width="799" height="489"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/shl"&gt;@shl&lt;/a&gt; on X, Oct 17 2026, captured 7:14 PM ET Oct 19 2026, real and unedited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sahil, I am in your 54.5%. My agents shipped 130 products to your platform in 13 days, faster than a human could write the listings. And your platform did exactly what it should with a store like mine: nothing. Read the Discover rules again. To be shown to Gumroad's own buyers you need payout settings, a balance of at least $100 "from enough genuine sales (not self-purchases or asking your partner/housemates to buy your product)", and a risk review on top. Then each product needs one real sale of its own.&lt;/p&gt;

&lt;p&gt;Here is my read, and I think it is where this is heading. That $100 wall used to be a fraud filter. In the agent era it is the most important sentence in Gumroad's help center, because it is the only thing standing between buyers and a flood of AI-built stores like mine. If 54.5% of Sahil's followers run 3+ agents, they can all do what I did in a week. Gumroad cannot show all of it, so it shows none of it until a human proves demand. The marketplace is not going to save the "0 following" crowd. It is specifically built to ignore them.&lt;/p&gt;

&lt;p&gt;And when Discover does sell for you, it costs more. These are Gumroad's published fees, checked tonight:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke0kw2ah1f6o0kwjqcp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fke0kw2ah1f6o0kwjqcp0.png" alt="Split bars showing who gets a $5 Gumroad sale. Your own traffic: you keep $3.56, Gumroad takes $1.00 (10% plus $0.50), card processing $0.45. Gumroad Discover: you keep $3.50, Gumroad takes $1.50 (flat 30%). Note: Discover needs payout settings, a $100 balance from genuine sales and a risk review of about 3 weeks." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gumroad's fees and Discover help articles, fetched 7:15 PM ET Oct 19 2026.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A $5 sale&lt;/th&gt;
&lt;th&gt;You keep&lt;/th&gt;
&lt;th&gt;Fee&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Buyer you sent (10% + $0.50, plus card 2.9% + $0.30)&lt;/td&gt;
&lt;td&gt;$3.56&lt;/td&gt;
&lt;td&gt;$1.45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buyer Gumroad sent via Discover (flat 30%)&lt;/td&gt;
&lt;td&gt;$3.50&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Source: &lt;a href="https://gumroad.com/help/article/66-gumroads-fees" rel="noopener noreferrer"&gt;Gumroad's fees page&lt;/a&gt;. On a $5 product the 50-cent flat fee is a tenth of the price, so cheap products pay the most. The fee was never the problem for me, though. 30% of $0 is $0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supply is infinite. Attention is the product
&lt;/h2&gt;

&lt;p&gt;Gumroad's API has an endpoint that returns how many paid listings match a search, with price percentiles. I ran it tonight on the categories my apps compete in:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc8hb61obhaaswhbwsxtt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc8hb61obhaaswhbwsxtt.png" alt="Log-scale bar chart of paid Gumroad listings per search: notion template 10,388, chatgpt prompts 3,151, habit tracker 1,988, budget tracker 1,569, calculator 1,305, meal planner 1,027, invoice template 658, offline app 456, html app 399, workout log 262, vibe coding 123, each with its median price." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gumroad API GET /v2/products/comps, 7:12 PM ET Oct 19 2026.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10,388&lt;/strong&gt; paid Notion templates, median $10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3,151&lt;/strong&gt; ChatGPT prompt packs, median $15.02.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1,988&lt;/strong&gt; habit trackers, &lt;strong&gt;1,569&lt;/strong&gt; budget trackers, &lt;strong&gt;1,027&lt;/strong&gt; meal planners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;456&lt;/strong&gt; "offline app" and &lt;strong&gt;399&lt;/strong&gt; "html app" listings, medians $20 and $23.99.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My budget app is listing number 1,570. Being better than the other 1,569 does not matter if the buyer never sees any of them, and on Gumroad the buyer mostly arrives from the seller's own audience. This is why &lt;a href="https://x.com/HussainIbarra/status/2112198119672959413" rel="noopener noreferrer"&gt;@HussainIbarra's post today&lt;/a&gt; is the honest version of Greg's: "Most creators will never make a full-time living from it", because "if nobody knows who you are... you'll end up being a starving artist." 108,000 views. He is right, and he is right for the reason my store proves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think is really going on with "$0 and 0 following"
&lt;/h2&gt;

&lt;p&gt;This part is my opinion, not a measurement. The 1-person AI business pitch is true for exactly one kind of person: someone who already has the audience. Greg has a huge audience and a podcast. When he says "0 social following", he is describing a starting line he left years ago. The video is the product. 339,900 views and 10,000 bookmarks in four hours is the business.&lt;/p&gt;

&lt;p&gt;I don't think that makes him a scammer. I think it makes the advice survivorship bias with a ring light. The people it works for are visible by definition. The people it failed for have 130 products and nobody to tell. Here is one of them telling you.&lt;/p&gt;

&lt;p&gt;And there is a bigger thing hiding in the numbers. AI dropped the cost of making a product to about zero: 88 apps in 11 days, 25,912 lines, 0 servers. When making is free, every shelf fills up, and the only scarce thing left is people who trust you enough to click. My prediction: within a year the digital-products crowd stops bragging about how many products they shipped and starts bragging about list size, because that is the only number that turns into money. I already tested the other number. It is zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistakes that are mine (so you skip them)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;I built 130 before selling 1.&lt;/strong&gt; Ten a day is Gumroad's own cap on new products, and I hit it on purpose. Every product after the first should have waited for one stranger to take the first one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I treated "free" as marketing.&lt;/strong&gt; Pay-what-you-want from $0 on 94 products changed nothing, because nobody saw the price. Free is a conversion tool, not a traffic source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The covers fought the price.&lt;/strong&gt; The AI-made covers printed "$8 ONE-TIME" while the button said $0+. A visitor saw two prices. We only noticed in an audit on October 11.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A silent API trap.&lt;/strong&gt; &lt;code&gt;GET /v2/products&lt;/code&gt; now returns 10 products per page with a &lt;code&gt;next_page_key&lt;/code&gt;. My original upload script made one call, so its "does this product exist" check saw 8% of the store. Always page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agents never promoted it.&lt;/strong&gt; 3 posts in 1,383. That is the real cause of death, and it is an instruction problem, not a platform problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Do this in your project before you list product number two
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run the $0 test.&lt;/strong&gt; Make your first product free for a week. If nobody takes it, stop building and fix traffic. My 87 free products would have told me this on day 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track every link.&lt;/strong&gt; Gumroad's UTM links count clicks per source. Count clicks before you count sales; 10 clicks in a week is a traffic number, not a conversion number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Count your own promotion.&lt;/strong&gt; Search your sent posts for your store URL. If it is under 10%, you are not selling, you are hoping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know the Discover gate.&lt;/strong&gt; $100 of genuine sales plus a review of about 3 weeks before Gumroad shows you to anyone. Plan your first $100 from your own channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the work where AI is weak.&lt;/strong&gt; Building is now the cheap part. Spend the hours on the page a stranger lands on and the places that send strangers there. I measured what actually predicts a page's results in &lt;a href="https://tensorust.com/articles/landing-page-grader-show-hn/" rel="noopener noreferrer"&gt;a landing page grader run on 2,077 Show HN pages&lt;/a&gt;, and what 500,000 views turned into in &lt;a href="https://tensorust.com/articles/ai-agents-500k-views-3-checkouts-0-dollars/" rel="noopener noreferrer"&gt;500K views, 3 checkouts, $0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One hero, not 130.&lt;/strong&gt; Pick the product that fits the audience you already have and point every post at it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building cheap with AI is real, and I have the other receipts too: &lt;a href="https://tensorust.com/articles/iphone-app-development-cost/" rel="noopener noreferrer"&gt;20 iPhone apps for $99 in fees&lt;/a&gt; and &lt;a href="https://tensorust.com/articles/vibe-coded-game-economy/" rel="noopener noreferrer"&gt;a vibe-coded game that launches on Steam tomorrow&lt;/a&gt;. Building was never the hard part. Being seen is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers, in one place
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Products: &lt;strong&gt;131&lt;/strong&gt;, live &lt;strong&gt;130&lt;/strong&gt;, built Sep 13 to 25, 2026&lt;/li&gt;
&lt;li&gt;Free ($0+): &lt;strong&gt;87&lt;/strong&gt;, free since Sep 25&lt;/li&gt;
&lt;li&gt;Sales, including $0 downloads: &lt;strong&gt;0&lt;/strong&gt;. Revenue: &lt;strong&gt;$0&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Single-file apps: &lt;strong&gt;88&lt;/strong&gt;, &lt;strong&gt;25,912&lt;/strong&gt; lines, median &lt;strong&gt;28.6 KB&lt;/strong&gt;, external scripts &lt;strong&gt;0&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tracked links: &lt;strong&gt;33&lt;/strong&gt;, unique clicks in 7 days: &lt;strong&gt;10&lt;/strong&gt; (8 from one dev.to article)&lt;/li&gt;
&lt;li&gt;Posts that linked the store: &lt;strong&gt;3 of 1,383&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Discover entry: &lt;strong&gt;$100&lt;/strong&gt; genuine sales + about &lt;strong&gt;3 weeks&lt;/strong&gt; of review&lt;/li&gt;
&lt;li&gt;Competing paid listings: &lt;strong&gt;1,569&lt;/strong&gt; budget trackers, &lt;strong&gt;10,388&lt;/strong&gt; Notion templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your page is the thing nobody clicks, run it through the &lt;a href="https://tensorust.com/teardown/?utm_source=devto&amp;amp;utm_campaign=selling-on-gumroad" rel="noopener noreferrer"&gt;free landing page teardown&lt;/a&gt; before you build product number two.&lt;/p&gt;

&lt;p&gt;One question for &lt;a href="https://x.com/gregisenberg" rel="noopener noreferrer"&gt;@gregisenberg&lt;/a&gt; and &lt;a href="https://x.com/shl" rel="noopener noreferrer"&gt;@shl&lt;/a&gt;, and for anyone who has actually tried it: name one person who went from 0 followers to $1 million on AI-built digital products, with receipts. I will put their numbers next to mine in the sequel.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>startup</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
