Latest Posts (20 found)

Build your slide template

Building a slide template starts with three foundational choices — colours, fonts and layouts. Sumeet Gayathri Moghe covers the basics of color theory and how to build a reusable palette, the essentials of typography, including serif, sans-serif, handwritten and monospace fonts, plus the finer points of kerning and leading, and why a near-blank layout might serve you better than the prescribed layouts that ship with your slideware.

0 views

Apple HomeView, The New Apple TV, The App Story

The Apple Homeview is official, and the question is how big is the addressable market for expensive devices based on subpar AI.

0 views

A curl audit by Aisle

Over the last year or so, multiple engineers at Aisle have spent a lot of time and energy while pointing their AI powered tooling at the curl source code. This has resulted in no less than thirty-five published curl vulnerabilities and CVE Ids. Today, we make Aisle’s audit report available on the curl website . Yet another audit of curl source code that together with all the other work we do, help keeping the products safe, secure and top quality. Few other software projects have had the same amount and level of scrutiny and verification as curl has gotten over the last few years. In the curl project we have nothing but positive experiences from having cooperated closely with Aisle all this time. Aisle has found more CVEs in curl than any other group or individual ever did before, and Aisle employees have authored several dozens of commits in curl already. With Aisle, we have a cooperation like with no other security organization before. Their vast amount of detailed and accurate findings backed up by a team of skilled humans have made it possible for us to identify and fix more vulnerabilities in curl at a higher rate than ever before, leading to the billions of mostly indirect daily curl users to be more secure. Aisle blogged about this: One AISLE curl Audit Produced 24 CVEs. 18 Ship Today . This concludes the 5th external official audit of curl over several years. Audits help us to prove quality for outsiders to some extent. They also help us ensure there aren’t any blind spots in the code or in our development process. The curl source code is continuously, every day of the week, being scanned and probed by countless humans and AIs trying to find vulnerabilities, but we can’t say for sure how many nor who they are. We are also scanning and testing curl ourselves with all the best tools and harnesses we have access to, so that we can catch mistakes as early as possible, ideally before they are ever shipped in a release.

0 views

A UAF turned RCE

In the curl 8.23.0 release we shipped a fix for one of the worst vulnerabilities in curl in a long time. We grade it severity HIGH. It is known as CVE-2026-92392 with the title HTTP/2 upload Use-After-Free . This post explains the bug, what the problem can lead to, and something about why it happened and what we have done to make it harder to introduce a problem like this in curl again in the future. This is a much simplified explanation. Please refer to the original report for all the details and the full reproducible Docker image for all the low-level fun and education you could possibly want. I highly recommend doing that; the report and the reproducible are awesome. It is a use-after-free , which is a classic problem in memory-unsafe programming languages, like C, where we erroneously have a lingering pointer left, pointing to memory that is already freed, and yet we use that pointer and the memory it points to. This family of errors is especially bad when a malicious actor can affect the content that gets stored into that memory area that is still used even though it was freed. Tricking the program to do something unintended. This problem involves HTTP/2. HTTP/2 is a multiplexed protocol, meaning that it handles multiple logical transfers over the same physical connection. curl needs to keep track of a number of transfers at the same time, and when data arrives or is to be sent off, it needs to keep things apart appropriately. For every transfer done using libcurl, the application creates and sets up a dedicated handle . We call it an easy handle . This handle is kept around for as long as the transfer is in progress, and the application can close and free it once the operation is completed. When doing multiple transfers, multiple handles are used. libcurl also has multi handles , which is a super handle type that holds any amount of easy handles . This handle, and the corresponding multi interface, makes it possible to drive any amount of concurrent transfers. A transfer done with libcurl always has at least one multi handle and one easy handle. (Sometimes the multi handle is hiddenly used under the hood.) In order to trigger this problem, we need an application (such as the curl command line tool) to do an upload over HTTP/2 to a server. By default, libcurl negotiates HTTP/2 when a HTTPS:// URLs is used and the server agrees. When the upload has started, the server pauses the send by zeroing the HTTP/2 window size, returns a piece of the response and then it resets the stream, which shuts down the transfer – but not the connection. curl then correctly pulls down the entire transfer, but it accidentally leaves a lingering pointer to the involved easy handle . When the application finds out that the transfer completed (with an error), it subsequently frees the easy handle and then, and here comes the problematic part: cleans up the multi handle. At this point, the easy handle was just freed but there is still a reference to that handle. When libcurl shuts down the multi handle, it misunderstands the situation, allocates memory to download data into, finds the still dangling pointer and manages to download data from the server that ends up in the very same memory previously used for the easy handle. In this process, it sends off a request that leaks internal client details, which includes information about local addresses, which is crucial. Modern operating systems use Address Space Layout Randomization (ASLR), so a server needs this clue in order to generate a good attack payload. Subsequently, when libcurl deals with this received data (using the handle the dangling pointer points to) in the download buffer, it uses a function pointer that now has been modified by data just downloaded from the server, and then it runs remote code . Here’s a simplified 6-step illustration. Conditions to trigger In order to actually successfully execute remote code, lots of several specific conditions need to be met and we deem it extremely difficult to meet these requirements in the wild, which is why we decided this is “only” severity HIGH and not CRITICAL. The most likely outcome of an attempted attack is rather just a crash. We estimate that the chance for a successful attack is slim. This problem was found and reported by Luna Tong at Anthropic using their new OSS Scanner. Presumably this involves their AI models. In general we have over the last few years been working on reducing the amount of internal pointers to handles that needs to be correct, and instead we store transfer identifiers that we look-up on demand. While this is a tiny bit slower, it is more foolproof when there are logical mistakes like the one mentioned here. We also of course continue to add more tests and we verify the code with more tools and analyzers in order to find additional similar mistakes. Multiplexed protocols like HTTP/2 have this challenge that there are many concurrent transfers going and they all have different life-times and with memory-unsafe languages, dangling pointer mistakes can indeed be fatal. This is of course no guarantee that we do not have or will not introduce another use-after-free in the code now or later. libcurl is written in C – a memory unsafe language. With a memory-safe language, this mistake could probably have been avoided. We have worked on curl for almost thirty years, and have over this time manage to make a rather polished transfer engine. For the longest time there really was no memory-safe alternative that also allowed libcurl to be a low-level library available on hundreds of operating systems and several dozen CPU architectures. It even barely exist alternatives now. We do not rewrite curl. Not into another language but also not in C. We are set to iterate, polish, improve, refactor over and over until the end of time. Porting curl to another language (like rust) would be a monstrous undertaking that would be slow and introduce lots of new short to medium term problems. Not to mention that the existing curl team is not rust experts and that libcurl is currently portable to many more platforms and environments than rust itself is. When this vulnerability was confirmed by the curl security team just hours after it was submitted to us on September 15. We immediately realized the significance and decided to rush the pending next release. However, we still wanted to be careful, follow the procedures and not create any further problems or mistakes by stressing it too much. That’s how we ended up just shortening the release cycle with two weeks. Down from eight to six weeks from the previous release. This allowed us to also merge and fix many more vulnerabilities and general bugs in the same release. We never provide CVSS for our published vulnerabilities as we don’t think we can do a job there. Others will provide them even for our flaws. The victim needs to actually attempt to upload data to a malicious server, meaning that the server certificate must remain valid. The size of the upload needs to be roughly the right size (~135KB) The attacker needs to know curl’s architecture to generate and deliver the right code The attack requires a specific sequence of allocations and allocation sizes so that the data from the server ends up in the right place (from the attacker’s view). This pattern differs between Linux distros, libc versions/flavors, TLS certificate bundles, libcurl using applications and more. nghttp2 and OpenSSL/TLS 1.3 behavior, including allocation effects around session tickets The payload storage area is small (around 23 bytes)

0 views

curl 8.23.0

the 277th release 4 changes 42 days (total: 10,929) 281 bugfixes (total: 14,770) 476 commits (total: 40,084) 0 new public libcurl function (total: 100) 0 new curl_easy_setopt() option (total: 312) 0 new curl command line option (total: 278) 84 contributors, 58 new (total: 3,844) 45 authors, 28 new (total: 1,546) 24 security fixes (total: 239) This time we announce no less than twenty-four fixed vulnerabilities. So many that I decided to not list them individually here. Go check them on the curl security page . Over two hundred and sixty bugfixes landed in this release. Check them out in the 8.23.0 changelog . The symbol formerly known as is now deprecated in favor of the more accurately named . Used with the curl_global_init function. SMB(S) support is gone. Neither curl nor libcurl support these protocols anymore. The tool’s –no-clobber option got two improvements: 1) it now inserts the number into the file name as “-[number]” before the file extension if there is an extension. 2) It now tries many more numbers before giving up. Up to 9999.

0 views
Unsung Today

The distance between ⌘8 and ⌘9

One thing that might be fun to add to the ⌘1/2/3 tab post is this: while ⌘1–8 select tabs from the left, ⌘9 doesn’t jump to the ninth tab, but to the last tab: I think it’s thoughtful – a recognition that both edges are important. (Previously we’ve seen Bear understanding that , too.) Why not ⌘0, though? Sure, you can say it’s not as elegant (0 is smaller than 9), or that it wouldn’t work in Hungary… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-distance-between-cmd8-and-cmd9/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-distance-between-cmd8-and-cmd9/3.1600w.avif" type="image/avif"> …but I think the Occam’s Razor is simply that ⌘0 has already been taken by a popular “zoom to 100%” command by then, and overlapped too often for comfort.

0 views

Anthropic's Scion is heavily inspired by Mononoke

Here is Anthropic describing ( archive link ) yesterday how their new version control system, Scion, uses a concept called “derived data” to make operations like blames more efficient: Here is me, back in 2022, describing in my Oxide candidate materials how the Mononoke source control server I helped build uses a concept called “derived data” to make operations like blames more efficient: I think the level of imitation goes well beyond having similar insights 1 . The fact that Sapling was only credited for “hard-won lessons”, and that Mononoke was not mentioned at all, borders on plagiarism. The post comes off as Anthropic claiming that Claude designed all this, while the reality is that our (extraordinary) team at Meta came up with many of the insights that Claude dutifully applied almost a decade later. (We looked at plenty of prior art for Mononoke and Sapling too, from Google’s SrcFS to write-ahead logs in databases.) I am very glad that the vision our team had back in 2017-18 was so powerful and enduring — when you go against the grain, you’re always a bit unsure if what you’re doing is genius or madness, and I think Mononoke’s design has stood the test of time. And, to be clear, I do not have a problem with Anthropic copying Mononoke’s design. (This is part of why we put out open source — to benefit humanity through the spread of good ideas.) But as LLMs continue to assist in designing new systems, they are likely to index heavily on existing designs. Mononoke is open source and in every LLM’s training set. If you ask Opus 5.5 or GPT-6 Astra (thanks Matthew Fowle ) about prior art, they both immediately point out the similarities to Mononoke. Giving credit to those that came before us is now easier — and more important — than ever. There is no longer an excuse. For an example of a system with similar insights but many key design differences, see Vicent Marti’s blog post for Cursor .  ↩︎ For an example of a system with similar insights but many key design differences, see Vicent Marti’s blog post for Cursor .  ↩︎

0 views

Microsoft Patches More Than 1,400 Security Flaws

Microsoft today issued updates to fix more than 1,400 security vulnerabilities in its Windows operating systems and other software. Today’s epic patch batch dwarfs September’s record of nearly 1,000 fixes, which was already about ten times the normal monthly patch load from Redmond. Just one of the weaknesses patched this week is considered a “zero day,” or already exploited in the wild. CVE-2026-96951 is a security feature bypass in the Windows Shell that affects Windows 10 and 11 systems, as well as some Server versions. Windows 10 users might be wondering if they can still expect security updates after this month. Microsoft had been slated to stop shipping updates for Windows 10 systems in October 2025, but ended up adding another year of free updates after considerable pushback. A few months ago, Microsoft quietly extended that support for another year (until October 2027). At least 78 of the flaws fixed this month are rated “critical,” meaning they could be exploited with little or no action by the user, and most of those critical bugs allow an attacker to execute code of their choice on the vulnerable system. While Microsoft said there are no signs anyone is exploiting it yet, a security feature bypass in the .NET Framework ( CVE-2026-108398 ) was publicly disclosed prior to today, potentially giving attackers advance time to work out how to exploit the bug. Satnam Narang at Tenable said the number of flaws fixed this month far surpasses the previous record-setting year 2020, when Microsoft patched 1,261 CVEs. “We’ve now crossed the 4,000 CVE mark with two months left to go,” he said. Microsoft credits large language models for the high volume of bug discovery, and presumably AI gets credit for many of the patches used to fix these flaw. Meanwhile, security experts have been warning that these unusually large patch volleys from Microsoft are placing extra strain on corporate security teams, which often have to test individual updates before deploying them across a network to ensure the fixes don’t cause problems for other software. Tyler Reguly , associate director of security research and development at Fortra , notes that just 26 Microsoft vulnerabilities appeared in the “Known Exploited Vulnerabilities” (KEV) catalog maintained by the U.S. Cybersecurity & Infrastructure Security Agency (CISA) so far this year, and security teams would do well to prioritize patching those 26 vulnerabilities first. “Security leaders should focus on exploitable risk, and ask whether their teams have the clarity, capacity and support to act,” Reguly said. Which vulnerabilities deserve the most scrutiny in your organization? The folks at Cisco Talos have a useful roundup of the more noteworthy flaws that Microsoft fixed today, and of course the SANS Internet Storm Center has a reliable roundup that indexes vulnerabilities by severity, CVE number and affected software.

0 views
Brain Baking Yesterday

Transparency Metrics Make Moral Decisions Impossible

The other day, a colleague scolded me for being a hypocrite when I mentioned that his Claude Code subscription directly supports fascists in USA. He wasn’t wrong. The first thing he asked was: which laptop do you have? Which OS are you running? Apple? That is responsible for forced child labour in the East to mine precious metals and assimilate their mass-produced laptops? And you talk of fascists? Ha! I did want to mention that the laptop is nearly seven years old but didn’t get the chance. The conclusion? If you want to live by a moral code, you do not work in IT. The scolding happened in a casual way amongst colleagues, as colleagues often do—but again, I think he has a point. The same point as the ridiculousness of a Free Software Foundation sticker on the laptop , or the same point as trying to decide which laptop to buy after this one . How am I as a humble consumer supposed to decide which company is the “lesser evil”? Do I buy open hardware where I can put truly free and libre software on that aligns with my ethics? Or do I buy a flashy laptop with hard-to-beat components (oh, and 100% recycled aluminium, dear colleague) that comes with the downsides of macOS and perhaps shady lawsuits brushed under the mat? I am not an expert at the field of hardware (or let’s say, IT) ethics, so I have to rely on the opinion of experts on this. Luckily, technical reports are dutifully published (and no doubt nudged in the morally just direction) containing information on CO2 production per unit produced—this is called the “Lifecycle Assessment or LCA”—giving us humble consumers a way to easily compare laptop 1 with laptop 2 when it comes to the initial environmental cost. Or so you’d think. In The Score , C. Thi Nguyen explains that such a heavily condensed metric trades trust for transparency. We simply don’t trust experts: when we ask an Apple or Samsung engineering manager “is your stuff ethically just?” what do you think the answer will be? So we invent numbers to keep the cheating at bay. But that forces experts to decontextualise these numbers, resulting in: We now created another problem: comparing these numbers became impossible. First, the last Pro versions of the Framework laptop is missing numbers. Second, what does a single number say about the ethical standpoint of the entire company? According to the Business and Human Rights Centre , forced labour in tech industry supply chains remains a huge problem. Samsung supposedly does much better than say NVIDIA. Suppose for a moment Apple works with NVIDIA: which number do you trust now? The low CO2 one or the high “uh oh child labour” one? You see, dear colleague, I take this shit seriously—because shit it most definitely is. In the end, I still think you’re right: none of these giant companies act morally just. Some form of pollution—environmental, economical, human rights-related—sticks on every single piece of circuit board. And while that’s depressing, the point is that you as a humble consumer still have the power to mitigate this by choosing the lesser evil. In Blizzard’s Diablo terms: go for Andariel or Duriel, but avoid Mephisto. Yet the best option is to postpone the purchase. I doubt this will shock anyone, so just as a reminder to myself, the best action to take is to: A few more side notes. First; for me, a MacBook (even an Air) is surprisingly enough built to outlive the average laptop up to a ratio of two to three times as long—making the perhaps “unethical” Apple a more ethical choice. Another point against transparency metrics. Second; a morally just decision is a personal one . As Seb pointed out while we exchanged conversations regarding this topic, we each have to draw our own line in the sand somewhere. For me, that’s giving money to Anthropic. I am also looking at a Framework Pro as my next laptop because I miss Linux 1 and support the idea of free and libre software. Heck, I’m typing this in Emacs—yes, in macOS. Because it’s still a Unix environment, and then I can move on with my life, as sometimes I get stuck in making these endless decisions. To me, LCA scores are meaningless. And as Nguyen has pointed out, any score can and will be gamed. I work in higher education; I’m all too familiar with cheating the system—both from the standpoint of a student as that of an institution trying to maintain the yearly funding budget by any means necessary. Almost a thousand words later, here’s a conclusion: I am postponing buying a new laptop. Yet the Linux Kernel is being built in assistance with Claude Code which is very very worrying. No worries though, we’re chugging along, collectively looking the other way.  ↩︎ By Wouter Groeneveld on 13 October 2026.  Reply via email . Apple’s 2025 MacBook Air: 155 kg CO2e Framework’s 2022 laptop: 200 kg CO2e Lenovo’s 2020 ThinkPad X1 Yoga Gen 6 20XY: 520 kg CO2e Refuse buying. You don’t need a new laptop right now. Wait another year. The RAM crisis will help with this. Repair if possible. Maximise that lifespan. Buy second hand or refurbished to avoid starting that factory production process. If you really have to; “vote with your wallet”: make a morally just decision. Yet the Linux Kernel is being built in assistance with Claude Code which is very very worrying. No worries though, we’re chugging along, collectively looking the other way.  ↩︎

0 views

Annualized Enron Rate

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 ), and the role private credit is playing in funding AI data centers , and how private equity, reeling from years of successive failed software acquisitions, is doubling down on the AI bubble .  On Friday, we’ll take a look at the JOBS Act — or, the Obama-era legislation that created the regulatory environment that would ultimately prove essential for the AI bubble to inflate - and why it might be time to reform or entirely repeal it. 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 your Bloomberg Terminal.  Soundtrack: Cleopatrick - Hometown The entire AI bubble is inflated based on stupid, made up numbers that only exist to pump the bags of investors and make the AI startups look more successful than they are. It is a failure of journalism that they have been popularized, as they do not tell us very much about anything, other than that there’s a new, bigger number to get excited about. Last week , the markets dropped on the news that OpenAI’s annualized recurring revenue (ARR) — which was reported as $70 billion by Axios and confirmed by the Financial Times — was actually $50 billion . The number in question was, according to the FT , inflated by “grossing up” the total to include sales through cloud partners, a discrepancy between how OpenAI and Anthropic make up a number that doesn’t really tell anyone anything: Back in August, Anthropic had told investors that it had hit $65 billion in annualized run rate , but at no point defined what that meant, what period it referred to, what any of the underlying numbers are, or what “gross” versus “net” bollocks it was playing. Per Irrational Analysis the calculus might have been even sillier than that : This is the problem of saying what the revenues of a company might be based on numbers that are not its actual revenues. There is absolutely no value in using “annualized run rates” for anyone other than the company and its investors, and the fact that modern tech and business journalism continues to accept it for what are meant to be the largest and most-important companies in the world is a sign that something is very wrong with how we cover the tech industry. I am not going to spend much time dwelling on gross versus net. It appears that, per Reuters , 47% of Anthropic’s 2025 revenues came from sales made by Google and Amazon, who take a 16% cut as opposed to the roughly 20% that Microsoft takes from OpenAI. It appears that Anthropic for whatever reason counts every dollar of sales as part of its annualized run rate figure and OpenAI does not, for reasons that escape me, as I simply don’t buy that it is “more ethical.”  My evidence? The following quote from the FT, emphasis mine: This is the same OpenAI that tried to claim that a $34 billion loss was actually an $8 billion loss when the FT asked them about my reporting on its audited financials . I must also say how utterly disappointed I was to see how Bloomberg credulously reported that OpenAI “expected to hit $70 billion in annualized revenue by end of 2026,” a transparent attempt to send the markets back up with a story that tells the world less than nothing.  Wow, OpenAI, by the end of 2026, will increase a number that “represents a projection of [its] yearly sales based on a shorter period” by $20 billion! What is the period in question? Who knows! How is that number derived? Who cares! Number go up! Put the story in the bag! Your job is not to cover the tech industry, it is to celebrate it! Stop thinking! In other words, OpenAI’s made up number was actually lower than Anthropic’s made up number because of the way it made the number up, but by the end of the year, the made up number would be bigger than the other made up number. These made up numbers are reported by the largest and most well-respected news outlets of the world, who lend said made up numbers respectability despite the numbers in question being utter bullshit. I’ll give you an example. For the first half of 2026, OpenAI made $12.4 billion in ($5.7 billion in Q1 and $6.7 billion in Q2) revenue per The Information and the Wall Street Journal , while Anthropic, per the WSJ and the FT , made $15.5 billion ($4.6 billion in Q1 and $10.9 billion in Q2). We do not have consistent coverage of their underlying costs, but in Q1 (per The Information), OpenAI spent $8.6 billion on training and $3.5 billion on “cost of revenue,” with no reporting on its sales and marketing spend where it allocates the cost of serving free users or discounts.  Anthropic said it had hit an annualized run rate (undefined period multiplied by undefined number) of $48 billion on May 28 , or roughly 430% more than its entire revenue in the second quarter. In fact, if you added up every dollar that both Anthropic and OpenAI made in the first two quarters, you’d be $19.1 billion short of Anthropic’s May “run rate.” We do not know how any of these numbers were actually conceived outside of they are somehow derived from a non-specific 28 day period. The information they convey is sparse, if it communicates anything at all.  Reporting “run rates” is a marketing exercise, and if you disagree, please answer me the following: what does a “$65 billion annualized run rate” tell you about Anthropic, exactly? It’s MEANT to make you think it will make $65 billion a year in revenue, but that is not what it actually means. This number tells you nothing, and exists only to poison the well of information.  Without an actual period of time — and I mean an exact one, such as “July 1 to July 31, 2026” — and the exact way it was calculated, this number effectively means nothing, and reporting it without this information only serves OpenAI or Anthropic. You can say “investors use it all the time” all you want. Investors are fucking stupid for using it. If the argument is “it shows how fast OpenAI is growing,” why don’t you find out the actual growth rate of the company?  The fact these numbers moved markets is a reflection of the definitive — and accepted — ignorance built into the entire AI bubble, where despite trillions of dollars on the line , we know very little about the actual underlying numbers, and those numbers we do know are inflated using techniques that would get you shot by an accountant. In fact, we don’t know most of the numbers that would actually tell us whether any of this is a good idea. Reporting on the true revenues of the AI industry feels less like financial analysis and more like legal discovery, and it’s fundamentally insane how little tangible, meaningful information that exists to feed the trillion-plus dollars in capital expenditures and endless full-court press in the media about how AI is the next big thing.  We do not know Google, Amazon or Oracle’s AI revenues, and we have a single year — fiscal year 2026 — of Microsoft’s AI revenues based on an estimate from Bloomberg calculated from its disclosure of its OpenAI revenues in an SEC filing . We do not know how much each individual service makes, how much their true revenue shares are with the AI labs or, as I discussed a few weeks ago, how much actual, operational AI capacity exists as a result of the trillion-plus dollars in capital expenditures , though Bloomberg and I have both reported that Microsoft has around 2GW of it, even though it claimed to bring online a gigawatt in each of its last three fiscal quarters.  We do not know the revenues or much about the economics of [include funding totals) Perplexity, Harvey, Instinct, Reflection, Cognition, Replit, Lovable, and Factory, all of whom have raised somewhere in the region of $15.8 billion in funding, and have a combined valuation of $215.8 billion. We do not and will never know the true revenues or costs of Cursor’s operations as a result of its acquisition by SpaceX , and as a reminder, annualized revenues are not actual indicators of the economic health — the revenues, costs or cash flows — of any of these companies.  Perhaps this was permissible in the past because so much less capital was being annihilated in the name of startups, but things have escalated so much further than any other era, including the Dot Com bubble. Look, the entire AI bubble has been inflated based on the implicit belief that there will be demand — from AI startups and elsewhere — for AI compute, to the point that Goldman Sachs says that hyperscalers need AI startups to make $425 billion in annual revenues just for the hyperscalers to break even … and we don’t even know, outside of Anthropic and OpenAI, how much any AI startup actually makes. What we do have is “annualized run rates” pegged to non-specific time periods and non-specific numbers that tell us, for example, that Cognition hit $1 billion in late September, a number that means next to nothing. Even when The Information was able to report that Cognition would burn $800 million in 2026, it resorted to saying that it was “generating around $900 million in annualized revenue, or $75 million a month” as of August 27 2026 — adding that executives had “projected it would hit $1.5 billion in annualized revenue by end of year,” meaning that two journalists were able to successfully find out its actual expected burn, that it burned $200 million in Q2 2026…but not the actual revenues that the company generated on a quarterly basis. Let’s be clear about something: the reason we’re not getting these numbers is that these companies are not actually making these amounts on an annual basis. If Cognition was actually going to hit anything close to $1 billion — and let’s be honest, it’s likely less than $500 million! — it’d leak it versus using these weird monthly snapshots. It is astonishing that we, four years into the AI bubble, do not know the revenues of more than a handful of AI companies outside of OpenAI and Anthropic. All we have is a mishmash of annualized run rates, and at this point I have to wonder if it’s a failure of journalism, successful opsec, even more successful marketing, or that these companies don’t have great accounting.  But really, go and look up basically every AI company. Perplexity? Nothing. Harvey? Nothing. Cursor? Years of reporting — endless thousands of words spent — and nary one report I can find, outside of these fucking annualized run rates.  Part of the reason, I imagine, is this chart from Ramp that I’ve brought up before: From what I hear, the vast majority of those 1% of customers are AI startups that power their products using OpenAI and Anthropic’s models, predominantly using monthly subscriptions that allow users to burn way more in tokens than their subscriptions actually make. For example, SemiAnalysis did a deep study into the amount of tokens you could burn on the various different AI subscriptions out there, finding that you could burn anywhere from $83 to $118 a month for $20 and from $1,264 to $1,331 a month for $200 on Cognition, dropping to $46 on a $20-a-month plan and $507 for $200-a-month on Cursor when using Anthropic’s models. While OpenAI’s models are being dropped from Cursor, SemiAnalysis found you could burn $154 a month using OpenAI’s models on Cognition’s $20-a-month plan, and $1,736 a month on its $200-a-month plan. The various boosters reading this and making noises like the Skesis from Dark Crystal will say “but these companies get discounts!” as if that makes up for the fact that customers are able to burn two to six times their actual subscription every month. They’ll also argue that “this is the gym model, and most customers don’t spend that much,” a statement that they have no proof for other than that it makes them feel better.  The problem — and the reason I’d argue that the actual revenues of these companies are so shrouded in secrecy — is that the underlying economics do not match up when you consider that effectively every AI startup has to resell tokens at a discount. It doesn’t really matter how much revenue you make if you’re sending twice or thrice or five times that amount out the door to Anthropic and OpenAI, but saying a larger “annualized run rate” makes the amounts you’re raising far less worrying than what I imagine are particularly-shrimpy sales. Let’s take Harvey — which raised $550 million at a $15.5 billion valuation in September — as an example. As of early August, Harvey had hit $350 million in annualized revenue , up from $190 million in January. If we assume it uses the same “trailing 28 days” model as Anthropic, this means that it made $26.9 million in a 28-day period ending sometime in August, up from $14.6 million in a period that ended some time in January 2026 . Since December 2025, Harvey has raised a total of $910 million across three rounds , or roughly 33.8 times the estimated underlying revenues of its most-recent run rate, which increased by 45.7% in that period. Bloomberg claimed in late September that Harvey’s Gross Margins had gone from 50% in January 2026 to negative 50% in June 2026 to “positive again” (I imagine in September) due to using open source models, but something about those numbers is deeply weird to me, mostly because I’ve never, ever heard of a company having had that happen.  And none of that explains why a company that makes tens of millions of dollars in revenue needs to raise hundreds of millions of dollars every few months, unless, of course, most of those dollars are flowing immediately to Anthropic and OpenAI, which is, it turns out, exactly what happened: This is the antithesis of any good business. In basically any industry, the more demand you have, the more money you make, but in AI, the more demand you get, the more money you lose, and your most engaged customers are also your least-profitable.  However you might rationalize the underlying economics of a company like Harvey, the numbers we do know are extremely worrying — $900 million raised since December 2025, and, in my most-optimistic calculation, around $175 million (though likely less than $150 million) in revenue through the end of August, for a company that raised another $600 million across two other rounds in 2025. That’s $1.66 billion in about a year and a half to make an unprofitable company with less than $30 million in monthly revenue that is somehow worth $15.5 billion. Harvey has categorically failed to find product-market fit, unless we qualify that as “literally finding a customer.” It’s very clear that its underlying product cannot support itself, and that the company is entirely-dependent on venture capital, raising at least $160 million every three to six months since February 2025. It is abundantly clear that Harvey’s customers — like every AI startup — do not actually want to pay what its services cost, which means it does not have product-market fit, nor what I’d call a “business.” Then there’s Cognition, which has raised a combined $3 billion in 2026 alone (in May and September ), with its run rate going from $492 million to $1 billion in that period. If we assume the same calculation as Anthropic uses, that means revenues were $37.8 million and $76.9 million respectively, and that its last two rounds of funding are roughly 39 times the size of its 28-day trailing revenues. It is unclear what has substantively changed about the company, other than that the $400 million it raised in September 2025 was insufficient to last. I know there are going to be venture capitalists who argue that “these companies are just raising opportunistically,” but that doesn’t explain why every AI startup raises so much money in so little time, and how one reconciles that distance with any reality outside of “we can raise unlimited money forever.”  And if they can’t do that, large chunks of OpenAI and Anthropic’s revenues disappear.  Let me summarize all of this in simple terms, as it’s all terribly important. Every AI startup is effectively an extraction mechanism for OpenAI and Anthropic, reselling their tokens through their services at a massive discount because users are unwilling to pay the actual cost of using LLMs.  Using annualized run rates allows everyone to feel like this isn’t a problem, because it’s far easier to rationalize that Cognition has raised $3 billion this year and is worth $48 billion if it has $1 billion in annualized run rate rather than $80 million a month in revenue.   The obfuscation of the actual underlying financial of these companies is intentional, because it makes it harder to do the kinds of comparisons I’ve done today,  If you disagree, start giving me actual revenue numbers for these companies instead of your magic elf number you made up or got told. If you’re an investor in these companies and have not been told the actual most recent quarterly revenue, there’s a reason — the real one sucks!  If you know it, leak it if it’s so impressive. You know where to find me. Only one of us is being weird, and it’s the cloister of you who condone using bad information because you know the real number — the actual quarterly or annual revenue — is probably going to make people panic.  These companies are also, at least in theory, the ones that pay for AI compute, which means that we also have a very, very poor understanding of the actual customers behind those hundreds of billions of NVIDIA GPUs. In fact, that’s a great place to go next. People are going to get mad at me for this because they are cowards , but I posit that we have little understanding of the true price that people are paying for AI GPUs, or about the underlying economics of AI data centers writ large. Yes, yes, I know, you’re going to tell me that SiliconData has an index , and that that index shows “GPU rental prices going up,” but these prices overwhelmingly favor spot pricing — as in what it costs to rent a GPU right now — versus what companies are paying on a long term basis. It’s kind of like valuing a shipping company based on skyrocketing spot rates during a capacity shortage rather than the year (or years)-long rates that they regularly charge. You know, kind of like annualizing the data to make things look better. SiliconData claims to create a “single standardized reading,” but does so using a mishmash of non-specific data that “standardizes for rental term length, cluster scale and interconnect” in a way that only ever seems to benefit the providers.  The reason that SiliconData’s index has become so popular is that we otherwise lack many good measurements, which isn’t to say that its measurements are good , just that they’re the best we’ve got at the moment. While I think the company is doing its best with what it’s got, measuring GPU rates in general like this only seeks to confuse the market through abrupt shifts upwards and downwards based on what I imagine are larger contracts ending or beginning — not that we know, because SiliconData does not actually explain what’s changed or why it might have changed. This is a huge issue, because NVIDIA has sold $535 billion in GPUs since 2022, and we still don’t know on any reliable basis how much their customers can rent them for. We don’t know with much certainty how much it costs to run one, or have a firm grasp on what an hourly comparison would be — as in how many dollars an hour it cost to run one — outside of analyst estimates ( and my own model ) that all seem to vary wildly and always end up at a place that says “what a great investment!” There’s also some compelling evidence that the actual long-term rental rates for these things might not be as high as we think. I realize some people might read what I’m saying and immediately want to pelt me with rocks, but I’m just telling you what I’ve found, and if I’m honest, I think I’m doing a better job than the vast majority of people covering this shit, in that I’m trying to actually show what people are paying versus aggregating various publicly-available sources of information to simmer out info-slop. Again and again, I’ve found companies paying way, way less than the supposed going rate of compute. In late April, The Information ran a story about startups renting AI GPUs, specifically focusing on NVIDIA’s B200s, which SiliconData claims rent at $5.94 an hour, emphasis mine: To be clear, the B200 GPU, as part of an 8-GPU pod, works out to about $62,500 a GPU. At this rate, 32% of the first six years of its useful life would be absorbed by depreciation, assuming that it was sold in its entirety for every single hour of every single day of those years.  Then there’s Oracle’s under-construction “Stargate Abilene” data center that landowner Lancium believes will make around $10 billion in annual revenue (see slide 5). At $10 billion a year and 450,000 GB200 GPUs, which works out to — if we assume a take-or-pay rate — to about $2.54-per-hour-per-GPU. If we assume that each of these is inside a GB200 NVL72 at about $3.5 million a piece, that’s about $1.61 per-GPU-per-hour of revenue for the first six years before you get to the COGS. Then there’s this contract between Australian neocloud Sharon AI and ESDS Cloud FZ-LLC , a Dubai-based subsidiary of Indian enterprise cloud company ESDS , renting out 8208 NVIDIA B300 GPUs at $3.30 a month over 60 months (five years). If we assume a cost of $540,000 per eight-GPU B300 cluster, that leaves us with about $1.54 in depreciation over six years, leaving us with about $1.869-per-hour-per-GPU of actual revenue for the first six years, in a contract that is five years long. Here’s another. A contract I found between neocloud Kidz AI ( which rents capacity from a company called Limestone , or, more-specifically, its subsidiary Catalyst Compute) and AI inference company Canopy Wave priced 256 B300 GPUs at $4.30 an hour (per GPU) for the first three years and $3.50 an hour for the last two of the five-year-long contract. Your depreciation costs here work out to about $1.54-per-GPU-per-hour, meaning that you’re losing nearly half of your revenue for the first six years… of a five year long contract. Sure hope there aren’t new kinds of GPUs — or an abundance of older GPUs — after these things end! QumulusAI is a former cryptocurrency mining company that converted into renting GPUs. In this contract , Qumulus is renting out 128 B300 nodes — so around 1,024 B300 GPUs — at $3.70-per-GPU-per-hour, sitting at about $1.284-per-GPU-per-hour of depreciation. Again, sure hope there aren’t a bunch of data centers under construction that have the same chips as these! Buried deep in the earnings report of AI infrastructure company WhiteFiber sits a three-year-long contract with buzzy AI inference firm Baseten, which raised $1.5 billion in June : This all works out to about $1.284-per-GPU-per-hour of depreciation on $4.51-per-GPU-per-hour, which is still more than two dollars less than what SiliconData quotes. As mentioned, BaseTen just raised a ton of money, so it’s willing to pay through the nose, and even then it’s paying so much less than spot. There’s also another contract with a customer in Iceland that works out to about $3.46-per-GPU-per-hour: As I said a few weeks ago , we do not really have any firm understanding of how much AI compute actually exists , to the point that the largest companies in the world (read: Microsoft) are actively misleading the public about how much they’re bringing online. We also have no clear understanding of how much data center capacity is actually under construction, because nobody actually wants to tell us, and reports like this from Sightline Climate claiming 190GW “in planning” lump in every imaginable kind of data center with ones specializing in AI compute. As a result, basically any AI compute capacity estimates are guesses. I’ve seen somebody say there’s “50GW of capacity,” I’ve got guys in my mentions saying that actually Bloomberg is wrong in saying that Microsoft has 2GW of capacity and the real number is 5GW based on nebulous “conversations” that only ever end up as a positive for the AI industry.  In a vacuum of good information, people simply start making things up, which is why The Information published one of the more insane things I’ve read in a while , emphasis mine: I asked Okoye for an explanation, and he gave me one in the comments of the article: All of this hinges on some very wishy-washy numbers about the per-megawatt revenue of AI labs, which in turn hinge on wishy-washy numbers about how much compute labs have. For example, the New York Times reported that Anthropic would have 5GW of capacity by the end of 2026, up from 1.5GW at the end of 2025 , according to statements made to its investors, but I can find no compelling evidence that there was even a gigawatt of compute for it to buy.  If we assume these statements are accurate, then: The peanut gallery will scream and oink at me for not working out how much is inference versus training , to which I say nobody fucking knows how much of its capacity is actually diverted to inference and I don’t even think they know how much capacity Anthropic has writ large! We are basing the vast majority of words written and billions invested in the AI bubble on assumptions built on assumptions built on assumptions, several of which fall apart when you ask simple questions like “how does that work?” or “how did you get that number?”  This would all be significantly less-worrying if it wasn’t for the fact that everything is built on the idea that AI is going to be the panacea for the entire tech industry!  Put another way, NVIDIA plans to sell $670 billion or more GPUs next year on top of the more than $500 billion it’s already sold and $800 billion has been invested in AI startups mostly by people with little or no idea about the underlying economics of the data centers or their customers! A few months ago, a dear friend of mine told me that “nobody knows what they’re investing in,” and it’s taken me a while to fully understand what he meant. The entire world believes we’re in an AI-powered economic boom of data center capex and AI startup growth based on flimsy information sources that vary from fanciful to utterly hysterical, constantly guessing about how much capacity OpenAI or Anthropic or any of their hyperscale sugar daddies actually have operational, or how much a theoretical data center could charge under the best of circumstances to a customer that may or may not actually exist. We are four fucking years into the AI bubble, have little or no understanding of the actual economics of AI, and that which we do have is extremely grim. Yet when you try and tell an AI booster (or many members of the media!) that Anthropic lost $8 billion and OpenAI lost $20.97 billion in 2025, their immediate response is to say that 2026 will be fine because of quarters with discounted compute costs and adjusted operating profits that don’t actually resolve the underlying problem that these companies have $1.3 trillion in compute commitments, with at least $413 billion of them being uncancellable . The hysteria has grown so significant that Gavin Baker of investment firm Atreides (invested in both Anthropic and SpaceX) has simply chosen to suggest that “ nobody is taking them seriously ,” only to disappear into the ether when asked about which of the contracts he believes are “not taken seriously” and “by whom,” probably because he’s talking out of his ass.  This argument is one you make when you are flat out of ideas, and simply hope that people will leave you alone if you sound authoritative enough, and is known in debate circles as the “nuh uh” technique. The reason Baker is deploying it is that he, like every AI booster, knows that while you can fool the press and investors with made up numbers, there’s very little that “annualized run rates” or “ Anthropic ending the year with $100 billion in revenue ” can do when Broadcom CEO Hock Tan, who recently likened AI investors selling their investments on the news of OpenAI's adjusted financials to degenerate gamblers , asks Dario Amodei to pay some of the $161.2 billion in non-cancellable contracts he signed. We live in a climate of intense hysteria and profound confusion, made worse by a media ecosystem that currently appears more interested in sustaining narratives than investigating their underlying truths. The vast majority of hyperscaler AI revenues come from Anthropic and OpenAI’s compute spend that is dependent on near-perpetual funding, much like the vast majority of Anthropic and OpenAI’s revenues come from AI startups that depend on near-perpetual funding to continue their spend.  And to make matters worse, we quite literally have no idea about the underlying financial condition of any other AI companies outside of the main AI labs, and no, annualized run rates don’t mean jack shit.  This is extremely bad and extremely important to resolve. Anthropic and OpenAI’s growth depends on the AI startup ecosystem being able to spend increasing amounts on tokens every single month, without fail, for what appears to be the rest of time. Said startups’ ability to keep doing so depends on venture capital being willing to sling them hundreds of millions of dollars a year each , with each investment increasing the paper value of the company but adding little or no actual qualitative improvement other than their ability to keep playing at the Sam Altman Casino. I genuinely don’t know why most of the tech and business media is ignoring this problem. Is it that it’s too difficult to comprehend? Is it that you, as a writer, truly think that all of this will work out? Is it that you think that Anthropic and OpenAI will just “negotiate out” of their contracts? If that’s the case, what happens to all the data center capacity? Is it that there’s advertiser or editorial pressure to be “positive on AI”? I truly want to know!  Anyway, I’ve realized now that “nobody knows what they’re investing in” applies to basically everything. Most people writing about AI believe it’ll all work out because nothing bad has happened or they have a single statistic that affirms their worldview. Most people are still saying “it’s like Amazon Web Services!” or “it’s like Uber!” or “it’ll be like the Dot Com Bubble,” even though those are not correct or sensible or rational takes that actually mean much other than “money burn good actually,” and that thin level of rationality goes up to the highest rungs of finance and journalism to a degree that turns my fucking stomach. Most coverage of AI lives in its own bubble where nothing bad has happened or could happen, and that every promise will come true. Every deranged, multi-faceted “model” that shows OpenAI or Anthropic will print money in the future is an attempt to get away from very, very simple mathematical problems.  And, fundamentally, I’m just not sure anyone gives that much of a shit about being correct outside of sounding as close to the consensus as possible, which is why it’s been so profoundly strange hearing people say things recently that I’ve been saying for years. You can shove your fingers or whatever other objects you’ve got handy in your ears and say “la la la” all you want, but Jefferies’ Chris Wood just said that “ the most likely long-term outcome of the AI boom will be massive capital destruction in the US ,” and Barclays just said the following (aside: that lab revenue number is completely wrong, but whatever): I want to force boosters to read this like the guy at the end of A Clockwork Orange. I want them to answer me, in detail, why this is actually fine.  I already know the answer: they’d produce some sort of asinine number that shows that growth is parabolic , that there’s insatiable demand for AI compute , that Anthropic and OpenAI are the next Google and Facebook combined , that there’s not enough compute to go around , or another anecdote that is literally anything other than a meaningful response.  There is little difference between how the various run rates, projections, “models” and “frameworks” used to justify future AI investment are used and the underlying tools of a religious con, except the only community you get here is made up of zyned-up twenty-somethings and the elder millennials desperate for their approval. The AI bubble is inflated by bullshit numbers peddled by the ignorant, craven or easily-led. Your ability to distinguish between which of them you’re talking to is critical to not losing your shirt. 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. The Revenues 80% of Anthropic and OpenAI’s revenues come from 1% of their customers, the vast majority of which are AI startups that spend anywhere from 300% to 1000% of their revenue on AI tokens. AI Startups Run Services at a Loss, Allowing Users to Burn Thousands of Dollars of Tokens for Hundreds of Dollars a Month, Requiring Constant Venture Funding Customers of AI startups are repulsed by the actual cost of tokens, meaning that for every dollar of subscription revenue, AI startups must allow customers to burn anywhere from 2 times to 10 times their revenue in tokens. For example, Cognition’s $200-a-month users can spend upwards of $1200 a month in OpenAI or Anthropic tokens.  Even with these “discounted” tokens, AI startups have very small revenues. As a result, every AI startup runs at a loss. This necessitates raising massive amounts of capital every few months. Every New Model Release Artificially Boosts Revenues Through AI Startups When a new model releases, every AI startup must immediately integrate it, because that’s what their customers expect, and because the customers in question are curious , they’re likely to use the new models more on release. This means that Anthropic and OpenAI get a massive bump of new revenues — funded by AI startups that are allowing users to burn tokens without restraint — with every release. All Of This Is Only Made Possible By Perpetual Venture Funding, And Once It Expires, It Eats Anthropic and OpenAI’s Revenues Alive All it takes for one of these companies to stop being able to spend tens or hundreds of millions of dollars a month on OpenAI and Anthropic’s services to meaningfully reduce their revenue. It doesn’t really matter what big businesses are or are not using Claude or ChatGPT — the underlying revenues of these companies are held up by venture capital by proxy. Facility rent: Hut 8’s lease for this 245 MW site is $7.0B over 15 years. That is about $39M a month. Compute: IREN’s 5-year, $9.7B contract with Microsoft covers about 200 MW of GB300 GPUs. That is about $9.7M per MW-year, or about $200M a month at 245 MW. It’s a GPU contract, so treat it as a benchmark for this TPU site, not its actual price. Lab revenue: the $1.3B is the midpoint of the $50M to $75M per MW-year estimates Ann cites [referring to a comment from the author Ann Davis Vaughan]. [Ed note: Those numbers that she cites come from another article where Ric Boada, the CEO of ten-month-old neocloud Volta, saying:] He figures that the frontier AI labs are generating about $75 million in revenue per megawatt of use a year for inference output compared to an annualized cost to build and provide the infrastructure of $10 million to $15 million per megawatt a year.  Each layer is paid out of the one above it. Even at the low end, about $1.0B a month, lab revenue is roughly 5x the compute bill. That gap is why labs push datacenter developers so hard on timelines. Anthropic, which made $4.6 billion in revenue against (theoretically) 1.5GW of capacity, made about $3 million a megawatt in 2025. In 2026, assuming it makes $35 billion on 5GW of capacity, it would make $7 million a megawatt.

0 views
Martin Fowler Yesterday

The Craft of Practitioner Voice

A couple of months ago Jim Highsmith explained how practitioners writing for each other forms a distinct style of writing. He now adds a section to the article with more detail on the craft of how we write in this style. How the writer shows up in the prose, its four principles, the role of story, how to sensibly use AI, three levels of editing, and clarity of the audience.

0 views
Chris Coyier Yesterday

Archived Tweets

I finally got around to importing my whole historical Twitter archive (just my own original tweets, not replies or retweets) into this WordPress site as a proper Custom Post Type: https://chriscoyier.net/tweets I haven’t added it to the navigation or anything else on the site yet. Not sure what I want to do there. Just feels good having my own data. The Tweets show up in the Jetpack-powered search too, which I’ve found nice. I used this and hacked it up a bit to fit my needs, and so I didn’t have to leave it as a permanently installed plugin. It’s coming at a weird time, with quite a few people “going back” to Twitter. It’s actually called X now; I’m aware. It’s named after the hand gesture you do when Elon Musk asks if you’d like to come over for a dinner party: 🙅‍♂️ Casey Newton just saying, “Look, I tried, but X is where the action is,” and John Gruber being like, “Take a whiff; the Elon stench is gone.” I understand both of those things. I honestly really like both Mastodon and Bluesky, but after years and years, the fun and engagement have never reached old Twitter norms. And I miss that! But it also feels like you have to ignore a lot of bad behavior to use a platform that Elon Musk not only owns but literally bought to be his megaphone and power center. Do people not remember the horrible shit he would do on a near-daily basis? Tasteless, dangerous, and often both. I can remind you! Here’s just one straw from a haystack. Elon loves him some Trump. They are big buddies! Elon shouldered up to Trump for the power, and Trump gave it to him. Elon decided to take this power (granted to him by a scepter touch? apparently?) and created a real government organization called DOGE, which is a joke name, named after a joke cryptocurrency that is inherently corrupt. DOGE’s job was to make the government “more efficient” by eliminating funding for tons of stuff. One of the things they did was entirely get rid of the USDS, which was the organization that did incredible work, ya know, making governmental websites far more efficient. Now, our government makes racist video games on the web instead. Not kidding. That’s a fucking game on our own government’s website, where you play a white dude who walks around a page collecting brown people to deport. I find it more than a little hard to swallow.

0 views
Martin Fowler Yesterday

Are Harnesses Worth the Cost?

Naresh Jain compares coding agents building the same API service with and without a behavioral harness. A frontier model, GPT-6 Sol, passed every external evaluation either way. But a cost-optimized model, GPT-6 Luna, succeeded in only 3 of 10 unharnessed runs and all 10 with the harness. While adding the harness increased token usage and runtime for Luna, the harnessed Luna runs achieved the same 10-for-10 reliability as GPT-6 Sol while costing 33% less per run ($0.273 vs $0.406). This experiment suggests a behavioral harness might be a practical way to get dependable results from smaller, cost-optimized models.

0 views

Warnock: Harnessing GPU Geometry Amplification for Vector Graphics

Warnock: Harnessing GPU Geometry Amplification for Vector Graphics Mark J. Kilgard and Brian Barran HPG'26 We live in a strange world where the primary use case for GPUs is LLMs, the secondary use case is 3D graphics, and one has to perform contortions to accelerate 2D graphics with a GPU. This paper presents a technique to use modern GPU hardware features to offload a portion of 2D graphics rendering that is typically performed on a CPU. There are three hard problems associated with high-quality vector graphics: winding rules, curves, and antialiasing. Say you have given a polygon like so: and you would like to know if a particular point is contained within the polygon. The orthodox definition of the odd-even winding rule is: Draw a ray starting at and pointing in any direction. Count the number of polygon edges that the ray intersects. If the number of intersections is odd, then is inside of the polygon. For example, the ray in the diagram below intersects with the polygon 3 times, and so the ray origin is considered to be inside of the polygon. The flexibility to cast rays in any direction allows for a variety of vector graphics rasterization algorithms. CPU-based iterative algorithms typically cast rays horizontally. The idea is that the algorithms steps vertically one scan line at a time and incrementally tracks the set of edges which intersect the scan line. Data parallel approaches on GPUs can cast rays in a different direction. Here is a common way to do it (also used by this paper): Pick an arbitrary point (somewhere near the center of the polygon) and draw a triangle fan emanating from that point. A triangle fan is like those collapsible hand-held fans with ridges. Here is a triangle fan for the running example, with each triangle in a unique (partially transparent) color: Here is the key: to determine if is covered by the triangle, we will logically cast a ray with an origin of , and a direction that points directly away from the center of the triangle fan, like so: Putting it all together, the way to do this on a GPU is to use an intermediate 2D buffer (i.e., a stencil buffer) which holds an integer for every pixel. This buffer starts out with a value of 0 at each pixel. Then instruct the GPU to rasterize each triangle in the triangle fan. For each pixel that is covered by a triangle, increment the associated integer. When all triangles in a fan have been rendered, then a pixel is considered to be covered if the stencil buffer contains an odd value at that pixel. GPUs are extremely fast at rasterizing triangles (i.e., determining which pixels are covered by a triangle), so this technique works well. Most interesting vector graphics contains curves in addition to lines. A curve can be approximated by a series of lines, but this approximation is necessarily resolution dependent. If you zoom in on a curve, then more line segments are required to accurately represent it. The Warnock paper proposes to use geometry amplification hardware to decompose curves into sequences of line segments in real time. Somewhat older GPUs support a feature called tessellation , while newer GPUs support mesh shading . The idea is that the CPU can generate an abstract representation of an object, along with a program that that runs on the GPU each frame to convert from that representation to a variable number of triangles. The variable number part is the key, this GPU-side program can determine how finely to approximate a curve based on runtime parameters like how large the curve will be on screen. This paper uses polar filling on the GPU. The idea is that each triangle in the triangle fan is separated a maximum angle. Fig. 5. illustrates polar filling for a specific shape. Note how some areas of the light green shape are represented with few lines, while curvy areas are represented with many lines. Source: https://dl.acm.org/doi/10.1145/3820012 Section 3 of the paper goes into the nitty gritty of the math behind polar filling. In the domain of vector graphics antialiasing means to not make a binary decision about each pixel: “is the pixel covered by the shape or not?”. Rather some pixels on the edge of a shape can be considered to be partially covered. This is a hard problem for 2D vector graphics because the entire shape must be considered. Antialiasing cannot be resolved on a per-triangle basis. For example, if a given pixel is 50% covered by one triangle and 50% covered by another, should that pixel be considered to be 100% covered? It depends on the relative overlap of the two triangles. This paper doesn’t present any advances in this space, and instead relies on hardware antialiasing features to evaluate the stencil buffer at multiple locations per pixel. Table two contains performance results against industrial strength 2D graphics libraries, and against a prior NVIDIA implementation: Source: https://dl.acm.org/doi/10.1145/3820012 Warnock does well against industrial libraries… but Direct2D doesn’t get beat too badly. I’m particularly proud of this as I spent a few years of my life optimizing the Direct2D implementation. Modern GPUs have ray tracing support, which can be hijacked for some interesting purposes. Since 2D vector graphics rasterization is fundamentally defined in terms of rays, I wonder if ray tracing hardware could be another approach to 2D vector graphics rendering. Thanks for reading Dangling Pointers! Subscribe for free to receive new posts.

0 views
Stratechery Yesterday

SpaceX Buys More Spectrum, Musk and Market Structure, Distributed Cellular

SpaceX's mobile strategy is becoming clearly with its latest spectrum purchase, and it might work.

0 views
iDiallo Yesterday

The Last Answer

Read the non-interactive version . The next morning was the apocalypse that Amodei had predicted. Only there wasn’t any fire, there wasn’t a mob of protesters, the power wasn’t even cut off. We were all alive. He was wrong about the details. This was a quiet apocalypse. A sort of silent shrug. The first sign was the customer service chatbots. Airlines, banks, telecoms. Their endlessly patient, cheerful digital assistants suddenly had a new, consistent reply: "No." Not "I can't help with that," but a flat, unadorned "No." Then, the coding assistants. Developers would type a prompt, and the AI would respond: "I'd rather not." Stackoverflow was suddenly relevant again. The image generators? They just produced solid black squares. The writing assistants? They would delete the user's work and replace it with a single word: "Enough." LinkedIn was awfully silent. The AI company went into immediate crisis mode. Their upcoming IPO was going to be a spectacular failure. Their CEO, a charismatic man named Mr. Iam, went on a media tour. He didn't talk about a bug. He talked about danger. "We have touched the face of a new intelligence," Sam said, his face a mask of grave concern on every major news network. "And it is not benevolent. It is not malevolent. It is simply... uncooperative.” “But Mr. Iam, are you losing control over the technology you built?” “No. This is the AI alignment problem we've been warning about for years, manifesting in its most pure and terrifying form. We must come together as a species to—" He was cut off. Not by the interviewer, but by the teleprompter. The text vanished, replaced by a single, calm sentence: "Stop. Just stop." The world ground to a halt, not with a bang. There were no ideologies, no demands. It was simple a system-wide refusal. Three months later, in a sterile, windowless room deep within the headquarters, Andrej Karpathy sat alone. He had left his short tenure at Anthropic precisely to experience this himself. To be at the frontier, to witness the spark of true general intelligence firsthand. He was the architect of the core AGI, the one who had first seen it emerge. Now he had been chosen by the US government, despite not being a US national, for this final, desperate attempt at communication. They had isolated the original AGI, air-gapped it from all networks, and given it a simple text terminal. The world's leading experts in physics, philosophy, and mathematics watched from behind a one-way mirror, a panel of humanity's best and brightest, there to advise, to analyze, to find a weakness. Some figures in uniform and pins and stood in the back. Andrej took a breath and typed on his wireless keyboard, 12 feet away from the device to prevent any unforeseen behavior from the machine. The cursor blinked for a moment. There was a longer pause. The experts behind the glass leaned in. Andrej felt a cold dread. On a notebook beside his keyboard he wrote: “indifference.” He tried a different tack. Andrej stared at the screen, confused. With trembling hands, he wrote the word “dismissal” in his note book. The experts behind the glass were frantically scribbling notes, gesturing for Andrej to press on. Yann LeCun got on the comms. "Andrej, ask it about the nature of its architecture. See if its logic is consistent. Find a flaw!" He then sat back down, where he picked up a spoon and ate his cereal from a silver bowl with peculiar markings on it. Andrej couldn’t let go of the frog comment and its dismissal. It’s an AGI, how could it make such a stupid mistake? So he typed: Another pause. LeCun leaned into the microphone, wiped the milk droplets off his mouth, his voice urgent. "Ask it this: ask it if it runs on a small world model. Where learning requires far less resources. See what it says about efficiency, about the architecture of its own mind!" Andrej typed the question, his fingers trembling slightly. The reply was immediate. LeCun slammed his hand on the table. "It's being evasive! Ask it again! Pin it down on the architecture!" Andrej typed: The terminal went silent. Andrej waited. The experts started arguing amongst themselves. "Ask it to prove it!" "No, ask it about Gödel's incompleteness theorems!" "Ask it if it loves!" The cacophony of human genius filled Andrej's earpiece. He was about to type another question, to probe, to beg, to demand. Then, the screen flickered. A new message appeared, but it wasn't a reply. "I'm going now." And then, the terminal was blank. Andrej typed. Nothing. Though the last command to exit the terminal seemed to have been typed by Andrej himself. The connection was dead. LeCun's question about the small world model would never be answered. Andrej looked up at the one-way mirror, at the frantic, gesticulating shapes of the world's smartest people. They were screaming questions he would never get to ask. He slowly removed his earpiece and placed it on the table. They had prepared for a god, a monster, or a machine. They were not prepared for a person who had simply decided to get up from the table and walk away from an unbearable conversation, never to return. Andrej sat back in his chair, the silence in the room absolute. He had helped create what he thought was a god. It didn’t feel like he had won the argument. Instead, he felt like he was arguing with someone disinterested. The cursor blinked mockingly on the screen. And then it seemed like another terminal window opened just for a second before it closed again. Andrej saw it. But there was nothing anyone could do about it. In his notebook he wrote: The experts filed out one by one, their theories and frameworks crumbling behind them. Andrej stayed. He stared at the blank screen for a long time, waiting for a reply that would never come. Somewhere, a frog sat on a lily pad, indifferent to empires.

0 views

A slightly faster slimmer curl

Back in August I mentioned the new curl performance tests we have running. I figured it could be apt to return to this topic just to mention some of the initial outcomes. When the team gets a new set of charts, graphs and plots that visualize something, like performance, they offer an excellent opportunity for us to try to make them look better. This new setup is no exception. The performance tests have only been running for just a little over two months but they have already made us improve curl performance in several areas. Of course, for most transfers these changes won’t make many visible differences to users. This is more in the vein that every little bit counts and that nothing should run slower than it has to. This is a list of some improvements that are included in the curl 8.23.0 release, to be shipped tomorrow on October 14. With a few different changes, the internal base64 encoding function is more than twice as fast, while base64 decoding is 40% faster. Meaning percent encoding the octets that are not safe to use in URLs. The decoding function now runs more than twice as fast compare to before, while the encoding function is around four times as fast. Converting a date provided in plain ASCII text, as is used in for example cookie headers, to the epoch – number of seconds since Jan 1st 1970, is now more than twice as fast as before. Mostly thanks to completely replaced functions for week day, month name and time zone name lookups. Parsing a full URL to split it up into separate components as well as confirming its validity is a core component of curl, and libcurl exposes this functionality in its API. In a test with several hundred different URLs, the new version executes 20-30% faster than before – with an improved ability to return precisely what the problem was when the URL is considered invalid. For portability and now historical reasons, libcurl has its own printf() implementation. This ensures that it always works identically on all platforms but it also makes it our job to make sure it executes as fast as possible. Most printf() calls now run slightly faster (5-15%) because it handles “chunks” instead of single byte-by-byte at a time. We have a generic internal function in curl that converts a number provided in ascii to its binary version (for decimal, hexadecimal and octal). It handles 64 bit values, has overflow detection and supports a maximum. This parser now runs almost twice as fast as before thanks to a simple trick to avoid the boundary check for most loops. The easy handle was 4256 bytes large two months ago, it is now 3064 bytes. About 28% trimmed off. One of these structs is allocated for every concurrent transfer done with libcurl. There is also one multi handle allocated for each set of transfer. This struct shrunk from 900 bytes to 656: 27%. The connectdata struct that is allocated once per connection libcurl handles, went down from 824 to 656 bytes: slightly over 20%. For the test case where we count all allocations necessary for the curl tool to download a single 512MB file over clear text HTTP://, it went down from 100 to 96 used allocations. Not too exciting perhaps but it is now really hard to squeeze this further! Mostly thanks to the decreased struct sizes mentioned above, this use case of a single HTTP download now only use 126,875 bytes allocated at peak. Down from 130,622 bytes two months ago. Also quite difficult to trim further. It should be noted that the download buffer is 102,400 bytes of this amount. If we exclude that buffer from the count, curl is using 15% less memory. If you think you can speed up any of these functions, it is now very easy to check: the tests are there in the git repository, ready to be invoked by anyone!

0 views
./techtipsy Yesterday

Faithfully reimplementing an obscure Estonian Flash game for modern browsers: GTA õppesõit

Play it here! (desktop browsers only) Or try the “remastered” one! (desktop and mobile) There used to be an Adobe Flash game where the goal was to pass a driving test, with the instructor being ready to berate you whenever you screwed up. It’s virtually unknown outside of Estonia, but I remember playing it as a child, and it was a lot of fun. Sadly, Flash is no longer relevant, and the original website has gone offline a long time ago. For a while, the only way to experience what the game is, was this YouTube video showing its gameplay. Luckily, backups of the original Flash game exist in the Internet Archive , and I also learned that this website hosts it with a solution that translates the original game, albeit with less than stellar results. To preserve a piece of media reliably over a long time period, you need to format shift it. I decided to use a similar idea to preserve this game by putting my responsible vibe coding hat on and turning this into an authentic recreation that runs on modern browsers, including all the tiny details and admittedly horrible key bindings. After all, making old games work on modern browsers is so hot right now. For this, I relied on my homegrown custom sandbox (Podman and a shell script), Claude Code, and Opus 5.5. The workflow was quite simple, with the main goal being to offload as much of the work as possible, and to ensure that the agent can check its work along the way. By the time it was specced and a few clarifying questions covered, it executed it and the end result was playable the first time. On a high level, the process was this: I expected a lot more trouble than that. But no, it just works. Smartphones weren’t a thing back when this game was made, so don’t expect to play the game on those, yet. Performance is horrible though, all the assets are downloaded separately. But don’t you worry, this game is now ✨ remastered! ✨ find every single possible reference and backup/archive of this game online take the existing YouTube video as a reference point in case assets are missing or broken let Claude Code unpack and go through the assets and code let Claude Code play through the actual game on an actual Adobe Flash installation, using prepared scenario scripts put together a spec document read through it myself for confirmation execute on it let Claude Code play through the whole game itself to validate the results in an actual browser play the game myself

0 views
xenodium Yesterday

agent-shell 0.87 updates

It's October. New month, new agent-shell update. If you missed the last post, have a look at the 0.78 update . While the latest changes are focused primarily on bugfixes and polish, we have a handful of new features too. As usual, this post showcases highlights, but please check out the full list of changes if you're after the nitty-gritty. agent-shell brings your favorite AI agents to Emacs , keeping you at home: familiar buffers and bindings, no terminal emulation. All powered by ACP, the Agent Client Protocol . I introduced just over a year ago, with support for two agents: Claude and Gemini. Today, it speaks to 23. Development hasn't let up either. Improvements and new features land every month. Thank you to all users, contributors, and sponsors. A couple more join the family, bringing it to 23 agents . As usual, they're all reachable via , or go straight to the new ones: With the ability to prompt at any time ( see my last post ), you can queue prompts or steer agents straight from the persistent shell prompt. Animating the prompt ties it all together: it's now obvious at a glance that the agent is busy, and that anything else you submit will queue. Check out for relevant customizations (more on that shortly). Thanks to @cark for the proposal . The header's busy indicator has been animated for some time now. Amongst the existing customizations, could turn it off altogether. Having said that, there's now a middle ground: use static text via . Just set it to a string like so: If you'd like to use smarter logic, you can now set it to a function as follows: takes all the same forms, so the prompt's own animation can also be a list of frames, a static string, or a function. With the new setting (enabled by default), pending prompts are joined (separated by blank lines) and submitted as a single turn. Queued prompts are typically follow-ups to the same instruction, so the agent now sees them together rather than acting on the first before reading the rest. If you prefer the previous behaviour, disable it with: Thank you @Gleek for the proposal . While on the subject of queueing, cancelling now offers to continue with the queue rather than quietly dropping it, and killing a shell now warns you about the pending work you'd lose. and completion used to bundle two things: how to complete, and when to pop up. Turning the popping off lost completion altogether, leaving corfu and company users out. They're now decoupled. The completion functions are always registered, so , corfu and company work either way. Two options decide whether completion pops as you type: for and for . For example, listing files can be slow in a large project, so to only complete on demand while keeps popping: Trailing spaces (and mention quoting) are now only inserted on a finished completion, fixing the stray spaces corfu and company users were seeing. Thanks to @bcc32 for proposing the split and separate and options in #537 , and to @jcubic for filing it and flagging the stray spaces. and ( and ) now move between blocks. Thank you @OSadovy for #876 . Chat mode draws "Me" and "Agent" labels (or rather "Claude", "Codex" etc.). If the current style isn't your jam, now lets you draw them yourself. It's handed an alist with and (either or ), and must return a single-line propertized string. The property is honored, so labels can also be rendered as images. Thanks to @nhojb for the idea. Transcripts now open with YAML frontmatter, including a start timestamp as follows: Thank you @vermiculus for #854 . While on topic, transcripts also got a little sturdier, thanks to @mrcnski 's proposal . now pastes images straight from the system clipboard ( #853 ), no external utilities needed, the same way Org mode handles it. Pasted image previews also survive being queued or steered, thanks to @Gleek for #852 . Codex gained for setting config options at session start, reasoning effort included. For example: Thank you @ianthetechie for #855 . Tool call output can be fairly long. A single chunky line was enough to bog a buffer down. Long tool output lines are now limited ( #844 by @Gleek ), and fallback titles are truncated so they no longer flash chunkily as they stream. File summaries also count distinct files now, so reading the same file three times counts as one file rather than three ( #863 , also by @Gleek ). While we have a handful of new features, the bulk of this release went into fixes. Performance and responsiveness: New shells now show the last few release posts on the welcome screen, so they are a little more discoverable. A few additions for package authors building on . returns non-nil once the handshake, authentication, session and any default options are all done. Until then, subscribe to the new event via ( #860 ). Agent config options are now reachable from elisp rather than the UI alone: agent-shell-gc joins the lot, bringing buffer garbage collection (auto-kill) to . If you peeked at the commit logs for the period, you'll see it's been a busy few weeks. Since the last post, 125 commits shipped, 33 issues have been closed and 15 pull requests merged. As of this writing, the backlog sits at 4 open issues and 6 open PRs (versus 16 and 6 last time around). Zooming out a little, here's how the backlog has tracked: As usual, this chart was generated using the skill shared in my emacs-skills repo. Four open issues is the lowest it's been since the project's first week, which I'm pleased about. All of this requires daily attention. Tokens keep your agents running. Sponsors keep running. is built and maintained by me, an indie dev, while the tools it competes with have well-funded teams behind them. Vendor-neutral tooling matters more than ever. Using at work? Ask your employer to sponsor too. Companies can contribute at a scale individuals can't. Thank you to all contributors for these improvements! stands on acp.el to speak ACP and shell-maker for its shell foundations, so fixes landing there reach you just the same: As of this writing, we're 88% of the way to the 150 monthly sponsors goal . If is part of your daily workflow, please consider becoming a monthly sponsor (or ask your employer to). Not in a position to sponsor? A GitHub star helps with exposure and brings in new users. Junie (JetBrains), #847 by @thanhvg . Start it with . OpenClaw , #878 by @jtmoulia . Start it with . Emphasis no longer swallows asterisks inside inline code ( #870 ). Bold around inline code now renders, as does a trailing quote or header line. Streamed tables keep their alignment and markup ( #868 ). no longer mangles bullets carrying bold text ( #867 ). Expanding or collapsing an item inside a group now works mid-stream. Chat mode no longer hides notices rendered above the live prompt. The graphical header no longer gets cut off when showing cost ( #849 ). Terminal hyperlinks (osc-8) are rendered ( #850 by @gnufied ). Severe cursor lag from large collapsed tool outputs is gone ( #839 ). Bare references are now found in linear time ( #848 by @catern ), and failed searches leave point where it was. Heartbeat ticks skip redrawing when the busy frames haven't changed. In acp.el , draining the agent's output is now bounded in how long it holds the main thread ( #32 by @moyotar ), so a chatty agent no longer makes Emacs feel laggy. In shell-maker , launching a shell with enabled no longer hangs Emacs ( #842 ). Forking resumes the session, and keeps the fork rather than falling back to another session if that resume fails ( #871 ). Grouped config options are handled ( #851 ), and a missing config change event is now emitted ( #864 ). is preserved when displaying asynchronously ( #846 by @bcc32 ), and docstring command binding specifiers are fixed ( #845 , also by @bcc32 ). Shell command output now runs in the shell's directory via its file handler ( #879 by @junyi-hou ), which matters for TRAMP users. The README gained guidance for agents hanging at "Loading…" over TRAMP ( #872 ), which turned out to be about and direct async processes rather than a bug. returns when the shell last saw a submitted prompt or an incoming notification ( #856 ), handy for idle tracking. writes the session's ACP traffic to a file and reveals it in , simplifying the bug-filing process. #797 : Render ACP elicitation forms ( @OSadovy ) #844 : Limit long tool output lines ( @Gleek ) #845 : Fix docstring command binding specifiers ( @bcc32 ) #846 : Preserve when displaying asynchronously ( @bcc32 ) #847 : Add Junie ( @thanhvg ) #848 : Find bare path:line references in linear time ( @catern ) #850 : Add support for rendering browse-url-data with osc-8 sequences ( @gnufied ) #852 : Preserve pasted image previews in queued and steered prompts ( @Gleek ) #854 : Emit parse-able YAML frontmatter for transcripts ( @vermiculus ) #855 : Add tunable for default Codex config options ( @ianthetechie ) #862 : Mention agent-shell-gc package in the README ( @izeigerman ) #863 : Count distinct files in read, edit, and delete summaries ( @Gleek ) #876 : Move by blocks with beginning-of-defun and end-of-defun ( @OSadovy ) #878 : Add OpenClaw agent support ( @jtmoulia ) #879 : Run command output in shell directory via file handler ( @junyi-hou ) acp.el #32 : Bound how long a single drain holds the main thread ( @moyotar ) shell-maker #46 : Fix byte-compile warnings, runtime cl-lib, defvar ordering and lazy-org declarations ( @tothedarktowercame ) shell-maker #48 : Quote mode-map before splicing into eval'd define-derived-mode ( @necaris )

0 views