Latest Posts (20 found)

📝 2026-07-12 10:08: It's a beautiful morning here in North Wales. My wife has taken our youngest to...

It's a beautiful morning here in North Wales. My wife has taken our youngest to his cricket match, and our oldest is upstairs playing with his Lego out of the heat. Me? I'm sitting in the sunroom, listening to the goats and chickens, with a coffee and book. Perfect Sunday morning. Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment .

0 views
Unsung Today

“Not being good at something doesn’t mean you can’t love it.”

Perhaps ironically given the subject matter, I found this 34-minute video by Razbuten a bit intense, but I would still recommend it to people who work on onboarding, settings, etc.: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/not-being-good-at-something-doesnt-mean-you-cant-love-it/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/not-being-good-at-something-doesnt-mean-you-cant-love-it/yt1-play.1600w.avif" type="image/avif"> In the video, the author tries to answer the question: how to make any given game a challenge, given there is no universal standard of difficulty and every player arrives at a game not just with different skillset, but also likely different goals. There are many techniques a game can use to adapt to the player – a simple upfront difficulty selector, complex difficulty settings, a training level, adaptive difficulty, accessibility/​assist modes – but there are no easy answers. Each method comes with pros and cons, and perhaps the very notion that a game should adapt to the user is flawed; some players might find it more rewarding to have to step up to the game instead. In the video, Razbuten covers a lot of examples really well. I’m not going to say any of this maps 1:1 to productivity software as goals of games are very different than goals of apps… but even though I have never played any of the games mentioned, the examples made me think. After all, some of the psychology of mastery will be the same between these two realms. (I bet there were at least some of you who saw the previous post about LaTeX and thought “this looks hard and fascinating – I’m going in,” and others took a note to never approach it.) #flow #games #onboarding #settings #youtube

1 views

On interactive Go tours

Over the past two years, I've published interactive tours for five Go releases, from 1.22 to 1.26. I know some of you have read them, and I've received a lot of kind words from you (even some core Go team members reached out) — thank you so much for that! Tour history: Go 1.22 • 1.23 • 1.24 • 1.25 • 1.26 + Go features by version Unfortunately, at some point, writing these tours stopped being fun and started to feel like a part-time job. I'm not really excited about that, so I've decided to stop. I still like Go (well, most of it). I read a lot of Go code, I write some Go code, and I write Solod code, which is also Go 🙂 (Solod is a systems language with Go syntax and a Go-like stdlib). I'm still pretty close to the language and will probably continue to write about it. But the interactive tours story is over.

0 views

Neo beginnings

I did it. I finally bought a new Mac. I managed to snatch a MacBook Neo on Amazon a few minutes after Apple announced the price increase across their line-up. It all happened very quickly, but I think it’s worth taking the time to explain my messy, complex, overcomplicated train of thought. If you’re a regular reader of this blog, you know that I complained (or bragged) a lot about the fact that I still used an early 2020 MacBook Air as recently as two weeks ago, and that its battery was getting a bit old, and it was maybe a little bit slow at times. I explained in a post that I felt confident in being able to keep using it for one more year, as its limitations felt more like a way to focus and maintain a well-controlled set-up rather than constraints. I was ready to wait for something like the M6 generation of the MacBook Air (so I could continue my story with that family of laptops, which started with the early-2015 11-inch model). But this post was written in January, before Apple unveiled the new M5 MacBook Air, and, as a little surprise, the MacBook Neo. I first considered the Neo, because its clear limitations were not a deal-breaker for me; on the contrary, they were a great follow-up to my then-current set-up, which was very much not demanding by design. In fact, the Neo looked pretty much, feature by feature, like the laptop of my dreams: simple, focused, reliable, cheap, well-built, straight to the point. With the classic Apple pricing ladder, of course the MacBook Air looked very tempting, offering so much more for just a little extra: better speakers, better trackpad, a backlit keyboard, double the memory, a better screen, a better audio jack, better connectors, a better battery, a far better chip, a better webcam, Touch ID, etc. Therefore, for 400 euros more, it looked like a better deal, and better value than the Neo. I could even use that extra bit of power to finally edit photos on my laptop instead of on my phone, where the screen and performance have long been better suited than those of my old Mac for running apps like RAW Power. This is where it got a bit complicated in my head and froze all my purchase intentions. Value-wise, the MacBook Air M5 was, like I said, a much, much better choice than the Neo: for 50% more money, you get more than double the computer basically. Money-wise, if the Neo is indeed sold at a great price, it’s not as good a deal as the MacBook Air, not as good value. But if I were to stick to value and price, well, keeping my old MacBook Air Core i5, costing me zero, would always be a better deal. For a while, whenever I thought of “what I already have” (the old MacBook Air) versus “what I really want” (the new MacBook Air), I had always chosen the easiest and cheapest option of the two. What I should have done instead was focus on the fundamentals: what I actually needed (the MacBook Neo). What I need is a laptop I can count on, but not only performance-wise, where my old Air was surprisingly resilient. The battery life, enabling the laptop lifestyle, is essential. Spending time on my computer is my hobby, my pleasure at the end of the day. On the days I had forgotten to plug the computer in, when I wanted to check something sitting on the couch or on my balcony, far from the reach of the charging cable, well, I could not: the little bugger had no juice left, my end-of-the-day moment was ruined, and this situation was overall a pain. So when I first learned that Apple planned to raise prices , I reconsidered once again the timeframe in which I had to change my Mac. Waiting another year and spending 20% more for the same-ish computer as the one I could buy today didn’t look like a good idea. So when I saw that Amazon had a special deal on the MacBook Air, priced at 1080 instead of 1200 euros, I was ready to buy one. A few days later, while I still hadn’t made the jump on the purchase, I saw the headlines pop up that the Air was getting 200 euros more expensive on the Apple store. From that moment, I knew I had to act fast, before Amazon raised the price too. This is when I saw that the Neo was sold at 630 euros instead of 700, and this is when a little light bulb appeared above my head. This Mac was the one I needed. In fact, as I needed to buy the laptop right away, before the price change, I was keen on saving 450 euros, especially a few days before my salary arrived. The 630 euro price tag was more affordable than 1080 and more compatible with an impulse buy. So I ordered the cheapest Neo model, without Touch ID, and ended up saving 170 euros on the Neo. That’s more than a 20% discount if applied to the current price on the Apple website. Needless to say, I’m very pleased with this deal: now if I were to sell my computer I could possibly still get more money than I paid for it, in case I end up unsatisfied with it, which is not the case so far. After two weeks of regular use, I have no complaints really. Thank you Apple for raising prices and forcing me to buy the computer I actually needed, I guess? Performance is fine, even great when compared to my old Mac. I want to say it’s more or less as snappy as the M1 MacBook Air I use for work. Clearly, this is no match for the M5 chip, and 8GB of memory may feel a bit limiting, but I don’t need that much memory to run BBEdit, NetNewsWire, GoodLinks, and Safari anyway. I actually like that this limitation is forcing me to keep my feet on the ground when it comes to trying out new apps and revisiting my current set up . We’ll see how it goes in the coming months and years. I don’t think I’ll be able to push this device as hard as I pushed my old Air, but hey, it’s almost half the price. The keyboard is more or less the same, if a bit firmer, probably due to the fact that it’s a new computer and I come from a six-year-old, worn-out keyboard. Most of the computer feels identical to the Air, if ever-so-slightly worse, like the speakers or the screen. As I don’t plan to edit photos on this machine, really, there is only one part where I really “suffer” from a downgrade compared to the Air: the trackpad. The Air’s trackpad has been so good for so long that we tend to forget about it: the haptic feedback makes it very satisfying and informative to click. On the Neo, pressing on the trackpad is nowhere near as satisfying. The travel distance of the trackpad is, I want to say, 60 to 70% longer than it feels like on the haptic trackpad, and this is 60 to 70% too long, too deep, too loud. So far, this is the only part that feels really worse in terms of my daily experience. In the end, this is what the Neo really is: a familiar 630-euro laptop — a 630-euro new Mac — perfect for my activities of web browsing, video streaming, writing, and geeking around with apps. Dare I say that the Neo, as a single-purpose device, is a perfect blogging machine?

0 views

Short Reflection on being Offline for 24 hours

There are, I think two reactions to the title of this post. One is to scoff at how short a time 24 hours really is; something barely worth mentioning. But another, perhaps less voiced reaction is to think "wow, I can't remember when I last did that..." When I last did this it was involuntary - I was living in a shack in the mountains and a sheep had chewed through the cable connecting me to the satellite dish, which was in turn connecting me to the web. And so I spent a couple of weekends net-less (with weekdays at a co-working space so I could keep in contact with my client). But I can remember kind of enjoying it, reading things I claimed I would get round to reading but never did, and thinking more deeply. "Maybe I should make it a regular thing" I thought, "just to reset things and get a new perspective...". That was some six years ago, and the most I'd managed since then is maybe an hour of self-imposed internet exile. But things have been building recently. Having a three your old who - while she does enjoy a cheeky music video or three - is nevertheless content to do things like read, draw, and play with blocks through her day made me reflect. How much was she seeing her father doom scrolling with the excuse of "I just need a break"? Why couldn't I be more like her, and how long until she was more like me? I took note of the contemporary moral panic around kids and smart phones, and I deemed it pointless if society at large was addicted; the generation who had chided us millenials for "always TXTing" on our monochrome nokias were now grey, wisened, and often more addicted to contemporary devices than we ever were. But unlike the generations before or after, I at least had partial immunity from remembering old youtube with it's amateur video content and primitive skinner box mechanisms; of having some natural resistance to the more modern and extreme developments of shorts and AI thumbnails. What hope does a child have of resisting contemporary, weapons-grade slop addiction? And so I've spent the last 24 hours cut off from the internet as an experiment. Completely self imposed - just disconnected my devices and set an alarm. Once again I read more, once again I thought more deeply, and once again I liked it. My alarm will be ringing soon and I will be lying if I said I wasn't excited to re-connect. And nor am I trying to say that the internet itself as some wholly negative thing - after all, that's where the things I read come from; the best written material the world has to offer, saved to my machine. And yet despite the incredible upside of the internet, I can't help wonder if my continued resistance against its dark side might require more drastic action. I'd already quit facebook, reddit, lobsters, HN (ok...provisionally) bluesky, several discords, and most recently I'd been off youtube entirely for days. But there's always a hook back in. "I can't quit X" I tell myself, "I've met so many great people... oh what's that, tech drama? Well they surely need to hear my opinion..." My time online draws near. The ever-full needle of stranger's opinions hovers tantalisingly over my swabbed, tensed arm. Still, I like to think I've taken the first step.

0 views

Establishing an Identity

If you’ve followed me on RSS for any amount of time, first off, thank you so much! Second, you may not have noticed how often this site changes. RSS protects you from the near-monthly changes that my mad scientist side makes to this site. This year alone, ThatAlexGuy.dev has been powered by 11ty, Hugo, plain HTML, Bear, Micro.blog , and Pure Blog. My files have sat on OpenBSD Amsterdam, DigitalOcean, and a Laravel Forge VPS. I’ve written new articles and lost old articles in migrations. My site has switched appearance more frequently than a Bian Lian (变脸) performer! I’ve come to realize I’ve been seeking both an identity and a voice. I want an outlet that reflects my interests, my background, and my day-to-day, but that’s more than what I could accomplish on something like Mastodon. All that brings us here, iteration 4 (or 8, or 15, or 16, I can’t remember). There are a few key differences and intentional choices that reflect where I want ThatAlexGuy to go. Building a new experience that will stick and satisfy the goals in my head won’t be easy, but here are the guiding pillars that are to shape what’s coming next. I have a desire to create in-depth, well-researched, and potentially interactive content. Many of my current posts come with a “1-minute read” tag. I want to change that. I’ll be digging into topics with greater detail, cross-referencing multiple sources, and (hopefully) interviewing others. As a result, I’ll be posting less frequently, but my new goal is quality over quantity. Regulars on my site will be aware of my “Photo Journal” series in which I posted a set of photos around a theme (macro, nature, Gameboy Camera ). I want to continue building my photography skills through the incorporation of high-quality photos in my articles. While text sets the tone, visuals set the atmosphere in an article. Here’s the big tomato, as they say (nobody says that): defining what this site represents. That means setting the tone and defining how topics string together to form a consistent narrative. I’ll be figuring this out for a while, but I want to leverage my interests such as indie technology, vintage computing, time away from the screen, photography, and Chinese culture. So what’s changed so far? Quite a bit! First, ThatAlexGuy.dev is now run by Ghost.org . For myself, this means less time in the technical weeds and more focus on writing. For readers, it opens the doors to a wider audience. Email newsletters are a more accessible way to stay up-to-date on new articles. Don’t worry though, RSS isn’t going anywhere! In fact, I managed to fix the broken RSS feed URLs from previous migrations (hopefully)! I’ve started to define the personality of the new site. I pulled background and accent colors from one of my favorite atmospheres in a game (Sprout Tower in Pokémon Gold). Using my iPad, I’ll be creating article images that give a calligraphy + hand-painted vibe. I’ve also brought in my Chinese name for the logo(小艾 - Little Alex). I’m working on my first longer-form article. It probably won’t be great, but first attempts never are. From there, I hope to refine my writing, researching, and supporting photography.

0 views

Dot product: Component vs. Geometric definition

The goal of this post is to answer a simple question: why are the following two definitions of the vector dot product in Euclidean space [1] equivalent for vectors \vec{a} and \vec{b} : Here’s a graphical depiction of our vectors (focusing on for clarity, though this applies to any-dimensional vectors). It shows both the components of the vectors and the angle between them. The length of the arrow for \vec{a} is |\vec{a}| . We’ll show two proofs of the equivalence here, the geometric proof and the projection proof . The Appendix describes some properties of dot products that facilitate these proofs. We’ll be using this diagram of our vectors \vec{a} and \vec{b} , as well as the vector \vec{c}=\vec{a}-\vec{b} : Using the law of cosines [2] on the triangle formed by the three vectors: Since for any vector \vec{a} , we have \vec{a}\cdot\vec{a}=|\vec{a}|^2 (see Appendix), let’s rewrite this equation as: But \vec{c}=\vec{a}-\vec{b} and the dot product obeys the distributive property (see Appendix). Therefore: For this proof, we’ll assume the geometric definition is correct and will see how it leads to the component definition. We’ll begin by denoting vectors \vec{e}_1,\vec{e}_2\dots\vec{e}_n as the standard orthonormal basis for . For example, in 2D space, these basis vectors are \vec{e}_1=[1\ 0] and \vec{e}_2=[0\ 1] , shown in this diagram: If we take an arbitrary \vec{a}\in\mathbb{R}^n and calculate its dot product with a basis vector, we can use the geometric definition: where a_i is the component of \vec{a} in the direction of \vec{e}_i . The diagram makes it easy to see why this is true from basic trigonometry, but in the more general case this is just a vector projection . Now let’s represent vectors \vec{a} and \vec{b} as linear combinations of the basis vectors: And calculate the dot product \vec{a}\cdot\vec{b} , beginning by rewriting \vec{b} with its linear combination of basis vectors representation: Using the fact that the dot product distributes over linear combinations: But earlier we’ve shown that \vec{a}\cdot\vec{e}_i=a_i . Therefore: Which is the component definition \blacksquare . A generalization of dot products in is the inner product , which is an operation meeting some specific requirements, defined on a vector space. The inner product is denoted as \langle x,y\rangle:\mathbb{R}^n\times\mathbb{R}^n\to\mathbb{R} , and must satisfy the following requirements for all vectors x,y,z\in\mathbb{R}^n and scalars a,b\in\mathbb{R} : For , we define the inner product operation in its component formulation as: Let’s prove the requirements listed above for this operation; this is fairly straightforward, given the well-known properties of scalar multiplication and addition on : Linearity in the first argument: Positive-definiteness: Consider the components of vector x . Clearly, \forall i\quad x_i\cdot x_i=x_i^2\ge 0 . Since the vector x is not the zero vector, at least one of its components is nonzero, and for that component x_i\cdot x_i>0 . Therefore: Now that we’ve proved all the inner product requirements on our operation \langle x,y\rangle , we can say that is an inner product space with this operation. By meeting these requirements, it can be readily shown that our inner product operation has additional useful properties: The third property is particularly helpful, because it means the inner product is bilinear , and thus is distributive over addition. Note that these are shown for the component definition of dot product. It’s not too hard to prove distributivity for the geometric definition using the notion of projections and how they add up. The norm of a vector x in an inner product space is defined as |x|=\sqrt{\langle x,x\rangle} . Therefore, the square of the norm is |x|^2=\langle x,x\rangle . The norm is used to express the notion of magnitude , or length of a vector. If you think of a vector x\in\mathbb{R}^n in Cartesian coordinates, the definition of the norm is a generalization of the Pythagorean theorem. Component definition: \vec{a}\cdot\vec{b}=\sum_{i=1}^{n}a_i b_i Geometric definition: \vec{a}\cdot\vec{b}=|\vec{a}||\vec{b}|cos(\theta) , where |\vec{a}| is the magnitude of \vec{a} and is the angle between the vectors’ directions Symmetry: \langle x,y\rangle=\langle y,x\rangle Linearity in the first argument: \langle ax+by,z\rangle=a\langle x,z\rangle+b\langle y,z\rangle Positive-definiteness: if x\ne 0 then \langle x,x\rangle>0 \langle x,0\rangle=\langle 0,x\rangle=0 \langle x,x\rangle=0 if and only if x=0 \langle x,ay+bz\rangle=a\langle x,y\rangle+b\langle x,z\rangle \langle x+y,x+y\rangle=\langle x,x\rangle+2\langle x,y\rangle+\langle y,y\rangle

0 views
Evan Hahn Yesterday

Prefer STRICT tables in SQLite

In short: I prefer strict tables in SQLite because they avoid some datatype problems, such as putting text in number columns. SQLite has a feature that I think is underrated: strict tables . Strict tables help enforce rigid typing, preventing mistakes like putting text into integer columns. I like them, and wrote this post to promote their use! To make a strict table, add to the end of its definition. Like this: That’s it! But what does it do? Broadly, strict tables help enforce rigid types, like other SQL engines do. Most significantly, strict tables keep you from inserting the wrong type into a column. For example, SQLite normally lets you put text into an column, but not with strict tables. Personally, I think it’s a mistake to try to put text in an integer column, or vice-versa. I don’t want SQLite to let me make this error! The same validation happens for s, too. Notably, if a value can be losslessly converted, it will still be accepted. For example, the string can be perfectly converted to an integer, so it’s allowed. These two lines are equivalent, even for a strict table: By default, you can create columns with bogus types. For example, all of these work even though they aren’t valid SQLite datatypes: I think these aren’t what the developer intended. Some of these are typos, some of them are misunderstandings of which datatypes SQLite supports , and some are egregious mistakes. Appending to any of these statements makes them error. In my opinion, that’s the correct behavior! Only , , , , , and are allowed. Strict tables also require a column type, so you can’t do . If you still need a column to be flexible, you can use the datatype. As the name suggests, it allows anything—even in a strict table. I haven’t found a use for this, but maybe you will! I prefer strict tables but I must share a few cons. Not everything is better! I think it’s best to use strictness from the start, but that’s not always possible. Unfortunately, I don’t think there’s a way to a table to make it strict. I think you have to copy the data out of the non-strict table into the strict one. Something like this: Note that this could be tricky if the non-strict table has invalid data! For example, if the old data accidentally contains text in an integer column, you’ll get errors when doing the migration. You’ll probably need to clean the data or cast it . You could make a rule for your codebase that all new tables are strict. That might be useful—at least some of your tables are valid! But it might also mean you have inconsistent validation across your tables, which might be more surprising than having weak validation on all tables. It’s up to you to decide whether this is a good fit for you. SQLite has a whole page called “The Advantages Of Flexible Typing” , where they argue that SQLite’s flexible behavior is good, actually. I hesitate to wade into the controversy of static-versus-dynamic, but I disagree in most cases. I’ve personally encountered many bugs where an unexpected data type caused subtle headaches. I’d much rather these mistakes explode loudly. But it’s worth noting that SQLite’s developers seem not to share my preference for strict tables! They point out a few good uses for flexible tables, such as “a pure key-value store” or “a place to store miscellaneous attributes” of different types. They also mention that you might want to keep the invalid data in some cases, like if you’re directly importing a messy CSV and don’t want to lose any data. I still prefer strict tables, but acknowledge there are some reasonable cases for non-strict ones. (There’s also at least one comment in the SQLite source that calls non-strict tables “legacy” , but I trust that less than the official documentation.) SQLite introduced strict tables in version 3.37.0 , released November 2021. If you’re on an older version of SQLite, you can’t use strict tables. It’s worth noting that old versions of SQLite can’t read databases with strict tables. For example, if you create a strict table in the newest version of SQLite and then try to read that database in SQLite 3.36.0 (before strict tables were added), you’ll get an error—even if the strict table is already in the database. Strict tables are theoretically slower because they have to do a little extra work. For example, they check datatypes when doing an insert or update . But in practice, I don’t think this is an issue. I wrote a hacky script that inserted millions of rows into a table with 100 columns, and there was no obvious difference on multiple machines I tried. The file size on disk was also the same. I didn’t test this thoroughly, so maybe there’s something I missed, but I don’t think strict tables present a performance problem. In fact, one might expect better performance because you won’t be accidentally mismatching SQLite’s column affinities. But again, I haven’t tested this. Personally, I think the pros of strict tables outweigh the cons. I generally prefer when types are rigidly enforced. It squashes a class of mistakes, and help enforce good data integrity. They’re not a panacea, but they’re usually easy to add and go a long way. If there’s a SQLite feature you think is underrated, please tell me .

0 views
Sean Goedecke Yesterday

In defense of not understanding your codebase

As a software engineer, how well do you have to understand your own codebase? My guess is that people who work on small codebases with low-turnover teams (say, Redis or games like The Witness ) would say “obviously you have to understand it completely, otherwise you can’t do good work”. I’d also guess that people who work on large codebases with high-turnover teams (say, the Google web search backend or GitHub) would say “obviously you can’t understand it completely, you just have to do the best you can in your local area”. These are two largely different ways of programming with different methods, practices and cultures 1 . However, the first group is over-represented in online discussion about software engineering 2 . I want to defend the second group against the first. In many software engineering environments, there’s nothing wrong with being in a state of partial understanding. In fact, in large systems a partial understanding is the best you can do. The best articulation of the “you have to understand your codebase” side is Peter Naur’s famous paper Programming as Theory Building . I like this paper, but I think it goes too far in that direction. Naur’s core point is that when programmers work on a program, the code is really just a by-product, and the main product they’re working on is their “theory of the program”. That’s made up of their intuitive sense of what’s happening and why, which can only be partially captured by code or documentation. If they lost the code, they could rewrite the program easily. If they lost their understanding (say, if the team experienced 100% turnover), they would struggle to make sense of the code. So far, so good, but Naur goes further than this. He says that the theory should not be reconstructed from the code. According to Naur, you’re better off scrapping the program entirely and having a new team rebuild it from scratch , building up a new theory in the process 3 : reestablishing the theory of a program merely from the documentation, is strictly impossible … [therefore] the existing program text should be discarded and the new-formed programmer team should be given the opportunity to solve the given problem afresh Anyone who’s been an effective software engineer at a large company knows that Naur is dead wrong about this. There are at least two reasons. First, you simply can’t rebuild large software systems from scratch . Sufficiently large systems (if they have users) contain thousands of weird cases and quirks that cannot be reimplemented. Even a team that’s intimately familiar with the system couldn’t do it: there’s just too much stuff to juggle. Successful rewrites always start by carving out the existing codebase into small isolated chunks, then rewriting one chunk at a time. In other words, rewriting a software system involves making a bunch of changes to the old system. If you can’t change the old system, you certainly can’t replace it with a new one. Second, abandoned systems are revived all the time . In a tech company with hundreds of millions of lines of code and thousands of engineers, it’s not uncommon for a codebase to have nobody left who’s familiar with it 4 . All it takes is a few people to quit at the wrong time, or for a codebase to be unmaintained for a year. Not only have I seen other teams do this, I have personally taken ownership of abandoned codebases, figured them out, and gotten to a point where I could effectively work with them. It takes time, but building a new theory of the codebase is possible. You start by understanding one flow end-to-end, then slowly branch out from there, making careful changes as you go. In sufficiently large codebases, everyone operates with an incorrect theory of the program . The defining feature of modern software systems is that they’re just way too big for anyone (or even a whole team) to keep in their head: nobody understands it all . To be effective, you have to figure out a way to work with a merely partially-correct theory. This is why I keep going on about taking a position and confidence . If you’re not sure about something, you can’t just sit back and wait for someone with a perfect understanding to come and give you the answer. If you’re a competent engineer, that person is you . You have to grit your teeth, make your most educated guess, and then deal with the consequences. To be generous to Naur, it’s possible that in 1985 the average size of a program was several orders of magnitude smaller than today, and that when Naur writes about “large programs” he’s not talking about tens of millions of lines of code. Naur’s first example of a large program is a 200,000 line industrial monitoring program, and his second example is a compiler. In 1987, the first version of the compiler GCC was about a hundred thousand lines of code; in 2015 GCC was over fourteen million lines. I can believe that rewriting one or two hundred thousand lines of code is relatively straightforward, particularly if you get to reuse existing tests. Not so for one or two million. LLMs are often cited as a tool that’s bad because it impedes the ordinary process of theory-building. I think this is overly simplistic. Like many software tools, LLMs are a double-edged sword: they make it harder to construct a detailed mental theory of the software, but they allow you to build a partial theory quickly and they can help you leverage that partial theory more effectively. This is a complex tradeoff that I’m still thinking about. Setting LLMs aside, I’m confident that it’s silly to say that anything that interferes with your theory of the software must be bad. Here is a partial list of other things that make it harder to maintain a theory: Like most things in software, “maintaining a theory of the codebase” is one value among many. Sometimes it’s the most important value and you sacrifice other values for it; other times you trade it off for speed, or legal compliance, or for political reasons 5 . Almost all engineers — particularly “pure” engineers — prefer to maintain an accurate mental model of their software. It’s more fun, less stressful, and feels more like “real engineering”. That’s why many engineers take up open-source projects in their spare time in order to work on small codebases by themselves: in order to do engineering work where they can maintain an accurate Naur theory of the codebase. I don’t think there’s anything wrong with that. However, at work you are paid to do a job . In other words, they pay you money to adopt their set of engineering values. It’s hopefully well-understood that however much you might personally care about performance, sometimes you have to write slow code at your job (for instance, to get a project done on time, or to accommodate some awkward requirement). Maintaining a theory of the codebase is the same kind of thing. I wrote about this at length in Pure and impure software engineering . I think many of the repeated arguments we have in the software industry are caused by the pure total-understanding culture coming up against the impure partial-understanding culture. Open-source engineers are more excited to blog about their work, the raw engineering content is typically more impressive (because coordination problems dominate big proprietary systems), open-source projects can be legally written about while proprietary systems can’t, and even if you could do it legally, writing about large codebases is impossible because it requires too much specific context . I re-read the relevant chapters of Ryle’s The Concept of Mind (which Naur cites throughout) and I think Ryle is more generous about theory-building. For Ryle, theory-building or know-how automatically happens as you do things. It’s fully consistent with Ryle to think you can pick up an existing codebase just from the code, purely by puzzling it out. Naur says: “Lest this consequence may seem unreasonable, it may be noted that the need for revival of an entirely dead program probably will rarely arise, since it is hardly conceivable that the revival would be assigned to new programmers without at least some knowledge of the theory had by the original team.”. If only! Some engineers might say that maintaining a theory is the core value, because without it you can’t fulfill any of the others. I disagree. You could say the same thing about readability, or maintainability, or correctness, or a bunch of other engineering values. We trade off “core” values like this all the time. Other people being allowed to write code in your codebase Having to implement legally-required features like accessibility and data protection Allowing your colleagues to quit their jobs or move between teams Having to upgrade software versions for security patches Bringing in libraries or other dependencies I wrote about this at length in Pure and impure software engineering . I think many of the repeated arguments we have in the software industry are caused by the pure total-understanding culture coming up against the impure partial-understanding culture. ↩ Open-source engineers are more excited to blog about their work, the raw engineering content is typically more impressive (because coordination problems dominate big proprietary systems), open-source projects can be legally written about while proprietary systems can’t, and even if you could do it legally, writing about large codebases is impossible because it requires too much specific context . ↩ I re-read the relevant chapters of Ryle’s The Concept of Mind (which Naur cites throughout) and I think Ryle is more generous about theory-building. For Ryle, theory-building or know-how automatically happens as you do things. It’s fully consistent with Ryle to think you can pick up an existing codebase just from the code, purely by puzzling it out. ↩ Naur says: “Lest this consequence may seem unreasonable, it may be noted that the need for revival of an entirely dead program probably will rarely arise, since it is hardly conceivable that the revival would be assigned to new programmers without at least some knowledge of the theory had by the original team.”. If only! ↩ Some engineers might say that maintaining a theory is the core value, because without it you can’t fulfill any of the others. I disagree. You could say the same thing about readability, or maintainability, or correctness, or a bunch of other engineering values. We trade off “core” values like this all the time. ↩

0 views
Unsung Yesterday

“…or I could click seventy buttons.”

I like Angela Collier’s videos about physics and I was delighted to discover this 18-minute one … = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/yt1-play.1600w.avif" type="image/avif"> …because it’s a great continuation to the thread about the complexity of Microsoft Office I shared recently. Collier talks about why physicists prefer LaTeX to Word. LaTeX is sort of a nerdy HTML that predates HTML. It looks like this… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/1.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/or-i-could-click-seventy-buttons/2.1600w.avif" type="image/avif"> …and given how nerdy HTML already is, you might imagine this is a power-user tool that’s chiefly about power and control. But Collier makes the argument that there are some things that LaTeX makes much easier: This is really interesting because it goes right to the core of the uncomfortable truth: naïve design decisions meant to make things easier might achieve the opposite. I shared the ForkLift example where the team didn’t understand what made the previous version great , and more recently the animation that could slow people down . (Of course, there is also the issue of typographical craft of LaTeX documents set in Computer Modern , but let’s save this for another time.) Also, the video starts with Collier apologizing for potentially making the audience feel dumb in a prior video. I don’t think it’s a joke, and I found it thoughtful and refreshing. #attention #complexity #enshittification #flow #youtube there is absolutely no need (or peer pressure) to spend time styling the document by choosing fonts, colors, etc., there is no “live preview,” and making a PDF is a separate step similar to compilation in coding – which means it doesn’t constantly occupy your mind, GUIs can slow you down because the keyboard is faster than the mouse, LaTeX doesn’t give you a lot of control over positioning, which is better than giving you only a semblance of control over positioning ( this is the TikTok meme Collier alluded to briefly ).

0 views
Giles's blog Yesterday

Building intuition about LLM parameter counts

When I was building my GPT-2 implementation in JAX , I started with just token embeddings for the input, and a separate output head (as I was not using weight tying ). It wasn't an LLM -- no Transformer blocks, no attention, no feed-forward networks. I was somewhat surprised when I noticed that even that stripped-down model had 77 million parameters with the "small" settings I was using to train -- specifically, an embedding dimension of 768. However, I realised I shouldn't be -- with a vocab size of 50,257, each of those components is essentially a 768 × 50 , 257 matrix, and that is indeed over 38 million numbers. But the finished LLM at the end of the project was only 163 million parameters -- that meant that the input and output components alone were almost half of it. That felt like a surprisingly large percentage. I had a similar shock when I was first looking into the feed-forward network , and realised that it had roughly twice as many parameters as the attention layers. When we learn about the internals of LLMs, a lot of the focus is on the attention mechanism. This makes sense -- it's the hardest part to get your head around. The rest of the setup, at least for simple GPT-2 type models, is fairly standard stuff. But that means that it is easy to overestimate how much of the total parameter count of the model attention uses up -- especially for smaller models, where the token embeddings and the output head are so large in comparison to the Transformer layers that make up the actual body of the LLM. OpenAI released GPT 5.6 today, so I decided to take its "Sol" variant for a ride in Codex and asked it to write a visualiser . It shows breakdowns of how the parameters are split between embeddings, attention, the FFNs, and the output head for different sizes of GPT-2 models (or your own custom settings with the same architecture), and you can also add/remove weight tying and QKV bias. It did a really good job -- check it out! Here's a screenshot of what it showed for GPT-2 small without weight tying. It's well worth a play. In particular, it's interesting to see what happens as the number of tokens in the vocab gets very large (many modern models have hundreds of thousands). You can very easily create a "tiny" model which is almost entirely embeddings and the output head.

0 views
Allen Pike Yesterday

The Persistent Gravity of Cross Platform

This week’s discussion of the ChatGPT app and its move to Electron merits a link to my evergreen article The Persistent Gravity of Cross Platform : At the highest level, cross-platform UI technologies prioritize coordinated featurefulness over polished simplicity. I’ve added a coda to that article about how coding agents actually strengthen the argument for Electron on large teams, at least for now. The initial release of the new ChatGPT app has been clumsy – there’s a lot of work to do to get Electron ChatGPT (née Codex) as polished as it should be. But, like it or not, cross-platform code is the least-bad way to coordinate a massive team on a rapidly changing product.

0 views
Karboosx Yesterday

How to Create Your Own Decentralized Messenger Protocol

Ever wondered how to build a decentralized messenger without any central servers? It's all about federation - just like email! In this post, I'll show you how to design a simple protocol from scratch, from server discovery using .well-known files to handling end-to-end encryption.

0 views

Premium: The Hater's Guide To The Memory Crisis

Hi premium readers! I’ll be taking a week off of the premium next week — July 17 — to have some well-earned rest. This will mark only the second time I’ve missed a premium piece since I started this newsletter in June 2025, and I hope you’ll forgive me for the (short) break. Don’t worry. Today’s piece is also an absolute banger. Everything’s more expensive, and it’s all AI’s fault. It really is that simple.  An AI data center is full of servers, which are in turn full of (for the most part) NVIDIA GPUs. Each NVIDIA GB300 has two B300 GPUs, the two of which have 576GB of High Bandwidth Memory (HBM, or HBM3e to be specific), and a CPU, which has 480GB of lower-power LPDDR5X RAM (the kind usually used in cellphones and other mobile devices). These systems tend to be sold in an NVL72 rack with 18 compute trays, bringing us to 36 GB300s , for a total of 20.7 terabytes of HBM and 17 terabytes of LPDDR5X RAM, and that’s before you get to the RAM associated with the high-speed networking gear and other associated components. Analyst estimates have the cost of the high bandwidth memory of a single NVL72 GB300 at around $15.27 per gigabyte, for a total of around $316,000 of HBM, and while I can’t seem to find a stable source for pricing around LPDDR5X, I think a fair estimate is around $4 per gigabyte based on this piece , so around $68,000 worth per NVL72 rack. At around 150kW of power draw per NVL72 , a 1GW data center (with 740MW of critical IT load) would have around 4,933 NVL7s racks — for a total of $ 1.894 billion in HBM and LPDDR5X costs, or around $2.559 million of HBM and LPDDR5X RAM per megawatt of IT load.  Oh, and each of these NVL72s can hold as much as a petabyte of expensive solid state storage, costing an additional tens of thousands of dollars.  Because HBM takes up more space on a wafer — the slice of semiconductor material that is etched using photolithography ( read: molten tin ) and then cut into separate dies (individual chips) — and generally has much higher margins (thanks to the triopoly of Samsung, SK Hynix and Micron), memory manufacturers are dedicating more space on their manufacturing lines to it than to regular consumer RAM, which allows (thanks to said triopoly) said manufacturers to charge effectively whatever they want for consumer RAM. And thanks to AI — to quote Tom’s Hardware and Counterpoint Research — NVIDIA is buying that LPDDR5X RAM at the scale of an Apple or a Samsung: The net result is pretty simple: every single consumer electronic of any kind is getting more expensive. Valve’s Steam Machine console debuted at a 30% higher price point than planned , Apple hiked the prices of its MacBooks and iPads and will likely have to do the same for its next iPhone . Nintendo , Microsoft and Sony increased the cost of their consoles, and the PS5 and Xbox Series now cost more today than they did when they first retailed, almost six years ago.  On the Android front, Samsung has bumped the price of its Galaxy smartphones , and manufacturers in this space (which tends to have smaller margins than those enjoyed by Apple) are likely to limit the number of new devices shipping with 16GB of RAM, as well as re-introduce models with 4GB of RAM   .  Meanwhile, memory manufacturers are having record quarters, with Micron’s revenue quadrupling year-over-year in Q3 2026 and its gross margin improving by ten percent (from 74.9% to 84.9%) quarter-over-quarter, and Samsung’s profits growing from $38 billion to $59 billion quarter-over-quarter thanks to the spiralling cost of revenue caused by…well…the companies setting the price of memory at whatever they’d like. This is a problem caused by the fact that these three companies — SK Hynix, Micron and Samsung — produce more than 90% of the world’s RAM, which is why there’s a price fixing lawsuit against them , per Polygon: To be clear, HBM is more expensive to make than regular RAM, and takes up significantly more space ( about 4x more ) on the wafer, but because of the incredible demand for AI servers, Samsung, SK Hynix, and Micron can charge effectively whatever they want for it, much like they are for the regular RAM that’s in short supply. The same is becoming increasingly true for the solid state storage that these companies (and others like Sandisk) sell too. Now, you may think it’s a little rich to suggest that memory manufacturers are colluding to rig their prices, perhaps a little judgmental , and you’d be wrong because they’ve done it before. Quoting Polygon again : To be clear, I am not saying — nor can I prove — that there is any kind of price-fixing or collusion going on. Nevertheless, there are three companies that effectively make all the world’s RAM, all raising prices at the same time, all seeing record profits, all riding high at a time when everybody else is suffering as a direct result.  The Wall Street Journal put it best : What makes this particular memory crisis so distinctly dangerous is that it isn’t a result of consumer demand so much as it is capital expenditures from very large companies making bets that don’t connect with reality.   Microsoft, Google, Amazon, and Meta aren’t spending $765 billion in capex in 2026 because of rapid demand by consumers for AI services, but a desperation caused by a lack of hypergrowth ideas , circular financing with Anthropic and OpenAI , and a vague concern that if they stop spending that the other guy will do something as a result. As I discussed earlier in the week , nobody can make a compelling case for building more data centers other than “we must do so, because of AI.” Nobody is having trouble accessing ChatGPT, Claude or another major AI service because of a lack of compute, outside of Anthropic and OpenAI’s continual rapacious hunger for more compute that doesn’t ever seem to involve them turning away business. While price increases generally help moderate demand for goods or services, none of that matters when you have four companies willing to spend a trillion dollars a year on the off chance that they might get something out of it .  As a result, Micron, Samsung, and SK Hynix can charge effectively as much as they want, and NVIDIA and others building black holes for AI capex can then pass those costs onto Microsoft, Google, Amazon, and Meta, who have given themselves a blank check to build whatever it is that they think will come out of the large language model era. Put another way, the capex spend of four of the largest companies of the world — all of whom are now funding their capex using debt — has now led to the single-largest increase in the price of consumer electronics in history, for the most part thanks to one company, NVIDIA, becoming the largest purchaser of HBM in the world because those four companies are buying so many GPUs.  To give you an idea of how bad that is, NVIDIA takes up roughly 65% of all high bandwidth memory, with the other 35% (mostly) going to specialist ASICs from Google and Amazon, and AMD’s Instinct line of AI GPUs.  This is a unique — and uniquely dangerous — bubble, because demand isn’t based on actual revenues or events happening outside of those in the imaginations of Sundar Pichai, Mark Zuckerberg, Andy Jassy and Satya Nadella. They didn’t start buying these GPUs because consumers demanded them. In fact, they did so without really checking whether consumers gave a shit, which is why I’m so worried about what comes next.  Only 23% of total DRAM wafers are taken up by HBM , but it’s accounting for a remarkable chunk of revenues, at least for SK Hynix, where it took up 40% of all DRAM sales back in Q3 2025 , the most-recent number I can get.  While I can’t find definitive numbers from Samsung or Micron, the situation is bad no matter which way you spin it. Either they’re increasingly-relying on HBM as a revenue driver to the point it’s crowding out the revenue from their other DRAM businesses (making them dependent on GPU and ASIC revenue), or their revenues are spiking because they’re able to crank up the cost of DRAM. This is setting everybody up for a dramatic and painful collapse, largely based on the strange nature of how memory is built and sold, unless cooler heads prevail and capex doesn’t accelerate based on hopium.  What happens when hyperscalers reduce their capex, or when banks stop issuing data center debt ? NVIDIA stops needing all that HBM, which means any and all capex dedicated to expanding manufacturing  infrastructure to produce more HBM — which is not particularly valuable outside of AI GPUs — will have been built to capture demand that doesn’t exist. While that capacity could be re-engineered to make useful DRAM with mass appeal, doing so will also drag down the profits of every memory manufacturer in the process, creating a supply glut the likes of which we’ve never seen in history.  The memory industry has gambled its financial future on the idea that there’s near-infinite amounts of capital available for data center capex, adjusting its supply chains and fabs to focus on scooping up demand that’s increasingly only made possible by the availability of debt. Microsoft, Google, Amazon and Meta have turned NVIDIA into a single point of failure for the entire tech industry, creating a painful present for consumers and a brutal future for suppliers, all because they decided to spend more than a trillion dollars on a dead end industry. The longer it takes for hyperscaler capex to retract, the more expensive everything becomes. The more GPUs that get sold, the more capacity that gets put toward high bandwidth memory, and the more that Micron, SK Hynix and Samsung can charge for it, which makes it more expensive to buy AI GPUs, which increases the amount that hyperscalers are spending on AI capex for effectively the same amount of gear. The longer that hyperscalers sustain this pace, the larger the return needs to be, and at this point, none of them have disclosed their AI revenues, which heavily suggests there’s yet to be a dollar of profit.  Yet the more they commit, the more committed they have to be. Pulling back at this point will prove to the markets that they’ve committed to too much capacity. Yet not pulling back means that hyperscalers will continue to turn their free cash flows negative in pursuit of an indeterminate goal. It’s a vicious cycle made worse by the fact that every spin of the capex wheel increases the price of just about every consumer electronic in the world , creating a market-wide inflation for what amounts to a speculative asset bubble. And If even one hyperscaler cuts their capex, the cartel-like memory industry is in for a nightmare scenario, one larger and uglier than any they’ve ever faced.  In the end, it all comes down to whose problem this high bandwidth memory becomes. Will SK Hynix, Samsung, and Micron have already built the RAM and face waves of cancellations, resulting in a bunch of fallow inventory it can’t use or sell? Or will they already have shipped it off to NVIDIA and ASIC builders, only for it to sit in warehouses waiting for the day it can finally be melted down? Who will end up holding the bag? The cartel of horrible fab-gargoyles, Jensen Huang’s Wallet Inspection Firm, one of the four simpleton hyperscalers, Broadcom, or one of the Taiwanese ODMs?  Just to be clear: everybody loses, unless the AI bubble continues in perpetuity. This is the Hater’s Guide To The Memory Crisis — and the terrible tale of the boom-and-bust memory industry.

0 views
Manuel Moreale 2 days ago

Downsizing

With the 150th interview of People and Blogs now live, it’s officially time to downsize my online presence again. My digital life follows a somewhat regular rhythm and I alternate through phases of expansion, where I buy domain names, ship new projects, start newsletters, and chase a million ideas, and phases of contraction, where everything happens in reverse: domains are left to expire, projects are archived, newsletters are deleted, services are cancelled. And my recent decoupling from the web was the beginning of one of these downsizing phases. The Dealgorithmed newsletter has been deleted; the domain is not going to be renewed, and it will expire later in the year. My From the Summit newsletter and my personal newsletter have been merged into a single new newsletter called “ Thoughts and Walks ”. If you were already subscribed to one of my newsletters, you can manage your preferences from the Buttondown’s Portal and decide what type of content you want to receive. I'll write a more in depth post about my plans for the newsletter. The only project that has survived the cut—aside from this blog—is blogroll.org, and that is not going anywhere anytime soon because there are things I want to add to that site. But more on that at a later time. Decluttering is fun! It's a nice mental exercise to delete stuff and become lighter again. Thank you for keeping RSS alive. You're awesome.

0 views
Unsung 2 days ago

The adjective of the present or the verb of the future

My arch nemesis lives only about 1.5 blocks away from me. It’s a coffee shop door. More specifically, it’s a sign on that door: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/1.1600w.avif" type="image/avif"> This is what happens with embarrassing regularity: I am inside, about to step out, my brain reads PUSH from the other side – and so of course, like an idiot, I push the door instead of pulling it. Sure, bad design. But don’t worry, I am not going full Don Norman on you. I wanted to show you this other thing, in Pixelmator Pro: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/2.1600w.avif" type="image/avif"> A pretty non-threatening menu, it seems, but sometimes when I see a treatment like this, my brain actually sees this… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/3.1600w.avif" type="image/avif"> …and it takes just a bit of extra thinking to figure out where I am and where I’m going. This is one of the recurring boolean problems in UX design. Given a choice, do we show the noun/​adjective of the present, or the verb of the future? Because another way would be to show the current state: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/4.1600w.avif" type="image/avif"> To me, this is unambiguous; the state is easy to understand visually without thinking, and the implied flip action also feels pretty natural. You could go even further: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/5.1600w.avif" type="image/avif"> Without knowing much of the context here, this would be my recommendation. Of course, this last configuration not only implies toggling but also implies showing , but that’s probably okay given all the context surrounding it? Now, like with many things I talk about here, I don’t have the benefit of user testing or research. (In practice, though, they aren’t often available for small things like this, anyway.) Also, this isn’t a universal recommendation. This is an evergreen UX problem for a reason. If there were other commands around it, the showing/​hiding verbs might have to appear. Same if no option had a checkmark by default. (One or two checkmarks establish an implied “show/​hide” verb for the whole section, but without any, it might feel like an unusual menu filled with only nouns.) There are more conventions – “Turn X On,” showing both options, submenus – each one with pros and cons. It’s good to be aware of all, because even if your tool uses one consistently, users might bring a different one as a default way of processing things. But the worst part about the Pixelmator menu is that it’s mixing conventions: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-adjective-of-the-present-or-the-verb-of-the-future/6.1600w.avif" type="image/avif"> It’s hard for me to understand the rationale here, and it makes processing this menu even harder. Maybe I need to go to a certain neighbourhood coffee shop to get more coffee… #interface design #writing

0 views
Stratechery 2 days ago

2026.28: XBOX On the Rocks

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 Asianometry video is on TOTO: From Toilets to E-Chucks . A Word from Mark Zuckerberg*.  I was delighted to see Ben insert himself into the CEO chair at Meta on Tuesday and write a script for Mark Zuckerberg as he tells the story of Meta and its AI investments in 2026. That article traces past Meta mistakes as well as those of investors who doubted the company, all to frame current investments in AI and the massive opportunities that remain central to the Meta’s future. A combination of history, analysis of the future, and fun, it’s a perfect summer read. As for a summer listen, we doubled back on all of it, plus Meta’s Muse-Spark release, for this week’s episode of Sharp Tech .  — Andrew Sharp Pulling the Plug on XBOX? It’s been years since there was good news coming out of the XBOX division at Microsoft and that trend continued this week, as XBOX CEO Asha Sharma announced plans to eliminate 3,200 jobs, or around 20% of its staff over the next 12 months. Wednesday’s Daily Update explores how Microsoft arrived at this point and why, in particular, the Game Pass initiative that was the last great hope for XBOX has been a failure. I’m not a gamer, but Ben’s rendering of the XBOX story — and the Game Pass story — is a great case study of both internet economics and management mistakes (and analyst ones!). — AS Toilet Talk . Look, I get that’s a little weird, but if there is one brand of household appliances that I cannot imagine living without, it is in the bathroom. Specifically, I absolutely love my Toto toilet, and was delighted that Jon made a video about the company on Asianometry . Here’s the twist: the reason why Toto is a subject of interest isn’t their toilets, but rather the fact the Japanese company also plays a critical role in the AI supply chain. — Ben Thompson A Script for Mark Zuckerberg — A script for what Mark Zuckerberg should say on Meta’s next earnings call. XBOX Cuts; Bundling and the Internet Solvent; Transaction, Coordination, and Sunk Costs — Microsoft’s Xbox division is conducting big layoffs, as the company deals with abject failure of its Game Pass strategy. Muse Image, Grok 4.5, Alex Karp on CNBC — The battle for verifiable data is increasingly defining the AI race, from Meta to Grok to the frontier labs. Online Insanity and Its Counterpoint — What we can and can’t achieve in response to paranoia and extremism online. The New ChatGPT App The Debt-Fueled Collapse of China’s Top Machine Tool Maker RCA and the Vacuum Tube’s Last Stand A Missile Test and New PLA Generals; The CITIC Plane Crash; America’s Taiwan Interests; Guo Wengui Jailed and Ezra Jin Released A Tale of Two Cities and Jaylen Brown, Minnesota’s Bet on LaMelo, Peterson Arrives and Mitchell Cashes Out Meta and Its Messaging Problem, The XBOX Reset, Q&A on Token Costs, American Soccer, Starlink in Nature

0 views
David Bushell 2 days ago

Astro is fine I guess

When I’m not fighting WordPress I deliver static HTML or the occasional JavaScript framework integration. For personal projects I have ‘fun’ with my own static site generator . This week was a side quest (soon to be main quest) to build my new company website. We’re talking proper business here so I can’t be messing about. I figured an off the shelf SSG would be most suitable. I asked the socials, “ 11ty or Astro ?” Both are popular but Astro had the edge. I gave Astro an early spin back in 2022 and found it slow . Maybe it’s good now? I ran with minimum release age to avoid immediately getting pwned . I selected Astro’s “Use minimal (empty) template” option and it generated both an and file — are you f — deep breaths, don’t fall for the rage bait. I code in a modern editor so I installed the recommended Astro extension. At first I struggled with Zed recognising HTML. I discovered a restart temporarily fixed the issue, but I guess I restarted one time too many because now the Astro LSP is completely broken. No modern comforts for me then. At least I can look at HTML without the red squigglies. I know what you’re going to say, “Dave bro, you’re inflicting this pain upon yourself! Just write HTML!” And I should. I just want native no-framework HTML includes , you know? Can you imagine the civilisation we’d live in if that could happen? I persevered and got my templates built with minimal fuss. I added a markdown collection and got the blog part blogging. It’s obvious that people use Astro to build real websites because all my “how do I” questions had an answer in the documentation. I’ve been forced to deploy way too many “React spaces” in my templates because Astro’s whitespace treatment is a mystery. I don’t need many components so I haven’t gone deep on Astro vs JSX . My site has zero JavaScript on the front-end. I plan to keep it that way. Edit: Christian Niklas on Mastodon shared a link to a recent Astro update where they added a option that defaults to no longer “following HTML rules.” Umm… okay. Set this to or if you’re building a website? I set it to . Minifying whitespace is over-optimisation. Astro has got the job done, despite the developer experience being broken out of the box. I dread to think what graveyard of dotfiles is installed if I choose a non-minimal start. I can easily de-Astro my templates should I need to. Right now Astro is solving the right problems and the issues are but a nuisance. Final conclusion: Astro is fine I guess. I’m not convinced Cloudflare’s acquisition is a good thing, considering their record for performative slop. I’ve lost my enthusiasm for DX and tooling to be honest. Even my own SSG experiments are collecting dust. I’d call the ecosystem a lost cause if I was being dramatic. I just try to avoid the worst of it and care about the end product: shipping a damn fine website! Which I can’t do because I’ve got more businessing to business before this particular site sets sail. Maybe in a few months? It’s looking awesome on though. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views
Jeff Geerling 2 days ago

QuadRF can spot drones and see WiFi through my wall

The QuadRF (pictured above) a phased-array radio built around a Raspberry Pi 5 and an FPGA board with picosecond-level timing. It does advanced signal processing and beamforming. It can see WiFi through walls and track drones in flight. If the open source community can come up with something like this, just imagine what governments are capable of. When you plug a computer into a network, tools like Wireshark can show all the hidden traffic you might not even know is there. WiFi packets are the same, but those travel through the air, allowing snooping without physical access.

0 views
Kev Quirk 2 days ago

A Rant About Modern Cars

I recently bought a new Peugeot and the experience of getting setup on their online platform has been painful to say the least. Yesterday I picked up my shiny new (to me) Peugeot E-3008 GT. It's a beautiful car with lots of bells, whistles, and toys. I had my little MG EV for around 2.5 years, and it served me well, but I wanted something bigger, with more range. So I opted for the Peugeot. Anyway, since this is a modern car, it no longer comes with an owner's manual. Instead you need to install an app and read the manual there. So I did that and duly signed up for a Peugeot Connect account - all standard procedure in this internet age we find ourselves in. That was until it came to generating a password. I did my usual and generated a 30 character, complicated password with Bitwarden , only to be greeted with this ridiculous password complexity error: So my 30 character , random string password is apparently weak and the only way to make it secure is reduce it's length (and complexity) by ~50%. Not only that, I had to abide by a slew of other arbitrary rules along the way. I tried to generate a 16 character PW with Bitwarden a couple times, but the error persisted. So I ended up jumping over to Gemini, pasting the requirements in, and asking it to give me a password. Being the sycophantic AI that it is, it spat out a password that conformed to Peugeot's ridiculous rules. Or so I thought... OK, so the password Gemini generated for me was . Let's see how it stacks up to the requirements: So why the fuck is the password still being rejected as too weak ? I assume it's poor wording on Peugeot's part, but I ended up just typing gobbledegook into the field until it passed. Interestingly, also passed and was reported as a "very strong" password: For the record, is NOT a very strong password. Don't use that. Ever. I'm astonished that this is still an issue in 2026. Why on earth can't manufacturers get this simple shit right? It's basic stuff. All you're doing here is forcing people to use shitty passwords. I finally got into my bloody Peugeot account and tried to enable to Connect features so I can do things like control air-con from the app, only to find that it costs £90 (~$120) per year! This isn't a piece of hardware that I'm paying for. It's literally £90/year for a switch to be flipped in some software. Utter. Fucking. Robbery. Peugeot, you should be ashamed of yourselves. Aside from this, the new car is lovely. 🙃 Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment . 8-16 characters ✅ An uppercase letter ✅ A lowercase letter ✅ A special character from the list ✅ No sequential characters ✅

0 views