Latest Posts (20 found)

Presented by Stripe

Listen to this post : Stratechery is, starting from today, presented by Stripe. Readers have, over the years, pointed out the paradox of my belief in and advocacy for advertising-based business models being delivered in a format bereft of advertising. In truth, however, there was no paradox, just pragmatism: when I launched the Stratechery business model I intended on having sponsors, and did for a month or two, before I realized that ad sales for a one-person business with a small audience was a waste of time; I was much better served devoting my attention to content and trusting that readers would be willing to pay. And, thankfully, readers were willing to pay, and ultimately, there ended up being far more such readers than I ever dreamed of. In fact, there were so many readers willing to pay that I have, over the subsequent 12 years, been able to build an audience that is uniquely attractive to potential advertisers, along with a team that can help me pursue the multi-faceted business model I always planned on. Stratechery is a business, and subscriptions + advertising is The Unified Content Business Model I have long advocated. That noted, this is a big change, both for you and for me; I’ll start with the latter. I take my ethics policy very seriously, including the fact I am not paid for posts, I do not hold individual stocks, and I pay for all of my own expenses. This has, in all honesty, probably cost me a fair bit of money, but the payoff has been trust from you, and for me the sense of personal integrity this provided. To that end, with this announcement, I am editing my ethics policy to include this paragraph: Stratechery is, as of October 2026, presented by Stripe, and there I make no claims of objectivity. To the extent I analyze not just Stripe but the entire fintech space, I strive to give my honest opinion; my contract with Stripe contains total editorial independence. However, the reality of a conflict is inescapable, and I will disclose my relationship to Stripe in every post where this conflict may be relevant. My ethics policy is going to include a link to this announcement, because there is one more admission to make: if I am honest with myself I have never been truly objective about Stripe specifically, for three reasons. I did always try and set these considerations aside when writing about Stripe; in truth I actually just wrote about Stripe and the fintech space less, as I was cognizant about these informal conflicts. By the same token, this is exactly why I couldn’t be more thrilled to have Stripe as an exclusive sponsor: if I am informally conflicted, why not make it formal? I actually think this gives me more freedom to write about fintech, not less, because the conflict will be on my sleeve; more than that, however, every ad I run or read is going to be heartfelt: I believe in Stripe, love their service, and while I am being paid for those ads, I will have the satisfaction of truly believing in them as well. That leaves the impact on you, the reader, and I’ve made an FAQ: Where are ads going to run? There are three primary places you will see Stripe ads: More on Sharp Tech below. What about sponsored content? There is no requirement that I run sponsored content; however, I’m actually very excited about the potential of occasionally leveraging Stripe content. Stripe has a unique position in terms of working with companies across the entire economy, and that is particularly true when it comes to AI. You see some of the insights that come from this position on both the Stripe blog and the Stripe Economics blog , and I look forward to incorporating those kinds of insights when it makes sense (and I should also call out Stripe’s Works in Progress site ). Just to be clear, however, that will be my call. So Stripe can’t tell you what to write? Absolutely not. More than that, Stripe cannot tell me what not to write either. I could call for Patrick Collison’s firing and I’m still going to get paid. I am not, for the record, going to do that; as I noted I will disclose this relationship whenever it seems relevant. However, my first loyalty is to my readers; that meant absolute editorial independence was a prerequisite for this deal. Can I skip the ads if I’m a subscriber? No. Like I said above, Stratechery is a business, and it’s the quality of my audience that makes this deal possible. Moreover, Stratechery has never promised to be ad-free: what I am selling is access to my paid content, and it’s on me to make that content worthwhile. In fact, I would spin this the other way: my motivation to deliver great content is higher than ever, knowing that it has to be worth not just your money but also the attention that I have chosen to share with a sponsor. That noted, while I don’t make categorical statements about my business, I do not anticipate raising subscription prices again, and certainly not over the course of this deal. Do I get anything out of this deal? This is the part I’m most excited about: I am going to invest the revenue from this deal into making more and better products. I have a bunch of ideas that are now unlocked, and one of them is launching this week: in-person Sharp Tech. I am extremely excited to announce that, starting this week, Sharp Tech will become a video podcast, recorded live and in-person. Over the past couple of months I have been building a small video studio in my home, and Andrew will be flying to Wisconsin every week (when possible) to make what I strongly believe will be a better product. There is no matching the energy and chemistry that comes from recording in person, so we’re going to do exactly that the majority of the time. We will be posting video episodes on YouTube (for clarity, not live as we record, at least to start), as well as through existing feeds; these episodes will be free. In addition, we will be adding a second weekly mailbag-centric audio-only episode — recorded the same day, in-person — for subscribers only. This is the first of what I hope will be many product launches for subscribers; my goal is that this sponsorship is seen as a real unlock and accelerant for what it means to be not just a subscriber but a member of the best audience in the world. That’s what I believe I have, it’s what Stripe believes that I have, and I’m grateful to every one of you for making that a reality and this business possible. First, Stripe is a foundational business for my business. The then-startup launched the Subscription API (what later became Stripe Billing ) in late 2011; Stratechery was predicated on that feature existing (and, I would add, the fact that a novice developer like myself could incorporate the Subscription API spoke to Stripe’s ease-of-use!). Second, Stripe is the foundation of Passport, the access management software that undergirds Stratechery, SemiAnalysis’ institutional offerings , and The Ankler ; we have and continue to work with Stripe closely for both Stratechery and Passport. Third, I have had the good fortune of becoming friends with Patrick and John Collison, who were some of the earliest Stratechery readers and subscribers. There is a “Presented by Stripe” placement on Stratechery, the cover art of the Stratechery, Stratechery Interview, and Sharp Tech podcasts, and in the emails I send. I honestly think it looks pretty great, but I’m biased! There will be occasional ad placements between sections of the Update, in the Interviews, and between Articles; this will apply to the web, email, and the Stratechery podcast (which is, and will continue to be, simply the audio version of what you can get on the web or via email). There will be a segment of Sharp Tech where Andrew and I discuss the Stripe ad topic of the week, along with an acknowledgment at the beginning of an episode, and an ad at the end.

0 views

Widespread PHP Flaw May Cause Many Site Outages Today

Expect to see quite a few websites serving error pages today: Nearly 70 percent of websites need to update their core software to fix a pair of vulnerabilities that allow an attacker to seize full control over affected servers. Experts say there are working exploits for the flaws, and that these critical bugs are already being exploited in the wild. Image: Shutterstock.com, Sashkin. The flaws at issue are present in PHP , the programming language that powers sites running on a large number of web publishing systems, including Drupal , Magento , Joomla and WordPress . Earlier today, PHP released an emergency security update to fix two critical bugs that can allow an attacker to execute code of their choosing on a vulnerable server. Reuters reports that government websites in Europe and elsewhere went offline today after the PHP vulnerabilities were disclosed. Cloudflare said it has already detected some exploitation of the flaw, and that at 3:02 am (UTC) it implemented web application firewall rules to protect websites from attack traffic seeking to exploit the bugs, which could cause a denial of service condition, remote code execution, and data exposure. OpenAI , which was involved in the vulnerability research and outreach, said “given the severity of these flaws and PHP’s widespread use, we consider this one of the most impactful security issues in recent memory.” Censys , a company that tracks the technology used by Internet hosts, said a recent scan identified approximately 2.58 million Internet facing hosts and 54.9 million web properties running PHP. Security experts at Wiz said every PHP version released in the last decade is affected by at least one of these vulnerabilities [full disclosure: Wiz is an advertiser on this blog]. “These findings rank among the most severe vulnerabilities discovered in PHP, and arguably in software history,” reads a blog post published today by a team of researchers at Wiz, which was one of several organizations credited with discovering the vulnerabilities. “The underlying flaws had been present for decades, but demonstrating their exploitability required an exceptionally complex chain of steps, at the edge of what human researchers could practically achieve. Frontier AI models substantially reduced that barrier, turning a longstanding flaw into an exploit.” The Wiz researchers say it is likely the PHP vulnerabilities will be mass-exploited to install web-based backdoors or “web shells,” which give attackers a web-based panel that allows them to remotely control infected sites. Wiz said that prior to the PHP bugs being publicly disclosed, the company worked with the PHP team, Calif and OpenAI to measure the size of the problem and coordinate patch verification and disclosure. The PHP zero-day vulnerabilities are being tracked by their CVE numbers, CVE-2026-109618 and CVE-2026-109619 , and they affect all web servers running PHP 5.4 or later. The bugs are fixed in PHP 8.5.12 , 8.4.27 , 8.3.36 , and 8.2.35 . According to Wiz, PHP is so deeply embedded in many web applications that we are likely to see organizations struggling to patch these vulnerabilities for some time to come, comparing this PHP vulnerability pair with the Log4Shell weakness that emerged in 2021 — a widespread, severe-as-it-gets security flaw in Log4j, a popular Java logging framework. “A vulnerability in core PHP reaches far beyond a single application,” the Wiz researchers wrote. “PHP runs across clouds, hosting providers, content-delivery networks and millions of independently managed servers. Reducing exposure before the technical details became public required coordinated work across that entire ecosystem.” The SANS Internet Storm Center is keeping an eye on major software platforms that are shipping updates to deal with these PHP flaws. For example, Ubuntu just released updated PHP packages. For a technical deep-dive on these vulnerabilities that tells the timeline of the discovery of these bugs in a comic book style, check out this post from Calif , another technology company credited with finding the PHP flaws. This is a fast-moving story. Updates will be noted here with timestamps. Update, 2:30 pm ET: Add figures from Censys and a link to Calif’s writeup.

0 views
Unsung Today

Before pixels: Speed-Minder

As you could probably tell, I was driving a bit recently, and once in a while saw this kind of a sign , often equipped with a (beloved) segmented font, reporting your current speed as detected by radar: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/1.1600w.avif" type="image/avif"> Just today, I learned of an early version of this idea: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/2.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-speed-minder/4.1600w.avif" type="image/avif"> This was a “Speed-Minder” deployed by Illinois State Police in the late 1950s or early 1960s. The car didn’t have a radar, it just reported its own speed , which I thought was clever. I am not even sure if it was as much to prevent drivers going too fast – I guess that’s what the name suggests – or just to help you calibrate your car’s own speedometer. I can’t find a lot of information whether this was effective in any way, but I just liked this visual of a non-digital speedometer mounted atop an old police car. (Before Pixels is an occasional foray into design ideas before screens came around, shared for context, amusement, and inspiration.)

0 views
Unsung Today

“No results” doesn’t mean “no results,” pt. 1

This is something I see time and again in Google Maps when plotting directions: = 3x)" srcset="https://unsung.aresluna.org/_media/no-results-doesnt-mean-no-results-pt-1/1-framed.1600w.avif" type="image/avif"> You might be thinking “this feels like a genuine error – not every two places on earth can be connected,” but that’s not it. I am in a good traffic corridor and, ten seconds later, doing the same exact thing again shows proper directions: = 3x)" srcset="https://unsung.aresluna.org/_media/no-results-doesnt-mean-no-results-pt-1/2-framed.1600w.avif" type="image/avif"> The clue as to what’s going on is elsewhere in both screenshots. My cell signal is low, and the Google Maps misrepresents no results arriving because of slow connection, with no results being there at all . Just to get Google Maps off the hook, here’s a similar thing in a Mastodon client Ivory: = 3x)" srcset="https://unsung.aresluna.org/_media/no-results-doesnt-mean-no-results-pt-1/3-framed.1600w.avif" type="image/avif"> There are 123 posts to be seen here, as the page itself conveys elsewhere. But at this moment, the internet is slow, and Ivory jumps to a wrong “no posts found” conclusion, instead of saying “cannot retrieve the posts because of a bad connection.” I believe what’s happening in these moments is that one kind of “no results” (software asked for posts, but the database results came empty) gets bundled with another (software asked for posts, but the database results didn’t come back in time, or transmission was interrupted). This feels important to me, because the wrong kind of an error can really confuse people and make them jump to the wrong conclusions – I guess Mark Simonson isn’t active on social! I guess I can’t drive there! – or even create bad mental models. Also, while this was a temporary situation for me, for a lot of people bad connection is a constant fact of life, so they might encounter this kind of confusion on a daily basis. Software should differentiate between different ways something can be zero , and in this case, communicate that back to the user. What’s really strange is that Google Maps has a separate “no internet connection” state that you can see in other moments – incl. an extra thoughtful and important manual try again button… = 3x)" srcset="https://unsung.aresluna.org/_media/no-results-doesnt-mean-no-results-pt-1/4-framed.1600w.avif" type="image/avif"> …but apparently still fails to use it in all the cases.

0 views

Upgrade your PHP installs immediately to protect against php2shell

This morning, two critical PHP Security Advisories were published: If you're running PHP for any service, you need to upgrade immediately to 8.2.35, 8.3.36, 8.4.27, or 8.5.12. And if you use Remi's repos on RedHat-derivative Linux distros, you need to switch to official repos temporarily as Remi's on vacation and can't update his community repo. (Reminds me of xkcd 2347 ). I'm glad I finished migrating this website from a PHP-based CMS to Hugo earlier this year—having a static website and a minimal commenting system saves on hosting costs and dramatically reduces attack surfaces. Especially in this era of AI tooling making exploit discovery easier. RCE via OOM corruption (9.2/10) RCE via stale global state (9.2/10)

0 views

Netflix Earnings, Business or Franchise, Disney’s Deal

Netflix has a solid business, which is exactly the problem: the company increasingly seems like a business and not a franchise, at least in terms of growth.

0 views
Unsung Today

“Because most users do not use dates before March 1, 1900, this problem is rare.”

There are really only three contenders for the most popular spreadsheet software: VisiCalc, the first computer spreadsheet and a system-seller for some home computers in the late 1970s, Lotus 1-2-3 dominating early PCs in the 1980s, and then Microsoft Excel (preceded very briefly by Multiplan). Excel dominated the market since the 1990s – so long it’s easy to assume it has always been there, but even hiding within Excel are some quirks of its predecessors. One of them is documented in an official Microsoft Excel troubleshooting document : When Lotus 1-2-3 was first released, the program assumed that the year 1900 was a leap year, even though it actually was not a leap year. This made it easier for the program to handle leap years and caused no harm to almost all date calculations in Lotus 1-2-3. When Microsoft Multiplan and Microsoft Excel were released, they also assumed that 1900 was a leap year. This assumption allowed Microsoft Multiplan and Microsoft Excel to use the same serial date system used by Lotus 1-2-3 and provide greater compatibility with Lotus 1-2-3. Treating 1900 as a leap year also made it easier for users to move worksheets from one program to the other. Yes, even in today’s version of Excel, you can easily get to Feb 29, 1900 – a date that never existed: I find what follows in the same doc really funny, as you can sense perhaps a frustration of someone needing to answer this over and over again, or held to blame for the decision that wasn’t even theirs to begin with: Although it is technically possible to correct this behavior so that current versions of Microsoft Excel do not assume that 1900 is a leap year, the disadvantages of doing so outweigh the advantages. If this behavior were to be corrected, many problems would arise, including: If the behavior remains uncorrected, only one problem occurs: But I also appreciate the details of what is a great example of bug-for-bug compatibility . Almost all dates in current Microsoft Excel worksheets and other documents would be decreased by one day. Correcting this shift would take considerable time and effort, especially in formulas that use dates. Some functions, such as the function, would return different values; this might cause formulas in worksheets to work incorrectly. Correcting this behavior would break serial date compatibility between Microsoft Excel and other programs that use dates. The function returns incorrect values for dates before March 1, 1900. Because most users do not use dates before March 1, 1900, this problem is rare.

0 views
Unsung Today

“We find many users write to us in a spirit of collaboration.”

From software company Linear, a blog post from last year titled Why we committed to a zero-bugs policy : When we tell people that Linear maintains a zero-bug policy a common response is disbelief. It may sound like a ridiculous approach, but we do it because no other way makes sense. The zero-bug stance means that we address bugs immediately, with the exact number of days depending on the severity: low-priority bugs need to be addressed within 7 days, high-priority bugs within 2. We formalized this approach two years ago. The impetus was actually a bug in a popular consumer app that I had reported to their team. Finally two years ago—and five years after I first reported the bug—I saw that it got fixed. I thought to myself, “wow, millions of users suffered through this bug for years for no reason.” If the company was going to fix the bug eventually, it would have been so much better to fix it right away. That’s the big idea behind our zero-bug policy. We want Linear to be a solid, high-quality product, which means we’re going to address any bug that comes in. Fixing a bug takes the same amount of work whether we do it right away or put it off. But it’s not a zero-sum game: fixing it immediately gives us a higher-quality product and spares users unnecessary pain for the same overall effort. It’s worth a read – especially if you’re a software quality process wonk – with some interesting observations on context switching and other things, for example: I’ve heard stories of companies whose backlogs grow to thousands of bugs. Eventually, instead of fixing the bugs, they just delete the whole thing and start over. It’s a reflection of how when you put bugs in a backlog, in most cases what you’re really saying is you’re never going to get to them. I also applaud the team for recognizing and pointing to the momentum boost and virtuous cycle on both sides – makers and their customers – when something gets fixed quickly after being reported: It’s not uncommon for Customer Support to file a bug in the morning—often through our Intercom integration—and have it fixed by lunch. That kind of turnaround allows us to turn a bad experience—an encounter with a bug—into an excellent one that changes their whole perspective on what it’s like to reach out to a company when something is broken. Over time these experiences have molded the way our user base reacts to imperfections in the product. Instead of coming to us angry or frustrated, we find many users write to us in a spirit of collaboration—working hand in hand with us to make Linear a better product because they trust we’ll respond quickly. It also often turns them into Linear advocates. However, there’s one thing that feels unresolved. The post says “low-priority bugs need to be addressed within 7 days, high-priority bugs within 2” – but what if a bug cannot be fixed within these time limits? I can think of a few reasons: I know getting deeper into the weeds would not make for a nice post with a punchy ending, but I also think the system feels incomplete this way – as with every process, a careless application of a “zero-bugs policy” could fall prey to a sibling of Goodhart’s Law , as the team starts deluding itself into categorizing things as “not bugs,” or find other ways to avoid bigger challenges if they cannot be fixed within the given time limits. Black-and-white systems struggle with shades of gray, and I’d be curious what is Linear’s answer to tackling this tricky part. a bug has a dependency on another, slower-moving piece of software (e.g. the browser or the operating system), the fix is a bigger systemic or change management challenge that will take months if not years to complete (e.g. a keyboard shortcut change or an internal migration), the fix requires a redesign larger than initially suspected, the team disagrees internally on the fix and needs time to hash it out.

0 views

Hilary Duff at the Spark Arena

What’s going on, Internet? Just got back from seeing Hilary Duff at the Spark Arena (on a Tuesday night, whooo). Great show. I wish I knew her music more as I would have loved to be belting out the lyrics with the rest of the crowd. Definite millenial energy in the crowd. Loved it. Hey, thanks for reading this post in your feed reader! Want to chat? Reply by email or add me on XMPP , or send a webmention . Check out the posts archive on the website.

0 views

Battle Drones - a vibe coded RTS with audio-based multiplayer

My latest vibe coded game experiment is a Command & Conquer style RTS (Real Time Strategy) game called Battle Drones ( play it here ). Unlike my previous experiments , this one is actually fun to play . I'm somewhat embarrassed to admit that I got there by telling Claude to "Make it a LOT more fun". It also supports multiplayer between nearby devices using audio to synchronize game state! Here's what I've built so far, and some of the things I learned along the way. My initial goal was to build an RTS game I could play on my phone, in the style of Command & Conquer . I have fond memories of the 1995 original (I liked Red Alert too) and wanted to recapture a little bit of the magic. After 12 major iterations (and 321 commits by coding agents, mainly Claude Code) I now have a browser-based game that works on mobile and desktop, has multiple play modes, several maps (including a random map generator) and even supports multiplayer for two devices within microphone range of each other. Here's a video demo of Battle Drones running in a desktop browser: Features so far include: Battle Drones is heavily vibe coded - I've reviewed almost none of the code, and it's built in a language (TypeScript) that I've hardly used myself. I've playtested it quite a bit though, and it's been through a large number of iterations since I started the project. Here's a rough history of the project so far, including key prompts and links to transcripts. I started out with Claude Fable 5 back in July: Here's a shared transcript . I'd given Claude Code for Web an environment variable with an OpenAI API key and told it to use the OpenAI Image Generation API for assets, which got me some basic sprites. You can try v1 here - it looked like this: It's recognizable as an RTS, has building mechanics and the ability to select and direct units, and a basic AI to play against. This first version was barely a proof of concept, and it wasn't any fun to play. Claude used the Phaser 2D game framework for these early versions. I didn't even realize this until several iterations later! The second version ( try v2 here ) added sprites for all of the vehicles and the "AI vs. AI" mode, so I could watch the game playing without having to directly control it myself. Claude proved reasonably competent at prompting OpenAI's image models to generate sprites. You can browse the v2 sprites in the public/assets/sprites folder. It still wasn't much fun, and the graphics were boring. It was now October, and I had upgraded to Claude Opus 5.5. I told it: This resulted in five new maps with generated background tiles in a variety of styles, visible here . Opus also regenerated the sprites, making them much more visually appealing. You can try v3 here - it looks like this: This is starting to feel like a real game! It still wasn't very fun to play though - I found myself getting bored pretty quickly. So far my Battle Drones experiment was confirming my previous belief that coding agents can build a thing that looks like a game but can't actually make something that's genuinely compelling to play. I shared this theory with someone over dinner, and then thought to myself that I should give the models a proper chance to prove me wrong. I prompted Opus 5.5 on my phone: This time I was running in Ultracode mode , where Claude Code (in this case Claude Code for Web) runs "dynamic workflows", described in their docs as: A dynamic workflow is a JavaScript script that orchestrates many subagents at once. This kicked off many hours of work. I started it in the evening and didn't get a playable result back until late into the next morning. But the results were spectacular. You can try v4 here - it looks like this: I had Claude write its own release notes - here are the highlights: Every skirmish and Daily Op now opens with a choice, gives the side that's losing a way back, and pulls the armies into the middle of the map. There are also two new ways to play. Fights run longer and swing more. In 1,200 AI-vs-AI test matches on Normal, games still undecided after 25 minutes fell from 14% to 0.9%. The share of wins by a side that had been 800+ scrap behind rose from 24% to 46%. Part of the reason Claude took so long was that it ran over a thousand simulated playtest sessions, and used the results to rebalance the existing units, add new ones, and introduce new features. After the success of Ultracode at "Make it a LOT more fun", I decided to be more ambitious: That was another overnight run. I woke up to this v5 version : The new 3D models were entirely constructed by Claude in TypeScript code. v6 ( play v6 here ) added some more visual polish. v7 ( play v7 ) added robot infantry (troopers, rocket squads, snipers) and a "Condor" troop carrying aircraft. I was beginning to feel guilty at how little actual design input I had into the game - it really had been a case of me saying "make it more fun" and "add visual polish" for the past few releases. I'd noticed that the AI didn't use the new infantry and troop carrying aircraft from v7 very often - there wasn't a great strategic reason to use them. It would be neat if we had a new map with a new game mechanic that actively encouraged players to load up Condors with infantry robots and send them out into the map. This resulted in my longest prompt yet: The result was the tropical Archipelago map, with seven island uplinks that players can only capture by flying out infantry in a Condor. It's definitely the most fun map to play, once you've got the hang of the basic game mechanics from the simpler maps. The v9 edition made that map a little more interesting - it now looks like this: I decided to add giant robot mechs to the game - think Jaegers from Pacific Rim , or Titans from Warhammer 40,000. Here are some of the prompts I used to brainstorm with Claude: The end result is really cool . Goliaths can be constructed using a Gantry - a building that can only be created after first building a Fab, Bay, Airpad, and Tech Lab. You can see the Goliath under construction, and it then walks out from the Gantry and can march around the map. Goliaths can "anchor", which digs them into the ground. In their anchored state they can act as a new HQ, constructing infantry units and additional buildings in a new area. Two Condor aircraft can hook onto a Goliath, at which point it can be flown around the map! The game now ends when you destroy the enemy's HQ building and any Goliaths they might have built. There are also a couple of mutators relating to Goliaths: The other v10 feature is agent battles . In musing about how multiplayer could work I had an idea: what if different LLMs could fight it out in the game? Opus 5.5 went to work on this, producing this AGENT-BATTLES.md proposal and then implementing and testing it. The feature also includes the ability to record and replay these battles - here's a replay of Claude Haiku 5.5 vs. GPT-6 Luna , and here's that same battle in a separate debug tool that shows the underlying prompt responses. The prompt that drives agent battles can be seen here . There are a few more replays like this linked in the README . I hope to turn this into a full league table at some point in the future. This version exists purely because I glanced at my Claude Usage page one day and saw that I'd only used 75% of my weekly allowance and it was resetting in 45 minutes. I decided to see if I could get an extra Battle Drones feature from my remaining tokens, and picked "random map" as the target: Here's the transcript , and an image Claude generated to show me its work: I only just got this working, so I've not had much time to actively test it yet. The latest Battle Drones now supports multiplayer via two devices sat within microphone distance of each other! This feature started out as my Chirp Pong experiment from last week. I pointed Claude Code at that working proof of concept: Opus built this Radio Probe tool to measure how much bandwidth we could get between two devices and, based on positive results from that, implemented a full audio modem system. I've tried it between laptops, iPhones and iPads so far and it seems to work really well! Why use sound for this? Because I love static HTML that costs nothing to run, and I don't want to spin up a server somewhere and then stay responsible for keeping it operating for as long as anyone might want to play the game. I know almost nothing about game development. This makes it a great opportunity to try out coding agents in a field where my existing software engineering experience has less impact on the results. Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug. This morning ( via Hacker News ) I found Steam Fans Are Begging for a No-AI Filter as Steam Next Fest Is Filled With Slop . I wouldn't personally dream of submitting Battle Drones to an event like this - it's still way too low effort to warrant consideration as a legitimate indie gaming project. ... but I can now see a path to vibe coded games like this being taken seriously. Battle Drones is fun, it looks good, it has innovative features (the multiplayer-over-audio thing is a first for an RTS as far as I can tell). I'd love to see what someone with better taste than me and a driving passion to produce something truly exceptional could build! A few other observations from this project: Earlier in this article I said: Games are also super low stakes. The worst that can happen is one of my silly game experiments suffers a bug. Then I tried playing the multiplayer version with Natalie... and the high pitched modem sounds gave her a nasty headache! That's a pretty bad bug. I added a warning and was then inspired to build proper network multiplayer. I tried getting WebRTC to work but couldn't get a connection going between two of my own devices even on my own WiFi network, so I had Claude build a simple, stateless WebSockets relay server instead: Here's the resulting server . Since this scales to zero and runs on a single Fly.io instance it should cost me no more than $2.19/month - and that's if it stays hot and serving connections the whole time. Battle Drones now supports online multiplayer. Click "Duel a friend online", then either share the resulting room URL via your messaging app of choice or have them snap a picture of the displayed QR Code. I also added a feature where you can copy JSON of the match once it has ended and then feed that into the replay feature to rewatch your game. I didn't expect to introduce online multiplayer this soon, but the headache bug felt like it warranted an urgent alternative. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options . Battle Drones How I built this v1: the initial prototype v2: full sprites v3: varied terrain v4: the fun update v5: Battle Drones goes 3D v8: Archipelago v10: Goliath, and agent battles Agent battles v11: Random Maps v12: Multiplayer via sound Some thoughts Update: Online multiplayer support 9 buildings, 7 ground vehicles, 6 aerial vehicles, 3 infantry units - all 3D models, which you can browse here Different weapons are needed to target aerial or ground vehicles Six maps , across five biomes - temperate, desert, arctic, volcanic, tropical A random map generator Skirmish mode - red vs. blue on a rotationally symmetrical map Last Stand mode - one player holds out against as many waves of enemies as possible Area effect weapons: Barrage, EMP, Drop Pod, Sky Hammer Crate drops with bonus resources In-game music that responds to events - it gets more intense as fighting breaks out Different in-game AI personalities (Balanced, Rush, Air Swarm, Boom, Skyforce, Ironclad) AI vs. AI mode, to watch those personalities play each other The Goliath - a giant stomping mech with laser eyes and arm cannons and the ability to establish a new base Mutators that add extra rules or twists A "Daily Op" challenge Ranks and achievements ( Medals ) Agent vs. Agent mode where two LLMs can play Battle Drones against each other A multiplayer mode based on two nearby phones communicating via audio messages, an extension of my earlier experiment with Chirp Pong Openers : pick Blitz, Industry or Air Wing before the clock starts. Call-down powers : Barrage, EMP, Drop Pod and the Sky Hammer orbital strike. Objectives and salvage : Uplink relays, supply drops and wrecks worth scrap. Feel : combat juice, adaptive music, unit voices and an announcer. Command : battle alerts, game speed, saved squads and touch placement. New modes : Last Stand survival waves and an 8-mission Ops campaign. Progression : heroes, an after-action report with awards, a career, 7 mutators and a Daily Op. Goliath Armada starts each side with four airborne Goliaths (each with a pair of Condors) and no other units. Robot Love adds a special rule: if enemy Goliaths get close to each other on the battlefield they fall in love and the game ends in a draw. (Thank Natalie for that one). Static HTML and JavaScript is a fantastic medium for games development. WebGL works great, and Three.js (and Phaser before it) are excellent platforms to build on that the current models know inside out. This also lets them run as Progressive Web Apps - I didn't ask for it, but Battle Drones works offline. I was able to play it on a plane despite never having directly installed it - my phone had it cached. Giving Claude an OpenAI API key and telling it to generate images using OpenAI's models works really well. It can view the images it has generated and iterate on the prompts. Opus 5.5 is spectacular at 3D modeling using Three.js (and Blender, and no doubt other 3D applications as well). The same is true of GPT-6 Astra. They are absolutely capable of building models for 3D game projects. For features like replay and multiplayer it's useful to have a deterministic simulation engine. At one point Claude had to replace calls to and and friends with custom versions because different browsers (Chrome vs. Safari, for example) returned very slightly different numbers, desynchronizing the replay. Opus 5.5 can write music! There are no audio files in this project - the soundtrack is entirely generated through code, varies across different maps, and even gets more intense as the battle heats up. See Scrimshaw Jukebox for a previous experiment with Claude for music composition. I still can't get over how well the prompt "Make it a LOT more fun" worked. Tools are effectively free. I prompted up the Radio Probe , the Model browser , the Agent vs. Agent debug tool , and Claude Code built a bunch of tools for itself that I haven't even explored myself. Audio-based multiplayer between static HTML games works! I hope to see a whole lot more games use this same pattern - in digging around today I've not found much prior art beyond Siner by Alon Horesh and ggwave by Georgi Gerganov (also of fame). Claude Code "Ultracode" burns tokens like there's no tomorrow, but it can also solve complex problems (like adding audio-based multiplayer) from a single prompt. I'm still not quite over the guilt of building software in this way. I don't feel like I've earned the right to create something this good, in a field in which I have so little prior experience! At this point I've shown it to enough people in private that it felt wrong not to publish it for everyone else to see and learn from.

0 views

AI Had Better Work Out

If you liked this piece, you should subscribe to my premium newsletter, and you can subscribe on the following links: $70 a year , $18 a quarter , or $7 a month . In return, you get a weekly premium newsletter that dives deep into the finances of the AI bubble. Over the past few months, I’ve published a two part guide to the world of AI debt, an analysis of the (dubious) impact of generative AI on the global economy , deep analyses of the biggest players in the AI infrastructure space like NVIDIA (part one and two ) and Oracle (part one and two ), how OpenAI will eventually kill Oracle , and how venture capital is killing itself .  Friday’s piece will be the Hater's Guide to Blackstone — one of the most loathsome companies in existence, and one that’s staked its entire existence on the AI bubble.  If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, Blackstone or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on your Bloomberg Terminal.  Soundtrack: Royal Blood — Pull Me Through At the end of July, Apollo Chief Economist Torsten Slok gave a blunt warning to the Washington Post : Today, I’m going to quantify exactly how difficult it will be for the “AI thing” to “work out.” As I’ve said before : The theoreticals and hypotheticals of this industry are so powerful that they’ve created one of the (if not the) largest equities bubbles in modern history, all heavily-centralized around the valuations of a handful of names related to the so-called AI trade, which translates to “buying or selling stuff to do with AI GPUs.”  This has led to the single-highest inflow of foreign investments into US equities in history — larger than the Dot-Com Bubble, the leadup to the Great Financial Crisis, and even the dying gasps of the Zero Interest Free Era in 2021, per Apollo : However you might hand-wave away the AI bubble’s economic issues by saying it’s “just like the Dot-Com Bubble” — when the NASDAQ 100 fell 77% from its peak — the consequences are now global, at a scale unseen in history, flowing into both direct stocks and indices. As of typing this sentence, NVIDIA alone makes up 11.31% of the NASDAQ 100, with the combined weight of NVIDIA, Google, Amazon, Meta, Microsoft, Broadcom, Micron, AMD and CoreWeave representing about 46.5% of the index’s value, or 39.3% of the entire 3000-company NASDAQ composite.  These same names — replacing CoreWeave with Oracle — represent around 28.9% of the value of the S&P 500.  To sustain the valuation of these stocks — let alone continue growing — will require every company involved to either spend or make hundreds of billions of dollars in perpetuity, increasing every single quarter, without fail. This will come from either selling ever-increasing amounts of AI chips and related hardware, or buying and using them to generate revenue either through rentals or building their own software products.  While the centralization was more severe at the top of the Dot-Com era NASDAQ — with Cisco, Intel and Microsoft accounting for roughly 74% — the total value of the index was a mere $1.82 trillion ($3.58 trillion adjusted for inflation).  Today’s top three — NVIDIA, Google and Microsoft — account for around 29% of the NASDAQ 100, for a total market capitalization of $13.5 trillion. I’m afraid things only get worse. Per Goldman Sachs ( via Reuters ), "...equity gains have been the dominant driver of household wealth accumulation ​and the main contributor to a positive wealth ​effect on consumer spending," and per data from the Fed , corporate equities accounted for 37.9% of all household wealth in Q2 2026, the highest number on record since Q4 2000.  Economist Paul Kedrosky told me it might actually be higher: While the Fed’s data only goes back to Q4 2000, corporate equities as a share of household wealth only sat at 25.9% ($11.5 trillion, or $22.7 trillion adjusted for inflation), back at a time when total household wealth sat at $44.4 trillion, or about $85.2 trillion in today’s money. In Q2 2026, total household wealth sits at about $195.8 trillion, with corporate equities sitting at roughly $74 trillion, or roughly 86.8% of the entire US household wealth 26 years ago. Retails are also making up an historically-large amount of the volume of trades on the market, per Bloomberg Intelligence, making up 20.3% of trading in 2026 to date, approaching the dangerous heights of the worst excesses of the end of the Zero Interest Rate Policy era. Retail investors also directly own about 29% of Amazon’s, 26.2% of NVIDIA’s, 22.6% of AMD’s, 21.8% of Microsoft’s, and 18.6% of Meta’s stocks, though these numbers are not inclusive of index funds like SPY or QQQ (a fund tied to the NASDAQ). In totality, retail investors own equity assets (at least as of May) equivalent to about 10% of the market . In fact, Goldman Sachs had retail volumes significantly higher: By comparison, Dot-Com era retail trading was much, much lower — less than 2% of the NYSE’s trading volume according to the University of Michigan’s Alicia J. Davis in a paper that begins with the phrase “the American retail investor is dying.”  When all of this is over, I think retail investors might wish they were dead, as they directly own somewhere in the region of $4.65 trillion worth of NVIDIA, Amazon, Microsoft, Google, Meta, Broadcom, AMD, Micron, Oracle, and CoreWeave stocks. The number is likely much smaller than the true exposure retail investors have, as it isn’t inclusive of investments in index funds. On April 14, 2000 , the NASDAQ composite dropped 9.67% and the S&P 500 5.78%, with a little under 97% of the S&P 500 constituents falling on the day , per TIME and The Washington Post, led by hot inflation numbers and overall anxiety over the tech sector’s valuations: Yet the Post had one telling quote, emphasis mine: While it seems unlikely, a drop of around 20% across NVIDIA, Amazon, Google, Meta, Broadcom, AMD, Oracle, Micron, and CoreWeave would have the same effect as the entire market downturn on the worst day of the Dot-Com Bubble crash.  In truth, it wouldn’t even have to be that bad.  Per CNN Moneyline News Hour transcript from April 14, 2000 , Qualcomm fell 21%, Yahoo fell 20%, Intel a little over 10%, and Microsoft a mere 5% — and that’s all it took to make the market bottom out.  Brief NVIDIA selloffs have already caused big market declines: Anyway, remember that quote about momentum investing, overvaluations and growth? Here’s a quote from Bloomberg from last week (October 14), emphasis mine : And here’s another quote from CNN from a day later, emphasis mine: History may not repeat, but it rhymes. Every problem that burst the Dot-Com Bubble is here, but it’s worse, bigger and uglier, with global contagion risk that I basically never see discussed. For example, the ongoing equity price of TSMC on the Taiwanese Stock Exchange makes up about 40% of the entire market, with the ODMs that have seen booming earnings making AI servers for hyperscalers representing another 3% or so. On The Tokyo Stock Exchange, the combined weight of SoftBank, RAM maker Kioxia, and the two major banks (SMBC and MUFG) backing AI data centers make up approximately 11.24% of the TOPIX Index. Samsung and SK Hynix, both of whom have seen remarkable RAM sales ( see my Hater’s Guide To The Memory Crisis for more ), make up more than 50% of the entire value of Korea’s KOSPI. Their elevated valuations come from a belief that they’ll grow in perpetuity, much like the American markets. And let’s be clear about something: all it takes is the vibe souring to the point that people lose faith in the AI trade for everything to start to collapse. So, what will it take to keep the party going? The answer is simple: perpetual, parabolic growth in both AI revenues and AI capex. Per CNBC , well, exactly what I’ve been saying, emphasis mine: Are…are you sure about that? Isn’t AI the biggest, most hugest thing ever? It’s transformative! It’ll change everything! Aren’t we all excited- Okay, well, check out Doctor Doom over here , I bet he’s gonna be so surprised when those profitable returns come in- Well, at least there’s a diverse revenue base for GPU sales- OH MY GOD ! NVIDIA has guided to a 70% increase in its next fiscal year — I assume FY2028, starting February 2027 — or over $670 billion in annual revenue, over three times its FY 2026 sales , with said sales dependent on whether Microsoft, Google, Amazon, Oracle, Meta, SpaceX ( who collectively make up 50% to 60% of NVIDIA’s data center revenues ), and the various neoclouds like CoreWeave, Nebius, and Nscale keep buying more of them every quarter, or at the very least that a willing vessel can step in to pick up the slack if they stop. If demand wavers, NVIDIA, Broadcom, Micron, AMD, and any associated silicon or hardware counterparties will see their revenue growth stumble, which will have a brutal knock-on effect on their stocks.  NVIDIA already has its own revenue concentration problem — 44% of its first half FY2027 revenues came from three customers, and in Q2 FY2027, 70% of its accounts receivables were from three customers, with 16% of its revenues coming from one. One. How is this not more worrying to people? Anyway, to buy those GPUs (or TPUs, in Broadcom’s case), everyone outside of Microsoft will have to raise tens of billions of dollars of debt at a time when underlying interest rates are growing and the overall debt markets have chilled around AI data center debt.  Said chill comes from the world finally waking up to what I said in March 2025 — that CoreWeave is a time bomb of expensive debt that’s now selling off as people realize that making any of its supposed $104 billion in backlog (at least 50% of which is OpenAI and Anthropic) will require, per UBS , about $102 billion in debt in the next three years. CoreWeave’s long-dated bonds (by which I mean maturing in 2031) had an effective yield of as much as 16% in the last week.  With endless delays and hundreds of billions of dollars of chips sitting in storage , AI data centers have dramatically turned from the panacea for all infrastructure investment to fixed-income nightmare fuel. For whatever reason, nobody thought that lending hundreds of billions of dollars to a selection of different dodgy SPVs and neoclouds to build the world’s most ambitious infrastructure projects was a problem until, well, everybody, per the WSJ : Per the Journal, this debt heavily relies on both the continued value of the data center and critical IT gear and whether the bloody thing actually gets built: In other words, the value of that data center debt is heavily contingent on whether the underlying assets retain their value, which in turn is contingent on whether there are customers that exist. For whatever reason, nobody wants to consider the most obvious problem: that if one customer can’t pay, other customers can’t pay, and if other customers can’t pay, there’s going to be less demand for AI data centers in general, which means there will be a glut of data center infrastructure, which will mean those assets you intend to resell if everything goes poorly won’t be worth as much. I sure hope that financial institutions have a plan… Oh okay, the problem with overly-expensive AI data center debt is simply that the markets will feel better when the underlying data centers ( which are overwhelmingly delayed ) get built? Awesome! It’s just that simple! I’m sure somebody out there will deal with the massive delays for the talent, materials and power connections necessary to complete them !   As of writing this sentence, CoreWeave’s bonds are trading somewhere between 14.1% and 15.1%, and the only way it can calm investor anxiety will be building AI data centers at a rate that has proven next to impossible. Part of the problem is that recent pushes by smaller and somehow-dodgier neoclouds like Firmus ( which just pulled its IPO ) and Nscale ( whose investors are pushing for it to nearly halve its IPO float to $16 billion and just lost Microsoft as a client due to power delays ) have made investors intimately aware of the overpromises of AI data center companies.  Both Nscale and Firmus have the same customer concentration problems as CoreWeave, with 85% of Nscale’s backlog coming from Anthropic and Microsoft, and 90% of Firmus’ coming from Meta and OpenAI. Again, these are problems that CoreWeave, IREN and Nebius have had for years, but for whatever reason everybody has decided to wake up. Everybody has the same backlog customers — Microsoft (for OpenAI), Meta, OpenAI, Google (for Anthropic and OpenAI), Amazon (for Anthropic), and, of course, Anthropic.  All this ire towards AI data centers means that the price of borrowing for them is skyrocketing on top of ten-year-dated Treasuries stubbornly sitting above 5%, which makes the overall economics of AI data centers increasingly problematic, as nobody can seem to measure A) how much they make and B) how much they cost. Or, indeed, how any of this will pay off. Congratulations to Eugene Kim of Business Insider for getting one of the biggest scoops of the AI bubble, confirming my estimate that billions of dollars of NVIDIA GPUs were being warehoused in this incredible story , emphasis mine: If you’re wondering exactly how much it’s warehousing… One Amazon email projected the company would take delivery of about $5 billion of Nvidia GB300 racks in August, followed by another roughly $3 billion each month "for the foreseeable future." That’s right folks — Amazon, which spent $54 billion in capex last quarter — is taking $3 billion worth of GPU deliveries every month “for the foreseeable future,” despite having such a supply glut that it cannot install them, and in some cases lacks an idea of when it may do so. As I discussed a few weeks ago , neoclouds and hyperscalers have over $374 billion in “construction in progress” assets, and I estimate that $200 billion or more of them are GPUs, primarily from NVIDIA. One quote from the piece stood out to me, emphasis mine: It appears that NVIDIA is channel stuffing. The phrase “compete more for scarce resources” doesn’t make sense in the context of GPUs that you don’t have enough power or space to install…unless, of course, NVIDIA is saying that if you don’t order and take delivery right now, the GPUs won’t be available by the time you actually build that data center. The booster counter-argument will be that “Amazon is just planning ahead,” but riddle me this — if Amazon, Google, Microsoft ( CEO Satya Nadella said he had chips “sitting in inventory he couldn’t plug in ) and many other companies do not have the power to plug in the chips… why are they scarce? What’s making them scarce? If companies cannot install the chips (or, put another way, do not need them yet) what is creating the scarcity, other than something that NVIDIA itself is demanding its partners do? Then there’s that curious matter of the whole “Amazon doesn't pay for racks until the gear is put into a data center.” How long has that been the case?  Let’s get specific about the verbiage — “...suppliers…carry the cost of the equipment in transit…” heavily suggests that these racks (which had GPUs in them, by the way!) were not actually shipped to customers until the customers needed them…until some indeterminate point at which the “Early Rack Receipt” program took place. This, if anything, proves that the “demand for AI chips” is far more a result of NVIDIA’s deliberate channel stuffing and antagonistic approach to doing business than anything about how many chips the world needs right now. Anyway, even if hyperscalers installed all the fucking things, it’s unclear who would actually pay for them at a volume that would match analyst expectations. Per Slok at Apollo , financial analysts covering the tech sector seem to be pricing in cash flows that do not match with reality, emphasis mine:  So, in case you didn’t know, every time a company reports earnings, financial analysts at big financial institutions set expectations — sometimes years in advance — of their expected revenues and cashflows. Right now, the analysts covering tech companies are guiding towards them adding $1.2 trillion in operating cash flows, all as the rest of the S&P 500 (ostensibly its customer base) doesn’t add anywhere near that much money. This is one of those very simple points that nobody seems to be able to answer about AI: where will all the money come from to pay for those revenues?  As Torsten said, tech analysts are expecting a parabolic surge of revenues across the entire tech stack, but the analysts covering them are saying the cash won’t be there. What’s the plan, exactly? The answer, it appears, is “Anthropic and OpenAI,” and maybe “open source” sales of indeterminate value. Sadly, there’s another wrinkle in the plan. Japanese financial services firm Nomura put out a worrying take a few days ago , emphases mine and from the poster I found it from: To simmer it down, Nomura is saying based on how much a data center costs both to build and operate, you shouldn’t spend more than $60 billion given the amount of revenue you could hope to generate.  It’s hard to get a precise measurement of how much one costs. The CEO of IBM said $80 billion a gigawatt at the end of 2025. Foxconn said $47 billion per gigawatt in September 2026. Back in June , Jensen Huang said future data centers could cost $80 billion to $100 billion a gigawatt. It is completely insane we do not have a consensus here. Nomura also throws cold water on the many people excitedly suggesting that Anthropic could make $50 billion to $75 billion a gigawatt, suggesting instead that the number is around $20 billion. In other words, if Anthropic is paying anything more than $20 million a megawatt, it’s losing money hand over fist just on the compute alone. Anyway, I sure hope that the people building these data centers aren’t dependent on Anthropic’s revenues… More-importantly, outside of the companies selling the hardware, we know very little about the actual revenue generated from renting AI GPUs. Amazon, Google, Microsoft, and Meta refuse to disclose their actual AI revenues — but analysts estimate that more than 70% of Amazon, Google and Microsoft’s AI revenues come from Anthropic and OpenAI’s compute spend , which is contingent on their continued ability to raise tens of billions of dollars.  As I’ve discussed in the past, I see around $22 billion in non-OpenAI/Anthropic compute spend globally, with an indeterminate amount of that coming from AI startups that, well… Said billions are contingent on the AI labs’ continued revenue growth, and considering that 80% of Anthropic and OpenAI’s enterprise revenues come from loss-making AI startups allowing their customers to burn many times their subscription price in AI tokens ( as much as $1,300 on Cognition’s $200-a-month plan , for example), meaning that Anthropic and OpenAI’s revenue growth is contingent on venture capital’s continued ability to fund their customers. This is one of the core issues with measuring AI demand — that the vast majority of it comes from selling services that do not make any economic sense. And their spend is contingent on their backers funding them in perpetuity. That won’t be easy. This, in turn, is contingent on venture capital’s continued ability to fund raise, and as I discussed in last week’s premium , VC has been on an historic losing streak since 2017, with the median net TVPI (total value put in, as how much you get in return on a per-dollar basis) sitting between 92 cents and a dollar, with 2025 fundraising dropping by 35% , and 2026 fundraising for first-time funds at its lowest rate in over a decade, per Murph Capital , which adds that despite representing only 6% of funds closed, funds of $500 million or more took 78.1% of all capital raised in 2026 to date. AI startups, which are predominantly unprofitable, unsustainable, and require near-constant flow of venture capital, represented 64% of all venture capital investment in Q3 2026 , with 50% of all global venture flowing into AI in 2025 .  As discussed both last year in the Enshittifinancial Crisis and last week’s premium , AI startups represent a devil’s deal for venture — by virtue of being buzzy “AI” companies, their valuations are naturally high, and by virtue of their capital-intensive businesses, they require more rounds of venture capital, with each round increasing valuations to unsustainable heights that make their IP-light, EBITDA-negative businesses impossible for either an IPO or potential acquisition. In fact, both venture capital and private equity are having real problems selling their investments, with IPOs becoming effectively non-existent as a share of exits for PE, per S&P Global . Meanwhile, per DealRoom , venture-backed from 2026 seem high, but are inflated by SpaceX’s IPO ($75 billion), the PE-backed take-private of gaming company Electronic Arts ($55 billion), SpaceX’s acquisition of Cursor (all stock, $60 billion), NVIDIA’s acquisition of Hugging Face ($13 billion), and Google’s acquisition of Wiz ($29 billion).  And since 2015, the $2.7 trillion in venture capital invested has only managed to increase its value by about 1.6x — to around $4.4 trillion in value ( not returns), or around a third of what you’d get if you’d have invested in the S&P 500. In other words, venture capital is not particularly good at creating value, and has, in a period of poor value creation, centralized the majority of its investments in a single industry, with the majority of those investments going to companies related to or powered by Large Language Models that have yet to prove their economic worth. And in this historically-low period of fundraising and exits, venture capital has invested a historically large amount of money , with the vast majority of it going into one bet: AI. What’s that phrase? “You should always keep your eggs in one basket, so that you know where they all are”? I think that’s it, right? At this point, the sheer scale of the AI bubble is too large and unwieldy for things, to quote Mr. Slok, “work out,” and yes, I believe we “have a problem.” I say this with no sarcasm, as I think Torsten has done fantastic work posing reasonable, logical questions that nobody seems to want to answer, like “how does this work out?” and “where does the money come from?” even as most media outlets and analysts nod and smile at basically any statement said by an AI lab, hyperscaler, or neocloud. For everything to “work out,” the current equities surge will have to continue in perpetuity, which requires both hyperscaler AI revenues — which are already depressingly small — and hyperscaler capex to expand infinitely, along with neoclouds, sovereign clouds and AI labs’ vague infrastructure plans to also expand infinitely.  All the while, there can be no perceptual shift against generative AI, because any further souring of the debt markets will have neoclouds and would-be data center operators paying 12% to 15% in interest to build data centers sometime three years in the future for a customer base that’s pretty much entirely made up of Anthropic and OpenAI.  As we’ve seen in the last few weeks, AI debt markets can quickly sour even without any bad news, and conditions will only improve in connection to an incredible earnings season for CoreWeave and other AI infrastructure players. Said “incredible” earnings would require A) data centers to be built and B) said customers to actually pay for them, which roughly translates to “OpenAI and Anthropic’s continued ability to spend more and more money.” Anthropic’s 47% quarter-over-quarter growth rattled the markets because this company has to grow fast enough to cover $413 billion of non-cancellable compute contracts over the next few years , and everybody kind of knows deep down that the bubble can only continue with parabolic growth , which is why everybody freaked out when OpenAI reported a lower annualized run rate (a made up number) than expected, because growth is the only thing keeping this going. And said growth rate is predominantly based on whether AI startups continue to let their customers spend anywhere from $2 to $10 in tokens per dollar of subscription, which in turn is dependent on venture capitalists’ continued status as the world’s most braggadocious paypigs, and at some point that venture money will run out, much like it did during the Dot Com Bubble. I didn’t expect this piece to be so sobering, but when I sat down to write it it just kinda flowed out of me how profoundly difficult the AI industry’s future has become. The fundamental disconnection between the perception of AI growth inflating the value of hyperscaler stocks and the worrying fact that we don’t really know exactly how much AI revenue they make means that the S&P 500 and NASDAQ are held up by a kind of childish excitement that will, at some point, turn to existential fear. Those reflexively responding with “they’ll get bailed out!” neither understand the markets nor the situation at hand. The AI bubble was inflated by hyperscaler revenue growth (without any disclosure of AI revenue) and NVIDIA’s GPU sales , meaning that the moment one of those slows, everybody freaks out. The US government cannot bail out NVIDIA, Microsoft, Google, Amazon, CoreWeave or Meta’s future misses of analyst expectations, nor can it cover every single bankrupt data center, nor can it bail out investor sentiment when it realizes the AI “boom” was yet another tech-based bust. I went into significantly more detail about it in my premium piece about how AI Isn’t Too Big To Fail . Remember: even with the bank bailout in 2008, the market still crumbled, and that was before we had over $40 trillion in debt, stubborn inflation, and a stock market that has fundamentally disconnected from reality.  The underlying weakness of the AI trade is that it isn’t really related to anything other than NVIDIA and the hyperscalers’ earnings.  We don’t know how many GPUs are in operation, we don’t know how much money the hyperscalers make from using them or renting them, we don’t know how many active gigawatts of AI capacity they have, we don’t know their actual customer concentration outside of analyst estimates, we don’t really know how much people pay to rent GPUs , and we don’t even know how much it costs to run a GPU on an hourly basis.  OpenAI and Anthropic are horrifyingly unprofitable, deeply unstable, and as I’ve discussed, 80% of their revenues come from companies that literally can’t afford to pay them , and yet the markets never react, because this information doesn’t really matter as long as the right numbers keep going up. This is why Anthropic’s IPO travails are so profoundly dangerous for the AI trade. Investors are now suggesting that it prices its IPO at $1.5 trillion , meaning a significantly lower payoff for investors and much less capital raised on listing, meaning that it will have to take on more and more debt — like its 10% interest chip financing deal with Broadcom and Blackstone — that will provide a brutal education in what a high-burn-rate, negative-EBITDA company really looks like when you remove the layers of annualized run rates and hype. And, per Irrational Analysis , Anthropic’s investor day didn’t go particularly well: Any further delays to Anthropic’s IPO will be somewhere between catastrophic and fatal, and at this point I think it’s fair to question whether it ever makes it to the public markets. If it does, a $1.5 trillion valuation would spell disaster for OpenAI, which has (as mentioned above) been trying to raise $30 billion at a $1.4 trillion valuation . Closing that round will be difficult to impossible at that price even without Anthropic’s drooping numbers, and if it somehow IPOs at something approaching $1 trillion, I have no idea how Clammy Sammy and OpenAI make it out of this one alive.  And really, does any of this look like the future? Does any of this feel like the next industrial revolution? Or does it feel like the run-up to another burst bubble and resulting financial crisis? The difference here is that AI has, for the most part, been sold as a panacea for the rich and powerful — a way to control, to steal, to acquire and to expand, to take and take and take as they always have, occasionally vaguely muttering something about “abundance” as both the media and financial institutions help force through yet another doomed cycle of “innovation.”  The people to blame are the tech CEOs — Sam Altman, Dario Amodei, Sundar Pichai, Andy Jassy, Elon Musk, Hock Tan, Jensen Huang, Sanjay Mehrotra to name a few — and the financiers that have helped them pump this bubble, with the worst of them being that rat fuck Stephen A. Schwarzman, CEO of Blackstone, a private equity (or “alternative asset”) firm that has funded basically every name I just wrote down on some level, funded by everyone from the Saudis to the California state pension system .  This week’s premium will be the Hater’s Guide To Blackstone, a company that vibrates with evil, and has staked its entire future on whether AI works out. It’s a stupid fucking bet from an evil fucking company, and I can’t wait to tell you all about it on Friday. If you liked this piece, you should subscribe to my premium newsletter. It’s $70 a year , $18 a quarter , or $7 a month , and in return you get a weekly newsletter that’s usually anywhere from 10,000 to 18,000 words and provides vast, detailed analyses of the biggest events and companies in the AI bubble. If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on The Terminal. On Jan 27, 2025 , NVIDIA dropped 17%, its worst daily percentage loss (per Forbes) since March 2020, with the S&P 500 dropping 1.5% and the NASDAQ 3.1%, though its share of the S&P 500 at the time was about 1.9% smaller. On June 5, 2026 , NVIDIA dropped about 6.2%, with the NASDAQ ending the day down 4.18% and the S&P 500 down 2.64%.

0 views

Unleashing agents inside the workshop

I recently learned of Ubuntu Workshops . In short, Workshops allow you to create an isolated development environment to safely work with AI agents. You get a configured (via YAML) sandbox where you can safely run an agent without the need for permission checks and guardrails. Workshops allow you to expose or block certain parts of your system as needed (for example, you can expose your GPU for local models or block access to your webcam). As an example, let's build a simple Rust app that converts images from the HEIC format (bane of my existence) to JPEG. We'll use Iced to provide a simple GUI that supports drag and drop. First, install the Workshops Snap from the Ubuntu App Store. I also had to install the LXD subsystem for virtualization : To setup the workshop, create an empty directory and run the following commands: This will give a workshop named "dev" with Codex and Rust ready to go. On first run, we'll need to login to Codex using the following: Next, we want to define an "auto-mode" for Codex so we don't have to deal with permission check prompts. We'll do this by defining an "action" in the file. We've added two actions, to define a non-interactive session, and for an interactive one. Both have the flag which bypasses permission checks. As an added benefit, actions make it easy to standardize how we pass instructions to agents. We could easily define a Claude action that accepts the same arguments as Codex. Now let's define our prompt, instructing the agent to build our Rust application. This could of course also be done interactively via the Codex TUI inside the workshop, or through a a AI software factory . For now, we'll create a file and add the following: Finally, we'll setup Git for version controlling. Time for the fun part! We'll use the command to build the application in the folder without needing any input from the user. The agent will now run completely autonomously with no need to press "enter" on permission checks. Our host system remains protected as the agent is sandboxed away from our filesystem and devices. In fact, you'll notice in the prompt we specified that the agent should not try running the application. This is because we didn't provide access to a Wayland or X11 display server, so the agent cannot run a GUI application. Here's what I got as a result: The UI isn't great, but it works and successfully converted some photos from my iPhone! After putting together this article and testing out workshops, I'd say it's definitely a tool worth using. Workshops add minimal overhead, provide a composable/reusable environment for development and safeguard your host system from agents going rogue. Between this and Myna , Canonical is doing a lot to support the new development workflows that are becoming common

0 views
Farid Zakaria Yesterday

No quarter for gaps

The advent of large language models has changed the economics of closing gaps in software stacks. This is in the nixpkgs manual, in the Ruby section, under “Platform-specific gems” [ref] . The pull request ( PR#68 ) it points to was opened in October 2019 and closed, unmerged, in August 2026, with: “Closing as stale. I no longer work with bundix. Feel free to take it over.” [cite] Aside There are alternatives that have sprung up but they all have unique gaps or are not widely communicated as blessed solutions. The manual itself also does recommend a workaround for the issue, but I found it to not work in practice. Every ecosystem has gaps everyone has learned to step around. They survive because there is just too much stuff to do. We live with these warts and gaps because the cost of fixing them is either too high or there are more important things to do. That economics is gone. We can have and expect amazing perfectly correct software stacks, because the cost of fixing gaps is now low enough that it is worth doing. The economics of software have changed. The multiple days of typing are now an afternoon, or less , of directing and reading to an AI agent. In the case of Nix and Ruby, I wrote the Nix side of a Bundler lockfile solution, gemlock.nix , within an hour, removing days of misery I hit while running this blog. While AI generated code may suffer from slop, it is a growing skill how to wield AI to produce correct verifyable code. Nix is amazingly well-suited as it gives the agents a reproducible test-bed with which to verify the correctness of the code they produce. The economics of software have changed, and we can now expect to have no quarter for gaps in our stacks.

0 views
Kev Quirk Yesterday

2026-10-20 16:31: Hooman, we are ready to receive your apple core. 🍎

Hooman, we are ready to receive your apple core. 🍎 Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment .

0 views
David Bushell Yesterday

How not to migrate from Cloudflare DNS

So you’ve been shamefully using US Big Tech giant Clownflare for DNS? It’s time to find an inopportune time to migrate away to a “European alternative” . You absolute must not follow these steps on a busy weekend when you must leave for hours on short notice. Step 1: Just remove your domain name from Cloudflare. Step 2: When the “are you sure?” modal pops up you’re forced to type the domain name. How patronising! Show them who’s boss by copy and pasting the domain name from the field label. Don’t fire a single neuron to consider which domain you’re deleting. Congratulations, you’re off Clownflare! It’s probably too late to backup nothing so make sure you’ve already done this step. Step -1: Don’t visit the DNS records page for your domain name. Navigating around Cloudflare is too hard after their latest UI shuffle. It remains a mystery whether that “Export” button allows you to backup records in the industry standard BIND zone file format. Unlikely. Step 0: It’s imperative that you don’t even consider first adding the DNS records to your new service provider. Why would you do that? You’ve already saved precious minutes by ignoring best practices . Now you’re ready to exploit the system further. DNS providers hate this one trick! Step 3: Some hours or days later you’ll be informed about a missing DNS record. Go ahead and fix that at your leisure. If you can’t remember a record and don’t get a warning, it probably wasn’t all that important anyway. The final step can take “up to 48 hours” so there’s no rush. Step ?: Sign in to your favourite meat-themed domain registrar † and edit the authoritative nameservers for your domain name. Clicking one of two pixels will open a dialog with a single textarea. Try comma-separated values and if that fails use a new line. You’ve already migrated from Clownflare, what’s the point of taking notes now? It was easy! Go make a smug skeet on Bluesky, you’ve earned it — oh shit your atproto handle is failing DNS verification… † Why does every registrar have UI like it was designed 20 years ago? Can anyone suggest a good European registrar that has 2FA and reasonable prices? Thanks! Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views
matduggan.com Yesterday

ClickHouse Will Let You Be Wrong at Scale

So I've posted before how I think ClickHouse is great. Its columnar storage is fast, it has amazing compression. I won't bore you with those details, you can see them all here: https://matduggan.com/clickhouse-is-winning-the-observability-wars/ However all technology is great until you try to do something atypical with it. What I wanted was a realistic torture test: network firewall telemetry, on the order of 2 billion rows a day of mixed-vendor syslog, parsed at ingest into wide typed tables with a 14-day TTL. The dashboards needed to do two things at once in Grafana: fast lookup of individual log lines, and fast visualizations where you can stack ad-hoc filters on top of each other across every panel simultaneously. I learned a lot of things about ClickHouse. Also some things about myself, not all flattering. This ended up being significantly harder than I thought it would be, and part of that is that I made a ton of mistakes. Don't email me mean comments. I'm writing this up as a warning to the people coming behind me, and I'll own every mistake as we go. For the happy OTel path, CH is very easy. Few hundred metrics, couple million logs a day, several thousand traces, not a problem. For the more complex custom route, CH is extremely powerful but it's hard to use. The theme of the whole project is that this stack fails silently. ClickHouse is the most agreeable coworker you'll ever have because it never says you are wrong, it just lets you be super wrong. A query that looks fine reads 84x more rows than it should. A misconfigured filter just doesn't apply. A projection that never routes still returns correct numbers, slowly. Once I understood that ClickHouse will never tell me that I did something wrong and that I had to figure out I did something wrong, we got along fine. You have to build verification habits before you build anything else. is your friend, your bartender, the lovable dog in a horror movie. This is the only thing in the system that says you messed up. Here are the lessons I learned. Hopefully they save someone else from going down the same path I did. So we're not doing anything weird here. My first draft of the dashboard wrote filters the way I'd typically write them in normal SQL, by adding a guard so the query stays valid regardless of what the user picks. This would end up being quite the stupid decision. Eighty-four times the rows, ten times the time, same answer. Why is this so much worse? I'm not entirely sure. My best guess is that the guard keeps primary-key pruning from engaging, so you get a full partition scan with post-filtering. I clearly measured the effect but I'm not exactly sure how to prove the mechanism . was my only savior here. The fix was to stop putting in the WHERE-clause filtering by hand and use Grafana ad-hoc filtering. The key learning here is how the plugin does that and why it makes a difference. It does not rewrite your WHERE clause. It appends the filter as a ClickHouse query setting, , which means it is applied at planning time and prunes exactly like a hand-written query. When I first set up the main table, I did the following: The logic made sense at the time, even if it didn't end up holding up. We're sorting by network device first since of all of these, there are going to be the least number of network devices. But what I didn't really think about is that every panel is time-bound because of course they are, that's how Grafana works. In ClickHouse only the front of the sort key gets the fast lookup path. Obvious in retrospect, but stumped me for a hot minute. I thought I was structuring this by lowest cardinality (device) and then out to most cardinality, which logically made sense. If all you want is information on the right way to do this, you can find that here: https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse and https://oneuptime.com/blog/post/2026-03-31-clickhouse-choose-order-by-key/view What's important to understand about this index is that it's not the same as like MySQL necessarily. It's the physical layout, the rows are written to disk in sorted order like a phone book sorted by lastname, firstname. ClickHouse by design doesn't keep a very large "bookmark list", every 8192 rows (called a granule), it writes down the sort-key values at that spot. That bookmark list is the primary key. So the Fast lookup only works for a prefix of the sort columns: Everyone asked me why I did that, let me explain. The two entries are not the same thing. Within any fixed (observer, action, application) group, sorting by (hour, exact-time) produces exactly the same order as sorting by (exact-time) alone — the hour is just a rounded copy of the same value, so it can never re-order two rows. So my first design was basically this . So time sat at position four, and the most common predicate in the dashboard was aimed at the worst-positioned column. The tail-logs panel with ORDER BY Timestamp DESC LIMIT 1000, a multi-hour window, measured before the guardrails went up, read 291.8M rows, 158 GiB, in 18.9 seconds; with one observer filter, 23.1M rows, 936 ms. The newest rows sit at the end of each device’s block so a newest-N query has to walk every device's block to find the tail. Here's what makes this decision consequential: can't reorder, prepend, or absorb existing columns. You can only append columns added in the same . Get the key wrong on day one and the fix is not an ALTER; it's a new table, ~520 GiB of backfill per shard under live ingest, and an atomic swap. Ask me how I know. MODIFY ORDER BY turns out to be less 'modify' and more 'build a second house next door, carry everything over by hand, then swap the mailboxes. After all those lessons, I ended up running a benchmark that was the kind of beautiful baby benchmark you dream of where it confirms you solved every problem. An identical aggregate query, 156 ms vs 1,690 ms. 10.8x faster! I felt great about that for most of an afternoon, which is how long it took to notice that 88% of the old table's partition had tiered to S3 while the new table sat entirely on local NVMe. We had benchmarked a Ferrari against a tractor and concluded the tractor was slow. Which is true. It is also not the thing we measured. Excellent work. The same-tier control with both on NVMe produced no noticeable query differences. So was it worth reorganizing? I'm not sure! I think? This took a long time to do, so triple check this part. So when you first run across projections in ClickHouse, they seem pretty great. A projection is not a separate table you manage. It's an alternative physical ordering of the same data, stored inside the same table. Think of it this way: your table is a book sorted by chapter number. A projection is an index at the back, sorted by topic. When a query matches your projection, it should just automagically read from the projection instead of the base table. You don't need to change the query, which is great. New data populates the projection on INSERT, which is what you want for this sort of stuff. Think of it like this: Projections are great for network firewall data because the data doesn't need to change shape. I just need to optimize my querying of the data for specific usecases. The biggest misunderstanding about how projections worked is that I made a lot of assumptions about how expression matching worked. I assumed (for no good reason) that expression matching was loose and that CH would do a lot of work to ensure my query was routed to the projection. and won't be used by a query asking for , which didn't occur to me until I read this: https://obsessiondb.com/blog/clickhouse-projections-complete-guide Also every filter column must be in the projection's GROUP BY. This means a filter on an absent column → full fallback to raw. This was a fucking nightmare to debug until I figured this out. Here are the basic lessons you must understand to do a large scale project. All of this was figured out when I started just obsessively checking . In order to use projections in ClickHouse you have to verify the routing every single time. Here are my mistakes in no particular order with projections: I like Grafana, I love the ClickHouse Plugin group of maintainers, all good vibes over here. But I misunderstood how much this plugin was going to do for me vs what I had to do myself. This is the part of the review where I say nice things and then hand you a first-aid kit. You will not have any idea that the thing you wrote is wrong until you check it by hand or it blows up. My advice is to configure your dashboards to blow up early and often so you don't find out months later that you messed up the query. ClickHouse is a good tool, but the more complex the thing you try to do with it, the more sharp edges you'll find. I'm also surprised at the ecosystem lacking stuff I expected. I wanted a linter. I got a side quest to make my own. I had trouble getting a full-fledged real migration utility for rolling out changes with advice about impact and cost and then confirming I can always roll back. There are still real gaps in this ecosystem people should be aware of. As always if I got it wrong (or you know something I don't), email me. ClickHouse is a 2 shard x 3 replicas setup underneath the Altinity operator. Every table is a wrapped in tables and Grafana only ever queries the wrapper. Grafana is the official plugin, 25 panels and then ad-hoc filters up at the top that apply to every panel at once. Hard guardrails we cannot break. = 1 billion, = 100 GB, = 60s, all in mode. I can raise these but the entire point of this process was to operate inside of the CH model for data and try to leave those alone. "All the Smiths" → jump straight to the S section. Fast. "Everyone named John" → Johns are scattered through every last-name section → you read the whole book. Slow. Their table also splits data into daily partitions (separate files per day). That's a coarse filter that works no matter what the sort key is (remember this, it becomes important) — the hour bucket . It rounds 14:37:22 down to 14:00:00. This is the "cutoff" — the exact time. — puts the bucket first, so an hour range is one contiguous block. All the Smiths together. Every table stores data in parts, which are directories on disk. When you add a projection, each part directory gets a subdirectory for the projection data with an anonymous table with its own columns, index, granultes. Projection parts merge at the same time as main table parts, so there's no lag like what you can experience with materialized views. Projections don't backfill by default but you can backfill them, which is a mistake that I made initially where I added one, nothing was better and I assumed I had messed up. The query’s aggregates must be a subset of the projection’s — count() and sum(duration) won’t serve avg(duration). Every filter column must be in the projection’s GROUP BY — otherwise, silent fallback to raw. The time predicate must use the projection’s own expression: toStartOfHour(Timestamp) >= X routes; toStartOfInterval(Timestamp, INTERVAL 1 HOUR) >= X — identical values — does not. Same query: 2,022 rows versus 12,373,248. It doesn’t reason about equivalence. It’s a bouncer with a laminated list, and toStartOfInterval is toStartOfHour’s identical twin in a different jacket. Projections don't automatically backfill which is fine but be aware when you run your benchmark and nothing has changed. You gotta think really hard before you add a projection. It's effectively a copy of the data, so make sure your ORDER BY is correct before you try to layer projections on top of it. GROUP BY partition tells you the coverage of your projection. You need this in order to know whether the query has access to enough historical projection data for you to actually materialize the thing you want to show. A wrong table name in the ad-hoc filter config is silently ignored. An unqualified table key instead of the schema-qualified one returned 79,350,116 rows where the correct key returned 2,314,678 . A typo produces a confidently wrong dashboard. The only reliable test: change a filter, confirm the number actually changes, per panel. Grafana's ad-hoc filter UI offers one operator and one value per key. There is no way to express through the filter box — a long-standing upstream limitation ( grafana/grafana#10918 , still open for cross-column boolean OR). Grafana's time handling and panel model will surprise you in every possible way. Hour-bucket edges are a correctness defect factory.

0 views
Josh Comeau Yesterday

The Future of CSS ✨

Every year, browser vendors collaborate via the Interop project to synchronize their efforts on new HTML/CSS/JS features. This year, there’s a ton of super exciting features being considered! In this blog post, we’ll explore the CSS of the future, to get a glimpse of what we’ll soon be able to do.

0 views
James Stanley Yesterday

Coding agents are the ultimate sandbox game

It turns out the Environment Agency have done a LiDAR scan of England . They provide point clouds with 1 metre lat/lon resolution, showing the measured height of the terrain at each point, across the entire country. They provide both a DTM ("digital terrain model") and DSM ("digital surface model"), where the DTM has been somehow processed to only tell you actual terrain, while the DSM tells you heights including vegetation and buildings etc.; there is also a combined point cloud that gives you DSM heights but includes a classification of each point to say whether they think it is ground or vegetation or a roof. James Nation recently posted a 3d reconstruction of Bruton Dovecote , using the Environment Agency LiDAR data to provide the shape of the surrounding terrain, this is how I found out about the LiDAR data. So this sounds like an incredibly powerful dataset, but what can we do with it? I started trying to just make a viewer so that I could explore the point cloud dataset and hopefully think of something cool to do, and you know how it is with LLM coding agents, one thing led to another and before I knew it I was flying a biplane around Somerset. Flight simulator This is a game using the Godot engine, plus a Python script that takes in Environment Agency point clouds and OpenStreetMap data, and constructs meshes of the terrain suitable for Godot. I currently only have a small area of the country, I'd love to do the whole thing but it is 60 gigabytes of Godot assets already. About 15 years ago I tried to play FlightGear , and found I didn't really get on with it. It was super slow on my PC, plus you have to spend a million years pretending to switch on magnetos and fuel pumps etc. before you can even fly the plane. I had much more fun playing GL-117 . It is visually a much less impressive game, but you get to experience the joy of flight with less faffing around. It has a crosshair controlling the "stick", and you basically just point the mouse where you want the plane to fly. So I copied that interaction model for my game. The ultimate sandbox game I realised while I was playing with this that the flight simulator is not the real game here. I briefly harboured the delusion that I was making a flight simulator that I might some day release, but I now realise that that is not what it's about. It's never going to be "finished". Adding things to the game and then flying around the local area is the game , for me. Treating it as a finished work that is just played as-is is missing most of the fun. Plus it's 60 gigabytes, and bulk-downloading the Environment Agency data is super inconvenient, they make you download it in 5km chunks and have some anti-bot stuff that makes it difficult (not impossible) for the LLM to download them automatically. All this stuff is just annoying for other people to have to deal with. (But apparently there is an easier way to get it ). So I think "finishing the game" and "releasing it" are not worthwhile. If you want to play the game I've been playing, start up your favourite coding agent and get started. The joy is in making your own. Traditionally a game involves a "gameplay loop", which is a sequence of things that take place within the game that are (intended to be) fun for the player. For example in Mario you run through the level collecting coins and avoiding enemies and trying to reach the end, and repeat that for every level. In my flight simulator the gameplay loop is to fly around in the game, have an idea occur to me, ask Codex to implement it, and then fly around some more now with the benefit of the cool new feature. It's a very personal type of gameplay. I also realised that a lot of the joy I have got from programming over the years has been this kind of "gameplay", it's just that before coding agents I had to focus much more on the programming and much less on the new ideas. 4 years ago I wrote in The future of virtual reality about this kind of thing being possible, although it isn't (yet?) playing out how I expected. I expected that you'd have some kind of AI-powered 3d world model that would behave more like an image generation model that you can walk around, and that the coding agent would have to do only a tiny amount of work in plugging together pre-existing parts. That's not really what's happened. Instead coding agents have been absolutely wildly successful, to the point that they just implement everything you ask for by hand and you don't need an AI involved at runtime. The biplane in the game is not even an asset I downloaded from somewhere, I just asked the bot for a cartoon-style biplane and it made me one. I didn't know whether it made a static triangle mesh or whether it was constructing it at runtime. (As it happens, it's made at runtime out of Godot primitives for spheres, cylinders, and boxes, with procedural shaders for fabric and metal seams). My flight simulator is still in the realm of "classical games programmed by AI" rather than "AI games" as such. I still think that an AI-driven world will be a material step-up in capabilities, but the required models don't exist yet, and end-user hardware wouldn't currently be able to run them anyway.

0 views
Brain Baking Yesterday

A Huge Pile Called The Ongoing Gaming Backlog

Not every video game I pick up manages to hold my attention long enough to reach the credits. There are many reasons for this: too boring, too long, not in the right mood, too difficult, too easy, my hardware platform suddenly failed, the friend I played it with stopped playing, … I realised today that I’ve got many of these so-called “dangling projects”. I’m making a list here to help myself get over the initial hurdle of picking them up again. Perhaps I dropped the game for the wrong reasons. Perhaps my mood or the context this time is aligned with that of the game. This backlog only lists games that are ongoing ; meaning that I played at least an hour before turning my attention elsewhere. Shrink wrapped limited editions do not count (to my big relief). Void Stranger is a unique sokoban-like game with an emphasis on story and discovery. It’s best to go in blind—and I did—but the typical Sokoban-like puzzles that stand between me and the unfolding of the story ultimately made me quit playing. I’m just not a huge Sokoban fan. I’m in B075 and have no idea how deep the Void actually is. According to How Long To Beat, it takes more than 20 hours of puzzling which might be too much for me. Against the Storm looked very intriguing because of its unique combination of roguelite mechanics with a typical city builder, yet somehow I stopped playing after one or two storms. I definitely still plan on picking this up, but perhaps after I’ve read a newbie guide as the many mechanics can feel daunting for new players. Wargroove is a nice Advance Wars clone that gradually revealed its non-story and painfully slow and boring battles. I am more than halfway through the campaign but lost interest after a particularly boring slog of a skirmish that made clear it is definitely not Advance Wars . Perhaps I should push on and do a few more battles before writing up a review. I don’t plan to reach the credits for this one: “finishing” will be playing until I’m done. I have this on a physical Switch cart together with Wargroove 2 so hope the successor’s battles will be more breezy. UFO 50 is a superb collection of new old games what Joel & I wanted to play by exploring a new game every week. I think we lasted four weeks? That’s probably my fault, sorry! I really liked what I played so far but the few stinkers afterwards made me pause. A working strategy would be to explore these games further but after 30 minutes just skip a game if it’s not clicking. Castlevania: Order of Ecclesia is the last DS Igavania that’s noticeably harder than the former two. I already finished it back in the day but wanted to replay them all as part of the Advance Collection . Especially the first few sections are brutal where you’ll be barely scraping by. Since I already know where this was going, I lost interest. Wizardry: Proving Grounds of the Mad Overlord is a remake of the 1981 original Wizardry “blobber” RPG. I love Wizardry 8 but this game is very obtuse and old school requiring memorisation, grinding, and regularly running back and forth between town and the multi-level dungeon. After a few hours of stumbling around, I found something more interesting to play. I’m still not ready to dive back in even though I want to. Metroid Prime: Remastered does not need an introduction. I think I played this for just over an hour before putting it down because of… I can’t remember: probably the situation didn’t feel right to continue playing. I did play the original back in 2002 but never finished it. Obviously, I do plan to continue exploring these beautiful and strange worlds very soon. Rayman 2: The Great Escape is installed on the Win98 Retro PC. I rage-quit a few years ago about halfway through after the 20th attempt to finish one of the annoying race levels. The problem now is that the Win98 PC is dead… So it’ll have to wait until there’s time to do some hardware debugging. I don’t feel like emulating the console release as I experienced it on the PC and there’s quite a difference between the two versions, even when it comes to the levels. For me, the problem with leaving a game way before it’s finished is that it creates guilt. This (highly subjective) huge pile is now sitting there, staring at me. What do you mean you’re starting a new game? Why not one of us? Good question. Perhaps I should give some more attention to the pile before it completely grows out of control. It took me a few years to realise that I don’t want to spend the little gaming time I have being miserable: I gave up finishing every game I start a long time ago. Yet since I write about every game I play , I do feel that I have to put in a significant amount of time before I can form an opinion. That usually means playing all the way to the end, but if that makes me feel miserable, I just won’t. I refuse to write about the games that make me feel bad within the first half hour (except weird Game Boy games just for fun) so some just don’t make it to the Codex. Tracking games in progress is not yet difficult. If it is, then I have a problem. The “huge pile” is not really huge: it’s not even a pile yet. I don’t track any ongoing nor yet to play games. If you do but don’t know where to start, there’s stuff like https://backloggery.com/ or https://giantbomb.com/game-tracker or you can make your own like the excellent backlog page created by Dávid Bárdos . In a sense, I did make my own, only I publish about the games that are to me considered done. Although perhaps I should. Distant Arcade wrote about their experience finally carving a spreadsheet to list the tracked ones bring out some harsh truths: stop buying games and start playing them ! No big surprises there, but still. Getting it to zero, like Tyler did might be a bigger challenge than I can ever handle. A screenshot of the first part of my exported Game Collector database of 2006. In the early noughties, I did use software called Game Collector to maintain my video game database. To give you an idea how this looked like, I still have an incomplete HTML export published at https://jefklakscodex.com/gamelist/ . Keeping track of the purchase price is also an interesting (and painful) experiment. Here’s an idea: maybe I should build a endpoint to start tracking new and ongoing games as well… Related topics: / games / By Wouter Groeneveld on 20 October 2026.  Reply via email .

0 views
Stratechery Yesterday

Muse Spark Open, Meta + Apple, Thin and Thick

Meta has a new open source model, and to everyone's surprise, they are are partnering with Apple to make sure you can run it locally.

0 views