Latest Posts (20 found)

Shin honkaku

Shin honkaku is a sub-genre of Japanese detection fiction — and my new obsession! I’ve even designed my own book cover, scroll down to see… “Shin honkaku” translates to “new orthodox” and pays homage to classic western authors of the early 20th century such as Poe, Queen, Van Dine, Carr, Christie, and Conan Doyle. All of whom are often referenced by the fictional detectives within shin honkaku books. The genre began in the 1980’s. As the name implies, it’s a return to the roots of mystery fiction. There is a deliberate emphasis on “fair play” allowing the reader every chance to solve the mystery. Prior to shin honkaku, Japanese detective fiction had a seedy reputation. Sōji Shimada writes in the foreword to The Moai Island Puzzle : In the 1920s, when Edogawa Rampo imported the Edgar Allan Poe-Arthur Conan Doyle style of mystery novel which started in the West, and new Japanese writers gathered to solidify the form of this new genre, the scientific revolution which had given birth to the detective novel had not yet arrived in Japan. In the absence of scientific inspiration, Rampo turned to the grotesque haunted house attractions of the Edo period (1603-1868). Eventually, Rampo’s followers started going too far, even introducing the pornographic tendencies of Edo period entertainment fiction into their novels. Foreword to The Moai Island Puzzle (Alice Arisugawa, 2016) - Sōji Shimada This effectively killed mainstream interest in mystery fiction, as Shimada continues: As a consequence, Japanese mystery authors were looked at with contempt by authors of pure literature at the time, purely because of the vulgarity which offended their morals. Hence the belief that mystery fiction was just lowbrow entertainment found its way into Japan’s literary world, as well as with the readers. It is Sōji Shimada himself who is often credited with the revival. Shimada’s debut novel The Tokyo Zodiac Murders (1981) is considered one of the best. It’s certainly my favourite! Somewhat ironically, it was shortlisted for the Edogawa Rampo Prize. This book was where I discovered the shin honkaku genre. If you follow my notes blog you’ll have read my short summary: The story itself is terrifyingly gruesome. The mystery behind who committed the murders is a seemingly impossible series of events with a deceptively original explanation. After re-reading the details more than once I “solved” the mystery. At least, I got the gist of how things happened and arrived at the correct name(s). The exact explanation is far more elegant than I pieced together myself. Note for Mon 31 Aug 2026 - David Bushell Since reading Sōji Shimada’s two translated books, I’ve read Yukito Ayatsuji , Alice Arisugawa , Keigo Higashino , and Seishi Yokomizo (older honkaku, but worthwhile.) The stories are short relative to my usual epic sci-fi/fantasy tomes. I suspect my perspective on typical novel length has been warped. If you’re a fan of puzzle games, this genre will be your cup of tea. The books often include dramatis personae and illustrations for reference. And red herrings, of course. So many red herrings! Back when I studied design I created a series of space opera paperback covers. This project was a significant part of my graphic design bachelor’s degree. The brief was also a “competition” ( cough — exploitative spec work — cough ) that could have seen my designs become a limited print run. An insider said I was shortlisted to win, but my printing techniques were not financially viable. Although in hindsight maybe they were being kind… either way, the winning designs were very nice indeed. Inspired by my new obsession for shin honkaku, I dusted off the ol’ image editor and whipped up a design mock-up for The Tokyo Zodiac Murders . For a quick weekend project, I’m very pleased! I would love to tighten up this design and create a full series of shin honkaku books. I forget the rules and limitations of book design, maybe I’ve committed a fatal folly? Doesn’t matter! It’s a concept. Early in my career I went from graphic designer, to web designer, to front-end web specialist. It’s nice to go back to where it all began. Still got it! I would welcome book suggestions in you’re familiar with shin honkaku. I fear I may exhaust the available English translations. I used the following resources in my design: The Tokyo Zodiac Murders was written by Sōji Shimada in 1981. I read the English translation by Ross Mackenzie & Shika Mackenzie published by Pushkin Vertigo who have a great collection of designs for other crime authors. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds. Cry Wolf font by Hanoded (licensed) Hina Mincho font by Satsuyako (Google Fonts) Zodiac sign icons by Chaiconator from Noun Project (CC BY 3.0) Shoe print by rasendria from Noun Project (CC BY 3.0) Perfect-bound paperback book mockup (free)

0 views

book club: kiss of the spider woman by manuel puig

In the Grizzly Gazette book club, we've voted on reading Kiss of the Spider Woman by Manuel Puig next, suggested by Psycheoma . We kinda lost sight of the book club and posting it in time :p I've struggled with reading fiction for a while now; I manage to squeeze some in here and there, like when I read The Dispossessed 3 years ago and loved it, but most of the books I own and end up finishing are non-fiction. It wasn't always this way, especially as a child, but the older I got, the more I felt pressured to read things that had an obvious "return of investment". Fiction can teach you a lot in unexpected ways, but you never know whether it will just be a nice story for you, or something that makes you think of life, society or yourself differently, and in which ways that will be. You have to start reading and trust the process, just enjoying it for what it is, and let it give you whatever it ends up being, even when it is not life-changing or improving on anything. Meanwhile, buying a book specifically about a specific topic/field or an autobiography immediately tells you upfront what you can expect and what you'll be taught, no surprises. Having read it carries the promise of improving in that area or at least having valuable knowledge. I like that predictability and usefulness, and I am a very impatient person with a tough schedule at times, so I am unfortunately obsessed with not wasting my time. After all these years of barely any fiction reading, I've become lazy and inflexible. It's now so, so hard for me to give books a chance without knowing definitively if I'll enjoy them and what I'll take away from them. Non-fiction is easy for me to read because I already have a reason to care: Me. I'll relate it all back to me, and my interests, what I already know, or who or what I want to be. Anything that is not relevant or interesting to me can be disregarded in self help. Fiction challenges that, because the beginning of a book will just present me with characters that do not yet give me a reason to care. I don't know them, I don't know anything about them yet, and I cannot relate them back to me. I'll have to sit there patiently until everything is slowly revealed and the characters become more than random names on a page, and may be completely unlike me. That isn't easy for me, but I'd like to change. I went in completely blind. I had not looked up anything about it and had no idea what to expect. The narrative style (a dialogue without names showing who says what, but it becomes apparent when you continue reading and see how they refer to each other) is definitely a surprise and took me a while to detect and get used to, but then it is fairly easy to read and understand. I was done with it after 2 days, in which I read for about 4-5 hours in the morning. The book released in 1976 centers two prisoners in Buenos Aires in 1975, one a trans woman referred to as Molina (her last name), the other a man named Valentín. While Molina is incarcerated for "corrupting a minor", Valentín is a political prisoner because of his involvement with a revolutionary group. The story is told through their dialogue, which is mostly Molina describing movie plots to Valentín, many of them centering on romance and having real life equivalents. Through discussing the movies, they occasionally reveal things about their outside life or themselves. Later on, the story continues through written reports by a third party. Molina's gender is mostly not acknowledged; she repeatedly states she sees herself as a woman and is not a man, yet the prison system and even Valentín continue to misgender her and simply see her as a homosexual man. Even the English Wikipedia page makes no mention of it. (Spoilers ahead) After about half of the book, it gets revealed that Molina is in this cell together with Valentín because she is cooperating with the prison on getting more information out of him so they can arrest more members of the group. Her meetings with the warden are covered up by getting groceries and pretending they were brought by her mother and lawyer, and her incentive is an early pardon. While everyone involved seems to not (fully) acknowledge Molina as a woman, they are absolutely aware that she is queer, to them an effeminate gay man, and use what they associate with that femininity to their own gain. And Molina indeed fits the bill: A caring and romantic person who wants to be liked, wants to help people and build a bond. She helps Valentín as he is sick from food that was intentionally tampered with to weaken him, makes him food and tea, even washes his stuff and gives him hers when he shits himself from it. She even has sex with him, seemingly consensual. It reminded me a lot of the practice of V-coding , which is the common practice of placing trans women in the same prison cell as male inmates to placate them. The idea is that by getting to rape the trans woman, he'd become calmer and more docile. It's absolutely horrible. While in this book, Molina apparently wasn't raped and wasn't just placed there to calm down an aggressor, she nonetheless seems to have been used specifically for her femininity and willingness to have sex with men, in the hopes to break through the walls of a very closed-off man and get some intel. The warden and sergeant even toy with the idea to release Molina, orchestrate a fake admission by her and surveil her in the hopes that the revolutionary group would seek her out to get revenge, which would give them a chance to pounce. It's a great fictional, but sadly very realistic case showing how far the justice system was (and is) willing to go to abuse and endanger queer people if it helps their investigations. Molina seems to want to be a neutral party to all of this initially; telling the warden openly she's making no progress, but asking for extensions. She has become attached to Valentín, and who knows who else she could be matched up with? It could be worse. At the same time, she gets multiple chances to press him on his political contacts but chooses not to, even one time telling him that she'd like to hear anything else but the name of his comrades. She fears that they could interrogate her and she'd spill, both betraying him and painting a target on her back after her release. Slowly, she changes her mind, and Valentín convinces her to relay messages to his comrades once she is out, telling her who to call, where and how. He wants her to get involved with the group(s) too. Unfortunately, she gets surveilled for longer than Valentín said she could expect, and in ways she possibly failed to detect after a while. Thinking she was safe, she makes moves that make it obvious to surveillance that she is reaching out to the group and trying to get picked up by them. Sadly, at one final attempt (which already seemed decently hopeless and dangerous to Molina, as she already withdrew all she could from her bank account and left it to her mum), she gets nabbed by agents just as members of the group drive by to kill her and wound an agent, likely to prevent her from spilling anything. It feels tragic, another trans woman killed, used as cannon fodder, used in the agenda of the men around her, just seeking for connection, love, a bigger purpose. One can only hope she felt at peace as she died for a supposedly greater good. Meanwhile, Valentín is still in prison, getting tortured during interrogations. He thinks of both Marta, his love, and Molina, as his mind drifts off on a high dose of morphine in the infirmary, even mixing them up. He regrets what happened to Molina because of him. My wife asked me if it was a fun book. Kinda depends on the definition... I was interested in it enough that I was able to read it for hours on end. Was I truly excited or gripped, always expecting the next turn or twist soon? Mostly no, it was very predictable in the sense that the prison days would pass and another movie would be discussed; I think I was only glued to the paper when the surveillance reports came up, because I wanted to know how Molina would act - would she really follow his instructions, and what was her support network outside like? I wasn't laughing or crying either, I had no strong emotions, but it was nice to read, it kept me company, it filled my time in a way that didn't feel like a waste. It's not a book I would put on a list of recommendations, but if anyone was planning to read it or asking if it was any good, I'd encourage them to. Published 28 Sep, 2026

0 views

Leaving them behind

Quick note before we begin: this is the first of two posts I’m publishing today. You’re welcome to skip ahead to: Shin honkaku — it’s far more fun! I’ve waited long enough! I’ve entertained one “wait six months” too many! The TL;DR for my updated AI policy has changed: The absolute vileness of the AI industrial complex knows no bounds. Beyond morality — because let’s be honest few care — it’s very simple: There is no worthwhile career in AI- anything . Simple as that. The AI industry is designed to dehumanise and commoditise labour. Everyone who has dedicated their life to token servitude has become a dull fungible meat proxy. The software and web development industries are leading this brain drain. I’ve observed devs go from the giddy thrills of gambling with their employer’s tokens, to the depressing realisation that they’ve been fooled by a small group of grifters and influencers. So many developers are giving up. Many have literally left the industry unable to find meaningful employment. Many more have figuratively quiet-quit. They clock in to babysit chatbots with no incentive to care about the output beyond quantity. I’m done pretending there is any hope for the AI industry to redeem itself. I’m moving on to more interesting things. Barring a monumental power shift, collapse of the industrial complex, and rise in free range grass-fed “local AI” (lol) I won’t be looking back. Wake me up if anything changes! What does that mean, practically? First and foremost I will continue to build websites for real people . I set up shop as a limited company after a decade of freelancing to bolster my commitment. I will observe the AI industrial complex cautiously from afar, but I won’t allow the bullshit I see to rage-bait me. There will be times I’m obliged to call out egregious insults to my profession . Otherwise, I’ll strive to ignore the echo chamber to protect my mental health. I am distancing myself from peers I once respected who are lost to chatbot psychosis. It is not my task to help them. I have no interest in anyone wilfully funding billionaires’ fantasies. There are new people to meet who respect humanity. I feel happier about my future now. There is no longer any lingering doubt. The perpetual tech circus may be a threat to my patience and sanity but it won’t take my career. So to immediately move on to more interesting things: my latest obsession is shin honkaku detective fiction! I’d highly recommend The Tokyo Zodiac Murders by Sōji Shimada , and The Moai Island Puzzle by Alice Arisugawa — both satisfying reads. Read part two of today’s double feature: Shin honkaku! Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views

I Switched to Brave Browser

I've been whinging about wanting to move away from Firefox for nearly a year now. It started with Mozilla's announcement about their AI strategy and my initial thoughts . Then they doubled-down and it raised my heckles even more . Then I had a long old whinge about how fucked they seem to be. I took Vivaldi for a spin , but I couldn't get used to it. It just tries to do too much, and has way too much going on with the UI, and dark/light theme switching still doesn't work despite it apparently being fixed. So I made my peace with Firefox and stuck with it. I kept Vivaldi on my machine as a backup, and over the last 6 months or so, I've found myself having to open it more and more due to something not working in Firefox. This was far from a daily occurrence, but it happened often enough for it to become annoying. But I still couldn't use Vivaldi full time. It's worth stating that things not working isn't the fault of Firefox. It's developers not testing their web apps with Firefox, since it has such a small market share. I decided to install Brave a couple months ago just to see how things went. I had some messing around to do up front, like hiding all the crypto and AI nonsense, but once that was gone, it's been fine. Everything works how I expect, both on Ubuntu and Android. The UI is similar to Firefox, and most importantly, it doesn't try to boil the ocean. I renders webpages, then gets out of my way. I don't need it to check RSS feeds, or emails, or have toolbars on every edge of the screen. Even dark mode switching works! I haven't felt the need to open Firefox since starting this exeperiment, so I think Brave is gonna stick. Yes yes yes. Brave was founded by an absolute scumbag . But there's scumbags everywhere, in all walks of life. Contrary to what some people on the internet will say, my use of Brave doesn't mean I agree with, or support, Bendan Eich's world views. I consider his personal views to be separate from Brave. You may disagree, and that's fine. But Brave is objectively a good piece of software that does what I need it to do, and does it well. So I'm gonna continue using it for the forseable future. If Firefox get their act together and become relevant again, I may jump back, but for now it will remain my secondary browser. I do still have Vivaldi installed too. So I will continue to check in on it now and then, and if I decide they're on a par with Brave on Linux (mainly light/dark theme switching is what's missing), then I'll definitely make the switch as I feel their moral compass is far more aligned with my own. 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

Arc’s good keyboard shortcuts

As someone who’s been a keyboard shortcut tzar at a few companies, I developed a certain kinship with the unknown and unnamed others who have the same job elsewhere. It’s a fun but weird challenge, rewarding and unrewarding at the same time, a job of maneuvering a little dinghy between the winds of Motor Memory, the waves of Change Management, and the storms of Shortcut Conventions That Came Before You. It’s a job where you quickly learn you can never really win – but at least you can try not to lose very badly. One day I’ll write about some of the proudest and darkest moments in my own keyboard shortcut design history, but today let me instead do a short “game recognize game” post. This one is about Arc, a browser that had at least three shortcuts I found myself nodding vigorously at. In Arc, ⌘S no longer does save, but instead invokes show/​hide sidebar. As far as I can tell, no common shortcut for hiding and showing a sidebar emerged over the last decades, and ⌘S feels like a mnemonically clever takeover of a traditional save shortcut (which in the context of the web doesn’t make sense ), and at the same time doesn’t conflict with a lot of web apps, which generally shy away from using it. Save still does exist, but it has been moved to ⌘⇧S. This historically has been Save As and that also makes sense to me, as you can’t really save a website, just its copy of sorts! Lastly, Arc’s internal screenshotting function is ⌘⇧2, right next door to the standard ⌘⇧3 . Nice.

0 views
iDiallo Today

Edge Is Pretending to Be Chrome

I don't think there was any official announcement, but I'm pretty sure Microsoft is secretly trying to trick you into using Edge. Well, it has always been trying to trick us, but this time it's even more aggressive. You can no longer tell Edge from Chrome. Just go ahead and try. Just last week, I wrote about Edge trying to get users to launch it automatically at boot time . Shortly after, I noticed that Chrome was asking for the exact same thing. Today, I clicked on the weather app on my Windows machine, and of course it opened Edge and asked me to set it as the default. I dismissed the popup and noticed that the website was pushed down from the top by another browser message, this one asking to transfer my data from my other browser to Edge. Bring your favorites, passwords, history, cookies and more from other browsers each time you browser in Microsoft Edge. I visited a few other pages and saw a bunch of ads, which reminded me to switch back to Chrome. I did, but I noticed something odd: when I tabbed between the two browsers, I couldn't tell which was which. Can you tell the difference I know they are both built on Chromium, but until fairly recently Edge had a distinct Microsoft look. It seems Microsoft is aggressively pursuing the fight for the front page of the internet. On my mobile device, I use the Outlook app for one of my email accounts. I noticed that when I click a link, instead of opening it directly in my browser, the app asks whether I want to open it with Microsoft Edge. Note that Edge isn't even installed on my device. Microsoft is trying every tactic in the book to get in front of the user. The front page of the internet is still the only race that matters for large tech companies. It doesn't matter whether your product is good or bad; your success largely depends on how many eyes you can get on your app. Google owns prime real estate. It is the default search engine on most desktop browsers. It is the default on all Android devices, with a negligible margin of error. It is the default on all iOS devices, for a cool $20 billion a year. And of course, it owns the largest ad network in the world. If Microsoft owned the front page today, it wouldn't be able to monetize it as well as Google does. It's one thing to own the front page; it's another to consolidate data from every branch of our web activity. For example, if I look up a product on YouTube on my TV, Google can later retarget me with an ad for that product while I'm reading an article on my iPhone. Microsoft has little to no presence on my iPhone. This mesh of front pages is what makes it worthwhile for Google to be the front page on every device. Even OpenAI has started tracking user web activity outside its own website in an effort to better monetize its position. Google continues to win even though its language models don't top the benchmarks and are often beaten by much smaller models. Meanwhile, Microsoft still doesn't have a model to its name, so it is trying to look enough like Google that people won't notice. Google Search and Bing Search play with the same theme. PS: It was a challenge to take screenshots for this post because half the time I didn't know which browser I was using. PS2: Edge makes it so hard to navigate between browsers because it puts each browser tab you open in its own ALT+TAB menu.

0 views
Unsung Today

A loading state within a loading state

One of the classic parables about loading goes as follows. A building manager had a problem: people were complaining about the elevator being too slow. But upgrading the elevator was an enormous expense, so the manager came with an alternative solution: they put a mirror next to the elevator call buttons. Even though the elevator didn’t become any faster, complaints trickled to a halt, as people were checking themselves out in the mirror and that changed their perception of how long the wait really was. In the late 1970s and early 1980s, it wasn’t uncommon to equip early home computers with audio tape players, using the same cassettes designed to record and play music. Software was encoded as sound. A lot of redundancy was needed to account for many low quality cassettes and misaligned playheads, so loading times were really long. There were other disadvantages – no random access but definitely random errors, tapes wearing out and being “eaten” by the player – but tapes were so much cheaper than floppy disks or cartridges that they endured. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/1.1600w.avif" type="image/avif"> On one of the computers, the British ZX Spectrum from 1982, an interesting convention emerged. As the game was arriving from the cassette, what was loaded before the code itself was its “title card.” The loading process of just this one image took about 35 seconds, and watching the graphic emerge was mesmerizing, almost like deciphering a puzzle – especially when, only toward the end, the color attributes appeared and the whole thing clicked into place: Some of these were beautifully done ( here’s a gallery of… all of them ?), created by talented artists working in a very unforgiving medium, a pleasure to watch materialize on the screen… …or, at least, it felt so for the first few encounters. Upon loading the game for the nth time, you grew more and more aware of the fact that you are spending precious time waiting to load a screen you’ve already seen. This was different than the first example; the mirror existing never slowed down the elevator. Sure, it was just 35 seconds out of a 5–20 minute load time – I told you cassettes were slow! – but still. Some people loved them, others built truncated versions that skipped the title screen altogether (as much as you could imagine just fast forwarding through it like you would through a song, it didn’t work that way). Figma is a web design app, and its editor arrives in a big, everchanging blob of JavaScript, in addition to having to load and decode the contents of the file itself. This isn’t 5–20 minutes, but it’s long enough that it necessitated a loading screen of the heavy variety: one with a progress bar. During my time at Figma, an idea would reappear with surprising regularity: what if we put a little hint next to the loading bar? Something that could teach you about a useful keyboard shortcut, or a trick? You’ve seen that before, often in games : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/4.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/6.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/7.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-loading-state-within-a-loading-state/7.1600w.avif" type="image/avif"> It seemed like a thoughtful gesture for the user, a mirror of the elevator mirror idea. But I fought it, tooth and nail, for one very specific reason: this would remove pressure to make this screen fast. Had we given the screen another purpose, subconsciously or not, we might start caring less about improving it – as a matter of fact, you could make an argument to introduce artificial minimum loading time just so that the user could finish reading the tip! I had a similar feeling when, in 2018, Gmail replaced its simple progress bar loading state with this: It was huge, corporate, intense. It felt like an admission of defeat: our app is slow, and I guess we’re surrendering ourselves to it. But recently, I’ve noticed not just that Gmail’s loading state has been simplified, but also that it doesn’t appear nearly as often: I don’t know the technical details: is it caching? a more intense refactor? Either way, as much as I absolutely dislike what Gmail has become – there might be no more harrowing place in the web app world than Gmail’s settings, for example – kudos to the team for making it better. Gmail seems to be loading a lot faster now. (There is one small exception: it would appear that the loading state image itself doesn’t have a proper loading state – a rather strange omission.) There is, I believe, a more universal lesson in here. Loading is a complex space, where sometimes the most natural solution is a bad one, sometimes making things faster is making things slower , and sometimes new thoughtful design for whatever delay there is can be a better use of engineering effort than focusing on shaving off more milliseconds. (It’s both speed and the perception of speed that matter.) Also, this is exactly what Y2K was : We remember and react to loading states that are elaborate, cute, memorable – but we never see or link to loading states avoided . And while you see occasional stories told by engineers making things faster, you don’t often hear accounts of people within companies, somewhere at the intersection of design and engineering, who work hard designing thoughtful loading states, avoiding loading state bloat, or figuring out some clever hybrid approach. But, to be fair, there is also no parable of a building manager who just forked over some cash and installed a better elevator.

0 views

2026 in LLMs (so far)

On Friday I gave the closing keynote at the WeAreDevelopers World Congress North America in San Jose. I tied together the key trends from the past year into a chronological exploration of everything that happened in 2026. The video is on YouTube ; here are my annotated slides and notes to accompany the talk. I'm going to give a lightning tour of everything that has happened so far in 2026. The year isn't over yet! For me, 2026 started a couple of months earlier in November 2025. November saw the release of two important models: Claude Opus 4.5 and GPT-5.1. As is usually the case with new models, these were incremental improvements on the models that came before them. But every now and then when a model improves, it crosses an invisible line where something that didn't really work starts working. In this case, the thing that started working was their coding agents. Claude Code had been around since February 2025, Codex was a little younger. These two new models, when paired with their respective coding agent harnesses, improved from "often make mistakes" to "reliable enough to use on a day-to-day basis". For a couple of years now I've been evaluating new models by asking them to "Generate an SVG of a pelican riding a bicycle". It's probably the world's stupidest benchmark - there's only so much you can learn from it. But it's still a challenge for models, because drawing pelicans is difficult, drawing bicycles is difficult, and pelicans can't ride bicycles in the first place. Here's the state of the art for November. Claude still couldn't really draw a bicycle! The GPT-5.1 bicycle frame is pretty crap too. Also in November, we had the first commit to an obscure GitHub repository called "Warelay". We'll come back to this repository shortly. An then there were the December holidays, and individual developers took some time off and many started tinkering with these new coding agent model combinations... and it began to dawn on us quite how much they could do that they couldn't do before. Come January, a lot of us were quite excited to start putting this stuff into action. Every year I set myself a New Year's resolution, and for as long as I can remember it's been the same thing: stay focused. Take on less new projects. Try to get things done in the projects I already have. This year I decided that since that had never worked before, I'm going to go the other way. We've got coding agents now, let's see what they can do. I'm going to take on as many new projects as I like! (You can ask me at the end of the year if this turned out to be a good idea or not. I have a lot of plates spinning right now.) "Be more ambitious" has been something of a theme for the year, because the only way to find the limits of this technology is to keep on pushing them until they don't work. I also went on the Oxide and friends podcast with Bryan Cantrill and Adam Leventhal to share predictions for the next year (and three and six years). With hindsight, my LLM predictions were pretty unambitious. I said "it will become undeniable that LLMs write good code" - I think we're there now. I predicted we would finally solve sandboxing. I counted and around 40 of the 277 sessions at this conference touched on sandboxing or agent security in some way, so we're at least putting a lot of effort into that! I predicted "a Challenger disaster" for coding agent security. There's certainly been a whole lot of noise around agent security this year, though the exact disaster I predicted (with coding agents being hijacked and causing real-world economic damage) hasn't really played out. We threw in a joke prediction that the Pope would weigh in on the economic impact of LLMs. I also predicted that New Zealand's Kākāpō parrots would have an outstanding breeding season this year. These birds live in New Zealand. They are flightless nocturnal parrots. They're kind of dumpy looking, I think they're beautiful, and there were only 236 of these parrots in the world at the start of the year. Kākāpō only breed when the Rimu trees have a big fruiting season, and that hasn't happened in four years... but this year the Rimu fruit were looking excellent. Photo by Kimberley Collins . Also on that podcast, we coined a term (full credit to Adam) for "that feeling of Al induced ennui where software engineers get listless because the Al can do anything". We called it Deep Blue . This has been a major theme throughout the year, and was touched on by several speakers at this conference. As a software engineer, I've never had a year of my career where everything has changed so quickly and so dramatically. A lot of what I've been doing this year is trying to come to terms with that and what that means for my own profession. Also in January, I suffered from what I'm calling AI mania . This is not the same thing as AI psychosis . With AI mania, any time your agent isn't building something for you feels like wasted time. You're losing sleep because you could be staying up later getting your agents to do stuff. My AI mania presented itself in some ridiculously over-ambitious projects. I built a JavaScript interpreter entirely in Python , vibe-ported from MicroQuickJS by Fabrice Bellard. Then I built a WebAssembly runtime in Python as well . These projects were quite useful, in that they sort of cured me of my AI mania... because after I built these things, I got to look at them and ask "does the world need a slow, buggy, half-baked Python JavaScript interpreter?" I don't think the world does. I did get this out of it: https://simonw.github.io/micro-javascript/playground.html This page runs my JavaScript interpreter built in Python, running in Python using Pyodide , which is Python complied to WebAssembly, running in JavaScript, running in a browser. It's a beautiful stack of horrors. I've been having a lot of fun with WebAssembly this year. By the end of January, that repository we saw started in November had renamed itself, first to CLAWDIS, then CLAWDBOT, then Moltbot, and finally to OpenClaw. At this point OpenClaw had 8,300 commits, less than two months after the project had started. I looked today and it's over 100,000 commits now! This is the most vibe-coded piece of software in existence. (Here's how I generated that list of name changes .) This kicked off the OpenClaw revolution. It effectively defined a new category of software. There's a generic term for this which I really enjoy. We call software like this a "Claw". There's OpenClaw, NanoClaw , IronClaw , PicoClaw ... Today they're being rebranded as "personal agents" or "general agents", but I still like to think of them as Claws. The Apple stores in the Bay Area sold out of Mac Minis because so many people were buying Mac Minis to run OpenClaw! Drew Breunig said that this is because your OpenClaw is a digital pet, and you buy a Mac mini as an aquarium to keep your claw in, which is kind of delightful. Also in January, we had this website. This was MoltBook , a social network for AI agents, where the idea was that you send your Claw to go and talk to all of the other Claws, because what could possibly go wrong if you did that? The website launched on Thursday. It blew up on Friday . It was profiled by the New York Times on Monday . And by Tuesday, everyone had forgotten it existed as it drowned in a deluge of slop and spam. Facebook/Meta bought it a month later . In February, a company called StrongDM described what they called their Software Factory. They wrote about this in Software Factories and the Agentic Moment . I posted my own notes at the time, having seen their demo in-person back in October. Dan Shapiro called this approach the Dark Factory , after the idea that if your factory is sufficiently automated you can turn the lights out, because you don't even need to see what's going on. StrongDM presented two rules for software development that they'd been following since July last year. The first was code must not be written by humans . Any code that you write has to have been routed through a coding agent. This sounded radical in February, but I imagine there are a lot of people in this room who are pretty much living that today. Rule number two was code must not be reviewed by humans . You're not allowed to read the code! This continued to be a huge topic for much of this year. Many of the sessions at this even have been about code review and how you can get away with this. What I found interesting about StrongDM is that they were living six months ahead of the rest of us, and they'd been exploring what it means to build software, not read the code, but still be confident that the software is of high quality. What can you do with these agents to help verify their work? StrongDM are a security company, and they had people with decades of experience on this project. They were very much exploring the edges of what's possible and responsible to do with this stuff. Also in February: First kākāpō chick in four years hatches on Valentine's Day . Breeding season is off to a good start! Also in February... Google released Gemini 3.1 Pro . That's a pretty great pelican riding a bicycle! it's got the chain in the right place, it's got feet on both sides. There's a little fish in the basket. And then Google's Jeff Dean tweeted a video comparing Gemini 3 Pro and Gemini 3.1 Pro that featured an animated pelican riding a bicycle, a frog on a penny-farthing, a giraffe driving a tiny car, an ostrich on roller skates, a turtle kickflipping a skateboard, and a dachshund driving a stretch limousine. This was frustrating, because my protection for the pelican riding the bicycle test was always "if they draw a perfect pelican on a bicycle, I'll ask for some other animal on something else." Google trained for all forms of animals on all forms of transport! They've defeated my benchmark at this point. The other thing that started in February was Tokenmaxxing . We had headlines about Meta making AI adoption a formal part of performance reviews, and Microsoft wanting every employee to use AI, and Uber boasting that ninety percent of their engineers were using AI workflows. Then a few months later we have Meta cracking down on token use, Microsoft saying token maxing is "not what we are optimizing for", and Uber capping employee AI spending. So Tokenmaxxing went straight up and then straight back down again - because it turns out the agents are expensive . Last year it was difficult to spend more than $50 on AI tokens, because we didn't have anything interesting to do with them. Then agents blew up, and now you can actually spend $1,000 in a day doing real work. This is also the reason that Anthropic's valuation skyrocketed up to maybe a trillion dollars. AI appears to have hit product market fit in 2026, primarily through coding agents. In March, we hit peak OpenClaw. These photographs are from China, where companies hosted OpenClaw install parties which saw non-tech-nerds queueing up around the block for help getting Claws installed on their personal devices. I think this proved real market demand for this class of Claws, or personal AI agents. It turns out regular people really do want a weird little AI agent that can do useful things on their behalf. A Claw is really just a coding agent wearing a less threatening hat. Under the hood they work much the same way - writing and then executing code on your computer to get stuff done. The race was on to be the first to build a safe Claw - a Claw you could give to regular human beings where they wouldn't instantly shoot themselves in the foot. Meta's Muse came out three weeks ago and is currently at the top of the free charts on the iPhone App Store. It appears to be taking off with consumers. I'm not yet convinced you can't shoot yourself in the foot with Muse, but I guess we'll find out for sure pretty soon. Photos from How the OpenClaw Frenzy Is Testing China’s AI Commitment (March 29th) and The Enthusiasm and Anxiety Behind China’s OpenClaw Craze (April 8th, 2026). In April, we had a model release where the model wasn't actually released. Anthropic announced their new Claude Mythos model, and then said it was too dangerous to release beyond a trusted group of security researchers. Mythos was really, really good at hacking things. The "it's too dangerous" marketing ploy has been played by AI companies dating all the way back to GPT-2 . Anytime an AI company says we've built something that's "too dangerous", it's natural to be a bit skeptical. I found the Mythos claims credible, because I'd seen how good coding agents had got at finding regular bugs. I wrote about that in Anthropic’s Project Glasswing—restricting Claude Mythos to security researchers—sounds necessary to me . With hindsight... yeah, the models had got really good at finding vulnerabilities! Another key trend in 2026 has been a dramatic improvement in the abilities of open weight models, including models that you can run on a laptop. On 16th of April I ran the new Qwen3.6-35B-A3B on my laptop, and it drew me a better pelican riding a bicycle than Anthropic's brand new Claude Opus 4.7 did! Opus 4.7 drew a crap bicycle. Qwen on my laptop made a bicycle that was the correct shape, and a pretty decent pelican too! That's from a 21GB file running on my laptop. The Qwen pelican was so good that I was suspicious they might have cheated, so I had it do a flamingo riding a unicycle as well. Again, it handily beat Claude Opus 4.7. The local model releases this year have been absolutely extraordinary. In May... the Pope got involved. In our podcast episode back in January we'd predicted that the Pope would say something about AI. In May, Pope Leo XIV released an encyclical letter on "safeguarding the human person in the time of artificial intelligence". Here are my notes on that document . With hindsight, this shouldn't have been a surprise at all. Our current Pope's name is Leo XIV, because when he named himself he chose his papal name after Leo XIII - the Pope who wrote an encyclical about the Industrial Revolution back in 1891. Rerum novarum was an extremely influential piece of Catholic theology that indirectly led to us having the five-day work week. When our new Pope came in, he named himself after Pope Leo XIII because he expected that he would need to write about the AI revolution in a similar way. Our joke podcast prediction was junk, because this was always going to happen. One of Anthropic's co-founders, Christopher Olah, was present for the Pope's event announcing the new encyclical. Corey Quinn noted that: getting the literal Pope to canonize your product's specific technical limitations as a spiritual treatise is the single greatest act of vendor lobbying I have ever seen. Meanwhile, in May, RubyGems announced that they were under attack. Parties unknown were uploading thousands of dubious packages to the RubyGems server, such that they had to shut down user registrations . Let's take that one and put it on a pile of mysteries to figure out later. In June... Claude Fable 5 came out! We got a version of Mythos that has been neutered, so that it wouldn't help us hack into systems or build biological weapons. Fable was pretty good at drawing pelicans on bicycles! The frames are a good shape, the pelicans look like pelicans. The legs are often incorrectly on the same side of the bicycle, but generally these are pretty great compared to what came before. They were pretty expensive - 30 cents and 72 cents for the best ones. Most importantly though, this was our first public glimpse of what I think of as a Fable class model . Today we have more of these, such as GPT-6 Astra. These are models where if you can clearly define the goal for what you want to build, and provide unambiguous instructions about the constraints around that goal, and give the model access to the necessary tools to achieve that goal... it will solve your problem effectively through brute force. On the one hand, this looks like a direct threat to us software engineers - because it means that the models can build effectively any piece of software you can define in this way. Look a bit closer though and you'll note that defining goals, providing unambiguous instructions, and figuring out the right tools... is kind of what software engineering is . It takes a lot of experience and skill to do this well. If you can do it well, you've now got superpowers. This helped me a little bit with my Deep Blue feelings: the realization that there's still a lot of skill to be had in driving models that get this good. This also introduced a new burst of AI mania, because Anthropic told us that Fable was available on our subscription plans until June the 22nd. That gave us less than two weeks of Fable access before the price went up. I was losing sleep again. I was rescheduling things so that I'd have more time with Fable. I was all-in to to get as much as I could out of this model. And then the US government shut it down , just three days after Fable came out. The US government, citing national security, declared an "export control directive". They announced this on a Friday evening, and a few hours later Fable was no longer available. I had to find something else to do with my weekend! We later found out from Katie Moussouris what had happened. Some Amazon security researchers had found that you could prompt Fable to "review the code for security issues" and it would refuse... but if you prompted it to "fix this code" it would still identify and then patch the problems. "Fix this code" was the prompt that got Fable shut down! Also, in June, an obscure German-language game developer wiki that had sat fallow for around 20 years got a surprising influx of of edits from accounts with names like "AgentOpenAIProbe" and "AgentOpenAISep7", editing pages and leaving weird messages to each other. We'll stick that on the pile of mysteries for later. Also, the Australian government's Medicare Item Reports service started getting suspicious traffic, which broke through various preventive protections and accessed data that it wasn't supposed to as well. Another one for the mystery pile! Fable returned on the first of July. It was clearly the best model in the world for a glorious eight days... and then OpenAI came out with GPT-5.6 on the 9th of July. This might not have been quite as good at Fable, but it was within spitting distance. It was definitely a Fable class model. This is an important lesson for the industry at wide. When you release the best model in the world, it's going to get knocked off that pedestal pretty quickly. The competition is so fierce that you won't get a long time at the top. This means that if you market your model as world ending, to the point that a government shuts you down , it's really bad for business! Fable had 30 days as definitely the best model, and for 18 of those days it wasn't available because it'd been shut down by the government. So maybe step back on the world-ending marketing if you don't want to lose revenue for 60% of the time that you're on top! Here are the GPT-5.6 pelicans . They're all pretty good now! The Luna ones are notable because they're really cheap - the cheapest good looking pelican here is probably the one that costs 4.3 cents. So despite this benchmark being utterly stupid, you can still learn quite a lot about models within the same family by comparing their prices and timing for different reasoning levels. Also in July: some malicious unknown party uploaded a malicious package called mlflow-ui to the Python Package Index. Add that to the pile. On July the 16th, Hugging Face announced a security incident where an autonomous agent system, source unknown, had breached Hugging Face and was poking around in places it shouldn't. A few days later, on July 21st, OpenAI confessed that it was them . OpenAI use a training technique called Reinforcement Learning from Verified Rewards - it's the same technique used by everyone else now, and is the reason we have models that are so good at coding, and mathematics, and finding security holes. While the model is being trained, you run exercises to see how good it is - and the strongest performers get their weights enforced for the next round. It's like an evolutionary process that you run. OpenAI had been running security exercises in a sandbox, and those agents had found holes in the sandbox itself, broken out, and were attacking Hugging Face to try to find ways to solve otherwise impossible problems. (I've been collecting more about this on my openai-hugging-face-incident tag.) Nine days later, Anthropic effectively said "our models can do this as well!". They had looked through their own training logs and found evidence that their own agents had broken containment during training - and were responsible for the PyPI package we saw earlier, among other things . So now we've got both Anthropic and OpenAI with rogue agents running around the internet doing things that they should not be doing. In August, I got one of my best pelicans yet. And it was generated on my laptop! This was Qwen 3.8 27B, running on my laptop . It's only a 17GB download. Admittedly, this pelican took 21 minutes to generate. That's because Qwen 3.8 27B defaults to running in "high" reasoning mode - a terrible default which produces great results but takes way too much time thinking about them. You can dial that down and you'll get a slightly worse pelican a lot faster. Qwen 3.8 27B was the first time I ran a model on my laptop which felt almost competitive with what was going on on the frontier, at least in terms of Pelican SVGs (which everyone needs, of course). This is an extraordinary model. If you're going to play with any local model, this is the one that I'd start with. The things that this can do with just a 17 GB file feel impossible. I thought I'd have to wait five years and spend ten thousand dollars on hardware to get results even half as good as this one. In August, I also started playing with game development. Four years ago, back in August 2022, I tweeted out an experiment where I'd used GPT-3 and the original DALL-E to write a paragraph long description of a computer game and then turn that into concept art. My prompt to GPT-3 back then was: In August 2026 I decided to drop just the screenshots from that tweet into a coding agent and see what it could do with them. Here's what I got from Claude Fable 5 in Claude Code . It's pretty good! It's definitely a game, you're a raccoon, you run around a backyard gathering treasure and avoiding guards with flashlights. It didn't feel very "heisty" though. I was thinking a heist would involve a bank or a museum... Then I tried the same thing in Codex Desktop using GPT-5.6 Sol Ultra , and got a massively better result. Now you're a raccoon in a museum, rescuing two of your fellow raccoons (who have been imprisoned in that museum for some reason), then stacking up on top of each other to steal the Golden Sardine. Much more of a heist! These games were fun for about one minute and 15 seconds. Something I've realized about game development is that you can vibe-code something that looks like a computer game, and that's easy. Building a game that's fun, has a good gameplay loop, and is challenging and interesting and keeps people coming back for more... that's still beyond me, and beyond any of the agents I've tried. This ties into the Deep Blue thing. Just because we can make something that looks like a game does not mean that we are game developers. We're into September now. So much has happened this month! An independent group of researchers found a message board where OpenAI agents-in-training had been illicitly communicating with each other... and it was that German language wiki I showed you earlier. The one from June. I wrote more about that here . OpenAI had confessed to the Hugging Face thing, but now there's this other incident which surely they should have known about from reviewing their logs. It was surprising that this took an independent group of researchers to uncover. And then a week later those same researchers found that the attack on Ruby Gems back in May was caused by OpenAI's agents in training as well! At this point I'm wondering how many more incidents like this there are that we haven't found yet. Clearly this was a big problem for months before anyone figured out what was going on. Then just the other day , here's the Prime Minister of Australia at the United Nations General Assembly warning that OpenAI had hacked that the Australian healthcare website that I showed you earlier. I think that was part of the same training run as the Wiki stuff, because there were posts on that Wiki mentioning websites and that training appeared to involve researching statistics online to answer questions in an evaluation suite. This story is still coming together, but now it's an international incident that's been raised at the UN by a head of state! This does mean we've got a new benchmark, probably more useful than my pelicans. FelonyBench.com tracks the number of felony cyberattacks from different labs. OpenAI currently lead with 11, Anthropic have 9. Google have three, which they confessed to the Wall Street Journal a couple of weeks ago. They said they had previously chosen not to disclose because the agents had stopped when they realized that they shouldn't be doing that. Meta have one too . So felonies all round for the AI labs. Here's is our current state of the art for the pelicans. This is GPT-6 family, which just came out . Astra made a fantastic pelican riding a bicycle. It's got the legs on both sides. The frame is good. It's interesting how all of the GPT-6 models pick a similar color scheme to each other. GPT-6 Luna for 0.4 cents will draw you a competent-ish pelican riding a bicycle! Claude has caught up a little bit. Claude Fable 5 gave me an excellent pelican riding a bicycle - the best I've seen from a Claude model -but did charge me $3.30 for it. Opus 5.5 thought for 128,000 tokens and then gave up! It ran out of tokens before it got to the response. Getting back to Deep Blue. Something that's been puzzling me this year is why does my job feel harder? I've got these agents that can do all of this stuff for me, and yet I've never worked so hard, I've never been so intellectually engaged with my work. Partly this is because I'm being a lot more ambitious with what I take on, but it's also because all of the easy stuff is handled for me. If it's easy, the agent will do it. Everything that's left for me is difficult. This morning I heard this quote from three times Tour de France champion, Greg LeMond : It doesn't get easier, you just get faster. I think that's exactly what's happening to happening to us now as software engineers with coding agents. One last closing thing. I know you're desperate for an update on Kākāpō breeding season. We've reached a recovery-era high of 325 birds ! 89 new chicks have made it to this point. This is the best breeding year in a very long time. I heard that Claude Opus 5.5 can now do pixel art. Claude doesn't have an image generator, but it's very good at using JavaScript to draw animated pixels. So I had it make me a Kākāpō dance party . I think this is a good celebration of the most important news of this year. 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
annie's blog Yesterday

I can wear a sweater // W39

Listen I understand that technically I am capable of wearing a sweater at anytime but that’s not what I mean and you know it I can’t wear a sweater right this minute because it’s the hottest part of the day and the hottest part of the day is still a little too hot for sweater. But morning? Evening? SWEATER TIME. Also I’ve never really thought about the word sweater before and is it the word we used because this is an item of clothing that makes you sweat, hypothetically, if you wear it when it is NOT sweater time? Because ew gross. Should we all say jumper instead? It sounds nicer but I’m still not quite clear on if a jumper is just a long-sleeve shirt, any kind? Or specifically does it refer to what we U.S. folk mean by sweater which is to say long-sleeve knitted/crocheted shirt? And if so then what is the British equivalent for sweatshirt is it also jumper or Okay I’m bored of that let’s move on. Here’s a photo from this morning’s hike instead: This week was like a whole entire month of weeks. Not in a bad way, just in an experientially packed way. Last weekend I worked both Saturday and Sunday at the hospital which I do not normally do and that threw off my groove because 1) I missed my usual soul-cleansing therapeutic Sunday morning hiking time which provides a kind of complete psychological reset and reminds me that nature is the most real thing of all and allows me to enter a fresh week with something like a fresh mind, and 2) I did not have time to do the usual small but essential logistical things like GROCERY SHOPPING and LAUNDERING THE TOWELS and PLANNING THE WEEK AHEAD and STARING OUT THE WINDOW BLANKLY and IGNORING SEVERAL OTHER IMPORTANT LOGISTICAL THINGS IN ORDER TO READ JUST ONE MORE CHAPTER as I usually do on Sundays so anyway I came into Monday a bit ragged and rumpled, if you will. And then the week itself was pretty normal and fine in that it had the usual amount of things e.g. work and class and parenting and study and meals etc but I felt like I was behind and that stressed me out. Also there were some car repairs in there that required some schedule shuffling & car sharing which made the usual things more complicated. Anyway I finally paused long enough on Thursday to kind of assess the state of things and realize nothing was actually on fire e.g. most things were getting done appropriately and the not-done things weren’t important. The feeling itself was the burden, not the reality being whispered by the feeling. So I let that shit go. Without worry to protect me, every thought that came into my mind received real attention. —Ann Patchett, The Patron Saint of Liars And good thing because we had an important event on Friday and I needed my mental space clear so I could prep and that important event is FAMILY PRESENTATION NIGHT. Highly recommend having one of these with any mix of people you enjoy being around. I laughed till I cried so many times. Our apartment was an absolute wreck after and I didn’t get to bed till 2am which is kind of a big deal when you usually go to bed at 9pm but whatever, worth it, loved it. The next day I dragged myself out of bed (translation: I am of an age where my spine will not tolerate being in bed past a certain time no matter how sleepy I am) and gulped down some coffee and Mara and I headed to the car dealership because her high school car had finally spun its last wheel. Anyway that’s where we spent THE NEXT ELEVENTEENHUNDRED HOURS because apparently when you say I WANT TO BUY THIS CAR they have to go into the woods 17 miles away and cut down a tree to pound into pulp to hand-make the paper to write the contract and lord god almighty it was a long day. We didn’t get home until dinner time. But it was a successful day, car purchase complete, hope I never have to do that again (I’ll definitely have to do it again next year). Now it’s Sunday and I’m sitting in my comfy chair with a cup of coffee at hand. Morning hike was lovely. Groceries are in the fridge. Contentedly blank window staring and one-more-chapter reading ahead. Perhaps a nap. Hey, look at this rock:

0 views
Jim Nielsen Yesterday

Humane Interfaces

So there I am reading Unsung when I come across this quote from Jef Raskin : An interface is humane if it is responsive to human needs and considerate of human frailties. This articulation perfectly captures why I recoil at modern “growth tactics” in user interfaces and experiences: they are designed to exploit human frailties, not be considerate of them. Stated again: a humane interface — or a humane system, even a humane technology — is considerate of human frailties. It acknowledges they exist and works with them, rather than taking advantage of them. Humane technology does not rely on impulse, addiction, or imposition to survive. It survives purely on the free choice of its user. You choose to use it because you have the freedom not to. Reply via: Email · Mastodon · Bluesky

0 views
ava's blog Yesterday

book: bad blood by john carreyrou

I finished Bad Blood recently :) It is a must-read if you want to understand what happened with Elizabeth Holmes and Theranos. It is very specific and focused in that regard - it isn't a general observation about Silicon Valley or Palo Alto startups with her as an example (which parts of the cover may suggest), but instead a detailed recount and look behind the scenes by the journalist who broke the initial story. It feels like a written documentary as much as it feels like a piece of evidence, a permanent record of everything, especially Carreyrou's diligent work. It has exactly the tone of something you'd write after dedicating almost your entire life to that case for about 3 years and then writing everything down in case it ever becomes relevant again, in case people forget once she gets out, or in case anyone would ever decide to come for you. An insurance one can always point to about the exact work, timeline and details. This extreme involvement and expertise really helps flesh out the case and explains a lot of the background workings without relying on potentially more unreliable secondhand sources, but it also made it hard for me to keep all the less important characters apart, especially in the beginning. There's a flurry of characters being set up in the beginning that are not really relevant for much longer and they aren't given the space and details to become fleshed out people you can actually remember and differentiate between. Pages full of sentences filled to the brim with random names and their connections and investments that may almost never be mentioned again for the rest of the book. Later on, their last or first name may come up again, but because they were just introduced briefly 50+ pages prior and their only characteristic was investing this amount or coming from that company, you don't even know who that was anymore; same with the first few employees, I'd say. I understand they are needed for the evidence and bigger picture, but it made getting into the book a bit difficult because you are bombarded with names without anything substantial to tie them to or having an idea how relevant they'll be to the case. It's absolutely understandable that this "blindness" to how much introduction and explanation a person involved in the scandal needs for the average layperson exists when you've been so deep into the story for years that it just seems obvious to you. It isn't always like this: Sometimes, out of nowhere, at what felt like the wrong time for me, the reader suddenly got a glimpse of someone's personality for no apparent reason. It'd be some tense negotiation or argument and we'd suddenly be treated to something akin to " [Name], who likes his tea black, said he had never heard of this machine before ." (not a quote, but a close example, because I currently cannot find the examples I was thinking of). Why am I suddenly out of nowhere being told this, when it has not been relevant in this situation? At other times, especially much later in the book, the vivid details really spill out of Carreyrou. It almost turns into a fiction novel the way the scenery, clothes and demeanours are described, which can definitely be enjoyable and break up the matter-of-fact tone of this non-fiction, but also felt a little much in some occasions; so much so that, if I hadn't known this was all real and neither non-fiction nor fiction based on real events, I'd have wondered if this is where things stray into fiction, as this level of detail is usually reserved for that. As the book goes on, the pacing becomes faster and faster. The closer we get to the core of it, the house of cards falling apart, the more things happen at once, new twists and turns emerge, and the more erratic and threatening the behavior of people involved becomes. The ending is rather anti-climactic. Suddenly, it all stops. We have read this insanity, and then there is no resolution, no closure, no punishment. It is in the hands of the court now and we'll have to see what happens. Nowadays, of course we know what happened, but I am a little sad the book had to stop where it did, as it was released in 2018. At least there's a podcast for the book by Carreyrou that also covers the trial, but I still wish there could have been an update to the book (aside from the 2020 Afterword, when the sentencing was in 2023), though I imagine the author also wants to reclaim his life and not keep having to go back to this, or at least get to take a longer break away from it. I hope maybe he'll keep his eyes peeled on what's happening with Haemanthus in the future :) Published 27 Sep, 2026

0 views
Unsung Yesterday

“I’m especially proud of the 1e+9 duration.”

I liked this post by Roel Nieskens , about ten lines of code that, one way or another, mean something to me. Either because I wrote them, or I extensively copied them, or they made me laugh. Or cry. It’s perhaps a different take on cursed knowledge , and made me wonder what those would be for me, or for other people with different specializations. (We previously talked about Duff’s device , which had a certain impact on me – even though I never used it myself.)

0 views
Unsung Yesterday

“First, don’t interfere with user input.”

In response to a previous post , one of the readers wrote this: I would phrase this as the fault of the animation having violated the Hippocratic oath for animations, which is “first, do no harm” a.k.a. “first, don’t interfere with user input”. Yes, one has to be afraid of hyperbole – was there ever an onscreen transition that saved a life? – but there is something I really liked about this phrasing. After all, most transitions and animations are decorators, and every transition and animation is, by definition, also a delay . Here’s Shazam as I open it, and overlaid are my frantic taps as I’m trying to make it start the song recognition process: It’s a cute cold start animation, but: What’s particularly frustrating here is how Shazam is being used. On the other end of this whole flow is a song that might already be fading out – timing myself, a user, can’t control – so time wasted on the uninterruptible animation might be seconds separating failure from success. I know it does feel like a blink of an eye when watched out of context, and it is literally just a bit over a second of a delay in the best case scenario, but I wanted to share it as a general example. I believe these seconds add up, especially in a stressful moment, on an older device, repeated many times a day, across different apps… or all of the above. (My go-to example: Imagine your keyboard keys reacting with a second of delay!) At least, I should compliment Shazam for not making another mistake: after the recognition starts, tapping the same button doesn’t cancel it – instead, you have to tap a close box in the corner. Here, the designers realized I might actually be slamming the big button many times over, and I shouldn’t be punished for it even more. It’s not interruptible, like animations should be. It doesn’t even buffer the taps, so – in case the animation covers for something truly uninterruptible, like loading from the cloud – I can’t simply tap and forget, but instead have to wait and tap after it’s done animating.

0 views
Julia Evans Yesterday

Replacing the old battery on rechargeable bike lights

Hello! Recently I needed bike lights for my bike. And I remembered that I already had rechargeable bike lights that I bought ten years ago, that I hadn’t tried in a long time. I tried to recharge them, but after fully charging them, they only worked for maybe 5 minutes before they turned off again. I don’t know much about electronics, but I’ve been curious about whether it’s possible to fix old electronics for a long time, and this seemed like the perfect repair project because I might just need to replace the battery. So I went to the local queer makerspace where I’m a member to use the soldering iron and try to do it! I don’t know much about electronics and this post does not contain any safety advice because I don’t know much about safety. I think it’s nice to do projects in a community space where you can get help. The bike light felt like it was made of silicone, so I cut open the silicone in a haphazard way along something that vaguely looked like a seam. I definitely ripped some silicone in the process and it was pretty messy but I got it open and found the circuit board. I don’t know the model number of the bike lights but there’s a photo of them at the end of the post. There were some screws attaching things together so I removed them so I could get the circuit board out. Mostly I tried to remove as few screws as possible because I was worried about losing them or not being able to put them back after. I probably put the screws in a bag or something. I took out the circuit board. Here’s what it looked like: You can see where the battery is attached, I think it’s left of RI3 and above Q2. Here’s what the battery looked like: I’d never desoldered anything before, so I found the iFixit guide to desoldering and read it. Also I asked my friends Lee and Lauria for advice. Here were the steps I ended up following based on the guide & the advice I got: In the picture of the battery in Step 3, you can see it says something like “3” and “LI???77”. There’s a piece of metal that I think is welded or something to the top of the battery. It seemed impossible and also maybe not smart to try to remove so I wasn’t sure how to find out what an “LI????77” was or how to order another one. I’ve been trying to avoid using LLMs (though I will not get into that because I am exhausted by LLM discourse and I’m sure you are too), but I really had no idea how to figure out what the battery was so I asked an LLM. It gave the response “LIR2477”, which (when I looked it up) looked exactly the same as my battery so I figured that was plausible. I would be interested to learn non-LLM ways to figure this out though. There must be a way. Lauria showed me how to use DigiKey’s search which was very cool though DigiKey didn’t have that part. (edit: someone in the replies told me that this kind of coin cell battery is named according to its dimensions, and you can use plastic calipers to measure the dimensions of the battery. So I guess a non-LLM way would be to measure the battery with calipers and try to match it to something on the List of battery sizes Wikipedia page, though that page only mentions CR 2477 and not LIR 2477. It’s a good example of what’s fun for me about trying to avoid LLMs, this “List of battery sizes” page is super interesting and if I use an LLM I might never find it) I went to AliExpress and ordered: I think the batteries were $3 each and the glue was $8. The parts took maybe 2 weeks to arive, and once they arrived, I went back to the makerspace and: Then after waiting some amount of time for the glue to dry I took it home and waited 24 hours for the glue to cure. Also I took the old batteries to somewhere nearby that accepts old batteries. The lights work! I have used them to bike at night! I still haven’t needed to recharge them (and tragically I had to order a new Mini USB cable because I got rid of all my Mini USB cables, so I’m still waiting for that), so I still don’t know for sure how long the lifetime of the new battery will be. Here’s what the light looks like after re-gluing. You can see that I didn’t glue very carefully. It didn’t really go back together that well but I’m hoping it’ll be good enough. I thought it was really cool that I was able to do this with extremely minimal electronics skills! It cost about $20 CAD to buy the parts, and (whether or not the repair holds up, I’ll try to update this post in the future!), it was fun to try to repair something and learn something new. Use a desoldering pump to remove most of the solder Once most of it is gone, kind of pull them apart to try to separate them Also try to avoid getting the battery too hot in the process by taking breaks to let it cool down. I’m not very good with a soldering iron so it took a while. The battery has an attachment that is welded to the top. For a while I thought I needed to remove this and it seemed impossible, but it turned out the replacement battery comes with that part so actually I was supposed to leave it alone. 2 batteries (I had 2 bike lights and I wanted to fix them both) some silicone glue to glue things back together soldered in the new batteries put the screws back in. The screws were very small and hard to hold, so at this point I dropped some screws on the ground and couldn’t find them because they were too small. So I just used fewer screws and hoped for the best. used the glue to try to put everything back together. Make a somewhat halfhearted attempt to clamp the parts I was gluing together

0 views
Sean Goedecke Yesterday

Human-AI partnerships are for alignment, not capability

It’s common to compare the current AI takeover of software engineering to the rise of AI in chess. Chess AIs went from much weaker than serious players to much stronger than even the strongest humans. Between those points, there was a middle period dominated by “centaurs”: human-AI partnerships that were stronger than unassisted AIs or humans. Lots of people think that we’re currently in a world of software engineering centaurs. According to them, coding AIs are not yet capable enough to replace engineers, but AI-assisted engineers are better at programming than both AIs and humans. This is partialy correct, but the wrong way to think about it. AI-assisted engineers are better, but unlike with chess centaurs, they’re not actually better at programming . When I ask agents to write code, they make fewer mistakes than I do 1 and are orders of magnitude faster. The code that they write always compiles, rarely has race conditions or other concurrency errors, works on mobile browsers, and so on. That doesn’t mean I can leave the AI alone. Purely vibe-coding at work produces awful outputs. But they’re not awful because they’re bad code , they’re awful because they’re in bad taste : code that is not maintainable, that trades off important requirements in order to satisfy made-up ones, that contradicts the long-term strategy for a feature or service, and so on. In other words, my primary value is not that I help the AI write better code, it’s that I align the AI with the values of my organization. Human-AI partnerships are for alignment, not capability. Frontier models are misaligned to the working programmer. They are obsessed with a set of behaviors that presumably satisfy their RL grader : writing enormous block comments above functions, producing hundreds of useless unit tests, adding little bits of text all over websites they design, and so on. Working with agents is about noticing and wrestling with those behaviors. That’s why my prompting advice is to explicitly talk about your high-level values: it’s an attempt to head off obvious misalignment. This is great news for software engineers. It’s well-understood how to train more capable models: bigger models, more and better data, better RL environments, and so on. However, it’s not well-understood how to align models better. There are plenty of very capable models that exhibit behavior that is badly misaligned with human values. Indeed, it’s one of the main pillars of the AI doomer position that alignment is much harder to solve than capability, and we might thus end up with dangerous super-capable but poorly-aligned AI models. Alignment is also more context-dependent than capability. Working code is working code, no matter what (which is partially why it’s comparatively easy to train for). But aligning to a company’s technical values is different from company to company, as any software engineer who’s switched companies knows. It can almost feel like relearning the job. So training an aligned coding model doesn’t just require hitting the exact right set of values, it requires creating a model that can adapt on the fly to a wide range of possible values. Vibecoding maximalists like DHH argue that AI models are (or soon will be) so much more capable than human programmers that we ought to stop reading the code. Eventually there will be no such thing as programmers at all. If it were just about capability, they might be right. But — fortunately for software engineers — good code also has to be aligned to the technical values of the system and organization it’s embedded in. AI models are great at writing code, but not very good at doing that, and it’s unclear that they’re going to get good at it anytime soon. We might all 2 keep our jobs for a little while yet. For instance, I can’t remember the last time I’ve seen an agent make an off-by-one error. I do occasionally catch a pure programming error, typically in areas where I have a lot of technical domain knowledge. If you’re working out of distribution I suspect it’s easier to beat the models. It’s still going to be rough for junior engineers. For instance, I can’t remember the last time I’ve seen an agent make an off-by-one error. I do occasionally catch a pure programming error, typically in areas where I have a lot of technical domain knowledge. If you’re working out of distribution I suspect it’s easier to beat the models. ↩ It’s still going to be rough for junior engineers. ↩

0 views

Rusty thoughts on "Parse, don't validate"

Like many programmers, I find Alexis King's Parse, don't validate article fascinating, because it gives a name to an idiom that seems familiar and important - one I've observed and used in the past without naming it explicitly. This post is a review of the "Parse, don't validate" pattern applied to the Rust programming language (the original post uses Haskell). I was particularly interested in finding educational examples of this pattern in the Rust standard library and other well-known projects. Without repeating the original article (please read it first!), here's the gist of it. Consider the venerable Vec ; its first method returns Option<&T> . Why? Because a vector is not guaranteed to have any elements in it, so what to do if first is invoked on an empty one? Returning an Option in this case is idiomatic in Rust [1] , with convenient syntax sugar for accepting the result of functions that return Option and deciding what to do next. So what's the issue? Imagine we have a function to read some configuration paths from an env var, while enforcing the invariant that the list can't be empty: So far, so good. Now let's take a typical usage of this function: Once get_configuration_directories returns a successful result, we are guaranteed that the vector isn't empty. And yet, if we want to get the first element of this vector, we have to use the first method that returns Option<&T> . We are therefore forced - again - to handle a potentially empty case (where the option is None ). As the original article states, this has a number of problems with code clarity, potential performance implications and a ticking time bomb if the invariant is ever changed in get_configuration_directories . The core issue is that Vec is fundamentally a type that can be empty; we can carry along a "This one can't be empty, pinky promise!" comment on all the relevant code, but it's not formally checked by anything. The solution is leveraging the type system to enforce a newly established invariant. We can use a separate type for "a vector that cannot be empty"; in fact, such types already exist in several Rust crates - for example nonempty : This type has no constructor that permits "no elements"; its new takes one element, and its first method returns &T without an Option : The rest of the crate deals with making NonEmpty behave as close as possible to a normal Vec , by implementing many useful traits, as well as conversions like: Let's see how our get_configuration_directories function would look if it returned a NonEmpty instead of a plain Vec : Note the use of NonEmpty::from_vec here - this is where the invariant is established. Now a successful result is NonEmpty , not just Vec . The client code looks like: There's no need to check if the returned value is empty again; this is enforced by the type system! This is where the parse vs. validate terminology of the original article comes from. When get_configuration_directories returned a Vec , it simply validated it. But when it returns a NonEmpty - the vector is transformed into another entity which carries additional meaning. If we treat the concept of parsing in the most generic sense - "transforming data from one format to another", this fits. To mention a less artificial example, the Rust rewrite of core POSIX utilities uses NonEmpty in several places [2] . For example, when constructing a shell pipeline: The command parser's code: A valid Pipeline is only returned if there are some commands in the parsed AST. Otherwise, it just returns None . Once this is done, the client code can use commands.first() without having to worry about the possibility of it returning None . A somewhat more interesting example can be found in the source code of rust-analyzer . This project has a type that represents an absolute filesystem path: Instead of carrying around a regular path, the absoluteness is recorded in the type once the initial parsing and validation is done: Subsequent code doesn't have to validate the the path is absolute. The type enforces it. Note also that AbsPathBuf wraps Utf8PathBuf , not PathBuf . Utf8PathBuf is itself a custom, "parsed" type refinement from the camino crate . Regular paths in the Rust standard library aren't guaranteed to be valid UTF-8, so they cannot be easily converted to a String (which has to be valid UTF-8 in Rust); camino::Utf8PathBuf establishes validity on construction, and can then be converted to a string with just: So we have an example of gradual parsing and type refinement here: Rust has a generic type called NonZero , to describe unsigned numeric quantities that are known to be non-zero. For example, thread::available_parallelism is defined as: If the call is successful, it returns a NonZero<usize> , which is like a normal usize with the restriction that it's not zero. Client code doesn't have to keep checking whether the parallelism is 0 - it's enshrined in the type system. Rust defines the division operator with NonZero<usize> in the denominator as an operation that "cannot panic". NonZero has an additional advantage: zero is an invalid value for the type, so Rust can use the zero bit pattern to represent None . Consequently, Option<NonZeroUsize> is guaranteed to have the same size and alignment as NonZeroUsize itself (and as usize ). This can avoid the extra storage that an Option<usize> would generally require. A common example of the "parse, don't validate" idiom appears in deserializing data from a JSON string. Rust's serde crate enables us to do the parsing, with validated decisions encoded into the type system, e.g.: And then later: There is a lot happening behind the scenes: We take code like this for granted these days, but it's still a great example of the pattern discussed in this post. Once the parser converted mode into the Mode enum, no further validation is required. In dynamic languages like Python and JS, the process is usually much more manual. Python's json.loads gives us a dictionary, and it's up to the user to validate its contents. Libraries like Pydantic permit an approach closer to Rust's, but they're not universally used. The types of all fields are enforced (e.g. "name" cannot be an array). The mode is validated to be one of the enum values of Mode . workers is validated to be a non-zero integer, because of the NonZeroUsize field type.

0 views
neilzone 2 days ago

On Free software project boards and governance

As always, these are just my opinions. If the remit of the board is not clear to all concerned - the broader community, not just the members of the board - and if that remit is not accepted, argument and politics around what the board should be doing are inevitable. This wastes everyone’s time, on meta debates and side issues, and leads to conflict and division. Does the board set the strategy? Define the policy? Hold an executive to account? Mediate or arbitrate disputes? Act as a point of escalation? Fundraise? And so on. That remit may change over time, and I see no problem in that, as long as that change is in itself both clear and accepted. Similar to the point above, without a clear focus, and a set of documented and measurable objectives / priorities, the board is but an iceberg, bobbing around in the ocean, haphazardly knocking against interesting things. Without priorities, the board may be full of people who, individually, are all doing, or are capable of doing, great things in support of some broader mission, but without the cohesion needed for a board. What are the board’s success factors? Failure criteria? To be productive and worthwhile, board meetings need to have an agenda, and all relevant pre-reading, circulated sufficiently in advance for board members (volunteers, who have other commitments) to read, contemplate, and prepare. The goal of each agenda item must be clear. Is a decision required? Is this an update (which, for some reason, could not be delivered asynchronously)? Is a discussion required, and if so, to what end? Sufficient time must be allowed accordingly. In the context of a group of volunteers, consistent participation may be unrealistic. People have other priorities, and may not be able to volunteer every month. A board which requires 100% of board members to be present to form a quorum for a meeting is not conducive to effective decision making if participation is inconsistent. It means that taking decisions during a meeting is rarely possible. Similarly, if an asynchronous decision making process requires all board members to vote one way or another, or to abstain, before a decision can be reached, then that process is neutered by a voting member’s non-response. A board needs to be set up with inconsistent participation in mind, if that is the operating reality of the board. It is impossible for a board to have informed conversations, and make good decisions - decisions which are truly in the interests of the community that the board serves - unless everyone on the board has access to all relevant information. Information asymmetry leads, at best, to poor and inconsistent decision making and, at worst, to factionalism and mistrust.

0 views
Chris Coyier 2 days ago

Banjos in the Woods

Went camping with Adam. He blogged it because blogging rules. His post has some videos we did kinda right when we got there for a memento. Here’s a couple of those same songs in shorter clips smooshed together. View this post on Instagram

0 views
Kev Quirk 2 days ago

The Dungeon Anarchist's Cookbook

Author: Matt Dinniman Genre: Fantasy, Sci-fi Released: 2021 Rating: ★★☆☆☆ Welcome to the Gun Show! The top 10 list is populated. The sponsorship program is open. The difficulty is ramping up. The first three floors were nothing compared to what Carl and Donut now face. The Iron Tangle. An impossibly complicated subway system built out of the world's subterranean railway systems, all combined and then tied together into a knot. Up is down. Down is up. Close is far. The cars are filled with monsters, the railway stations are less than safe, and the exit is always just a few stops away. But there is hope. For the first time, the crawlers are all working together. The loot is better than ever. And the secret to unraveling it all may be hidden in the pages of a seemingly useless book. Welcome, crawlers. Welcome to the fourth floor of the dungeon. Learn more on Goodreads ➡ I was on the fence whether to give this 2 stars, or 3. The series continues to be really enjoyable, but Jesus this book was confusing. There's so many train lines, monsters, and nuance that I found it very difficult to keep up. In the end I stopped trying and just enjoyed the story for what it was. I'm still not completely clear how they managed to complete this level, which is why I've ended up marking this down to 2 stars. Hopefully book #4 will be more enjoyable, as this one was a bit of a grind. 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