Latest Posts (20 found)
Unsung Today

“The broken, slapdash, bed-shitting end to one of the most iconic franchises in all of gaming history”

I absolutely love Billy Maher’s body of work . He’s been writing about older games and software in general since 2011; it’s always solid, always an enjoyable read, and always providing new perspectives even on stuff I thought I knew well. (Maher also goes by The Digital Antiquarian.) I linked to his work once before , and today I wanted to share a recent essay about the disaster that was the 1999’s game Ultima IX . = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-broken-slapdash-bed-shitting-end-to-one-of-the-most-iconic-franchises-in-all-of-gaming-history/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-broken-slapdash-bed-shitting-end-to-one-of-the-most-iconic-franchises-in-all-of-gaming-history/1.1600w.avif" type="image/avif"> I have never played any Ultima games, but this felt a gripping read. […] Richard Garriott, the motivating force behind Ultima from first to last, has done his level best to write the aforementioned last out of history entirely. Ultima IX is literally never mentioned at all in his autobiography. But, much though I may be tempted to, I can’t similarly sweep under the rug the eminently unsatisfactory denouement to the Ultima series. I have to tell you how this unfortunate last gasp fits into the broader picture of the series’s life and times, and do what I can to explain to you how it turned out so darn awful. In some sense software projects always fail for one of the few obvious reasons, and it’s just details that change. Here, the details are fascinating. The Ultima series started in the very early 1980s as a series of small games made by one person, and ended ignominiously as an almost-AAA title rushed to market that no longer wanted it: They met the deadline — what other choice did they have? — but the playable game eluded them. It’s not just the deadline. There’s also a studio past its prime, a fascinating but deeply flawed leader, the market forces and trends, and perhaps even some enshittification long before the word’s invention. It is also a story of the first two decades of the videogame industry itself. It happened so long ago that it almost feels like a fairytale itself, but one with a sad ending. Maher also lists some learnings that are universal enough to apply to a lot of other projects: And, in case you want more, here are handy links to Maher’s all Ultima essays: I (3 parts!), II (3 parts), III , IV , Multima , V , VI , Worlds , Underworld (2 parts), VII , and VIII . I have no personally read them in order, and I’m better for it. #enshittification #games #software evolution No game can be all things to all people. Development teams need a clear leader with a clear vision. Checking off a list of bullet points sent down from marketing does not a good game make. When the design goals do change radically, it’s often better to throw everything out and start over from scratch than to keep retro-fitting bits and pieces onto the Frankenstein’s monster. It’s better to release a good game late than a bad game on time.

0 views
Unsung Today

Shift & ⌥ & Splat & ⎋ Escape

The biggest smallest GUI design schism between Apple’s platforms and Windows isn’t the black vs. white cursor or where to put the menu bar. It’s the presentation of keyboard shortcuts. On a Mac, the shortcuts are iconographic. Command is ⌘. Option is ⌥. Shift is ⇧. Control is ⌃. Fn is 🌐 . There are also icons for all the other non-printing keys, from the relatively well-known Tab (⇥), through the perennially confusable End and PgDn (⤓ and ⇟), to the absolutely cryptic Esc (⎋). On Windows, the keyboard legends are mostly text. PC lost the icon battle in the early 1980s – IBM had them on their 1970s computers, worldwide, but apparently American users of the early IBM PC hated them – and the names are spelled out (Shift and Enter and Home), or close to it (Ctrl, Esc, PgDn, Prt Sc). Why did Apple go this way? My speculation is the revered Braun and generally hi-fi hardware: a lot of stuff sold in Europe defaults to iconography in part because that makes exporting easier. Icons are also more compact – putting ⇧⌘C in a menu or a tooltip takes up a lot less space than Shift+Ctrl+C – and more beautiful when done well. Here’s Figma’s right click menu on Mac and Windows: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/1.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/2.1600w.avif" type="image/avif"> But there are also challenges, as icons are more cryptic and confusing. “Command” tells you something about itself out of the box, but “⌘” is completely abstract. (Arguably, only arrow keys and symbols like ⇥ and ↵ explain themselves visually.) The attendant issue is that icons are hard to talk about if you don’t know their names, hence tons of jargon like “propeller,” “splat,” or “beanie” for ⌘, for example. It’s a hard situation. Here is one of Mac’s own menus being thoroughly inconsistent, and an example of CleanShot using both the icon and the label to be sure: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/4.1600w.avif" type="image/avif"> “Why not both” seems to be the best way in places you can afford it. Apple started doing that on the keyboards too, but it took them decades to get there for modifier keys alone. Even on the 2026 computers, many other keys like Esc and Tab are still single-legended: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/5.1600w.avif" type="image/avif"> With all that in mind, I want to show you what I saw the other day in Google Docs, on my Mac: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/shift-and-option-and-splat-and-escape/6.1600w.avif" type="image/avif"> This is one of those cryptic things that I would love to understand the thinking behind. Because, on the surface, this breaks so many rules: There is also a visual argument that cannot be ignored. We’ve been there once before ; if in your menu keyboard shortcuts start overwhelming the commands themselves, you are probably doing something wrong. The only explanation for this I can think of off the top of my head is this: these were invented somewhere else (Word?) and inherited by Docs to respect motor memory of the users transition from the older app. That still doesn’t cover the presentation, plus there is a way for Docs to redesign the shortcuts to be better for people who are starting anew. Ultimately, I think all of this also breaks a cardinal rule: it makes keyboard operation feel more scary and intimidating than it needs to be. Shortcuts are scary enough on their own, and they don’t need any help in this area. #google #iconography #keyboard #mac os A strange hybrid of Mac and Windows styling: some modifier keys are spelled out, and the others are iconographic. (It’s very strange to see ⌘ conjoined with others using a plus!) Complex and generally uncommon dual key shortcuts – to collapse the sidebar, you really need to press ⌃⌘A and then press ⌃⌘H, in sequence. Three-modifier-shortcuts are in general really unpleasant and Google Docs does not seem complicated enough to warrant them. (You can’t see that, but they’re also unreliable! ⌃⌘A ⌃⌘H doesn’t always work and seems to depend on where the focus is.)

0 views

AI blog question challenge

Rishabh emailed me the other day, asking me to answer the 7 questions of his new blog challenge, and who am I to say no to such a request? So here we go. I assume by AI models we mean the current crop of LLMs, and not AI models in general, because I’m old enough to remember when “Machine Learning” was a thing. What even is AI anyway at this point, since everything is lumped together into one useless definition? Anyway, I believe my first experience was trying out chagpt back when it first came out. I don’t think I spent more than 10 or 15 minutes using it at the time. It was impressive tech, but was also completely useless for me at the time, and that’s why I didn’t bother spending more time using it. This is an interesting question. Do I use AI? Well, I guess the answer is yes since it’s almost impossible to avoid using it if you use the web at this point. Pretty much all tools and services are integrating some sort of AI-powered functionalities, and it’s become harder and harder not to use them. If, instead, the question is do I use one of the various LLMs directly to do stuff, then the answer is still yes, but the amount of usage is so low that some people might consider that to be the same as not using them at all. I don’t directly pay for any of the models, but my work email has been powered by Google for more than a decade, and so I do get access to Gemini Pro. Workspace has usage data for everything, and I just looked it up: In the last 90 days, the only AI-related feature I used was the Gemini App (that’s not surprising considering I turned off everything else), and I have apparently used it 62 times. I’m now looking at the history of those chats, and pretty much all of them are single-question queries related to something web dev I was doing. Things like how to do a specific thing inside Kirby, or how to achieve something using a particular JS library. This is stuff one should be able to find inside documentation websites, but the search there is often awful and so after a google search, I try my luck with AI. And as I wrote somewhere else, I never copy-paste. I ask very narrow questions so that I can be pointed towards the correct answer. And once I have that, I do the coding and I re-implement everything myself. Am I against using AI? As a generative tool, yes. I refuse to ask AI to do something for me or to generate content from scratch. As a tech in general? I think it has some potentially useful applications in narrow contexts. As always, the answer is not cut-and-dry, and it can be yes or no depending on the framing and the scope. The only aspect I appreciate is the ability to ask questions in natural language. Because sometimes you have a problem or an answer you’re looking for that can’t be described in a more structured way. As for what I don’t like, how anthropomorphised these stupid tools are is definitely high on my list. I don’t want my computer to talk back or to make jokes or to say «I’m sorry». If I input a question, I want an answer back, and that’s it. I don’t want follow up questions, I don’t want some pointless preamble. I get why this happens, but I fucking hate it. This is software. I don't want my software to have a personality. I want it to perform a task and get out of my way. I also don’t like the lying, the gaslighting, and all the other crap, and I also don’t like what the AI industry is doing as a whole, but that’s a separate issue. Again, another question that has different answers depending on the scope. The idea of being able to generate images, in general, is neutral to me. It all comes down to what you use it for. There are some potential use cases that are totally fine, others are completely insane. As a whole, I think the ability to generate slop is bad, but that’s because humanity can’t be trusted to do anything the right way. As for their use in blog posts, I think stock images were useless, and I don’t see images generated with AI to be any different. Unless you have generated an image as part of the content to explain or visualise something. That’s fine, label it as a generated image and move on. That’s no different than including a render, or a sketch on paper, from a content perspective. My consumption of online content these days is so limited that I don’t have this issue. I read very few blogs, and I know they are not AI generated because I emailed the people behind them more than once, and I know what their stance is. I watch almost no YouTube, and I only read a few news sites. My strategy is to simply stay away from the digital world as much as possible, and I’m at the point where I’m considering dropping my digital consumption down to zero and quit the internet as a place for content. I have zero hope. And that is because I have zero hope in anything that’s in the hands of mega corporations. The incentives are totally skewed, and they’d do everything they can in order to keep the line go up. I don’t see people with strong morals in positions of power and so unless we decide to go full French Revolution, I see no reason for things to improve. Thank you for keeping RSS alive. You're awesome. Email me :: Sign my guestbook :: Support for 1$/month :: See my generous supporters :: Subscribe to People and Blogs

0 views

My Agent Stack For Automating My Personal Life

My agent manages my emails, SMS, WhatsApp, Telegram and pretty much everything to automate my personal life. People keep asking me how I use agents in real life. I mean the actual boring things that make a day disappear: reading WhatsApp and Telegram, finding someone's email, searching the web, drafting the intro, updating a document in Google Drive, creating a calendar event, checking who still needs an answer, and doing all of it across the same messy tools I already use. My answer is disappointingly simple. I use Codex as an operator on top of my actual life data. It has tools. It has data connectors. It has skills. It has a source of truth. It has enough permissions to act locally, and enough approval gates that it does not embarrass me in public. That is basically the setup. Tools, data connectors, skills, and taste. I used to do more of this in Claude Code but I have been moving the setup to Codex because GPT-5.5 is currently a better model for this kind of work. The switch from Claude Code to Codex is not really the story. The story is that once a model is good enough, the real leverage comes from wiring it into the world you already live in. The important part is that the agent can move across boundaries. My personal life is not in one app. It is split between Gmail, WhatsApp, Telegram, iMessage, Google Drive, Calendar, Notion, local files, random PDFs, browser sessions, and a contacts spreadsheet that is much more valuable than it looks. A few days ago a friend sent me a WhatsApp message. She was helping a fast-growing San Francisco AI startup recruit in France and wanted to connect their recruiting manager with a recruiter I know. I did not remember the recruiter's email. I did not know the latest funding news about the startup. I needed to search WhatsApp, search Gmail, find the recruiter's email, search the web, understand why the startup was credible, draft an intro email, include the two job links, show the draft to me, send the email after approval, and then text my friend that it was done. That is normally twenty minutes of annoying app switching. WhatsApp to Gmail to Google search to Gmail again to WhatsApp again. It is not hard work, but it is exactly the kind of work that burns attention because every step is a small context switch. With the agent, I asked for the outcome. It read the WhatsApp thread, searched Gmail for the recruiter's email, researched the startup's funding and recent news on the web, drafted the intro, waited for my approval, sent the email, and then texted my friend that the intro was done. The user-facing part took about ten seconds. The agent did the glue work (in seconds!) This is the killer pattern. The agent is not "answering a question." It is operating across my tools to complete a small real-world workflow (aka a "job-to-be-done") Another example is even more boring, which is why I like it. I got a new license plate for my car. I sent photos and context to Codex. It updated the car information Markdown file I keep in Google Drive, changed the license plate, added the registration notes, preserved the existing VIN, insurance, owners, and address, then uploaded the file back to Drive. That alone is useful, but the better version is what happens next. The agent can use browser automation to go update the same information everywhere else: FasTrak, the parking app, insurance portals, DMV-related forms, or any other web app that does not have a clean API. For clean systems, it should use an API or CLI. For messy systems, it can use the browser and it's so good! I also now use Computer Use from Codex. This is what personal agents are for. Not dramatic autonomy. Administrative continuity. I was always afraid of Openclaw yolo mode in the background. I appreciate being in control. The most important architectural decision I made was centralizing valuable personal information in Google Drive. For years, a lot of my knowledge lived in Notion. I like Notion as a human workspace, but I do not love it as the primary source of truth for an agent. The API works, but the workspace is too fluid: nested pages, databases, properties, permissions, formatting, backlinks, and a lot of UI-native structure that is pleasant for humans and annoying for models. So I used the Notion API to export the valuable information and move it into Google Drive. I was not trying to perfectly preserve the Notion workspace. I was trying to make the information agent-readable. Most of the useful information in Drive is Markdown or CSV, because those formats are easy for the agent to search, diff, edit, and upload back without ceremony. Google Drive became the source of truth because gogcli gives the agent a simple command line surface for Gmail, Drive, Calendar, Docs, Sheets, Contacts, and Tasks. This is an underrated point. You should not organize your knowledge only for the human UI. You should organize it for the agent's tool path. Agents like stable file IDs, text, tables, Markdown, CSVs, and commands that return JSON. If the agent can search it, download it, edit it, upload it, and cite where it came from, the data is useful. My personal data layer is embarrassingly simple. Google Drive holds the important docs, mostly as Markdown files and CSVs. Contacts live in a Google Sheet mirrored as a CSV. Notion exports land in Drive. Local instructions live in . Skills live as Markdown files in folders. The source of truth is not elegant. It is legible. A lot of personal productivity is just joining across this data. One fact is in WhatsApp. Another is in Gmail. The email address is in Contacts. The date is in Calendar. The document is in Drive. The agent becomes useful when it can cross those boundaries without asking me to be the glue. One of my best investment was to create a contact.csv with the phone number, email, LinkedIn etc. of all the people I know. The core tools are boring by design. I use gogcli for Google Workspace, wacli for WhatsApp, imsg for iMessage and SMS, Browser Use or browser automation for web apps, and AppleScript or macOS UI automation when there is no better interface. The hierarchy is simple. APIs and CLIs are best. Local files are great. Browser automation is acceptable. Screen automation is the last resort. This hierarchy matters because agents are only as reliable as their tool surface. Asking a model to click around a website is sometimes necessary, but it is not the happy path. A command like or is much easier for the model to inspect, retry, and reason about. Here is what the tool layer looks like in practice: None of this looks like science fiction. That is the point. The future of personal agents starts as a pile of commands that let the model operate the tools you already use. You want to reduce to a maximum the abstraction layers between the models and the APIs. Tools give the agent hands. Skills give it habits. A skill is just a small operating manual that tells the agent how to do a recurring task the way I like it done. My inbox-zero skill is a good example. It tells the agent to list Gmail inbox messages through gog, separate auto-archive from needs-review, show me the important emails, quote the substance, suggest archive or reply, draft replies, wait for explicit approval, send in the original thread, preserve all recipients, archive only after sending, keep replies short, never suggest calls unless I ask, and sign with "Nicolas." That is not a fancy architecture. It is a procedure. But the procedure is the product and... it's just text instructions. Without the skill, I have to be the prompt every time. I have to remind the agent not to send without approval, not to drop cc recipients, not to suggest a call, and not to sign with some weird corporate signature. With the skill, I say "run inbox zero," and the workflow already contains my taste. The important habit is that I improve the skill every time the agent makes a mistake. If it suggests a call when I hate calls, I add that rule. If it forgets to preserve cc recipients, I add that rule. If it archives too aggressively, I tighten the classification. The agent gets better because the procedure gets better. This is how personal agents become personal. Not by having a cute voice. By accumulating operational taste. The setup compounds because the mistakes become instructions. I do not want an agent that blindly replies to everyone. I want an agent that prepares the work, shows me the draft, and asks at the right moment. For most communication workflows, the loop is: read context, draft response, show me, wait for approval, send, confirm. Sometimes I let it send directly when the stakes are low. "Tell Hugo I am in Seattle next week" does not need a board meeting. But an investor email, a customer reply, an intro, or anything with social nuance should be drafted first. This is the difference between useful and terrifying. Read-only scanning is one trust tier. Drafting is another. Sending is another. Deleting, paying, signing, or changing account settings is a completely different tier. The future is not "the agent does everything." The future is "the agent does the tedious work and asks at the right moments." The killer workflow is not email. It is life inbox triage. Every few hours, I want to ask, "What did I miss?" and have the agent scan WhatsApp, Telegram, Gmail, SMS, Calendar, and the relevant Drive changes. Then I want it to tell me who needs a reply, what is urgent, what is stale, what can be ignored, what should become a calendar event, and what needs a document search. This is the perfect agent task because it is context-heavy, repetitive, cross-tool, and full of small decisions. Humans hate doing the first pass. Agents are good at first passes. Judgment still belongs to me. The result is not that my life becomes autonomous. The result is that I stop being the person manually digging through five apps to discover the three things that matter. If someone wants to reproduce my setup, this is the checklist. Install Codex. Install gogcli for Google Workspace. Install wacli for WhatsApp. Install a Telegram connector if you use Telegram. Install imsg for iMessage and SMS. Add browser automation, ideally through Browser Use or a Chrome controller. Add macOS automation through AppleScript and UI scripting. If your knowledge lives in Notion, use the Notion API to export the valuable parts into Google Drive. Then centralize the data. Make Google Drive the source of truth. Keep contacts in a Google Sheet or CSV. Keep important personal docs as searchable files. Keep local instructions. Keep small skills for recurring workflows. Then grant permissions carefully. Full Disk Access is needed for local files and app databases. Screen Recording is useful as a visual fallback. Accessibility is needed for clicking and typing in apps. These are serious permissions, so pair them with serious approval gates. Then write the operating rules. That is basically it. Tools, data connectors, skills, approval gates, and continuous improvement. The personal computer used to be app-operated. You opened the app, searched, clicked, copied, pasted, wrote, and sent. The agent-operated computer feels different. You state the intent, the agent gathers context, proposes the action, waits for approval when needed, executes, and reports back. Once you experience this, the old way feels absurd. Why am I manually searching WhatsApp, Gmail, Google Drive, and the web to send one intro? Why am I copying a license plate into five different portals? Why am I reading 100 messages to find the three that matter? The computer should do that. The setup is still ugly. The CLIs are rough. Permissions are annoying. Some connectors break. Browser automation is brittle. You have to write skills. You have to maintain a source of truth. But that is how the future usually starts. The first useful personal agents will not look like polished consumer apps. They will look like a model inside a terminal with access to your files, accounts, memories, and tools. That is what I use today, and every week I give it one more piece of my life to operate.

0 views

2026.22: Luceing Their Mind

Welcome back to This Week in Stratechery! As a reminder, each week, every Friday, we’re sending out this overview of content in the Stratechery bundle; highlighted links are free for everyone . Additionally, you have complete control over what we send to you. If you don’t want to receive This Week in Stratechery emails (there is no podcast), please uncheck the box in your delivery settings . On that note, here were a few of our favorites this week. This week’s Stratechery video is on The Inference Shift . Why Everyone Hates Luce. To say that the Jony Ive-designed Ferrari Luce, the iconic carmaker’s first electric vehicle, has faced a chilly reception is an understatement. I actually think it looks great —  for an electric car . On Dithering , John and I discuss why the real problem is that it’s branded Ferrari, and on Sharp Tech I get even more philosophical: electric cars are focused first and foremost on efficiency, and not only is that different than performance, Ferrari’s calling card, but also representative of the parts of modern society — including tech — that leave everyone feeling increasingly alienated (and why, surprisingly, AI might help). — Ben Thompson How to Monetize AI Answers. The ad business is, for me at least, endlessly fascinating, and not just because it is the most important business model in consumer tech: I think digital ads, particularly Meta-style ads that introduce you to things you never knew you wanted, a societal good. The other reason to care about ads, however, is that their economic importance means they are where the impacts of new technology are often felt first. This week’s Interview with Eric Seufert covers all this: how LLMs are changing digital ads, the changes both Google and OpenAI have made in terms of monetizing AI, and, more philosophically, why believing in ads might make one more optimistic about humanity in an AI-denominated future. — BT Social Mobility in China, and Lack Thereof.  Late last week China’s State Council announced a reform that will ease so-called “hukou restrictions” and allow migrant workers from all over the country to access social services in the cities where they work, which had long been forbidden. It’s a major reform that furthers Xi’s goal to unify the national market, and should improve the lives of millions of workers, but it also comes with plenty of questions as it’s implemented. We discussed all of it on a great episode of Sharp China this week , as well as reports that top Chinese talent in AI has been banned from leaving the country, continued capital control, and ongoing tensions with Japan and the U.S. that call to mind an ominous passage from Mao Zedong.  — AS Nvidia Earnings, The AI Stack, Nvidia’s New Reporting — Nvidia is changing its reporting to delineate between hyperscaler sales — where Nvidia is fighting commoditization — and everyone else, where Nvidia runs the whole stack. The SpaceX IPO and Data Centers in Space — There isn’t a financial model that justifies the SpaceX IPO, but data centers in space are plausible, and that might be enough. An Interview with Eric Seufert About Models and Ads, and AI’s Upside for Humanity — An Interview with Eric Seufert about building models for generative AI, why Meta’s foundational models are so important, and why understanding advertising leads to optimism about humanity’s future. How Spencer Pratt Happens — Spencer Pratt’s success in L.A. reflects his own surprising political talent, and an increasingly broken Democratic machine in California and beyond. Acquired the Podcast The Ferrari Luce How Things Fell Apart for Germany’s Nixdorf Computer Japan’s Rare Earths Island Social Mobility and Hukou Reform; US Halts Taiwan Arms Sales?; Ongoing Pressure on Japan; An American Xinhua Journalist Arrested The Knicks are in the NBA Finals, A Moment of SGA Truth, Around the League with Giannis, Bulls, and the Basketball Gods SpaceX Hype and the Elon Bargain, Nvidia and the Neoclouds, Q&A on Dropbox, Google, Ferrari Luce Backlash

0 views

Premium: What If...We're In An AI Bubble? (Part 3)

Last week I ran the second part of my three-part “What If…We’re In An AI Bubble?” series where I have been covering the scenarios that I believe could lead to the bubble popping. Here’s what I’ve discussed so far: Today I want to start with a very simple rundown of what has to happen for the AI bubble to make sense. These are all points that are rooted entirely in the projections and sales of the companies in question.  As NVIDIA intends to sell over a trillion dollars of Blackwell and Vera Rubin GPUs by the end of 2027 , it needs to have around (assuming a PUE of 1.35) 40GW of data center capacity built to support the 30GW+ of GPUs it will have sold .  With that compute being sold at around $12 million a megawatt (based on discussions with analysts and sources), that means that there must be around $435 billion in global annual compute demand to substantiate the amount of GPUs sold.  Outside of OpenAI and Anthropic, there doesn’t appear to be more than a few billion dollars of demand . Another concerning sign is that NVIDIA has had to agree to spend $30 billion in multi-year cloud compute agreements across the very partners it’s selling GPUs to ( per page 16 of its most-recent 10-Q ): The other problem is that data centers are taking way, way too long to finish , taking upwards of 24 months even for smaller 40MW builds.  This means that… Put another way, NVIDIA’s continued growth relies on people’s belief that A) these data centers get built and B) that they’ll actually make money.  Per COO Greg Brockman, OpenAI will spend around $50 billion on compute in 2026 , and I imagine Anthropic will spend in or around the same amount, especially as it’s now agreed to spend $15 billion a year on Musk’s Colossus data centers on top of whatever it spends on Google Cloud, Microsoft Azure and Amazon Web Services.  $100 billion is nowhere near enough to justify the compute being built. And while Anthropic and OpenAI have made more than $1.1 trillion in compute commitments in the next 3-5 years across Microsoft, Google, Amazon, Oracle, CoreWeave, Cerebras, Terawulf, and Cipher Mining, there’s so much more compute that needs to be sold on top of that.  Even if both doubled their spend in a year, we’d still need at least another two Anthropic or OpenAI-sized compute customers — either in aggregate or as separate companies — at a time when I can’t find a single other company spending even a hundred million dollars a year on compute. Most AI startups (and customers) want to pay Anthropic or OpenAI directly to access their models , which means that either Anthropic and OpenAI need to use roughly twice the amount of compute they do today and then some to meet the capacity being built. This will require them to do something either historic or impossible. This is not hyperbole! OpenAI, per The Information , plans to burn $852 billion through the end of 2030. Anthropic has, per The Information, agreed to spend $330 billion on compute on Microsoft, Google, and Amazon , at least another $30 billion on compute with CoreWeave , and another $63 billion in TPUs bought from Broadcom .  To reach this point, Anthropic projects it will hit $174 billion in annual revenue by the end of 2029, and OpenAI $284 billion . Both have made ridiculous claims of profitability ( with Anthropic actively conning investors with a “profitable” quarter based on discounted bills ) in the next few years that are immaterial to the larger point that they need actual, real cash to meet their obligations.  This is, again, not hyperbole. If we assume that the services in question are profitable, sustainable businesses, then revenues attached to AI services must exceed those driven by AI compute by a reasonable margin. It isn’t enough for us to have a few AI companies that spend a lot more on compute than they take in revenue, because at some point venture capital subsidies will run dry.  This isn’t happening. Putting aside the profitability part for a second, OpenAI and Anthropic account for 89% of all AI startup revenues , with the nearest competitor being Cursor with its pathetic $3 billion in annualized revenue . These are rookie numbers. They are insufficient. We need so much more than this. Again, not hyperbole! These are OpenAI and Anthropic’s own revenue projections — $184 billion and $174 billion respectively — that they expect to hit by the end of 2029. These are the same projections that have been used to make their $1.1 trillion in compute commitments, much of which make up 50% of Google, Amazon, and Microsoft’s remaining performance obligations : These commitments reflect expected revenue and demand for OpenAI and Anthropic’s services, but they’re commitments, which means that they need to be paid even if that demand doesn’t exist.  This is a huge problem for these companies. If they buy too much compute and don’t have the demand and revenue to support it, they’ll go bankrupt.  To be clear, that’s not my opinion, it’s what Anthropic CEO Dario Amodei said to Dwarkesh Patel in February, emphasis mine: That is not good! As I’ve covered before , buying compute is a knife-catching game where you have to guess how much you need for a particular year, and if you guess correctly you don’t lose as much money but if you guess wrong you run out of money.  It should be far more worrying to executives that the single-largest AI company is basically saying that if he mistimes growth his company explodes! Per Business Insider , Uber COO Andrew Macdonald said this weekend that it was becoming “harder to justify AI costs within the company”: Anthropic’s meteoric revenue growth has come from both AI startups burning more tokens ( as Opus 4.7 appears to burn more than ever ) and large organizations doing some form of “token-maxxing,” meaning that they tell their employees to use AI as much as they want, usually with KPIs that specifically track AI usage, as is the case at Meta , Amazon, and Zillow . Even organizations that aren’t actively incentivizing their engineers to burn more tokens are finding they’re blowing through their budgets at record speed. The situation with Uber’s COO was caused by his CTO saying back in April that the company had burned through its entire annual token budget in four months. Similarly, my reporting on Zillow’s AI spend showed that it will likely max out its annual Cursor budget by the end of May. The problem, as Macdonald said, is that nobody can seem to track all of this spend to an actual return on investment. This isn’t a situation where somebody is saying “the ROI is low but improving” or “we’re on the path to working that out,” but “it’s very hard to actually draw a line between “what we’ve spent” and “a reason we’re spending it.” This makes it hard for Uber to say how much it should reduce its token budgets. If you can’t measure the return on investment, how do you measure how much you’re meant to spend? What is “enough”? Because right now it’s clear that whatever they’re spending is too much , which means that there’s a ceiling to Anthropic and OpenAI’s revenue story.  OpenAI and especially Anthropic cannot afford for this conversation to be happening, because it suggests there’s a ceiling to the amount that people will spend on AI. It appears there’s a limit to which organizations can be abused and manipulated into believing that “the future is here,” and that limit is when they pay millions for something that doesn’t appear to have a measurable return on investment.  Anthropic and OpenAI need organizations to willingly spend 10% to 100% of their headcount on AI, as their revenue projections are clearly tied to every organization maintaining a significant spend on tokens in perpetuity.  There’re really two problems: This is budgetary poison. Right now, the vast majority of AI token spend is experimental , and if companies are already hesitating at the amounts they’re spending, Anthropic has no way to keep growing, and they also have no super secret models or harnesses or products that are going to reverse this trend. Nobody knows why they’re spending so much money or even how much money they might spend in a given month , which makes it tough to view Anthropic’s ( suspicious ) revenue growth as anything but a chaotic money-dump driven by CEOs that don’t know what their companies actually do and have been beguiled by the AI grift machine . And as I wrote up last week , OpenAI had a negative 122% operating margin in Q1 2026, and ChatGPT growth has stalled. It is unclear what its API revenue is, but it’s likely much less than Anthropic despite shoving its enterprise customers onto token-based billing not long after they did. As I’ve said: this cannot happen, and neither Anthropic nor OpenAI can afford to slow down. Their revenues must grow to over $100 billion by 2028, as their compute commitments demand it. Their growth must continue.  It’s been a little under four years of endless confidence about the inevitable growth of generative AI, and by extension the eternal success and growth of OpenAI. Yet in reality, its economics have only ever soured, and its growth appears to be collapsing.  In October 2024, The Information reported that OpenAI believed it would turn profitable in 2029, that its total losses between 2023 and 2028 would be $44 billion , and that its (non-GAAP, every one of these numbers is non-GAAP) gross margin would be 41% in 2024, though it would end up being a point lower at 40% in the end. OpenAI would then project a gross margin of 49% for 2025… but it ended up at 33% anyway .  OpenAI would also say on September 5 2025 that it would actually burn $115 billion through 2029 , but that “burn” assumed that it would have revenues of $60 billion in 2027, $100 billion in 2028, $145 billion in 2029, and $200 billion in 2030, when it would “become profitable” in some undiscussed manner. Two weeks later on September 19 2025, The Information would report that actually OpenAI would spend “about $450 billion to rent servers through 2030,” but not otherwise update the burn-rate. On November 4, 2025 , OpenAI CEO Sam Altman would say that the company had hit $20 billion in ARR and had made $1.4 trillion in commitments “over the next 8 years,” and a few months later On February 20, 2026 , OpenAI would claim that it had targeted “around $600 billion in compute commitments by 2030.” The very same day, The Information would report that it planned to spend $665 billion on compute through 2030 , that it missed gross margin projections (without sharing what those margins might be), and that ChatGPT had hit 910 million weekly active users that month, 90 million short of its goal of 1 billion by the end of 2025. It’s very obvious by now that OpenAI has been making up all of its projections, and that none of the numbers actually add up. My own reporting from November 2025 from actual Azure personnel suggests that OpenAI’s Q1 to Q3 revenues were billions lower than every other reported figure, and I think it’s likely that OpenAI is overstating its revenues.  In any case, on May 22, 2026 , The Information would report that OpenAI’s Q1 2026 operating margin was negative 122%, and that its Q1 average weekly active users (WAUs) sat at 905 million — suggesting that growth has stalled. OpenAI had anticipated that it would cross the one billion WAU mark by the end of 2025 — and it blamed its failure to do so on fiercer competition, primarily from Google’s Gemini. For OpenAI to afford its compute commitments, it has to make or raise $852 billion in the next four years. It must have that cashflow, or it will run out of money or be sued out of existence by its numerous counterparties from CoreWeave, Microsoft, Amazon, and Cerebras. In the final part, I’m going to get into the depths of destruction — the unraveling of the greater data center debt industry, the massive damage to private credit to come, potential shareholder lawsuits against NVIDIA, and the consequences of the deaths of OpenAI and Anthropic. What If…We’re in an AI Bubble? I also want to add that I realize three headlines didn’t make the cut — what if there’s not a bailout, what if I’m wrong, and what if I’m right — and I intend to cover all three of them in future free newsletters.  Nevertheless, today’s is an absolute beast, a 16,000 word conclusion to the first multi-part Where’s Your Ed At Premium.  What If The AI Industry Moves To Entirely Token-Based Billing?  What If Organizations Can’t Afford To Keep Spending On AI? What If The AI Capacity Crunch Never Ends (And Data Centers Aren’t Getting Built)? What If CoreWeave Can’t Keep Up With Its Capacity Demands? What If Hyperscalers Can’t Build Data Centers Very Fast? What If Hyperscalers Have Warehouses of Uninstalled GPUs? What If Hyperscalers Write Off A Large Chunk of GPUs? What If Data Center Construction Demand Collapses?  What If Venture Capital Funding Stops Flowing To AI Startups? What Would Make Venture Capital Stop Funding AI Startups? What If Most AI Startups Go To Zero? Scenario: OpenAI and Anthropic Go Full FTX, Scooping Up Dying AI Startups To Keep The Industry Afloat With Circular Financing Scenario: Venture Capital’s Post-AI Depression What If Inference Isn’t Profitable? AI Has Become An Existential Reckoning For The Valley NVIDIA’s customers are taking years to even begin making back the billions of dollars its chips and the associated construction costs. NVIDIA is selling far more GPUs every quarter than can realistically be installed in the space of a year. NVIDIA’s revenue stream is entirely based on organizations forecasting demand years into the future. NVIDIA’s revenues are, by extension, dependent on how long organizations believe that building data centers is a good idea. NVIDIA is absolutely, without a doubt, warehousing at least a million Blackwell GPUs . It’s difficult-to-impossible to actually measure the ROI of AI spend. It’s difficult-to-impossible to actually know how much it’ll cost to complete a specific task with AI. What if data center debt stops being issued? What if private credit had to write off most of its data center loans? What if the AI bubble blows up Taiwan’s ODM server manufacturers? What if NVIDIA is misrepresenting how many GPUs are shipped, sold and operational? What if OpenAI and Anthropic don’t go public? What if Oracle doesn’t get paid by OpenAI? What If OpenAI Dies? What if Anthropic Dies?

0 views
Jeff Geerling Yesterday

It's hard to justify buying a Framework 12

My nephew just graduated high school, and wants a laptop. When he decides what computer to buy, price (or more precisely, value ) is the most important attribute. Apple's MacBook Neo upended the 'value laptop' equation—Apple's not supposed to be both the cheapest option and the best value... but it seems like that's squarely where the Neo landed for the good-but-cheap laptop category. My nephew is also my godson, and to kick off his computing journey, I thought I'd let him choose from a Framework 12 I bought to test, or the MacBook Neo I bought a couple months ago to use around the studio.

0 views

fLaMEd 🔥

This week on the People and Blogs series we have an interview with fLaMEd 🔥, whose blog can be found at flamedfury.com . Tired of RSS? Read this in your browser or sign up for the newsletter . People and Blogs is supported by the "One a Month" club members. If you enjoy P&B, consider becoming one for as little as 1 dollar a month. What's going on, Internet? Kia ora, I'm fLaMEd 🔥. I'm originally from Te Awa Kairangi (Lower Hutt), now living in Tāmaki Makaurau (Auckland), Aotearoa, New Zealand with my wife and two kids. I get up every morning at 4:30 am to get to the gym before the kids get up and the day begins. I've recently picked up golf again, but find less time for that than I do for website work. You can get a better idea of what I’m into over at my website, Flamed Fury I'm not a developer, not a designer, just a guy who loves the web. Flamed Fury started in 1999. It's been through more versions than I can properly count, but the rough timeline: 5 versions before it became a personal blog, a few side quests at different domains inbetween, and finally 4 versions in the 2020 era when I landed back at flamedfury.com where I started. Started in summer 1999 on one of the free hosts, I don't remember (probably cjb.net). Moved to sweeetnet.com in 2000 through hanging out in the #sweeet IRC channel. A guy called kertiz from #sweeet took pity on my design skills and gave me a proper redesign, then stuck around contributing. Another guy fitty-two joined in. We iterated every couple of years until the dot-com bubble burst, advertising money dried up and the IRC crew drifted apart. I tried to keep it going by myself with a 2002 layout that wasn't great. But "blog" isn't really the word for any of this. The 1999–2003 version was effectively microblogging before microblogging was a thing, built around a niche (lifestyle magazine style, lol) before niche blogging was a thing either. We just didn't have the vocabulary yet. November 2003 was when Flamed Fury became a blog in the way I'd recognise the format today. Posts about polytech, nights out, whatever was going on. That lasted until 2005, then I parked it and tried being "more adult" at another domain through 2006–2008. Took a break as MySpace, Bebo, Facebook and Twitter took over. Came back in 2012 with a niche barbeque blog and carried on with it for six years before archiving the whole thing in 2018, once I realised how much I absolutely loathed niche recipe blogging. Revived the fLaMEd persona in 2019 on a new domain (Hugo + Netlify). In 2021 I settled back on flamedfury.com with Eleventy on Neocities. Two redesigns later and a move to a local VPS, here we are. Every version of this site, going back to 1999, has been the same instinct: a personal site as a place to be yourself on the web. The 1999 version was more of a microblogging website with three friends collaborating around celebrity magazine scans, that's where the era pointed. The 2026 version is the opposite. Everything and nothing, no algorithm to satisfy, no brand. Different tools, same instinct. There's a longer version of this story I'll get round to writing on the site soon. It's in draft , I promise. Hit me up if you want to see me finish it. Inspiration for what I put and write on my website comes from across the web and life experiences. A gig, a new record, a beer, a trip with the family, or any number of posts I find across the web gets me thinking. Storytelling, sharing my experiences and interests. I love monthly recaps to populate my now page, reflections of last night's gig, new (usually local) music finds, a fun time out with my friends or family. Drafts begin as a note on my phone, my notebook before I find myself with a spare opportunity at my computer. I'll begin with these rough notes and begin fleshing them out. I'll have a couple of tabs open to grab details and links of what I'm talking about to sprinkle through the post. Sometimes I'll start a draft and they'll sit there for days, weeks, and sometimes months in an untracked markdown file in Codium. Depending on what I'm writing about I won't have any proof reading. If I'm writing about something topical about the web I'll often have xandra or one of the other 32-Bit Cafe crew read over it and give me some pointers or a thumbs up. Then after sitting on it for a minute, an hour or a day, I'll publish it. Other pages on the website will get worked on and usually published in unfinished states and I'll continue to work on these over time - nothing is ever really finished is it? My ideal creative environment is in my home office, at my desk or couch in silence. I might listen to a few songs or watch a couple music videos to get me in the zone, but when it comes to focus time, all noise off and I work in silence, often talking to myself. If I'm away from home and I get a moment to myself, it's either at a table, kitchen bench or an arm chair. Hopefully with silence, but usually with the chaos of family life going on around me. Our kids are young, they're busy, noisy and need lots of attention so focus time these days is few and far between :) Do I believe the physical space influences my creativity? Heck yeah, if I'm not in the office, then a walk around the block or through the village listening to music will help me get creative - as long as I get those thoughts out of my head before they dissapear. If I'm travelling, then any beautiful location might inspire some spark. I use Eleventy for building my website. I originally started with Eleventy Excellent by Lene Saile , but it's evolved beyond that over the years. I often check in with her when she releases new versions to make sure I take in any key updates, but also find some changes I've made find their way back into the starter template :) These days flamedfury.com runs on an NZ-based VPS to keep the site close to home. I use a local domain registrar for my domains. Deployment is a simple then rsync directly to the VPS. To participate in the web, I've implemented a bunch of IndieWeb features, Webmentions, h-cards, h-entries and of course provide a number of Atom/RSS/JSON feeds which are syndicated to Mastodon through EchoFeed to meet people where they are. My Bookmarks are backed by the 32-Bit Cafe's instance of Linkding and pulled into my website at build time and shared via Atom/RSS/JSON and EchoFeed. I run an instance of Forgejo on my homeserver and commit the project there multiple times a day. I don't think so. If anything I would have tried to preserve everything rather than ditching things over the years. I've managed to recover a lot of the old stuff through old CD-Roms where I'd burnt old versions of the website or from the Wayback Machine. I would have definitely tried to keep in contact with a lot of the old crew from IRC. We drifted apart before it was easy to keep in contact with each other. I do regret losing those early relationships. I'm really happy with how I've managed to salvage a lot of the old stuff and merge it into what the website is today. It really is a labour of love. All in NZD. The domain is $39/year and my VPS is $82/year. All the other infrastructure on my home network is sunk cost over the years and I'm not sure how I'd put a $ value against that. I haven't made money from my website since 2001 along with the original internet advertising bubble burst. I did have a go with ads and affiliate marketing with the barbeque blog, but that left a sour taste in my mouth. I'm a fan of services like ko-fi and the like but haven't looked into setting it up for myself - not sure if anyone would be interested in supporting me. I throw money at the 32-Bit Cafe's ko-fi and contribute to infrastructure costs there as well as my time to help moderate and run the forums and will throw other bloggers tips here and there through their ko-fis, and will buy sticker packs wherever I see them being sold in the wider hobby web community. When I need some new graphics for the website I'm always on the look out for a commission and will happily pay for talented graphic designers services. I support a few independent journalists through their newsletters that I enjoy reading and support a local independent news/media website to help keep the lights on there as I enjoy their local content. A great way to keep up with what's going on in the country and the world without the doom-and-gloom. What's my position on people monetising personal blogs? Go for it as long as it's not intrusive or full of dark patterns. Keep it personal and creative. I love the sticker packs or graphic commissions. So many to mention! More at my blogroll and links pages. Who do I think you should be interviewing next? Hit up Chris Burnell if you have time before wrapping the project up :) If you're into making websites, or you want to start you should most definitely come and check out the 32-Bit Cafe - our small community of the web where we welcome hobby web developers of all skill levels and help each other out building our websites. We have monthly web weaving workshops, discussion forums, and other fantastic services offered free for the community and join in on the discussion at our forums . Plugging my own stuff, check out my record collection , and my ever growing list of bookmarks And for all the readers out there, keep building the web you want to be part of. There's so much great stuff going on out here. Laterz 🤙 Now that you're done reading the interview, go check the blog and subscribe to the RSS feed . If you're looking for more content, go read one of the previous 143 interviews . People and Blogs is possible because kind people support it. Chris Burnell — we've become great friends over the years. I love to bounce ideas with; dev, IndieWeb, beer, music. Xandra — xandra is my small web bestie and I've got to know her pretty well over the years through the Cafe. yequari — another of the Cafe barista team. The driving force behind our infrastructure endeavours. His new project https://webweav.ing/ recently launched a guestbook service that I'm using on Flamed Fury. jay , fyr , key , and rodrick - all my fellow 32-Bit Cafe baristas who help running and making the Cafe an awesome place to hangout. Cory Dransfeldt — another I've chatted to heaps with over the past few years. We have heaps of the same interests. His media collection and the direction he's taken his website is "beyond amazing". Robb Knight — Robb always has a new and interesting project to check out. I'm always picking up neat things to add to my website from his. america's decline - not often seen outside of the Neocities circles, but one of my favourites on Neocities. A throwback to my favourite era of the web, music, celeb, pop culture, and fantastic graphics. shellsharks - an indie web powerhouse and curator of the fantastic scrolls weekly . James - another indie web powerhouse. James's blog is full of thoughtful and insightful posts about the web and has recently launched a new podcast centered around the independent web, Wonders of Web Weaving .

0 views
Unsung Yesterday

The surprising richness of GarageBand

Do you remember the video I once shared about making a song in Strudel ? I recently stumbled upon this 20-minute YouTube video by iSongs of someone recreating Eminem’s “Lose Yourself” in GarageBand on their iPhone: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-surprising-richness-of-garageband/yt1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-surprising-richness-of-garageband/yt1.1600w.avif" type="image/avif"> Like the previous video, I believe this is so tight as it was previously rehearsed/​prepared, which makes for an interesting watch if you even just check out a fragment of the video. I can’t speak for the verisimilitude/​quality of the composition, but it was fascinating to witness because The. UI. Just. Kept. Coming. I had no idea Garage Band is so fully-featured on the iPhone, and that there is so much going on! Maybe my fascination is this: it’s amazing that “power users” come in various shapes and forms. Would I recommend using the iPhone to do this? Not really. Is it cool that this is possible, for people who might not have access to other platforms? Yeah. (The channel has a lot more different songs if this one is not to your liking.) #touch #youtube

0 views

What's going on with Gemini?

Google is in a strange spot right now. They've got arguably the deepest research bench in the industry, their own custom silicon, and effectively unlimited money - and yet most developers I talk to barely touch Gemini day-to-day. The recent Google I/O announcements crystallised a lot of what I find confusing about their AI strategy, so I wanted to write down where I think they actually stand. The consensus seems to be that currently Anthropic and OpenAI are very much in the lead for frontier model intelligence, with each of those two labs trading blows every month. This may change in the near future - if Anthropic releases Mythos-class models that OpenAI doesn't have an answer to - but right now I think most practitioners would agree that GPT5.5 and Opus 4.8 are roughly in the same ballpark. After that, you have Google, with Gemini 3.1 Pro being in benchmarks ahead of the Chinese models but behind the flagship Anthropic/OpenAI models. In my personal experience though I've had better results from the best-in-class Chinese models (GLM 5.1 and Qwen 3.7) than Gemini 3.1 Pro at software engineering tasks. The main model announcement at Google I/O was Gemini 3.5 Flash. The benchmarks of it were underwhelming at coding: Gemini 3.5 Flash on the Artificial Analysis Coding Index - solidly mid-pack. Source: Artificial Analysis . However, the model is super fast - roughly 4x faster in tokens per second than the aforementioned Anthropic/OpenAI models: Output tokens per second - Gemini 3.5 Flash at 206 t/s, far ahead of Opus 4.8 and GPT-5.5. Source: Artificial Analysis . This definitely is really interesting development, especially for user facing applications which can appear very sluggish to users. But - the big but - is the huge price increase they announced - 3x more expensive than the previous flash release. At $9/MTok it is vastly more expensive than the best in class Chinese models, and I'm struggling to see where this fits - if you want best in class intelligence you pay the extra for Opus/GPT5.5, if you want cheap but not-as-clever the Chinese models fit the bill well. The risks around Chinese models are somewhat overplayed in my opinion - you can self-host a lot of them, or use US-based inference providers via OpenRouter. Having said all that, perhaps really this model isn't designed for external use in the same way that the OpenAI/Anthropic models are. Clearly Google consumes an enormous amount of tokens internally - for all their products like AI mode, Gmail, etc. If you look at it that way, the model makes far more sense. The speed of the model really matters for a lot of the Google use cases - AI mode is very user driven and Google knows better than anyone that speed really matters. And the actual serving cost Google pays is almost certainly a fraction of the external facing price, so that becomes irrelevant. The most interesting part of this story though, is this excellent comment on Hacker News from someone that estimated the size of the model and the fact that it should run on one TPU 8i card (Google's latest custom inference hardware). This does give Google a huge advantage. They are the only frontier lab that (currently) designs its own AI hardware. While other labs certainly optimise their models to the hardware, and also no doubt have a lot of say in driving the Nvidia/AMD roadmaps to their specifications, the model teams and hardware teams in Google almost certainly collaborate to a far greater level than the other labs. This really matters. If you have a very good steer on upcoming hardware you know the right size of models to target training runs to aim for. And equally, research from Google Deepmind can go straight into the hardware roadmap without any negotiations. [1] It'll be very interesting to see how this continues to develop. Inference efficiency will be the key driver to actual unit economics in AI, and Google may develop an outsized lead in this. The one real weakness I think Google has though, is their confusing and incoherent strategy on coding agents. While Anthropic has Claude Code, and OpenAI has Codex, in true Google style they have ended up with a smorgasbord of tools. There is currently Antigravity, Jules, Gemini Code Assist, Gemini CLI and AI Studio all doing slightly different things. This doesn't include some other agentic SWE tools they have for specialised purposes (like Android Studio). They announced that Gemini CLI is being discontinued and folded into Antigravity, but I very rarely come across any developer using Google-based SWE tooling. This is a huge issue for Google - there is no doubt that Claude Code and Codex is producing a lot of very detailed telemetry and training data that can be used to improve further models. Without this being resolved, Google does have an extreme weakness in the fastest growing - at least revenue-wise - segment of AI. While I definitely wouldn't write Google off - they do have enormous structural advantages in other areas - I get the feeling that because Google has such a bespoke internal software development workflows [2] their isolation from what "the rest of the industry" does in software is so large it's perhaps hard for them to really reason about agentic tooling for the rest of the industry. My read is that Google is playing a genuinely different game to OpenAI and Anthropic. Gemini 3.5 Flash only looks strange if you assume it's meant to win the same race - priced and tuned for Google's own gigantic internal token consumption, with the TPU advantage baked in, it makes complete sense. Where they're actually behind is the developer-facing surface: a confused tangle of coding tools and an org that struggles to reason about how the rest of us build software. If Google sorts out the agent story, the structural advantages underneath - the silicon, the research, the integration - could make them very hard to beat. That's a big if. But I wouldn't bet against them. While it's hard to say if there was any truth in this - or it was just a negotiation strategy - there were rumours of OpenAI being unhappy with direction/progress Nvidia was making earlier this year: https://finance.yahoo.com/news/sam-altman-pushes-back-report-213000823.html ↩︎ Google engineers have an enormous amount of home built/custom/internal tooling that is uncommon outside of Google-scale companies. They use different source control, build tooling, testing infrastructure and build deployment to the rest of the industry - for very good reasons! But this stack is absolutely overkill for 99% of companies, and when you are used to thinking about SWE at Google scale I suspect it is very difficult to reason how people build software outside of that ecosystem. ↩︎ While it's hard to say if there was any truth in this - or it was just a negotiation strategy - there were rumours of OpenAI being unhappy with direction/progress Nvidia was making earlier this year: https://finance.yahoo.com/news/sam-altman-pushes-back-report-213000823.html ↩︎ Google engineers have an enormous amount of home built/custom/internal tooling that is uncommon outside of Google-scale companies. They use different source control, build tooling, testing infrastructure and build deployment to the rest of the industry - for very good reasons! But this stack is absolutely overkill for 99% of companies, and when you are used to thinking about SWE at Google scale I suspect it is very difficult to reason how people build software outside of that ecosystem. ↩︎

0 views
Langur Monkey Yesterday

Langur Agent

Langur Agent is a simple, open, hackable CLI AI agent for Linux and macOS. It connects to any service providing an OpenAI-compatible endpoint. It features: The source is available in this repository . Langur Agent has been tested on Linux and macOS only. Install the agent with: Run the agent with the default session: If you need an API key to access the endpoint, put it in the file. Langur Agent looks for the file in the following locations, in order: Create the file with the API key: The agent uses to load at startup. The package reads from the environment automatically. You can also set in your shell profile. On first run, the configuration is created in . You can configure the agent interactively with the slash command. The agent works with any OpenAI-compatible endpoint, so LM Studio, Ollama, OpenWebUI, or any other service you configure. Here are the default values: Run the agent, and then you can enter your prompt. You can use the following key bindings during input: During inference, you can cancel the turn and return to the input prompt with Ctrl + c . Use to print information about the available commands, and to configure the agent interactively. Internally, Langur Agent uses sessions to separate different memory histories. Sessions are named by the user. By default, the agent uses the session. You can start in a different session (either create a new one, or restore it if it exists) with the argument: The default session’s name is , so the following two commands are equivalent: You can also list the existing sessions with : Sessions contain: For now, the configuration file is the same for all sessions. Sessions are matched by the directory name in the sessions location ( ). You can rename a session by just renaming the directory! You can enable mode for the current session with the command , or permanently in the configuration . External editor —In mode, exit INSERT mode ( Esc ), then press v to edit your prompt in an external editor (uses your or variable). There are a few commands available to use in the agent loop. You can list them with . Also, use (e.g. ) to show additional help for a command. Persistent memory follows XDG Base Directory spec in : In addition to persistent memory, the agent maintains a chat history of recent user input and assistant output pairs. This provides context that survives beyond the LLM’s context window. Here is how it works: Persistence: Configuration: Langur Agent can be easily customized and extended by adding new tools, commands, and skills. If you create a cool new tool, skill, or slash command, consider contributing it via a pull request! Create a file in or use one of the existing ones. To create a tool, create a method and decorate it with : Tools are auto-discovered on startup. The process is very similar to tools. You need to create your method, preferably in , and decorate it with . A slash command must return, in that order, , , , : Decorated commands are automatically registered, and auto-completed in the input prompt. Add a file in with YAML front matter, following the agentskills.io standard: The front matter and are parsed and shown in the skills list. The body is injected into the system prompt. session management memory management visual candy autocompletion interactive configuration Python 3.13+ for dependency management Current directory, Home directory, Alt + Enter : add a new line Enter : submit the prompt Ctrl + q : quit The input history Chat memory (see chat memory ) Notes (see session memory ) User profile (see session memory ) — user information — persistent notes (added via tool) Memory is loaded into the system prompt each turn tool adds notes during a session tool explicitly persists memory to disk Memory is auto-saved when the agent exits (interactive mode) Each user message and assistant response is stored in memory Reasoning is omitted from chat memory Automatically compacted when exceeding the configured character limit The user can trigger the compaction any time with Chat memory is attached to the system prompt on each turn The agent displays the last 10 exchanges, with long messages truncated Chat history is persisted to Automatically loaded on startup Saved after every exchange (user input or assistant response) Compacted history is also persisted to disk : a indicating if the command succeeded or failed. : an optional short status message. It is printed with or . : an optional with the Python Rich-formatted content, it is printed to the output. : an optional formatted in Markdown, it is printed to the output.

0 views

Claude Opus 4.8: "a modest but tangible improvement"

Anthropic shipped Claude Opus 4.8 today. My favourite thing about it is this note in the release announcement: Users will find Opus 4.8 to be a modest but tangible improvement on its predecessor. There’s still more to be done: we’re working on developing and releasing models that provide many of the same capabilities as Opus at a lower cost. It's so refreshing to see an AI lab honestly describe a release as a minor incremental improvement over the previous model! Honesty seems to be a theme. Here's my other favorite note from that announcement: One of the most prominent improvements in Opus 4.8 is its honesty . We train all our models to be honest---for instance, to avoid making claims that they can't support. But a general problem with AI models is that they sometimes jump to conclusions, confidently claiming to have made progress in their work despite the evidence being thin. Early testers report that Opus 4.8 is more likely to flag uncertainties about its work and less likely to make unsupported claims. This is borne out in our evaluations , which show that Opus 4.8 is around four times less likely than its predecessor to allow flaws in code it has written to pass unremarked. That linked system card includes the following: Claude Opus 4.8 had the lowest incorrect-rate of the six models on every benchmark—the most direct measure of factual hallucination. It achieved this mainly by abstaining on questions about which it was uncertain rather than by answering more questions correctly. Not much has changed since 4.7. It's priced the same as Opus 4.5/4.6/4.7 - $5/million input and $25 per million output. "Fast mode" is twice that price, which is a significant reduction from their previous models - fast mode on 4.6/4.7 remains at $30/$150. Note that fast mode is only available to organizations that are part of the research preview, "Contact your account manager to request access". Both the reliable knowledge cutoff and the training data cutoff are January 2026, the same as for 4.7. The context window is still 1,000,000 tokens, and the max output is 128,000 tokens. The What's new in Claude Opus 4.8 document has some of the more interesting details. These caught my eye: Mid-conversation system messages . Claude Opus 4.8 accepts messages immediately after a user turn in the array (subject to placement rules ). This lets you append updated instructions later in a long-running conversation without restating the full system prompt, which preserves prompt cache hits on the earlier turns and reduces input cost on agentic loops. See also this update to the Anthropic Python SDK. Being able to steer the system prompt mid-conversation sounds really powerful. I was worried this would be incompatible with the abstraction provided by my own LLM library , which expects a single system prompt per conversation... but it turns out my recent redesign should handle that just fine . Lower prompt cache minimum . The minimum cacheable prompt length on Claude Opus 4.8 is 1,024 tokens, lower than on Claude Opus 4.7. I checked and 4.7's minimum was 4,096 . Here are pelicans riding bicycles for all five thinking levels, , , , , and : This time I ran them using the LLM CLI , exported the logs to Markdown and then had Claude Opus 4.8 build me an HTML tool that could render that Markdown with the fenced code blocks displayed as SVGs on the page. (I later had GPT-5.5 xhigh in Codex update that code to remove any XSS holes. I'm sure Claude could have done that if I'd asked, but GPT-5.5 is my code security blanket at the moment.) The max one was clearly the best, but it did take 25 input, 17,167 output tokens for a total cost of 43 cents ! 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 .

0 views
ava's blog Yesterday

AI blog question challenge

Rishabh made an AI blog question challenge and invited me to fill it out. Let's go! 1. How was your first experience with AI models? I used to have fun playing around with NeuralBlender, and used it to inspire glitch art of mine that I drew. Back when ChatGPT launched, I used it to teach myself HTML and CSS. 2. Do you use AI or are you completely against using it? On average, I use it once a week or less; weeks can go by where I don't use it. Due to my field of interest, I want to keep up to date on some use cases and capabilities, and make my own experiences instead of relying on what the hype online says. I feel like I can't properly write about my criticisms or privacy concerns if I don't use it at all, or don't test the use cases people rave about (which often leave me deeply disappointed). Occasionally, my boss will also ask me to trial out some use cases at work. Situations I use it for in private when I am not testing what others are doing: 3. Do you have any preference among different models, for example Claude vs ChatGPT? If yes, how do you choose? I only use ChatGPT and Lumo, and I'm trying to permanently move to Lumo. I no longer want to use anything made by OpenAI. 4. What aspect of AI models do you like and what do you not like? I hate the sycophancy and wordiness. Even when I adjust settings to be short and precise, they still yap. I don't like all the subheadings and bullet point lists, I prefer a full text. I turned emojis off. I also hate when they constantly repeat my name, so I removed that again. I also hate how mean Lumo can get; I want no sycophancy and the fucker will start bullying me for some reason. I like the aspect of being able to ask something when no one else is available (either due to the sensitive matter, embarrassment, or time issues). 5. How do you feel about AI generated images? Does it annoy you if someone uses them in a blog post? Seeing an AI generated image on a blog post is about as nice as being greeted by a steaming turd. Even worse when I know it isn't a bot blog and the person spent time crafting the text, only to include a graphic that has several errors, spelling mistakes and other unfitting or illogical stuff. Do you have absolutely no shame or quality standards? You wanna tell me you looked at that picture that said "thseism" instead of "theme" somewhere in it and thought " Yup, that's it, best I can do, hope my readers enjoy this total eye candy, can't see anything wrong with that "? What is it supposed to convey to me as a reader - that you didn't even look at it, or that you were too lazy to formulate a second or third prompt? 6. Internet is flooded with AI slop now, full of generated text, images, audio and videos. How do you filter it from authentic human creation? Do you have a strategy? I'm not on any of the big platforms or their replacements, and I consume the internet through my highly curated RSS feed reader where I follow real people who don't use it like that, or the Discover page. It's easier to avoid when your internet use is limited, in a niche, and mostly used for blogging, reading and studying. I have a good grip on detecting generated text and images, but I've noticed that videos and gifs can easily fool me by now. 7. Are you hopeful for a better future with A.I. or a dystopian one? Hard to say; I think AI is absolutely a dystopian nightmare when used in surveillance and war. For the rest, I assume the bubble will pop and few dedicated models for specific niches and use cases will remain that have proven to be useful and worth the cost, and the rest will fade away. I hope it can do some good in healthcare, but that may be wishful thinking. If AI went away completely, I would not miss it. Reply via email Published 28 May, 2026 I can't find something specific (like a specific word, jargon, saying, concept, item name etc.) via normal search engine use or can't find a clear explanation for something I find difficult to understand. Needing an easy language version for a really difficult paragraph, law text passage, case part etc. that I can't seem to crack on my own. Career and job questions I am unable to ask anyone both offline or online, because people I know in real life can't help, and I'd have to reveal too much to others if I asked online. Career trajectory brainstorming, 3-year and 5-year plan stuff.

0 views
Manuel Moreale 2 days ago

Enhanced games

The other day that stupid thing called the Enhanced Games took place. As you might have guessed by the name, this is basically the Olympics on steroids, quite literally. The event itself is not even worth commenting on. I remember hearing about this concept ages ago and forgot about it, and only skimmed through a few headlines the day after the event. But reading about it got me thinking about what I’d love to see if we were to organise an Olympics spin-off. There are two concepts I’d be genuinely excited to see, and they go in opposite directions. The first concept is to let tech and engineers go wild. A lot of modern sports are infused with technology of all kinds: from running shoes materials, to laser stitched swimsuits, to tracks that are incredibly bouncy, the list goes on and on and on. I remember, almost a decade ago, Nike trying to break the 2 hours barrier for the marathon , and thought it was an interesting experiment. I’d love to see what kind of barriers we can break by letting the best athletes and the best minds join forces, but without doing silly things, like strapping rockets to someone’s feet. The other idea is the exact opposite. Remove all tech. Like all of it. No shoes, no fancy materials, no special equipment, no stadiums, nothing. We go back to ancient times, and we see how much just human bodies alone can achieve, with as little external help as possible. I’d very much enjoy seeing both of those events. Thank you for keeping RSS alive. You're awesome. Email me :: Sign my guestbook :: Support for 1$/month :: See my generous supporters :: Subscribe to People and Blogs

0 views
daniel.haxx.se 2 days ago

curl up 2026 summary

Getting curl developers and related enthusiasts into a single room to hang out in the real world for a whole weekend once a year is awesome. We find inspiration, we share experiences, we learn from each other and we dream and plan of future endeavors and things to work on. Seeing faces, hearing voices and watching body language help us communicate better virtually and on video calls during the rest of the year. We have gathered curl people like this annually since 2017, even if some years during Covid were “different”. To me, this is one of the best events of the year. I get to hang out and talk curl with good friends a whole weekend! The 2026 edition was held in Prague in late May and kept the general style of past events. About 25 people got into the room. We had five curl maintainers present and quite a lot of local curious minds. The curl up format is easy, casual and friendly. We do topical presentations, followed up with Q&A and discussions around the topics brought up – of course usually with reflections about curl’s role, both past and future. We live-stream and record the presentations to allow our friends who could not attend to keep up both in real-time but also after the fact. Unfortunately the tech is not always on our side so the quality sometimes is a little lacking. This year I brought an HDMI-splitter and an HDMI-to-USB device to allow us to get better recordings, but they were not working as smoothly as intended so we had to use inferior backup solutions for most of the meetup. This presentation above was the “keynote”, the introduction talk to the event. We then also recorded another nine session that are all available in the curl up 2026 playlist on YouTube. To give you all a little glimpse of what curl up is about, here’s a gallery showing some of the speakers and some scenery. Daniel Stenberg Alexandr Nedvedicky Daniel Stenberg Jim Fuller Jim Fuller Carlos Henrique Lima Melara Jim Klimov Moritz Buhl Stanislav Fort Daniel Stenberg Igor Chubin Igor Chubin Daniel Stenberg Daniel Stenberg and Frank Gevaerts All photos taken by and donated to us by an anonymous curl fan present in the room.

0 views
ava's blog 2 days ago

i want a nemesis... or do i?

Today I partially joked in a chat I think at this time of my life, I would like to have a nemesis. Everyone has people they don't like and find annoying, I do too. But a nemesis? There's something you can't stand about them, but you recognize they are really good at something, and can admire some things about them too. You might piss each other off, but there is a good kind of competition between you. It has to be mutual, though. One-sided nemesis stuff is just weird. On a more serious note, I guess it is an expression of my search for someone equally passionate to help me grow and challenge me in some topics. We had another Country Reporter meeting organized by noyb yesterday, and this time, the presentation also featured questions we discussed in breakout rooms, something we never did before. Really loved that. Made me realize again how much I am craving and missing actually talking to professionals about data protection and privacy in a way that is more theoretical/academical or covering areas I know less about, instead of being geared towards laypeople's issues in practice. Blogging is fine, emailing some people is fine; but it is rather solitary or with great delay, and little to no pushback with good arguments that make me dig deeper. Writing helps sort things out and is a great opportunity to research or to revisit stuff I read, but it isn't a balanced peer debate and it doesn't make me aware of blind spots. I do have our DPO at work as mentor, but we meet roughly every 2-3 months or less, and I think I can't make it a more regular thing, as he's very busy. I try to make it to conferences 1-2x a year, but that's also mostly listening to presentations or panels without really getting a back and forth going. The social aspect there is more about networking, status signaling, or passive learning than intellectual sparring. I try to read articles, blog posts and papers that challenge me, but it's not enough as I can't discuss them with anybody. My understanding of things is not getting pressure-tested, I want to need to research more and formulate arguments in conversation. I thought about how I could address this need, and brainstormed about a digital roundtable every other week where the group discusses a DPA decision, court case, new guidance, articles, news, question etc. each time for 60-90 minutes. What would be important is that I am not completely sold on the idea because of scheduling friction, recording concerns and people's general aversion to digital meetings especially without camera, but asynchronous means wouldn't scratch the itch either. I need the conversational intensity and immediacy, and I crave people who are opinionated enough to argue, but not status-defensive and comfortable to change their mind. I'll let that one marinate for a bit still. :) Reply via email Published 28 May, 2026 not just one person supplies the discussion material, but everyone takes turns or signs up to do the next meeting when they find something worthwhile. an explicit expectation that it's okay to disagree. Chatham House Rule, no recordings. diversity in backgrounds (and identity) - laypeople, professionals, field, (gender and location) etc., because even just all being focused on the legal perspective or the activist lens can get pretty monotonous, and professionals don't just wanna lecture laypeople; it gets more interesting when you have people from software engineering, platform governance, cybersecurity, social sciences etc. in it too that all bring a different part to the table, especially technical angles. can't actually be that big, because the more people are there, the less people can actually speak, and many will then just silently attend. There needs to be enough room for everyone to speak if they want to, and not just 2-4 people going at it as everyone else listens. people shouldn't just be there because I'm there.

0 views
Jeff Geerling 2 days ago

Tuning in FM Radio on a 3D Printer Heatbed

Pooch from Repkord dropped by my studio while he was in St. Louis, and asked a simple question: Can a 3D printer's heatbed act as an antenna? A fair question, as many an antenna is embedded in a PCB these days... and the traces on a PCB heatbed like the one used in Prusa's Core One look kinda like an antenna, if you squint the right way. Really, anything (or anyone) can be an antenna, given enough power.

0 views
Stratechery 2 days ago

An Interview with Eric Seufert About Models and Ads, and AI’s Upside for Humanity

An Interview with Eric Seufert about building models for generative AI, why Meta's foundational models are so important, and why understanding advertising leads to optimism about humanity's future.

0 views
マリウス 2 days ago

80Retros x HMX Monochrome

After spending a fair amount of time with the KTT x 80Retros GAME 1989 Orange , I figured it was about time to take a closer look at the HMX -side of the 80Retros catalogue. The 80Retros x HMX Monochrome have been with me for a while, ever since I picked them up back in Seoul. The switches stand out from the rest of the 80Retros lineup as they don’t ship in a film canister, and they have a fairly boring black and white colorway. The 80Retros x HMX collaboration comprises of a handful of linear switches, amongst others the KD200 (a Kodak -yellow homage), the FJ400 (a Fujifilm -green homage), the GAME 1989 Classic (a Game Boy DMG-grey homage with pink stems), the Joker (a green/white/purple character homage), and the Monochrome , which arrived as one of the later releases. While most other 80Retros switches ship in oversized film-canister packaging, which is probably half the reason people bought into the lineup in the first place, the Monochrome , however, break that pattern, as they come in a plain sealed pack. 80Retros have framed this as a practical decision, since a sealed bag preserves the factory lube better than a (non-airtight) film canister. The Monochrome have a white top housing, a black stem, and a black bottom housing. There’s no nostalgia, just basically a clean, modern industrial look. It’s probably one of the few switches in the lineup that would feel at home on a build that’s trying to look new rather than old. The interesting thing here is that the Monochrome seem to be materially identical to the KD200 , at least from the information I was able to dig up on them. It seems like they use the same PA12 top housing, same LY stem, same 13.55mm stem length, and the same HMX P2 bottom housing. The only spec that appears to be different on paper is the spring, that is a 42g on the Monochrome versus a 45g on the KD200 . The Monochrome seem to basically be a KD200 in different clothes with a lighter spring. Therefor it seems like most of the KD200 -flavoured tendencies show up here too. The first thing you notice is just how light they are. 42g is on the gentle end of the linear spectrum these days, and even coming from the GAME 1989 Orange at 40g actuation, the Monochrome feels softer, probably because the PA12 top, HMX P2 bottom, and LY stem combo doesn’t have the same dry, gritty character the KT2 stem gives the Orange . There’s no audible texture in the travel here. It’s just smooth from top to bottom. Stock smoothness is very good. HMX ’s factory lube is well applied, with visible coverage on the stem sides and along the spring contact points. Slow-pressing a single switch at ear level reveals nothing worth complaining about, as there’s no scratch, no spring ping, and no leaf chatter. This means you can just install them and stop thinking about them, which, for a stock switch, is probably what most people would want. Wobble seems to be in line with the rest of HMX ’s newer-mold output. There’s a touch of north-south play and a touch of east-west, neither of which are distracting in normal typing. The Monochrome has a sound profile that’s noticeably soft, light, and, for lack of a better word, swooshier . The Korean reviewer who teardown-photographed the whole 80Retros x HMX lineup described it as a “wave-like” sound. There’s still a clean tonk on the bottom-out, but it sits lower in the mix and the upper harmonics that make for a louder pop are largely absent. Volume-wise, the Monochrome is on the quieter side. Not silent, not Volume 0 -quiet, but noticeably more restrained than e.g. the GAME 1989 Orange . On softer builds (gasket-mount, Poron -foamed, that sort of thing), it leans firmly into muted thock territory. On more rigid aluminium builds I’d expect it to open up slightly, but my own testing has been on softer cases, so take that with a grain of salt. In short, where the Orange has audible character, the Monochrome is doing something quieter and a little more uniform. If you enjoy the Orange ’s pop you’re probably be slightly disappointed with the Monochrome . As for the factory lubing, it is competently done. I peeked into a few switches and the application is consistent enough that I didn’t feel any particular urge to retune them. If you’re someone who lubes everything regardless, maybe be sparing here, as otherwise you’ll smother what little articulation the switch already has. The switches accept films, like everything else in the lineup, and films do their usual job of tightening housing tolerances and compressing the sound profile slightly. Given how restrained the Monochrome already sounds, I’d hesitate to film them unless the build absolutely needs it. You’d mostly be removing what little air is left in the sound. The 80Retros x HMX Monochrome are soft and gently-weighted linears with very few rough edges and they are relatively quiet in volume. Whether that’s the switch you want depends entirely on what you’re trying to build. If you want acoustic complexity, the GAME 1989 Orange is definitely more interesting. If, however, you want a low-effort and low-noise linear that disappears into the build, the Monochrome fit that role pretty well. I wouldn’t call it an exciting switch, but I would, however, call it a sort of grown-up switch. Disclaimer: I’m not a switch scientist. I don’t own a force curve rig, I can’t tell you the exact durometer of the KT2 blend, and my ears are probably not calibrated to the standards of someone like ThereminGoat . This review is based on my personal experience typing on these switches across a few different boards and ultimately actively using them on my primary keyboard . Your mileage may vary based on your plate material, case, keycaps, and other factors. Take everything here as one person’s experience and use it as a starting point for your own.

0 views

Notes on Fourier series

The trigonometric Fourier series is a beautiful mathematical theory that shows how to decompose a periodic function into an infinite sum of sinusoids. These are my notes on the subject, with some examples and the connection to linear algebra in Hilbert space. Let’s assume that is a well-behaved 2L -periodic [1] function and that we can find coefficients a_n and b_n such that: Then we say that the Fourier series on the right-hand side converges to . We’ll talk more about the assumptions mentioned above and convergence in the next section. Note that when n=0 , the sum becomes just ; therefore it’s customary to write the series starting with n=1 , with a separate constant component (which is the function's average over one period). To make computations nicer, this constant is typically called a_0 / 2 , so: Our goal is to find the coefficients a_n and b_n that satisfy this equation. We’ll do this in three steps. Step 1: Integrate both sides of the equation between -L and L [2] . Per Appendix A, all integrals within the sum are zero, so we’re left with: And thus we find : Step 2: Multiply both sides by cos\frac{m\pi x}{L} ( m is a positive integer constant) and integrate between -L and L . Looking at the right-hand side, the first integral is zero per Appendix A, and the last integral is zero per Appendix B. We’re left with: Per Appendix B, the integral on the right is zero for all n\neq m , and L for n=m . Therefore, we can write: Recall that m is an arbitrary integer, just like ; for consistency, we’ll replace m by and isolate a_n : Step 3: Hopefully it’s clear where this is going now; multiply both sides by sin\frac{m\pi x}{L} and integrate between -L and L . Using a very similar reasoning to step 2, we’ll end up with: We’ve just found a way to calculate all the coefficients of our Fourier series for : The previous section discusses Fourier series for a function that is well-behaved - but what does that mean? The full answer would lead us deep into analysis, which I’d like to avoid here. So I’ll keep it brief. We typically assume that is square integrable , which is denoted as L^2 . Moreover, we assume that the function is piecewise smooth : each segment of the function has continuous derivatives. A very simple example of a piecewise smooth function is f(x)=|x| . Another is the triangular wave function used in the example below. These conditions hold for pretty much any reasonable function we want to approximate using Fourier series, so they aren’t a serious burden. For a function that satisfies these conditions, it’s guaranteed to have a Fourier series that pointwise converges to it. This means that at every continuous point of , the Fourier series converges to it exactly; at every jump point, the Fourier series converges to the mid-point of the jump. Sometimes, additional properties of the function can help us simplify the Fourier series for it. If f_e(x) is an even function , then we know that: Because the function inside the integral is odd, and integrating an odd function over a symmetric interval results in 0. Therefore, the Fourier series for such f_e(x) is a cosine series : With coefficients and a_n given as before. Similarly if f_o(x) is an odd function, then its and a_n are 0, and its Fourier series is a sine series : So far we’ve been talking about 2L -periodic functions that can be faithfully represented by Fourier series. But what if we have a non-periodic function defined on a finite interval? E.g. suppose we have f(x)=x on the interval [0,L] . Can we approximate it with a Fourier series? Yes! First, we have to make a choice of how to extend the function to the negative interval [-L,0] . Then, we simply repeat the function every 2L - this is called a periodic extension . Note that the Fourier series calculation only cares about the range [-L,L] . The resulting series will approximate the generated periodic function in its entirety, and in particular will also converge to it in the [0,L] interval (except maybe the endpoints, depending on the mode of extension). There are several natural ways to extend a function defined on [0,L] into the interval [-L,0] [3] : Here’s an example of extending our sample function f(x)=x onto the full interval [-L,L] and then repeating it periodically every 2L : Note that the Fourier series for these extended functions will be different. However, they will all converge to in the interval [0,L] . Typically, even and odd extensions have the benefit of producing either cosine or sine series, correspondingly (as discussed in the previous section). We’ve seen that Fourier series work well for periodic functions and also non-periodic functions defined on a finite domain (because we can extend these periodically). But what about aperiodic functions defined on the entire real line? This is where we’ll have to leave Fourier series behind and move on to their generalization - the Fourier transform ; this will be a topic for a separate post. Let’s take the following triangular function t(x) [4] : t(x) is periodic with period 4. We can define it by starting with a formula on the interval [0,2] : Then making an odd extension into [-2,0] and repeating it periodically. Now we can go ahead to calculate its Fourier coefficients. Since this function is odd, we know that we’ll get a sine series , as a_n are going to be 0 for all . Let’s calculate b_n ; in our case L=2 (half the period). Since t(x) is odd and so is the sine, we’re integrating an even function over a symmetric interval. Therefore, we only have to integrate on the positive half of the range and multiply the result by two: Let’s set k=\frac{n\pi}{2} : And split up the integral for the different segments of t(x) : The first integral, by the method described in Appendix C: The second integral can also be split into two: The first of these is trivial to calculate; the second can once again use Appendix C. After some tedious but straightforward calculations [5] we’ll get: Adding I_1+I_2 , we get: Now let’s substitute k=\frac{n\pi}{2} back. This makes sin(2k) zero because the sine of an integer multiple of \pi is always zero: We have b_n , so the Fourier series for our t(x) is: Note that for even values of , sin \frac{n\pi}{2} is zero, so only the odd terms remain: Here’s an interactive chart showing how the series t(x) converges to our triangular function. You can set the number of terms in the Fourier series and see the effect (red line). Note that all even coefficients are zero so it will look the same for as for n-1 when is odd. We’ve written the Fourier series for as follows so far: We can rewrite this in a somewhat more compact form, using a single sinusoid with a configurable phase at each : Based on Appendix D, q_n and \theta_n can be computed as follows: When Fourier series are used in the context of signal processing, this formulation is easier to reason about because it represents the magnitude and phase shift of each harmonic of in the frequency domain [6] It should not come as a surprise that the Fourier series, being a combination of trigonometric functions, can also be represented with complex exponential functions. Specifically, we’ll show that our can be approximated as follows: Let’s calculate C_n . We proceed in a manner similar to before, by multiplying both sides of the equation by e^{-im\pi x/L} and taking an integral in the range [-L,L] : By Appendix A, the sum elements are all zero when n\neq m . When n=m , we get: Therefore, renaming m to (since it’s just an arbitrary integer constant): We’ve found an alternative formulation to Fourier series, using complex exponentials instead of trigonometric functions. While this was a direct derivation, another way to achieve the same result is to use the Euler Formula to derive: And substitute these into the original Fourier series formula. I’ll leave this as an exercise for the diligent reader; eventually, the result will be the same. Moreover, it’s possible to show a direct correspondence between a_n , b_n and C_n , for n>0 : Note that C_{-n}=C_n^* when both a_n and b_n are real (which is the case for a real-valued ). This helps explain why the complex formulation has negative frequencies in the sum; when the function is actually real, each negative frequency is paired up with a positive frequency and the result is real [7] : So, for a real function we only need to account for positive frequencies: We can take it further. C_n is a complex number, so let’s represent it in polar form as C_n=\frac{q_n}{2} e^{i\theta_n} (the factor of half will make sense soon). Then: And substituting back into the sum: This is precisely the compact formulation from the previous section! The most beautiful aspect of Fourier theory is that it doesn’t just happen to work by chance, and is deeply connected to linear algebra. Please read my post on Hilbert space before proceeding. The space of real-valued square integrable functions L^2 forms a Hilbert space, in which we can define the inner product (assuming real functions): We’ve demonstrated that the family of functions: Are all mutually orthogonal, because their pairwise inner products are zero! We’ve also shown that any function in L^2 can be represented as a weighted sum of these functions: So these functions form a basis for L^2 . When we think of these functions as vectors (in an infinite Hilbert space), much of what we did in this post starts feeling like "normal" linear algebra. For example, when we have a set of basis vectors and we want to know how to represent some vector in this basis, we usually find the coefficients by projecting it onto the basis. E.g. with a basis vector e_1 , the coefficient of : Similarly, when we calculate the coefficient b_n for some function , we project onto the basis vector sin\frac{n\pi x}{L} by calculating: From Appendix B, we know that the denominator is L , and we’ve just denoted: Which should look familiar! This is the core linear-algebra idea behind Fourier series: the functions 1 , cos\frac{n\pi x}{L} , and sin\frac{n\pi x}{L} play the role of orthogonal basis vectors, while the Fourier coefficients are coordinates of in this basis. The integral formulas for a_n and b_n are not mysterious tricks; they are projections, just like dot products with basis vectors in ordinary Euclidean space. Fourier series therefore let us decompose a function into independent orthogonal directions, much like decomposing a vector into its , , and z components. For any integer n\neq 0 and an arbitrary constant L, we have: Using these, we can calculate the integral of a complex exponential function for an integer n\neq 0 : We’ll start with the product of two sines, for any positive integers m and : Using the trigonometric identity for a product of sines, we can write: Now let’s focus on two different scenarios, m\neq n and m=n . If m\neq n , then each of the integrals constituting ss are 0 (see on Appendix A), so ss=0 . If m=n , then the second integral is still 0, but the first one isn’t: We can use exactly the same approach to show that: One more variant to cover: Since sine is an odd function and cosine is an even function, their product is an odd function. And the integral of an odd function over a symmetric interval is 0 (see this post for more details ). Let’s calculate the indefinite integral: For some constant k . We’ll use integration by parts: Here u=x , so du=dx . Also dv=sin(kx) , so v=-\frac{cos(kx)}{k} . Putting it together: Let’s take a general sinusoid with magnitude q , frequency and phase : We’re going to show that s(x) can be represented as a sum of a sine and a cosine with no phase. This is related to my earlier post on the sum of same-frequency sinusoids . Let’s start by expanding s(x) using a trigonometric identity: Now we’ll denote: a=q\cdot cos(\theta) and b=-q\cdot sin(\theta) , so: We have a and b in terms of q and , but what about the other way around? Let’s take the equations: Square both of them and add together: Now we’ll take the equations for b and a and divide one by the other: Where the atan2 function is careful to take into account the sign of both numerator and denominator. Also it’s worth mentioning that is determined up to additions of 2\pi . To conclude, for any q , and : With the aforementioned conversion formulas for a , b . The trigonometric Fourier series is a beautiful mathematical theory that shows how to decompose a periodic function into an infinite sum of sinusoids. These are my notes on the subject, with some examples and the connection to linear algebra in Hilbert space. Coefficients of Fourier series Let’s assume that is a well-behaved 2L -periodic [1] function and that we can find coefficients a_n and b_n such that: \[f(x)=\sum_{n=0}^{\infty}\left(a_n cos\frac{n\pi x}{L}+b_n sin\frac{n\pi x}{L}\right)\] Then we say that the Fourier series on the right-hand side converges to . We’ll talk more about the assumptions mentioned above and convergence in the next section. Note that when n=0 , the sum becomes just ; therefore it’s customary to write the series starting with n=1 , with a separate constant component (which is the function's average over one period). To make computations nicer, this constant is typically called a_0 / 2 , so: \[f(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left(a_n cos\frac{n\pi x}{L}+b_n sin\frac{n\pi x}{L}\right)\] Our goal is to find the coefficients a_n and b_n that satisfy this equation. We’ll do this in three steps. Step 1: Integrate both sides of the equation between -L and L [2] . \[\int_{-L}^{L}f(x)dx=\int_{-L}^{L}\frac{a_0}{2}dx+\sum_{n=1}^{\infty}\bigg (\int_{-L}^{L}a_n cos\frac{n\pi x}{L}dx+\int_{-L}^{L}b_n sin\frac{n\pi x}{L}dx\bigg )\] Per Appendix A, all integrals within the sum are zero, so we’re left with: \[\int_{-L}^{L}f(x)dx=\int_{-L}^{L}\frac{a_0}{2}dx=\bigg[\frac{x\cdot a_0}{2}\bigg]_{-L}^{L}=a_0\cdot L\] And thus we find : \[a_0=\frac{1}{L}\int_{-L}^{L}f(x)dx\] Step 2: Multiply both sides by cos\frac{m\pi x}{L} ( m is a positive integer constant) and integrate between -L and L . \[\begin{aligned} \int_{-L}^{L}f(x)cos\frac{m\pi x}{L}dx&=\int_{-L}^{L}\frac{a_0}{2}cos\frac{m\pi x}{L}dx\\ &+\sum_{n=1}^{\infty}\bigg (\int_{-L}^{L}a_n cos\frac{n\pi x}{L}cos\frac{m\pi x}{L}dx+\int_{-L}^{L}b_n sin\frac{n\pi x}{L}cos\frac{m\pi x}{L}dx\bigg ) \end{aligned}\] Looking at the right-hand side, the first integral is zero per Appendix A, and the last integral is zero per Appendix B. We’re left with: \[\int_{-L}^{L}f(x)cos\frac{m\pi x}{L}dx=\sum_{n=1}^{\infty}\int_{-L}^{L}a_n cos\frac{n\pi x}{L}cos\frac{m\pi x}{L}dx\] Per Appendix B, the integral on the right is zero for all n\neq m , and L for n=m . Therefore, we can write: \[\int_{-L}^{L}f(x)cos\frac{m\pi x}{L}dx=a_m\cdot L\] Recall that m is an arbitrary integer, just like ; for consistency, we’ll replace m by and isolate a_n : \[a_n=\frac{1}{L}\int_{-L}^{L}f(x)cos\frac{n\pi x}{L}dx\] Step 3: Hopefully it’s clear where this is going now; multiply both sides by sin\frac{m\pi x}{L} and integrate between -L and L . Using a very similar reasoning to step 2, we’ll end up with: \[b_n=\frac{1}{L}\int_{-L}^{L}f(x)sin\frac{n\pi x}{L}dx\] We’ve just found a way to calculate all the coefficients of our Fourier series for : \[f(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left(a_n cos\frac{n\pi x}{L}+b_n sin\frac{n\pi x}{L}\right)\] Where: \[\begin{aligned} a_0&=\frac{1}{L}\int_{-L}^{L}f(x)dx\\ a_n&=\frac{1}{L}\int_{-L}^{L}f(x)cos\frac{n\pi x}{L}dx\\ b_n&=\frac{1}{L}\int_{-L}^{L}f(x)sin\frac{n\pi x}{L}dx \end{aligned}\] Conditions on f and convergence of Fourier series The previous section discusses Fourier series for a function that is well-behaved - but what does that mean? The full answer would lead us deep into analysis, which I’d like to avoid here. So I’ll keep it brief. We typically assume that is square integrable , which is denoted as L^2 . Moreover, we assume that the function is piecewise smooth : each segment of the function has continuous derivatives. A very simple example of a piecewise smooth function is f(x)=|x| . Another is the triangular wave function used in the example below. These conditions hold for pretty much any reasonable function we want to approximate using Fourier series, so they aren’t a serious burden. For a function that satisfies these conditions, it’s guaranteed to have a Fourier series that pointwise converges to it. This means that at every continuous point of , the Fourier series converges to it exactly; at every jump point, the Fourier series converges to the mid-point of the jump. Cosine and Sine series Sometimes, additional properties of the function can help us simplify the Fourier series for it. If f_e(x) is an even function , then we know that: \[b_n=\frac{1}{L}\int_{-L}^{L}f(x)sin\frac{n\pi x}{L}dx=0\] Because the function inside the integral is odd, and integrating an odd function over a symmetric interval results in 0. Therefore, the Fourier series for such f_e(x) is a cosine series : \[f_e(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}a_n cos\frac{n\pi x}{L}\] With coefficients and a_n given as before. Similarly if f_o(x) is an odd function, then its and a_n are 0, and its Fourier series is a sine series : \[f_o(x)=\sum_{n=1}^{\infty}b_n sin\frac{n\pi x}{L}\] Fourier series for a non-periodic function defined on an interval So far we’ve been talking about 2L -periodic functions that can be faithfully represented by Fourier series. But what if we have a non-periodic function defined on a finite interval? E.g. suppose we have f(x)=x on the interval [0,L] . Can we approximate it with a Fourier series? Yes! First, we have to make a choice of how to extend the function to the negative interval [-L,0] . Then, we simply repeat the function every 2L - this is called a periodic extension . Note that the Fourier series calculation only cares about the range [-L,L] . The resulting series will approximate the generated periodic function in its entirety, and in particular will also converge to it in the [0,L] interval (except maybe the endpoints, depending on the mode of extension). There are several natural ways to extend a function defined on [0,L] into the interval [-L,0] [3] : Direct periodic repetition: we simply repeat every L : f(x+L)=f(x)\ \forall x . Even extension: f(|x|) Odd extension: when x\ge 0 and -f(-x) when x<0 .

0 views