Latest Posts (20 found)
Unsung Today

A hacker’s guide to bending the universe

Continuing the theme of software fixes for hardware problems , here’s an essay I wrote in 2016 about a broken computer display that I “fixed” as a teenager, just because I wanted to play Civilization. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-hackers-guide-to-bending-the-universe/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-hackers-guide-to-bending-the-universe/1.1600w.avif" type="image/avif"> It remains one of my favourite things I’ve ever written.

0 views

One Year

Today marks a year since my little sister, Lisa, took her own life. She was 34. It was an overdose, but we don't know if it was an accident or suicide. We’ll never get an answer, yet I lean toward believing it was by choice. As grim as it sounds, picturing her with some control over the end brings me a small measure of peace. I still think about her every day, and I still get upset regularly. Especially when I've been to visit my nephew and I see the sadness in his eyes. At first I was angry at the selfishness of it all, but I think that's gone now. These days I'm just sad. Mum blames herself, and has asked me numerous times where she went wrong. I never have an answer for that. What can I say? "Well the rest of us turned out ok, Mum. So you did fine. " That feels dismissive of her emotions. So I just give her a sad smile and ask her to not think those things. I miss her. I miss her laugh and dry sense of humour. I miss how she would always call people on their bullshit. Never afraid of speaking up. Hopefully next year it will be a little less raw... 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

OpenAI Dev Day, Dot and OpenAI’s Product Transition, Sign In With ChatGPT

OpenAI's Dev Day showcased a product that is, frankly, pretty confusing. However, there is more vision here than it might seem.

0 views

In response to “The death of web development education”

I read Mat​hia⁠s S​chäf⁠er’s excellent post, titled The death of web development education . I was thinking about how I can contribute to the conversation and really struggled to articulate the problem. The most effective way I can contribute, in my opinion, is a crude sketch I just did of Piccalilli ‘s Stripe chart for all time sales: That’s a whopping 67.5% reduction since 2025… Pretty bleak, huh? Something really does have to change or you’ll miss publishers when they’re gone .

0 views
Unsung Today

Before pixels: Modular industrial dashboards

In my recent visits to German and Polish museums, I noticed a recurring theme: modular industrial dashboards, which I imagine have by now been all replaced by software. I don’t know much about these – please write me if you do – but I wanted to share them anyway, perhaps for context, or amusement, or inspiration. They’re interesting design systems, and interesting interaction systems as well. This was a very cool physical display for air traffic control, at the The Deutsches Museum in Münich: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/1.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/2.1600w.avif" type="image/avif"> At Fernmeldemuseum Stuttgart, these were used to monitor subway trains, or light rail. I do imagine these panels must have been interactive with all the buttons? = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/4.1600w.avif" type="image/avif"> I like that they light up to show status: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/6.1600w.avif" type="image/avif"> One of the modules was a counter: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/7.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/7.1600w.avif" type="image/avif"> And I believe this was a way to annotate that something was… fixed, maybe? Or on its way to being fixed? = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/8.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/8.1600w.avif" type="image/avif"> A railway museum in Nuremberg used what looks like the exact same system, and I spotted a few modules with their plates removed: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/9.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/9.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/10.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/10.1600w.avif" type="image/avif"> And, here’s a similar panel shown in a tram museum in Stuttgart, filled with an incredible typographical tension between DIN and the German equivalent of Dymo: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/11.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/11.1600w.avif" type="image/avif"> Warsaw’s train museum had a slightly different system, but similar in look and feel: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/12.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/12.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/13.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/13.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/14.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/14.1600w.avif" type="image/avif"> This big industrial switch toggled between day and night. I don’t know if it changed the operation of the system, or is just switched on some sort of a dark mode for the panel itself: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/15.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/15.1600w.avif" type="image/avif"> And this was at the DASA Museum in Dortmund, from a power plant control room: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/16.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/16.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/17.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/17.1600w.avif" type="image/avif"> This was by far the biggest one of the ones I’ve encountered… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/18.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/18.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/19.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/19.1600w.avif" type="image/avif"> …with the biggest variety of modules… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/20.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/20.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/21.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/21.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/22.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/22.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/23.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/23.1600w.avif" type="image/avif"> This was also the panel I showed some molly guards from before. But today I want to end at this great switch: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/24.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/before-pixels-modular-industrial-dashboards/24.1600w.avif" type="image/avif"> Don’t you just want to rotate it, no matter what it does?

0 views

rose ▪ bud ▪ thorn - september 2026

My coworker brought back soap for the entire team from her trip to Turkey. The Magic Secret Lair stuff :) Soba with a sweet-sour mango sauce, chickpea tofu, vegetables and shredded toasted nori. My nails this month. My Poron! Or rather, Cinnamoroll in a Poron outfit, but I take what I can get. I "modded" her because she comes with a different keyring, but one of my other Sanrio keyplushies has this pink heartshaped one which suits her so much better, so I switched it out. Our latest sourdough bread: Published 30 Sep, 2026 Started feeling a lot better; more hopeful, more together, more focused and motivated. I met up with Xaya , her girlfriend , and Kami in real life. :) went to a café, then went back to my place to play some games. I added new pictures to my blog - on my /now page and my author page . I bought new matcha and a Poron plushie. I love her so much, she is my favorite from Sanrio, but never really gets any merch or it is ugly (doesn't get her fluffy ears right). This one I really love. My Stardew Valley Secret Lair order arrived and my wishes came true - Krobus really was the secret card included!! I restarted doing summaries for GDPRhub again after taking a 2-month break. The URL penis.ceo now forwards to this blog for a year. I won't renew it, but 9 dollars is ok and it makes me laugh. Did a deep clean and declutter of the main bathroom. Been having a good time at the gym, making progress. I go 5x a week now unless I need an additional rest day. In FFXIV, I have now made it to the Stormblood expansion. Had a good date with my wife at the place where we got engaged, and we found a new favorite restaurant. Read Bad Blood by John Carreyrou, then Kiss of the Spider Woman by Manuel Puig. Getting back into the blogging groove. I've started studying for the new semester. I postponed Property Law from last semester to this one, plus I have also enrolled in Employment Contract Law and Commercial Criminal Law. Working on adding some fun easter eggs and mysteries to my blog. I've started Digitaler Kolonialismus by Ingo Dachwitz (I like his work at netzpolitik.org). I wanted to add an AI law class to my data protection consultant certificate because they're now offering that upgrade, but it cost a surprising amount of money that I don't think the material and resulting extra diploma is worth. It sucks though, because other than that, I really wanna do it. I wanted to apply to a job, but upon further consideration and really reading the work description deeply, I realized it wouldn't be fun for me. It's in the right space/topic, but the actual day-to-day work is not something I enjoy. Made me sad, because I was looking forward to a possible exit from my current position. It feels like unless you already have Master's degree and several years of experience, all you are allowed to be is a clown who makes PowerPoint slides all day or adds events to an Outlook calendar. I ended up doing zero exams for the summer semester. I had to drop it all. Unfortunately. I feel unsure about my future and where to take it from here. I guess I'll just focus on finishing my part-time degree first, but it would be nice to have a bit more of a plan for afterwards, or for the rest of it so I don't have to stay in a job I hate for the next 3 years still. Things have shifted so my original plans don't really seem to work out anymore. My gynecologist just shut down operations a week ago and will go out of business today with no notice or warning. Found out yesterday. I was really happy with them and I’m completely blindsided. Had to figure out who will refill my prescription and continue treatment.

0 views

Updates 2026/Q3

This post includes personal updates and some open source project updates. もしもし、マリウスです, faxing at 9600 baud directly from Tokyo, Japan . After a short hop over to Hong Kong and Shenzhen , I’m back in the beautiful neighborhood of Shimokitazawa , where I’m spending almost the entire rest of the year until right before Xmas, when I’ll be heading back to Shenzhen. First things first, a warning: This is a very long post as it includes a metric ton of project updates. If you’re interested in the stuff that I’m building then this update is definitely for you. However, let’s start off with some infrastructure-related things. A few major updates happened in the past quarter with regard to my infrastructure. Probably the most important one is the migration from individual VPS instances to my own bare metal running a Proxmox “datacenter” . While I had been relatively satisfied with Vultr in the past, with an ever-increasing number of virtual server instances, for projects like MSG.TAXI , Hyperuplink , tty.fail , and everything related to this very website, my cloud service bill became overly expensive, all while contributions sadly decreased over the past months, making it unsustainable to run cloud infrastructure, especially to that extent. It just so happened that Vultr had more maintenance windows than usual over the past months, which prompted me to finally deal with the task of moving my VPS instances onto my own hardware. By migrating to bare metal, I was able to slash costs by approximately 30%, by discarding the resource safety buffer I had accounted for within each individual VPS, for a more dynamically allocating approach across individual instances. With rising hardware costs, however, one trade-off that I had to make concerns high availability. A full hardware failure on the current setup will result in all uncached services becoming unavailable for as long as the repairs take. Unless prices for hardware go down again, which is unlikely to happen , or contributions pick up again, which in the current market climate is equally unlikely, I won’t be building out the setup any further. As for some general stats about this specific website, over the past six months it generated at its peak over 270GB of traffic per month, which is considerable, given its compact size and its GTmetrix rating of (100% performance, 98% structure, 450ms LCP, 0ms TBT, 0.02 CLS), with the first contentful paint after 344ms, the speed index at 366ms, the time to interactive at 436ms, and an average page size (including images) of a few megabytes at most. Because I stopped running any form of analytics software, due to privacy reasons at first, but ultimately because of the realization that it has become pointless with all the robots LARPing as legitimate human traffic, I cannot tell you the number of visitors this website or any of the related projects have, and frankly I don’t even care. Not because I don’t care about actual humans being interested in the things I’m publishing, but because over the past months I have been receiving an increasing amount of feedback via e-mail, as well as welcoming a surprising number of new members to the community channel , so that I don’t need analytics software to show me that visitors appreciate the work I’m putting in and decide to stick around. Speaking of sticking around: The SimpleX group that existed next to the primary XMPP channel is no more. Neither the platform, nor the group itself developed in a favorable way over the past years, despite its almost 500 members. SimpleX turned from an interesting privacy platform into yet-another-Telegram-type messenger and is on the way to enshittification with VC investments from e.g. ACP, who is an investor in K2 Space (ELINT), OnScreen.ai (tracking), Zorus (employee/network monitoring), as well as Jack Dorsey. To make matters worse, at the end of September Evgeny Poberezkin reached out to me via e-mail with the following request: Thank you very much for this article: https://xn--gckvb8fzb.com/an-overview-of-privacy-focused-decentralized-instant-messengers/ (we shared it here: https://simplex.chat/ <redacted>). We launched equity crowdfunding on Wefunder in August ( https://simplex.chat/ <redacted>), to give users the opportunity to get a stake in SimpleX Chat and benefit from its growth - 150 people have already invested. Please help us spread the word - maybe you could write about it and some other recent news: the foundation, channels, public names, and supporter badges, which we launched recently ( https://simplex.chat/ <redacted>). It would be great to connect - SimpleX link is below - please send any questions! Thank you again and all the best Evgeny P.S. If you write something, could you please share with us before publishing so it complies with Regulation Crowdfunding rules? We cannot promote (and won’t be able to re-share with our community) if it mentions valuation, security type, how much is or left to raise (saying how many people invested is allowed), and how the funds will be used. We can mention perks we provide though. Thank you! – Evgeny Poberezkin SimpleX Chat, Founder Despite my article clearly stating, quote: Red flag: VC funded, specifically by Jack Dorsey , since Aug 14, 2024, hence I do not recommend it any longer. … Evgeny (or, more likely, his team that didn’t properly vet every organic site linking/mentioning SimpleX) sent me this fairly generic looking e-mail, to which I replied by pointing at the red flag . Long story short, the fact that SimpleX has now seemingly become so much of a product in the literal sense that they are trying to get approved organic content out for their funding campaign shows once more that it isn’t a suitable option for the privacy/decentralization community anymore. I have therefore deleted the SimpleX group, as well as removed all mentions of the messenger on this website, treating it the same way as I treat e.g. Telegram, WhatsApp or any other commercial platform. Anyway, a few days ago I shut down the last Vultr instance, an OpenBSD machine that had been serving this website for years. It outlived the rest of my cloud infrastructure by a couple of days. The clearnet version of this website had moved from the instance to a Bunny storage zone with a pull zone in front of it earlier in September, which happened due to the increased traffic by bots and maybe humans , and which means that there is no origin server at all any longer. The Tor and I2P sites still needed a machine of their own, since Bunny doesn’t offer a way to serve either of them, hence both are now served from a virtual machine on my own hardware. That machine has no public IP address, which neither the Tor daemon nor i2pd needs in order to publish a site. Unfortunately it does appear to make the I2P site less reliable, presumably because an I2P router that nobody can connect to depends on other routers to introduce it, and in a measurement about four hours after the move, 4 out of 8 requests to the eepsite succeeded, while all 8 requests to the onion service did. If the eepsite doesn’t load for you, simply try again, since a second attempt usually works. The clearnet side has a trade-off of its own, namely that this website now depends on a provider being there, where the VPS used to be able to serve the entire thing by itself if I ever took the CDN away. What makes me comfortable with it is that the build is still a folder of plain files that any web server can serve, hence going back would require not much more than a server, a workflow step and a few changes in the DNS, but not a rebuild. There’s a dedicated write-up on the whole publishing pipeline in the works, so I’m keeping it at this for now. It’s been almost three months since I got the Lenovo X1 Carbon Gen 14 Aura and switched from the StarBook Mk VI to it , and I haven’t regretted it so far. The laptop performs as well as I had expected it to while offering very decent battery life. At times I’m getting dangerously close to its 32GB RAM limit, which is something I had expected before purchasing it, but most of my workloads still have plenty of breathing room. Shortly after upgrading to the X1 Carbon I also decided to get an external (portable) 19" screen, and so I snapped up the Uperfect GR19BU. So far my experience with the display has been very decent, but I won’t get ahead of myself as I’m going to release a dedicated write-up/review on it soon. However, with several other new additions to my setup, like this display, the Mudi 7 , and the things below , it’ll probably make sense to also start preparing a follow-up on the travel desk setup from earlier this year. As usual with many of the posts on this site, however, it takes between one and three months from the first line to the finished and published post, so don’t count on it until the end of the year or maybe even early next year. After having had a few minor issues with the uni USB-C hub (8-in-1 with USB-C power), and slowly running out of USB ports, I decided that it was time to get a proper Thunderbolt 4 dock for my X1 Carbon , and what option would be better than the official Lenovo ThinkPad Thunderbolt 4 Smart Dock Gen 2 7500, for which I happened to find a pretty sweet deal. As a matter of fact the deal was so good that I didn’t realize at the time of buying that the dock comes with A) its own external 135 Watt power adapter and cannot be powered through a regular USB-C PD charger, which is sort of messing with my minimal yet productive travel desk setup , because I’m already carrying a PSU that weighs over 800g, and B) with cLoUd CoNnEcTiViTy . The dock itself is 590g, its PSU (plus power cord) another 350g, which amounts to 940g total added weight for only the dock. Clearly the dock isn’t meant to be a travel-friendly option, but it seems like no Thunderbolt dock really is considering the (even heavier) alternatives, like the CalDigit TS-4. However, with regular USB-C hubs not providing enough connectivity, performance and, most importantly, stability, it was time to try a different class of devices. Sadly the dock only lasted a single day before it stopped working and had a slight smell of burnt electronics to it. Hence I had almost three weeks of back and forth with Lenovo’s customer service in order to get it RMA’d/replaced, which was a frustrating experience to put it mildly. Then again, I don’t think the lackluster performance of Lenovo in the specific geographic region that I had to deal with them in is a fair representation of Lenovo’s global customer service, but very likely typical customer service across most companies in that region. Anyhow, I eventually received the replacement and I’m finally able to use it. The hardware is fairly decent, I haven’t encountered any odd messages in my log yet, and I finally have enough USB-A/-C ports to connect all sorts of peripherals, like my keyboard, my mouse, the portable monitor , and more. However, I’d wish that these docks would replace their HDMI and DisplayPort connectors with more USB-A/-C ports and maybe even a halfway decent sound card with various audio connectors (3.5mm amongst others). I never needed that many display outputs on a computer, let alone on a portable device. But I guess I’m the exception, as pretty much every dock manufacturer seems to follow this quadruple/sextuple/octuple display-setup trend. The only meh part of the dock seems to be the integrated Ethernet card/port, that appears to be a Realtek RTL8156B ( ), which is a bit of a potato. There are plenty of user reports online that describe all sorts of issues with this specific NIC under Linux. While it does offer 2.5G, matching my new switch perfectly, it does seem to come with a few issues with regard to reliability and actual performance. However, with the amount of USB ports on the dock I can connect one of the many 1G Ethernet adapters that I have and be done with it, in case the integrated NIC should ever give me a hard time. So far, however, it had been working without issues. In an ongoing effort to USB-C-ify all of my hardware I also pulled the trigger on a new portable switch, namely the Ubiquiti Flex Mini 2.5G. I’ve been using the blocky Netgear 1GbE switches forever, but I’ve always struggled to power them, as they come with a barrel connector and a dedicated PSU. While I did at some point get a USB-A-to-barrel-connector cable, judging from the power output of the PSU those switches are not intended to be run off of a USB-A port. It works, but it’s probably not the best idea. Short story long, I went for the Flex Mini primarily because it is powered via USB-C, so that I don’t have to carry another PSU or worry about damaging the device. As an added benefit, the switch now offers 2.5G links, which the Lenovo dock , as well as the Mudi 7 and the Slate 7 can benefit from. Ideally my portable NAS should also benefit from the higher speeds, but sadly that probably won’t happen with the current hardware. Speaking of which … The Ultra-Portable Data Center (v2) has had its second birthday and has held up extremely well, considering all the travel and, at times, incredibly dusty, humid, and/or hot environments that it went through. More importantly, though, even two years later there is still not a single comparable, commercial product on the market that would make me want to replace the existing system with it. Every piece of hardware that I’ve stumbled upon to date appears to come with major hard- or software headaches, be it the UnifyDrive UT2, the Beelink ME Mini, the CWWK x86 P6, or even the significantly larger/heavier AOOSTAR R7. The closest in terms of software freedom, hardware reliability and physical footprint to date appears to be the QNAP TBS-464, which is an ultra-thin and lightweight, portable 4-bay M.2 NVMe NAS introduced back in 2021. Because I had to further reduce the weight and size of the items that I carry with me on my travels, however, at the beginning of September I began working on the next iteration of my ultra-portable NAS, the UPDC v3. I haven’t yet found the time to pour the endeavor into a dedicated write-up, but I am happy to say that I’ve managed to reduce the build’s footprint from initially around 1.48 liters down to as little as 0.68 liters in volume. I won’t spoil too much, yet, but it’s fair to say that I’m relatively happy with the end result and that it allowed me to make the UPDC a fixed part of my carry-on luggage . Not much happened on the keyboard front this quarter, apart from a set of PBS Black on Black that I was gifted, and that has since been on my Kunai . It has become one of my favorite keycap sets and it is pretty much what I was hoping for . The PBS keycaps are however not as rough/textured as I was hoping them to be, which is a bit of a bummer. Anyway, I might post a dedicated long-form review in a few months when I’ll be able to better judge long-term use. I invested some time in pursuing my open source projects in the past quarter, hence there are a few updates to share. Several of them shared the same two things, which were a move to the SEGV-1.1 license , and a vanity import path under my own domain. As some of you might remember, I had an unpleasant encounter last year with one of the Alacritty developers, which prompted me to do something that was long overdue, namely switch to Ghostty. Along the way I implemented the exact feature I initially wanted for Alacritty and made my code public, on a dedicated branch in my fork of Ghostty. Over a year later, I’m still maintaining that patch. If you’re using my patch, make sure to update your local version. Neon Modem Overdrive , my BBS-style command line client, received a whole new backend this quarter. It can now connect to Hyperuplink, the bulletin board of the future, to which I’ll get in just a second . Neon Modem is the first dedicated client implementation for the relatively young and not-yet-well-thought-out REST API. Additionally, a shared prompt package now handles the server URL and credential input for that system as well as for Discourse and Lemmy, instead of each one keeping its own copy. I also tracked down a longstanding source of UI lag. The post-create and post-show windows were doing more work on every keystroke than they needed to, and reworking their handlers and rendering made the interface responsive again. A new release with all of this is available on tty.fail , with binaries on GitHub . Kopi , the command line coffee journal, had its two heaviest dependencies replaced. The SQLite driver moved from the -based to the pure-Go , so Kopi now builds without a C toolchain and ships as a fully static binary on every platform. The OCR helper, which reads the details off a photo of a coffee bag, moved from an Ollama-specific client to the official OpenAI Go SDK , so it can point at any OpenAI-compatible endpoint rather than only an Ollama instance. The Go module was renamed to a vanity import path under my own domain ( ), and the usual dependency, workflow and GoReleaser housekeeping came with it. On top of this, Kopi received the first contribution , which was applied to it via at the end of July. reader , the command line web page reader, had a productive quarter. The biggest change is the removal of the journalist dependency, whose crawling logic is now part of reader’s own package rather than pulled in from a separate module. As I don’t maintain journalist any longer it made sense to pull out the bits that I need for reader. Additionally, reader gained proxy support, so it honors the standard proxy environment variables (#23). It now also correctly handles the URL scheme when deciding whether a source is an HTTP resource (#35), and it got a fix for an -related issue (#37), which I worked out despite the reporter never supplying the example files I asked for. Note: Don’t be that guy . If you open an issue in any piece of software that you don’t pay for and that someone else dedicates their time to free of charge, consider upfront if it’s really something that you’re going to use, and if it’s an issue you’re willing to dive into and help fix. If either of these are a clear nope , then simply don’t report it at all. usbec , the USB Equipment Commander daemon that runs commands when USB devices are plugged in or removed, had its one core dependency reimplemented in-tree and enhanced. The module was dropped and its Linux netlink listener rebuilt inside usbec’s own package, so the daemon no longer depends on an outside module for that. The license moved from GPLv3 to the SEGV-1.1 license , the module was renamed to the vanity import path, and the release workflow and GoReleaser config were fixed along with it. In addition, the USB Equipment Commander is now a USB & Network Equipment Commander, with the introduction of NetworkManager (via D-Bus). This allows you to have usbec run commands whenever the network changes in any of the various ways it can change. My motivation was to run a script that queries my public IP and the inferred location via and shows it as a desktop notification whenever NetworkManager (re-)connects. zpoweralertd , my Zig rewrite and drop-in replacement of poweralertd, which is a UPower-powered power (.. power, POWER, POWERRRRR) alerter, has received a deep and thorough refresh. The biggest change is the C bindings, which I have replaced with handwritten s, just the way I had used them for the first time in ssh-askpass-zigtk , but more on that new tool below. The second big change is the Zig compatibility, which now requires at least 0.16, and which I have tested against the current master/future 0.17 release as well, to make sure that everything will continue working. With this, I also largely refactored the code, for which I initially took inspiration from poweralertd. The restructuring allowed me to clean up the codebase and find a handful of memory-related issues along the way. A new version of zpoweralertd has been released that contains these enhancements and, for the first time, it is available as pre-built binaries directly from the releases page. cexec , my small cached-exec wrapper that runs a command and caches its output for a given amount of time so that re-running it returns the stored output instead of executing it again, was rewritten from Go to Zig this quarter. The new version is a drop-in replacement for the previous one, but it changed a few things in the background, one of which is the storage. Previously cexec used BuntDB, which turned out to be a bad choice for a process that can theoretically run multiple times in parallel and access/write to the same database. The new version, instead, uses plain files that are scoped to the actual commands that are being executed. In addition, the new Zig version supports encryption for the cached runs, with an optional key from or the environment variable, which makes using cexec suitable even for output that contains sensitive data. On top of that, everything cexec does is now also available as a Zig module, so that the same caching can be used from another program without having to shell out to the cexec binary. New this quarter is , a GTK4 helper written in Zig . OpenSSH runs an askpass program to prompt for a passphrase or a yes/no confirmation when it has no controlling terminal. The reason it exists is my own issue with X11, which I explained here . The reference askpass, and most others, link GTK against X11, so they fail to build on my Gentoo system with the global USE flag. does not require X11 dependencies, so it builds and runs on an X11-less GTK4. It works on Linux and (hopefully) on the BSDs alike. Also new this quarter is Switchyard , a lightweight bridge that accepts e-mail over SMTP and forwards each message to XMPP. You might have read about it before in the dedicated post that I had published at the beginning of August, but if you haven’t I recommend going through it if a bridge for SMTP to XMPP sounds like something you could have a use for. For years I had a small shell script in my dotfiles that popped up a bemenu list whenever I clicked a link, so that I could decide which browser it opened in. This quarter I turned that idea into a proper GTK4 application written in Zig, namely Browser Select . It registers itself as a web browser, hence every link another application opens goes to it first, and a small popup then lists the browsers installed on the system for you to pick one with the mouse or the keyboard. Just like the script before, that used the Go version of cexec as a binary to cache the choice for a few seconds, Browser Select also uses the new Zig cexec library for remembering a choice for a while, so that clicking a burst of links doesn’t lead to repeated asking for a browser. The Flipper BUSY Bar review that I posted this quarter came with a little goodie: busybar.zig . It is a Zig 0.16 client library and command line tool for the Flipper BUSY Bar, implementing the device’s current OpenAPI specification as closely as possible, so that you can drive it over its HTTP API from Zig code or straight from the shell. It uses nothing but Zig’s library, which means it builds for every target Zig supports, including macOS and Windows. Darkwing Ducky is a BadUSB (“Rubber Ducky”) firmware for the PicoUSB, an RP2040-based board, built in Zig 0.16 with MicroZig . I’ve struggled to finish this for about ten months or so, primarily because implementing the required USB HID code that acts like an external keyboard wasn’t all that straightforward with MicroZig. Anyway, Darkwing Ducky announces itself to the host as an ordinary keyboard and then types out a predefined sequence, which can be useful for automating the setup of a machine that you have physical access to, or, well, for other things. While the PicoUSB comes with its own CircuitPython-based software, I wanted to try Zig on hardware, especially with MicroZig for a while and so this device was the perfect excuse to do so. If you’re curious, the repository has the details on the payload format and how to flash it. The internet bulletin board software that I had been writing about as ▓▓▓▓▓▓▓▓▓▓▓ in the previous updates has a name, and it’s out. Hyperuplink went public at the end of August, together with a dedicated post that covers what it is, why it exists and how to run it. If a JavaScript-free forum as a single binary sounds like your kind of thing, read that one first and come back here afterwards. Otherwise you might as well skip this part. Most of the quarter went into the bits and pieces that the board needed before anyone other than me could run it. Attachments and profile pictures with local or S3-compatible storage, board-wide settings and an administration UI for all of them, a search, soft-deletion for categories, forums and topics, and a manual that is embedded in the binary and available under Help -> Manual . On top of that came a whole set of themes and color schemes, as well as the packaging, which now covers Docker and Podman images, Quadlets, a Helm chart, a nixpkg with a NixOS module, an ebuild for Gentoo, and service files for systemd, OpenRC and rc.d. And if that wasn’t enough already there is the REST API, which is what Neon Modem connects to. If you’d like to have a look at Hyperuplink yourself without any commitment, there’s a demo instance that you can check out. You can find its login details on the official website . Account creation is disabled on the demo instance (for now). Go compiles down to a single static binary, which is why it is a great choice for Hyperuplink. However it has nothing along the lines of Django, Rails or Phoenix that takes care of the web parts, hence a good share of Hyperuplink was never about the bulletin board at all, but about routing, controllers, models, migrations, background jobs, translations and configuration. At the end of July I moved that share out of the repository and into Go on Glides , a web application framework for Go that includes everything needed to build database-backed web applications, on top of Fiber v3 and pgx , with embedded migrations, an asynchronous job queue, cron jobs, i18n, local and S3-compatible storage, and helpers that each project would otherwise have to reimplement. The reason for the split is that I’m building a second service on the same foundation, namely Maya , which meant that Hyperuplink’s internals had to become something that more than one program can use. Inca is the spiritual successor of addrb and caldr , my two earlier attempts at the same problem, this time as a single command line client for CalDAV and CardDAV that synchronizes calendars, tasks and contacts into a local database for offline use. It is built on top of the “framework” that I built and make use of in zeit , and therefore it shares a lot of zeit’s UI aesthetic. On the other end is Maya , a CalDAV and CardDAV server as a single Go binary with PostgreSQL underneath it, which (sadly) uses a patched hard-fork of go-webdav , and which exists because neither Radicale nor Baïkal ever made me happy. It’s the second program built on Glides . I’ve been dogfooding Maya myself since early September, and as of now it still isn’t publicly available because it’s not yet at a point that I’m comfortable releasing it, in particular due to its hard-fork of go-webdav, which was a requirement because the upstream project is sadly pretty much dead at this point. However, given the absolute mess that DAV protocols are, it’s not even surprising that the maintainer seemingly lost interest in this project, and that the ecosystem is so bad. Anyway, I have both, Inca and Maya, at a point that I can daily-drive them and, more importantly, that other clients (Android, iOS, desktop) can participate without too many hiccups along the way, but I’m not at all happy with the results for reasons that I will get into if I ever choose to release Maya. Also new this quarter, and admittedly not something one might call a modest undertaking , is Netrunner , a web browser built on WebKitGTK and GTK4, written in Zig . I’m calling it the hacker’s browser as it’s meant for people who prefer a lightweight browser over Chromium and Firefox and who care more about configurability and about built-in integrations than about endless features and add-ons. Netrunner deliberately leaves out a number of things that other browsers have, bookmarks being probably the most obvious one, because the people it is built for tend to have a system for those features in place already. Netrunner is configured through a single TOML file that holds the static settings as well as the runtime state, e.g. which sites are allowed to run JavaScript, play audio or send notifications. The session (i.e. open windows and their tabs) is also persisted in that one TOML file when the browser quits, and restored on the next start. Two other features that Netrunner comes with built-in are Onion addresses and Eepsites, which are native protocols for the browser. By default, whenever you open an URL or an link Netrunner opens a connection via Tor or i2pd and keeps it alive for as long as you browse sites within the Onion/I2P network. As soon as your browsing activity goes back to the clearnet, Netrunner automatically disconnects from Tor/I2P again. To the user these connects/disconnects happen completely transparently and every network gets a of its own, so a tab that follows a link onto another network moves over and keeps its back and forward history. In plain English this means that and URLs are indistinguishable from any other URL and you don’t need to do anything special to be able to open them. Obviously Netrunner is not a replacement for the official Tor Browser that the Tor Project releases and that is somewhat hardened to make sure you stay as anonymous and safe as possible. Instead, Netrunner’s Tor and I2P integrations are intended for the casual user who enjoys the freedom of browsing those networks as if they were part of the “normal internet”. Speaking about the normal internet, one thing that can’t be missed, especially these days, is content filtering. While WebKit sadly doesn’t support running a full-blown uBlock Origin, its own content filter engine is nevertheless a relatively decent option for basic ad blocking and annoyance filtering. As a matter of fact, Netrunner uses the same AdBlock and uBlock Origin lists that popular browser extensions use, but it does so by downloading and converting them into the WebKit content blocker format via adblock-webkit-convert.zig , one of two small Zig libraries that came out of this browser experiment. Sadly, the WebKit content blocker format does not support all the trickery that e.g. uBlock is able to do within its browser extension, which means that no, you won’t be able to avoid YouTube ads within Netrunner, at least for now. You will however still score above 62% on AdBlocker test sites , which is fairly okay. The other library that came out of this experiment is osdetect , which does what its name suggests: It detects with some amount of confidence what operating system a program is running on, and it gives you specifics like whether it’s e.g. a Debian or a Gentoo machine, or not even a Linux at all. I won’t tell what my main motivation for building this library was, but if I should ever get to the point that I have a 0.1 version of Netrunner ready for release you will be able to the source code for to find out. Which brings me to the release. Not only to that of Netrunner or Maya, but to the more general question of open source and how I intend to contribute to the ecosystem moving forward. Despite having a landing page online, Netrunner is a fun project that I don’t take too seriously and that I’m currently dogfooding, just like I do with Maya , to find out whether this is a project that I can imagine maintaining long-term, or whether it is one that will eventually outgrow my availability. After two decades of putting the software that I build for myself online, I have come to realize one or two things. The first thing is that “just putting it out there” won’t benefit the software and it certainly won’t benefit me. My main motivation for building all these things is my own curiosity about how stuff works and, ultimately, my own needs. I need a proper CalDAV/CardDAV server that is pleasant to administer/maintain and that can talk to all of the software that I’m using, hence I’m building Maya (and Inca) . I need a proper TUI client for Keebtalk and a few other forums, hence I’m building Neon Modem Overdrive . Speaking of which, I needed a forum and I was sick of the cruft that is phpBB or Discourse, so I built Hyperuplink . And it’s also me who is annoyed by the utterly insane bloat of modern web browsers, which is why I started building Netrunner. Publishing any of them inevitably changes the software from “what I need” to “what I need and what others seem to need” , and there is no guarantee, even if you go the extra mile to implement what others ask for, that those people will stick around or ever start contributing themselves. Zeit is one example where I experienced exactly that, multiple times, and every time it left a bitter taste in my mouth and, what’s worse, hundreds of lines of code that other people had requested but that nobody ended up using long term. At some point Zeit v0.x had become so bloated with other people’s needs that I rewrote it from scratch as the v1 release that it is today, with only the features that I believe make sense to support long term. The second thing that I realized is that “putting it out there” in hopes of finding like-minded people to collaborate with is a pipe dream. The open source “community” has been broken for a long time and, in most cases, was never much of a community to begin with, but rather the developer-equivalent of a one-man band . Not that there are no exceptions, however, my projects usually aren’t those exceptions. Kopi received its first contribution only this quarter, two years after I initially released it, and it was a one-time submission rather than something that materialized into a long-term collaboration. reader , in the very same quarter, collected a handful of issues, one of which I fixed without ever receiving any feedback on it whatsoever. And if you look through the few “Issues” sections on GitHub that I haven’t disabled yet, you’ll see that it’s the same story across the other projects as well, and you might understand why most of the repos lack the “Issues” tab these days. A single patch against two or three dozen issue reports is roughly the ratio that every single one of my projects has had over the past two decades, and I don’t believe that this is because my software is particularly unattractive to contributors, despite it being intentionally niche, but simply because writing a patch for someone else’s program is work, while filing a request is at most a two-minute annoyance. This is also why I, contrary to many other voices in the industry, do not regard opening an issue report as an actual contribution to a project. With all due respect, I don’t want your issue reports, keep them, especially the drive-by ones for something that you’re unlikely to end up using anyway. What a public repository attracts, hence, is an audience rather than a community , and many times that audience has a very short attention span. All of this eventually turns a maintainer into more of an unpaid support desk, which is not what I would like for myself. On top of that, LLMs have taken away the one argument that publishing open source software still had going for it. That argument wasn’t that a stranger would show up and maintain your software for you , but that someone out there might one day need the exact same thing badly enough to extend what you had already built, instead of writing it from scratch all by themselves. In 2026, however, that someone doesn’t need your repository any longer, because they’ll describe what they want to a model and get back something that compiles. Whether what comes out the other end is any good depends on the person directing the LLM and on the effort, or, dare I say, the money they’re willing to throw at it, rather than on the LLM itself. Code itself has become relatively cheap . As a matter of fact, if you want a specific feature implemented in any of my years-old tools, you might as well ask the machine to do it for you, so you can have what you need for the time being. And frankly, I’m quite happy about that! I’m happy that a random passer-by can get the feature that they thought they needed during their euphoric discovery phase of a tool they just found out about, mainly because I also know that the moment the honeymoon phase ends and the person loses interest in the tool, their interest in that feature will vanish along with it, and it would be left up to the maintainer to continue supporting it. Don’t get me wrong, I’m not arguing that collaboration never works, because examples like Linux, curl and PostgreSQL prove the opposite, but I am arguing that for small programs that a single person can hold in their head there are very few reasons for others to actively contribute, and even fewer in a world of automated code generation. Going back to where I started, I’m not sure yet whether I’ll ever publish any of the newer tools and programs that I’m building, like Maya or Netrunner, simply because I don’t see much of a reason to do so. Especially when, for projects like Netrunner, I know of far more popular examples that still died the moment their maintainer stopped investing time into them. And maybe that’s a good thing. Maybe these kinds of projects, just like the ones that I’m publishing, are simply not relevant enough in the grand scheme of things. Maybe it’s just Darwinism at work, and maybe that’s just how things should be after all. There he goes. One of God’s own prototypes. Some kind of high-powered mutant never even considered for mass production. Too weird to live, and too rare to die. – Raoul Duke

0 views

September 2026 blend of links

Some links don’t call for a full blog post, but sometimes I still want to share the good stuff I encounter on the web. Talking Watches: Pusha T On Why Rolex Is Worth The Wait – Let’s be real, I’m sharing this video mostly for the perfect coffee brand name Pusha T is launching with Lavazza (and promoting in this video). Bonus points if you guessed it. Repairing a 100-Year-Old Camera – Beware, this video will take 60 minutes of your time, and you won’t get those precious minutes back. (via Anthony Nelzin-Santos ) Lucky Notes – I recently wrote about this little app, but it deserves a spot in this series . If you were wondering what the cutest notes app is, there you go. 8 years and done – “ Now, I find it increasingly difficult to find topics on which I can offer thoughts worthy of other people’s reading time. (Truth be told, I probably haven’t been able to come up with that kind of content for a while now, but I soldiered on anyway.) ” Always sad to see a blog end, but this quoted part really resonated with me. (via Kev Quirk ) Meanwhile – Meanwhile, Daniel Benneworth-Gray relaunched his blog, as a perfect complement to his excellent newsletter . Pros and Cons of Using Personal AI Agents – Another instant classic. Muse Is What Meta Means by ‘Personal Superintelligence’ – “ Perhaps I am not enough of a dutiful consumer to be so amazed about a robot that can buy things for me. That is not to say there is nothing I like […] but there is a huge disconnect for me between the amount of technology here and what it could actually do for me in real life. ” I feel a lot like Nick Heer about this, and I would even go further. The one thing that is bothering me about this whole agentic lifestyle is the idea that tasks and chores are on the same level. And what do these people do with all this alleged extra time anyway? One Day on Rails – Pretty quiet until four in the morning, then captivating. (via 82MHz ) 100 unusual crisp flavours, ranked – Now, this is unexpectedly complex investigative journalism. Why Am I Left-Handed? – “ Sometime after the emergence of the genus Homo, 2.8 million years ago, evolution coded a preference for right over left. Of the various speculative theories for the emergence of this extreme preference, one that seems plausible to me points to our unprecedented capacity for violence. ”

0 views
Jim Nielsen Yesterday

VLM Enhanced Metadata For My Icon Galleries

Confession: I got nerd-sniped by Sam Henri Gold’s request for my icon galleries: I'd like to humbly request artwork-level searching in macosicongallery.com What follows is a train-of-thought blog post as I play with what an implementation might look like. I’ve actually long-wanted something like this, e.g. let me search for “coffee” and show me all icons that have some depiction of coffee in them. Similarly, I’ve wanted some kind of “related” representation for icons. I have this today via existing metadata, e.g. “Show me other icons in the category ‘Productivity’” or “Show me other icons tagged as ‘orange’”. But I’ve wanted a more robust representation of this, so if you were looking at an icon that had a microphone in it, the site would say “Here are other icons that also have microphones in them.” And the relationship would be rich/smart enough to know that “microphone” was meant broadly, i.e. dynamic mics, condenser mics, ribbon mics, etc. So how would you do this? I could go through every icon one-by-one and classify/tag any attribute of its design that comes to mind, but that would take ages! Seems like a good use case for a vision model. First, I’ll look at Sam’s suggestion: run every image through CLIP. I’m not familiar with CLIP so I start with a little research: What is it? How would I use it? And most importantly: is it free/open (because I ain’t spending a ton of money to send my thousands of icon PNGs to an AI provider via their API)? Ok, so CLIP will take an image and spit back an embedding (basically a bunch of numbers representing features of the image). When you do it with multiple images, you can then compare those embeddings to see what the model considers similar (and, if you like, set a threshold for what constitutes a “match”). After getting a sense of the task in front of me, I work with the LLM to come up with a proof of concept. I don’t need to fit this into my existing site. I just want to make one-off HTML pages where I can feel out, “Can this process create anything useful? What’s the amount of work required?” This is enough to create a single HTML file where I can click on an icon and see other icons that look like it. However, I realize quickly that I’ll need to process my entire icon library to really get a good sense for how well these are matching. So I do that. [Computer goes brrrr…] Ok, now when I click on an icon that looks like a camera, I see other icons that look like cameras. Or if I click on an icon that has a checkmark in it, I see other icons with checkmarks in them — sort-of. But the results aren’t that great unless an icon is visually distinctive. I share some thoughts with Sam. He has a few other suggestions I follow. Sam mentions SigLIP2 so I start with that as a keyword. The LLM recommends DINOv2 so I say, “Let’s try it”. I give that a try, creating a separate dataset and prototype (e.g. and ) so I can continue to view these different prototypes and compare their outputs. It’s fine. Different from CLIP. Honestly not much better. So I figure let’s try another one. I go with SigLIP2. I ask the LLM to create a page where I can compare the results. Seems like six of one, half dozen of another. One does better on some kinds of icons, worse on others. The LLM recommends that, at this point, I be done shopping models. They’re roughly the same class of tool with different tradeoffs. None are breakthroughs. So now what? Sam recommends another approach: You could also try handing all icons over to a VLM, having it write up a description, and embedding THAT text against what people might search for. A thoroughly detailed person might’ve done this from the start, e.g. for an icon that’s a checkmark, add the keyword “checkmark” to its metadata. That would take me forever to go back through all my icons and do — a perfect task for a computer that never tires. So I give this a try. First I need a free/open VLM. After a little research I decide to try Moondream via Ollama . I have the machine go through each image and caption it, then pull out “tags” from the caption. For the Clear app icon , I get data like this: Then the LLM creates a single file where I can test icon matches by searching for tag overlaps (or choosing one of the popular ones). So, for example, on the search page I can click on “checkmark” and see all the icons with a checkmark. Or click on “fox” and see all the icons with a fox. Matches are pretty spot to be honest. But that’s a different kind of test than what I was doing with CLIP. Can I leverage tags for the same kind of “related icons” work that CLIP is doing? I get the LLM to cook up a single-page HTML file where I can compare “click on this icon and find other icons like it” where I’m using embeddings from CLIP vs. matching on keywords. The results seem to fare much better for CLIP. For example, here I matched on what I think of as a “checkmark icon”. You can see the approach that matches on tags didn’t work too great. I believe this is because with my simple tag-overlap approach, a distinctive keyword like “checkmark” gets diluted amongst generic tags like “square”, “blue”, and “simple”. Whereas with CLIP, if you click on an icon with a checkmark, you get other checkmarks (and not other icons that also have related tags like “square”, “blue” and “simple”). Which all makes sense. Pushing on the implementation here could help, but that’s separate work to do. I’m not sure. While doing all of this was an interesting technical exercise, there are a few important considerations I need to think through before implementing anything, such as: I’m very picky about adding new dependencies to these icon projects. I like to think that’s why I’ve been able to maintain and continue contributing to them after so many years — because I make it easy on myself (good job, Past Jim). So, for example, if I make a VLM a dependency of this project such that every time I add a new icon I have to run it through to create the embeddings, that’s a big dependency cost IMO. I’m not sure I want to do that. That said, Apple now ships foundation models in macOS 27 available through the CLI (go ahead, try typing in your Terminal if you’re on Golden Gate). So if my Mac continues to be the primary machine where I add/update metadata for my icon projects, using would be a really easy/low-cost way to process each new icon to generate a caption and keywords for matching in search. But again, I don’t know if I want to do that. I wrote this post to try and work through what I want to do, but I am still undecided. So I guess the only thing for me to do at this point is hit “Publish” on this post and keep simmering on a decision. Reply via: Email · Mastodon · Bluesky Write a script that runs a sampling of icons through CLIP’s image encoder Read the file locally, e.g. 256x256 pixel icons seem to be enough, as the CLIP model I’m using preprocesses them to ~224px anyway. Create a dataset representing the “embeddings” (an array of numbers) for each icon that I get from CLIP, e.g. Create a dataset representing the top matches between different embeddings, e.g. Create a file has both datasets (plus supplementary icon metadata I already have), render all the sampled icons, and support an for each icon that shows the icons. CLIP: click on an icon and see other icons like it. Tags: click on a keyword and see other icons with that keyword. What kind of functionality do I actually want? A “related icons” feature? Does it match on keywords or embeddings? A “search” feature that matches on keywords? How do I build these features into my codebase now, given the thousands of icons that already exist? How do I maintain this feature in the future? e.g. every time I add a new icon to my gallery, is a VLM now a dependency of this project? Given all the above, what’s the time and money cost?

0 views

OpenAI DevDay 2026 live blog

I'm at OpenAI DevDay today, in Fort Mason, San Francisco. Same as last year I'll be live blogging the keynote and some other notes during the day. OpenAI gave me a free ticket and a seat in the "creator" area for the keynote. 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

Dead Money

If you liked this piece, you should subscribe to my premium newsletter, and you can subscribe on the following links: $70 a year , $18 a quarter , or $7 a month . In return you get a weekly premium newsletter including vast, detailed analyses of NVIDIA , Anthropic and OpenAI’s finances , and the AI bubble writ large . It's a great way to support my free work, and you'll get full access to my massive archive of premium analyses of the tech and finance industry. I just did a two part Hater's Guide To AI Debt that's essential reading given the current climate around AI data center loans. On Friday, I’ll interrogate generative AI’s effect on the economy to date — the dubious claims about productivity, the consequences of hyperscaler spending on treasury yields, how it’s driving inflation, and what could happen when the bubble finally pops.  If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on your Bloomberg Terminal.  Soundtrack: Flobots - Mayday!!! Last week, Fidelity Director of Global Macro Jurien Timmer said that “the [AI trade] has been dead money for more than three months,” citing that both token expenditures and GPU lease rates were all “flat to down,” citing specifically rental rates for H100 and A100 GPUs. While the counterargument might be that Blackwell GPU rental rates aren’t included, as I discussed last week , it’s questionable how many B200, B300, or other Blackwell chips are actually available for rent, as it appears that anywhere from $200 billion to $300 billion of NVIDIA’s sales since 2022 are sitting in warehouses or unplugged in data centers waiting for power. The Financial Times’ Bryce Elder took the ball and ran with it , and found research that backed up what I’d been saying, emphasis mine: Yet Elder makes the point, based on research from Jefferies, that there’re far more problems than simply not having enough power: In other words, the talking point that NVIDIA’s GPU sales are proof of actual demand for AI services or, indeed, that hyperscaler growth is a result of all those capital expenditures is a complete lie. In reality, at least half of all those chip sales — and I’d add in Broadcom’s TPU sales too ( see my Hater’s guide for more ) — are being made years before anything actually happens with the chips, making the trillion-plus dollars spent on capex so far seem somewhere between optimistic and utterly incoherent. Microsoft, Google, Amazon, Meta, Oracle, and far too many other companies have been hoarding hundreds of billions of dollars of AI chips that they either ( to quote Microsoft CEO Satya Nadella ) can’t plug in or simply want to have in supply for reasons that I find tough to imagine.  Even the argument that they’re in reserve for the (eventual) day when they’ll be installed in a data center, and that by purchasing well in advance, they’re not bottlenecked by NVIDIA’s ability to ship AI chips, doesn’t feel credible given the extent of the hyperscaler GPU spending spree. Especially considering that much of NVIDIA’s backlog exists because hyperscalers and neoclouds are stockpiling its GPUs.  Trevor Noren of Sage Road Research noted that he’d heard from a venture capitalist that “...some companies are hoarding colossal amounts in case they come to a point at which they don’t have enough chips to provide the computing capacity,” as if there’s been any shortage of NVIDIA chips, outside of the illusory one created by hyperscalers buying them years in advance.  So, we’ve got a situation where Microsoft, Google, Amazon, Meta, SpaceX, CoreWeave, and every imaginable neocloud is sitting on hundreds of billions of uninstalled GPUs (and increasingly TPUs). Whenever more capacity comes online, it’s immediately sold to OpenAI or Anthropic, who make up anywhere from 70% to 80% of all AI revenues and compute demand , creating the illusion that revenue growth is “coming from demand for AI compute” rather than said demand coming from two companies that have been fed over $217 billion in the last nine months, with the vast majority of it coming from Google, Amazon, Microsoft, and NVIDIA themselves.  As I discussed last week , If “demand is outstripping supply” because of millions of customers begging for AI compute, that’s very different to “demand outstripping supply” because two or three (including Meta) customers are taking up most or all of the capacity. Not to repeat myself, but… And that’s absolutely what’s happening, suggesting that the “AI boom” is more like five or six large companies (hyperscalers) feeding money to two companies (NVIDIA and Broadcom) so that they can feed money to two companies (Anthropic and OpenAI) who then feed that money back to them whenever capacity comes online. I estimate that there’s around $22 billion of global, non-Anthropic/OpenAI compute demand , and an indeterminately-large chunk of that is coming from AI startups that can only afford to pay for the compute as long as venture capital continues to fund them… …which is also the problem that Anthropic and OpenAI themselves face, as 80% of their enterprise revenues come from 1% of their customer base , with the vast majority of that being unprofitable AI startups that allow users to spend hundreds of dollars (or more) of tokens for $20 to $60 a month, meaning that the AI labs’ demand is, much like hyperscalers’ compute demand, dependent on venture capital’s ability to keep funding it. Right now, at least to the outside world, hyperscalers’ AI capex seems premature, when my argument is far simpler: it’s been a catastrophic waste, as there exists no fundamental demand for AI compute at anything approaching the scale of data center capex or construction, and what demand does exist is an illusion created by speculative investments.  In fact, I’d argue that the last year and a half’s worth of AI capex is fundamentally speculative, because there has never been any proof — even with Anthropic and OpenAI’s compute spend — that spending a trillion or more dollars on GPUs and data centers would ever pay off. And now the rest of the world has caught up to what I’ve been saying since October 2025 — that hyperscalers need at least $2 trillion in annual AI revenue by 2030 or they’ve wasted their capex . Too little too late. I’ll admit it’s vindicating to see so many people suddenly jump on the “how much money do hyperscalers need to justify their capex?” train, even if not a single one of them bothers to give me credit. Per Callum Williams of The Economist , Google, Amazon, Meta, Microsoft, Oracle, and SpaceX will need somewhere in the region of $1.29 trillion in annual AI revenue to get a 10% return on invested capital for their capex through the end of 2027, with the amount rising to $2.87 trillion if this farce continues through 2030. To put that in perspective, Microsoft had around $34.4 billion in AI revenue in fiscal year 2026 , of which 70% was OpenAI’s compute spend. Per Barclays estimates , Amazon will have $31.6 billion in total AI revenue in 2026, 73% of which will come from OpenAI and Anthropic, and per UBS estimates , 54.3% of Google’s AI compute sales come from them too, with an undefined amount of Vertex AI model sales coming from Anthropic on top, for a total of around $65 billion in AI revenue, which sounds a little high. Adding all those together gets us to around $131 billion in AI revenues for Google, Microsoft and Amazon , of which $82.2 billion (62.7%) are from Anthropic and OpenAI.  As of its latest quarter, SpaceX had (when you strip out Twitter’s ad revenues) around $2.194 billion in AI revenue, or $8.7 billion on an annualized basis, but I’ll bump that up to $25 billion on the year to include its full $1.25 billion a month from Anthropic and $920 million a month from Google , though I’ll add that both have 90 day outs. If we assume that Anthropic’s discounted compute for that quarter meant that it accounted for only $500 million of SpaceX’s AI revenue, this puts us at approximately $32.8 billion in AI revenue for SpaceX , with (as I believe Google will rent the compute directly to Anthropic) 79.3% of that coming from Anthropic. While we don’t know Oracle’s actual AI revenues, it disclosed in its last quarter that its CPU and GPU revenues were at $6.5 billion for the quarter, or around $26 billion a year in revenue. Because I’m feeling nice, I’m going to say that Oracle has approximately $20 billion in annual AI revenue, but due to a lack of information it’s tough to say how much of that is OpenAI, though I’d imagine we’re looking at at least $8 billion or more given the progress of Stargate Abilene and the (as confirmed with sources) H100 and H200 GPUs currently rented to the AI lab. As a result, I think it’s fair to say at least 50% of Oracle’s AI revenues are from OpenAI. This puts us at $183 billion in annual AI revenue for Google, Microsoft, Amazon, Oracle and SpaceX, with $118.2 billion, or at least 64.3%, coming from Anthropic and OpenAI. And as you’re about to find out, $183 billion just ain’t gonna cut it. Last week, Goldman Sachs’ Ryan Hammond got a little more specific, noting that hyperscaler capex estimates were now over $1.1 trillion in 2027. These revised capex plans also came with a new and deeply-worrying analysis, taking the average of estimated AI capex for 2026 and 2027, and calculating how much annual AI revenue hyperscalers would need to break even on their capital expenditures for just those two years . To just break even, hyperscalers need $308 billion in annual AI-specific revenues, and for a 10% Return On Invested Capital (calculated based on estimates of depreciation and operating expenses), they’d need $417 billion.  As discussed above, they are — including Anthropic and OpenAI — currently $124.2 billion short of break-even, or $243 billion short of break-even without their revenues, or $233.2 billion to $351 billion short for a measly 10% ROIC.  Now, keep in mind that A) the 2027 capex has yet to be spent and B) that, at least in theory, Anthropic and OpenAI will spend more next year… if hyperscalers are able to build the capacity necessary for them to do so, and they’re able to raise the money to pay them.  Goldman aggressively clears it throat by adding that “revenues are growing quickly and revenue backlogs are sizable”, but that’s far from a foregone conclusion considering (as I’ve mentioned) the fact that hyperscalers appear to be warehousing hundreds of billions of dollars of GPUs, with Microsoft sitting at around 2GW of AI capacity , and Oracle’s delays to its “Project Jupiter” data center in New Mexico becoming so severe that it had to issue a “force majeure” notice with the project developer , though as the Financial Times notes, it’ll have to pay regardless of whether the data center actually has power, otherwise known as a “Hell or High Water” contract.  Yet the part that really worries me is about the so-called “application layer” — the companies paying the hyperscalers for AI compute — and how much revenue they’d need in totality to be able to justify that hyperscaler capex. The answers are extremely grim. For hyperscalers to break even on their capex through 2027, their AI customers would have to make around $425 billion in annual revenue, and that’s if they had an operating margin of 10%, a number that includes training costs for OpenAI and Anthropic. To be explicit, this chart measures how much revenue AI companies would need to have specific operating margins and for hyperscalers to have a specific ROIC. In other words, AI companies would have to make $725 billion in annual revenue to have both 10% margins and for hyperscalers to have a 10% ROIC. For some context about how far we are from these numbers: Even if Anthropic and OpenAI doubled their revenues and every single one of these “annualized” figures represented the true annual revenue of the companies, we’d be sitting at an embarrassing $157 billion, or roughly $268 billion short.  The further we get, the more ludicrous the expectations become, with Bain claiming that AI services (across both the consumer and enterprise realms) would need to generate $6tn in annual revenue by 2031 to justify the current and near-future levels of expenditure.  It’s remarkable, four years and hundreds of billions of venture capital dollars into the AI bubble, that we basically have zero meaningful revenue-generating AI companies outside of Anthropic and OpenAI. We aren’t even in the same universe of scale that would be necessary to justify the capital expenditures made by hyperscalers. I don’t even know how to put into words how far away we are, because it’s all so unfathomably stupid. Goldman’s response is laughable:  That link goes to a year-old report saying that “ The AI Spending Boom Is Not Too Big ” that does not, at any point, describe AI US labor productivity gains, other than this paragraph:  Those AI productivity estimates come from an analyst note from March 2023 , around two weeks after GPT-4 came out. In other words, Goldman’s way of reassuring boosters and investors is to vaguely cite numbers from three and a half years ago, numbers that it has, for whatever reason, chosen not to update.  To quote Peter B. Parker from Spiderman: Into The Spider-verse, “ don’t watch the mouth, watch the hands .” There’s a reason that Goldman hasn’t sought to measure the actual productivity or economic benefits of AI for three-and-a-half years, I assume because doing so would make it blatantly obvious how large the gulf is between the massive investments in AI GPUs and data centers and, well, this chart : Alternatively, they’re avoiding saying what Timmer said: that investments in AI are dead money. And things are only going to get worse from here. Per Morgan Stanley , AI-related debt issuance should be around $570 billion in 2026, with around $250 billion of that coming from hyperscalers, and the rest various different forms of high-yield debt shoved into either asset-backed securities or dodgy SPVs for AI data centers. Things are only set to increase next year. Per Goldman Sachs , hyperscalers will fund more than a third of their AI investments with debt in 2027 — around $400 billion — with Jeff Pu of GF Securities putting the number a little higher at $419 billion, against estimated capital expenditures of around $1.14 trillion, specifically referring to Meta, Google, Amazon, Microsoft, and Oracle.  If we assume that other AI-related debt stays flat on the year, that puts us at $739 billion in AI data center debt in 2027, and if we assume growth matches hyperscaler debt issuance growth (around 67.6%), the number grows to around $939 billion in debt. That’s an astonishing number, and one that’s going to run headfirst into the growing price of US Treasuries, which I covered a few weeks ago in part one of the Hater’s Guide To AI Debt: To be clear, I published that article on September 18 . As of writing this sentence, 10-year-dated US Treasuries are now sitting at around 5.24%.  The combined force of the wars in Iran and Ukraine, inflation, and spiralling government debt have pushed interest rates up aggressively over the last few months, in a way that is set to add billions of dollars in interest payments to an already-staggering debt load across the tech and AI industry.  Let me give you a few examples. A few months later in November 2025, Oracle would issue $18 billion in bonds , with maturities ranging from 4.45% on the five-year-dated notes to 6.1% on the forty-year-dated. Back then, Oracle was the belle of the ball, with analysts a month previously saying they were “all a bit in shock” by its massive new revenue backlog, most of which came from OpenAI and would require building 7.1GW of data center capacity that, as I’ve established, would take years. In the month preceding, OpenAI had announced a flurry of multi-gigawatt deals, most of which didn’t exist , but the market was extremely excited to fund whatever crap was put in front of it as long as it had “AI” on the side. By December 2025 , the spreads ( explained here ) on Oracle’s debt were trading “like junk,” meaning that investors were buying and selling them at a price that said that if it were to issue more, it would have to be at the high yields associated with the junk bond market.  Since then, Treasury bonds have sold off and interest rates have been hiked with another due by the end of the year . Two months ago, Oracle’s credit rating was downgraded to BBB — one level above junk — by S&P Global , and the debt associated with the SPV behind its New Mexico data center for OpenAI has moved into “distressed” territory , meaning that it’s trading somewhere between 89 cents and 91 cents on the dollar, with the “Force Majeure” notice arriving less than a week later. All of this is to say that Oracle faces a much, much harsher lending climate today than it did back in November.  When we reprice based on today’s Treasury prices and current going rates for Oracle’s debt, things get…a little nasty. Across the board, Oracle’s spreads between US Treasuries have effectively doubled, and its new yields range from a bad-yet-manageable 6.73% and 6.91% on its five and seven-year-dated bonds to astonishingly high 8%+ yield across anything longer than 10 years. On a strictly cash basis, this means that Oracle’s debt would, if issued today, cost it another $6.89 billion in interest. I should also be clear that these numbers are based on a completely flat calculation related to today’s Treasuries and going prices for Oracle’s bonds. As Oracle sits exactly one rung above junk — and its debt trades at junk rates (meaning that the markets buy and sell it as if the yields were junk ( an average of 7.8% ) — it would likely see its debt priced at around 25-50bps more than what we’ve seen here. And if Oracle raises more debt, it runs the risk that two ratings agencies could downgrade it to “junk,” immediately forcing investment funds and indices that cannot hold junk debt to dump it, turning it into a “fallen angel” ( as I covered a few months ago ). Oracle isn’t even the worst of them. Wretched, debt-ridden neocloud CoreWeave issued around $7.75 billion in bonds in 2025 and 2026, and faces a double-whammy of problems — the increasing yield on Treasury bills combined with the overall souring of debt markets toward both its business and the overall idea of AI data center debt.  Last year, CoreWeave was already borrowing at ridiculously-high coupons of over 9%, but if that debt was repriced today, it would be paying at the very best rates between 11% and 13.22% — the kind of numbers you’d associate with a personal loan. As you can see, repricing CoreWeave at today’s rates would increase its costs by 35.8%, adding $1.2 billion to the lifetime cost of the bonds for a company that already pays $640 million a quarter in interest . Make no mistake, CoreWeave needs to raise more debt to build its data centers. Bloomberg consensus estimates have it borrowing more than $33 billion in 2027, at a time when interest rates are likely to stay elevated and jitters around AI data center debt are becoming full-blown convulsions. UBS’ Karl Keirstead estimates that it will need $102 billion in extra financing between 2027 and 2030, but that makes the broad assumption that CoreWeave will still exist in a few years. In any case, CoreWeave and Oracle’s debt exist as a kind of barometer of the data center industry’s debt position — two junk-or-near-junk firms raising endless debt to build out the so-called next industrial revolution at an agonizing price. And if the price of their debt is crashing — and the expected yield on the future debt is skyrocketing as a result — then their problems are everyone’s problems. As I discussed back in July , the sheer scale of AI capital expenditures has inflated the price of every imaginable piece of gear that goes inside a data center, a problem that compounds with every new dollar of capex: I published that newsletter on July 28 2026, back when ten-year-dated US Treasuries were a mere 4.6%, and concerns around Oracle’s data center debt had yet to truly erupt.  And a little under a month later, NVIDIA would bump its prices by more than 15% , partly as a result of memory costs, and partly because it has the entire tech industry by the balls. So, as more AI data center debt gets issued, said debt becomes more expensive, because the larger the amount of debt any one thing takes up, the more competition it faces, and the more risk an investor carries by holding it. Once the debt is issued, it immediately flows into buying GPUs and associated hardware, slowly growing the cost of memory and hardware, all while increasing the competition for the specialist labor and materials needed to build data centers, such as spiking the cost of Copper , increasing the cost of construction by billions in the process. In other words, the more you buy, the more you lose. The more money you raise, the more money you need. The more money you need, the more expensive that money becomes. And once you spend that money, everything you spent it on becomes more expensive, including raising more money in the future.  The other problem is, as I discussed last week , that these things are simply not getting built, either because the power isn’t there or construction is taking longer than expected, which is in turn putting pressure on effectively any data center-related debt, with even the $27 billion in bonds underlying Meta’s Hyperion data center in Louisiana (known as “Beignet Investor LLC”) aggressively selling off over the last two months. As I’ve said , a bond “selling off” means that anyone raising more debt that resembles it will have to pay investors more for the privilege.  And when even the debt associated with the largest companies in the world begins to sell off, that becomes everyone’s problem.  So, let’s talk about the $18 billion in debt behind Oracle’s New Mexico-based Project Jupiter data center, starting with ZeroHedge’s diagram of the structure : Oracle borrowed $18 billion from a syndicate of financial institutions including BNP Paribas, Goldman Sachs, and two Japanese banks — MUFG and SMBC — that have been in effectively every major AI data center deal, including multiple CoreWeave debt facilities, every Stargate/OpenAI/Oracle data center, and even SoftBank’s bridge loan that it used to fund OpenAI’s 2025 funding round . Additionally, funds related to Blue Owl (who is also invested in multiple different Stargate and CoreWeave facilities) kicked in $3 billion in equity to make sure the debt actually got raised. This kind of labyrinthine structure is how basically every off-balance-sheet and SPV-based data center debt deal is capitalized — a few billion dollars of equity investment, usually from one of a few private credit funds (EG: Blue Owl, Blackstone, BlackRock) that then raise debt from many of the same investors, something I covered at length in my Enshittifinancial Crisis piece from the end of last year . I also went into detail about the SPV structures a few months ago here . The reason I bring all of this up is that this kind of SPV is the template for data center debt, and the associated investors are a large chunk of the capital funding it, which means that their ability to continue feeding the beast of AI data center debt is what’s holding up this industry.  And now one of their largest data center debt deals, as mentioned, has entered “distressed” status , which means that any further SPVs they’re involved in will price based on the current state of Project Jupiter, which will be priced both based on the project’s health and the current state of Oracle , which is being dragged down by the questionable health of its many, many data center debt deals, all of which are contingent on OpenAI’s ability to pay it $300 billion over five years . This means that the price of any debt associated with AI data centers is now skyrocketing, at a time when the price of the goods that debt is buying are skyrocketing, at a time when the underlying construction needed to pay back that debt is taking forever. This is the Doom Loop: the more data center debt that gets raised, the more expensive both the data centers and the debt become, and the only way of fixing the problem is to stop financing new data center debt , except once that happens, everybody will ask whether the data center buildout has stalled, which will in turn create pressure on all of the debt that’s already been issued. In simple terms, it’s going to be difficult to impossible to raise AI data center debt below 8%, with even the $2.27 billion in bonds issued to CleanSpark for a Meta-connected data center in Georgia pricing at 8.25% on September 18.  As I went into in last week’s premium (and per my Bastard data center model ), a 100MW data center costs around $4 billion to $5 billion, with gross margins of 28% at $17.7 million a megawatt…with negative gross margins below $12.10 a megawatt. But only if you have a customer the entire time, and you don’t have any debt.  Those customers are, for the most part, either OpenAI, Anthropic, or a company like Microsoft or Amazon renting out compute to resell to them. Otherwise, they’re unprofitable AI startups like Cognition, which expects to burn $800 million in 2026 , with (per The Information) “hundreds of millions” of dollars of those costs coming from renting NVIDIA GPUs. This means that the underlying customer base for effectively every AI data center is either a hyperscaler or somebody that can, by definition, not actually afford to pay for their compute without somebody else giving them the money, with “somebody” often meaning “a hyperscaler.” AI data centers are some of the most-expensive and ambitious infrastructure projects in the history of mankind, funded with some of the most-expensive debt ever raised, with said debt only payable in the event that the project A) gets completed and B) has customers that can pay once that happens. Said customers are brittle, unprofitable and unsustainable, with the very real risk that they simply won’t exist by the time construction is complete. Even if everything goes to plan, the incredible cost of AI data centers means that they’ll take anywhere from three to five years to pay off, and that’s being extremely generous about the terms of the debt and the willingness of the customer to pay top dollar. One counter-argument to my skepticism has been that the per-hour price of GPU compute has gone up based on SiliconData’s various indices , but I have serious questions about the validity of this data, as I believe it measures spot rates — as in the amount you’d pay to rent right now versus on a longer-term basis — which creates an illusion of success that doesn’t connect to reality.  For example, SiliconData has NVIDIA’s B200 GPU pricing at around $5.78 an hour , but a contract I found between neocloud Kidz AI ( which rents capacity from a company called Limestone , or, more-specifically, its subsidiary Catalyst Compute) and AI inference company Canopy Wave priced 256 B300 GPUs at $4.30 an hour (per GPU) for the first three years and $3.50 an hour for the last two of the five-year-long contract for a more-advanced chip than the B200. Another contract I found between Australian neocloud Sharon AI signed a deal with a dodgy-sounding company in Dubai priced 8208 B300 GPUs at $3.30 an hour for five years. To be explicit, the B300 is NVIDIA’s latest-generation GPU, and its long-term rental prices are less than half of SiliconData’s hyperscale pricing for the years-old H100 .  If we assume that an 8-pod of B300 GPUs retails around $550,000, and the capex is a comparable amount, that puts the cost of the data center that Sharon AI is renting out at somewhere in the region of $1.1 billion, for a contract that will, over the course of five years , pay a total of $1.264 billion, assuming that the client in question pays.  In the case of Catalyst Compute, the 32 8-pods of B300s cost roughly $17.6 million, for a rough total of $35 million for the full capex. Over the course of five years, the contract will pay around $44.6 million, and I should note that the customer (Canopy Wave) only moved into reselling inference compute as of November 2025 .  In both of these cases, capital expenditures are barely paid off in five years, and only if you don’t include a single dollar of operating expenses or associated debt.  And that’s if everything goes to plan, and the customers actually pay. Even then, at the end of the five year period, we’ll theoretically have multiple new generations of NVIDIA GPUs (Vera Rubin and Feynman), which will further suppress the ongoing rates that your data center earns, all as ongoing opex (and debt) stays at the same level, assuming, of course, you were paid consistently throughout. Let’s review: AI data centers — and their associated costs and debt — are priced for a level of perfection that no other industry has ever rivaled. Their customers must be well-capitalized, prompt in their payments, and have revenues that allow them to spend tens or hundreds of millions of dollars a year on operating expenses on an ongoing basis, something that only really matters if the underlying construction happens. For whatever reason, everything I read about AI data centers considers it a foregone conclusion that everything will go to plan, and in fact that each data center will generate tens of billions of dollars a gigawatt in revenue, with no real thoughts or feelings about where those billions might come from or whether anyone will be able to afford them.   Everybody is either egregiously ignorant or hopelessly optimistic in a way that will make this situation so much worse when it collapses. I do not think the majority of these AI data center debt deals ever get paid. I do not think CoreWeave makes good on its debts.  Shit, I don’t think Oracle makes good on its debts. I estimate that since 2023, there’s been around $800 billion in global venture capital investment in AI companies, with at least $266 billion of that going to Anthropic and OpenAI. Of those investments, I expect at least $300 billion of that equity to be dead money, because, for the most part, AI companies are wrappers or layers built on top of Anthropic and OpenAI’s models, holding very little IP of their own and being burdened with ever-growing opex that mostly flows to the two AI labs that constantly want to compete with their customers. These businesses are fundamentally built on reselling tokens from the large AI labs at a loss, which is why companies like Harvey and Perplexity have to raise hundreds of millions of dollars every few months. These startups’ continued existence is entirely a function of venture capital, as all of them are deeply unprofitable. This means that before the bubble bursts, these companies will continue to sap the venture capital world of billions more dollars, all with little chance of an acquisition and a near-zero chance of an IPO considering their ugly economics. These economics are also load-bearing for OpenAI and Anthropic, representing around 80% of their revenues , meaning that once they die, the AI labs’ underlying revenues begin to decay. This also means that these AI startups are, in general, not actually renting AI GPUs, choosing instead to rent them by proxy by using Anthropic and OpenAI’s models. Though some of them talk a big game about building or training their own models , doing so is enormously expensive with little chance of a payoff, especially given the massive advantage in compute, capital and talent held by the labs.  There really is no clean “out” for any AI startup not named Anthropic or OpenAI. Cognition, valued at $48 billion in its latest funding round , is allegedly worth nearly as much as Ford ($59 billion market cap), yet generates a mere $1 billion in ‘annualized run rate,’ which could mean anything, all while losing $800 million. Ford, by comparison, had $187.2 billion in revenue in 2025, with a net loss of $8 billion attributable in part to a massive writedown of its electric vehicle portfolio ( $12.5 billion in Q4 2025 alone ). In 2025, Ford sold around 2.2 million vehicles. Cognition, by comparison, makes yet another AI coding agent. What, exactly, does Cognition do from here? Who buys Cognition? Does it go public? How? It loses tons of money and has a commoditized product!  Nobody wants to answer these questions, because the answer is pretty simple: one day, Cognition, like many AI startups, simply runs out of money and dies, or becomes a much, much smaller company. The same goes for Harvey, Perplexity, Replit, and basically every other major AI startup, though I’d argue they’re all hoping to get swept up by a hyperscaler. As I discussed at the end of last year , AI startups are a devil’s deal for all venture capital. Because they’re so capital-intensive, there’re tons of opportunities to invest, and every time you do so, the underlying valuation (and assets under management of the VC fund) skyrockets, making everything look good on paper. The problem is that these valuations are entirely disconnected from reality to the point that, for the most part, all of these companies either go to zero or are picked up in nebulous “acquihires” for embarrassing fractions of their previous prices.  Without these companies, Anthropic and OpenAI lose somewhere in the region of 60% to 80% of their enterprise revenues, which makes them even less likely to be able to pay for all their $1.3 trillion in compute commitments. And outside of those two companies, I estimate there’s roughly $22 billion of demand for AI compute . Every single day — even on the weekends — someone asks me either how or when all of this breaks, and my answer is simple: when the money runs out. Eventually, AI data center debt is going to become untenable for those raising it, because 11%+ rates on already-meager margins makes the maths a little impossible. Once this happens, there will be a fundamental reevaluation of the value of all AI data center debt, which may lead to a sell-off of the underlying bonds and associated debt, which will make any investor deeply entrenched in the GPU credit business extremely nervous and, in some cases, unable to exit their positions in anything short of an embarrassing fashion. This isn’t likely to happen due to moral or ethical reasons, but as a result of creditors realizing that they’ve got way too much risk tied up in projects that regularly make the news for not getting built. At some point these projects become too risky for even the most mold-poisoned private credit fund or brainless Japanese bank to stomach, and the timeline will accelerate based on either Treasury rates or further data center developments facing cashflow or construction problems. On the venture capital side, it’s unclear how much dry powder actually remains, how much of it could be deployed into AI startups, and whether it’ll be a case of ‘running out of money’ so much as a moment where everybody gets spooked about AI and stops investing entirely. This would be accelerated by any cashflow issues across any major AI startups, any downrounds (IE: raising at a lower valuation), or failed acquisitions, such as when Anthropic walked away from buying Decart for $6 billion earlier in September . And really, the biggest sign is the most obvious one — the deceleration of Anthropic and OpenAI. If they aren’t going to pay those $1.3 trillion in compute bills, the jig is up for AI data center demand. The signs are already there that something is up. Per Irrational Analysis , Anthropic’s record-breaking “$65 billion in annualized revenue run rate” from July 2026 may have been calculated in the single-most-deceptive way I’ve ever heard a startup do so: That’s right folks. If Irrational Analysis is right, Anthropic’s revenue on July 31, 2026 was $178 million, and because the other calculation — 28 days times 13 — created a lower number, the company chose to go with something that should, at a minimum, have investors hiring lawyers and demanding real, tangible answers about how run rate is calculated. Every single reporter with any Anthropic source that can speak to run rates should be screaming at them for clarity, because this is some sub-Enron bullshit. Even if you don’t trust that analysis, another from TickerTrends surfaced by Callum Williams of The Economist shows Anthropic’s annualized run rate plateauing since, it seems, the beginning of June, and as Williams said, if this is even broadly correct, it’s really, really bad. Williams also another TickerTrends chart showing OpenAI’s revenue growth had continued to climb…but was showing the initial signs of a slowdown. Neither of these companies can afford to slow down, in part because of their massive compute obligations, and in part because their massive valuations are based on them being able to pull in, at least in Anthropic’s case , between $190 billion and $200 billion in annual revenue within the next two years.  If they fail to do so, everybody suffers. Hyperscalers miss revenue estimates. AI data center debt goes unpaid. Venture capitalists find their holdings washed out.  When that happens, everybody will act as if it was a huge surprise, rather than something that was blatantly obvious to anybody who bothered to look. That was originally where this newsletter ended, but the night before this was due to go out, parts of Anthropic’s S-1 leaked to Reuters , showing the shocking financial condition of the company as of the end of last year. In 2025, Anthropic lost over $8 billion on $4.6 billion in revenue. 25% of its 2025 revenue came from two customers, and its compute costs were $7.33 billion for the year. It technically had a net loss of $42 billion, but that was stock-related and was not a cash loss.  Reuters did not report on Anthropic’s 2026 numbers, and while in theory its economics could have improved in the last three quarters, there are reasons to believe that things have gotten worse, such as the fact that it has resorted to using adjusted margins as a means of faking a “profit” in Q3 2026 . In any case, I find it strange that Reuters reported on only a section of the S-1, and if it turns out anything was held in reserve for some reason I will be deeply disappointed. I will be fair and assume it was a limited slice of the prospectus, and that Reuters will diligently report anything it finds, and it is an incredible exclusive. So, let’s talk about how terrible of a company Anthropic was in 2025.  It spent $12.65 billion in operating expenses to make $4.6 billion of revenue, otherwise known as spending $2.75 to make a dollar.  This, shockingly, means that Anthropic was a worse business than OpenAI in 2025, when it spent $34 billion to make $13.07 billion ( per my own exclusive reporting of its audited financials ), or $2.60 to make $1. While things could change in 2026, it’s important to note how many people said that Anthropic was “a better business” that would “be profitable faster than OpenAI,” which is, until we are able to see both of their audited 2026 financials, somewhere between a myth and an outright lie. So many people told me that Anthropic was more-profitable! So many people assured me that this company had worked it all out , when in fact Dario Amodei’s horrid son was just as obese as Altman’s, a rotten, unprofitable carcass. Boosters are already boiling their copium kegs, angrily oinking that 2026 “will be better” and that “Anthropic has been more profitable.” At this point I have less than zero interest in anything that hasn’t gone through an auditor, because it’s very clear that, through either misinforming investors or the media, Anthropic has intentionally obfuscated the full horrors of its economics.  Perhaps 2026 will be better! But right now, the evidence is that Anthropic’s economics have decayed for the last two years, and its business was, at least in 2025, somehow more toxic than OpenAI’s, regardless of what you may have read in the press. If things have improved, it will have required a fundamental turnaround of a business in a way that does not appear to have happened in any way for OpenAI, despite both companies being in the same business and selling the very same thing. The only difference I can imagine is that Anthropic’s infrastructure is more TPU and Trainium/Inferentia-heavy, but we’ll eventually find out, I guess. If you have the full S-1, I implore you — bring it to me. My signal is ezitron.76. I will protect your identity. I will do this document justice. It’s time we had complete clarity into what this business truly looks like. We should not be made to wait for November, we should see it now, so that investors (and any economic counterparty) may fully understand the state of Anthropic.  In any case, these numbers are as bad as I’ve always thought they’d be, if not a little worse. I don’t see how this company becomes one that can afford its $518 billion in compute commitments, nor do I see how it magically works its way out of the economic equivalent of septic tank.  This company will, if allowed to go public, likely lean on the very same junk-grade/high-yield debt that AI data centers and neoclouds like CoreWeave currently need, and it will do so at volumes of somewhere between $50 billion and $100 billion a year for a company with few assets, endless losses and a CEO with the grace of a drunk elephant.  Anthropic is not the future of technology, nor is it the next Google, nor is it the next Microsoft, nor is it, to quote Reuters, capable of “[transforming] the global economy more profoundly than industrialization, electricity and the internet.”  Anthropic is a cloud software company with volatile products and economics, sold in a fundamentally insincere and deceptive manner, pushed upon society with threats of death and destruction by aggressive zealots and members of the media bereft of shame. Its culture is fundamentally unhealthy, as is the culture of the fandom it has curated over the last few years. Dario Amodei is a manipulative and deceptive person influenced by a cadre of cultists , and Anthropic CFO Krishna Rao should feel ashamed of himself for allowing a single run-rate story to go out. It is impossible to rationally argue that the economics of OpenAI and Anthropic make any real sense. To claim that this is “just like Uber” or “just like Amazon Web Services” or “just like the Dot Com Bubble” is to bury one’s head in the sand or, on some level, want to know less about the world. This is serious, dangerous, and should not be seen as “business as usual.” We must treat OpenAI and Anthropic as what they are: economic disasters waiting to happen.  To do anything less is to directly invite danger to the door of every investor that’s allowed to believe that they’re funding the next industrial revolution. If you liked this piece, you should subscribe to my premium newsletter. It’s $70 a year , $18 a quarter , or $7 a month , and in return you get a weekly newsletter that’s usually anywhere from 10,000 to 18,000 words and provides vast, detailed analyses of the biggest events and companies in the AI bubble. If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on The Terminal. OpenAI estimates it will have $36 billion in revenue in 2026 . Through the first half of 2026, Anthropic had around $16.3 billion in revenue, and if we assume that it’s growing faster than OpenAI, that puts its annual revenue around $40 billion for 2026. Cursor allegedly hit $4 billion in annualized revenue ahead of its acquisition by SpaceX , but that most decidedly does not mean $4 billion in revenue.  Perplexity is allegedly sitting at around $750 million in annualized revenue , but was at $250 million at the start of the year, making its annual revenues likely somewhere in the $350 million range.  Cognition recently hit $1 billion in annualized revenue ($83 million a month) as of September 25, 2026, but never defined what that meant. Considering that The Information had it at around $900 million a month beforehand , I think it’s likely that its revenues sit at around $300 million to $400 million. The Information also notes that Cognition expects to burn $800 million this year. Per The Information , OpenAI and Anthropic represent 89% of all AI startup revenues. AI data centers are extremely expensive. AI data center debt is now extremely expensive. AI data centers take years to build. AI data center customers are brittle, unprofitable and dependent on near-perpetual funding. For there to be any real chance of a payoff, the average customer — you know, the brittle, unprofitable one I just mentioned — will need to survive until the data center is built, and then be able to afford ongoing fixed annual costs, all while competing with multiple other data centers with identical chips.

0 views
Kev Quirk Yesterday

2026-09-29 16:03: I think it's time... #Ubuntu

I think it's time... #Ubuntu 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 Yesterday

Book review: What Can A Body Do?

A new confession: I struggle with a lot of accessibility writing. I am not necessarily saying this to blame people writing in this space, whose work I respect even if it’s not resonating with me. I think it’s more of a recognition of how difficult it is to talk about accessibility and disability. Advocacy is never easy. It’s hard not to be impatient with the pace of progress, hard to contain your incredulity that others don’t get that what is so obvious to you, hard not to constantly expect more from people, hard to imagine others – and the society as a whole – not caring. On top of that, accessibility is a more difficult subject than many I cover regularly on this blog. There are hard-to-explain technical issues wrapped in deep legal considerations, and some aspects of disability are taboo or taboo-adjacent. To me, all this often makes even best-intentioned accessibility writing less approachable. I am also, personally, to blame. I sometimes struggle with design writing, too. Some of the taboos and hangups live inside me. I might be obstinate when corrected. I have also personally seen a few times the opposite of the curb-cut effect : not fully thought through accessibility accomodations making software worse for some groups of people. All of this is making me a tricky customer. I’ve been wanting to find accessibility writing that would work for me, with just the right amount of push and pull: detailed but not overwhelming, inspiring but not cheesy, gentle but not basic, pleasant without being cheap. This book by Sara Hendren is as close as I’ve ever been to all this. It’s exceedingly well-written, to a point that it’s really hard not to quote it excessively. Witness the very opening: Every day every body is at odds with the built environment. Bodies come up against stairs and sinks and subway platforms, sometimes with ease and grace and sometimes blundering and awkward, over hurdles, even in a sudden clash. Each flesh envelope is miraculous and mundane in tis way, lugging all its gear and getting where it needs to go. Maybe you handle a sharp knife with enjoyment of its grip; maybe you wince as you sit down in or get up from your office chair. Or, just a few pages in: But consider: this dual job that design has to do is a mammoth task! How do you make a charismatic thing – not just a thing that works, but a thing that has elegant presence or pleasure in its handling, some kind of draw, a thing that pulls you in or makes you think while also being handy, modest, even garden-variety in its value? This combination is what makes design so interesting to so many people. It’s not just the quest for a better mousetrap, and it’s not just a free-form experiment, and it’s not just a slick new color scheme. […] When Hendren early on decides to focus on the right words and the best definitions – a theme permeating the entire book, important in an area of sensitivity around language – it has none of the awkwardness of a wedding toast’s “the dictionary defines X as…” but is instead a lucid exploration of the power and beauty of language, piercing right through some of the taboos I mentioned: Among disabled people there’s a bigger catch-all term, a slang for this particular mismatch: it’s called life on “crip time.” Crip is short for cripple, a name that disabled people have repurposed in an act of political reincarnation, dropping the degradation attached to a word that was used to describe them in the past, cripple , and investing it with in-group pride. “Crip time” is flexible shorthand in disability culture, used to indicate a range of uneasy relationships to thje pace of contemporary industrialized life, with its relentless and clock-driven organization of hours and days. As a disabled person, to say you’re “on crip time” on a Tuesday might signal te extra time that it takes you to get to the train platform or in and out of a public bathroom. It can also stand for bigger systemic fits and starts – the spiky, unpredictable time it might take a person to proceed through a fairly rigid K-12 education that’s built on all kinds of normative chronologies. This whole book is this – it’s accessibility and disability as details, as creativity, as confidence, as joy, as warmth, and as craft. The writing has so much range and color, covering some of the aspects I expected, but also talking about autism, dementia, phobias, and general intellectual disability (who knew? your brain is your body, too). Hendren dips into history as needed – the origins of the usually simplistically portrayed curb-cuts is fascinating – but the book is anchored in the present. There isn’t a lot of software in the book, and the other reason I’m giving it only four stars is that I wanted… more photos. I’m a single-issue voter this way, always dreaming of visual evidence of devices, people, and places. But don’t let this stop you. This book will help you understand accessibility and disability – and if you already do, it might help find good ways to talk about it. You should read it. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/book-review-what-can-a-body-do/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/book-review-what-can-a-body-do/1.1600w.avif" type="image/avif"> (Thank you to Ethan Marcotte for suggesting the book and a conversation about it, and to everyone who answered my question about good accessibility writing – check out the answers on Mastodon or Bluesky if you are interested in more recommendations!)

0 views
neilzone Yesterday

How does one genuinely identify one's own, non-technical, learning and development needs?

As a solicitor, each year, I need to make a statement of solicitor competence . Aside from the regulatory requirement, I want to do a great job for my clients: it is a source of my own personal, professional pride. Similarly, most of my work comes from word of mouth referrals so, simply from a grubby money-making point of view, doing a good job just makes sense. The requirement, at a high level, is pretty obvious: the ability to perform the roles and tasks required by one’s job to the expected standard The Solicitors Regulation Authority helpfully breaks this down into a number of different areas: Crucially, based on the SRA’s list, technical competence - the “knowing and applying the law” bit - is just one facet of overall competence. In terms of learning outcomes / knowing what continuing education I need, this is pretty straightforward: I know that I need to keep on top of my stuff. For me, this means both law and technology, since much of what I do draws heavily on both aspects. In practice, I do this through keeping track of numerous different sources of information, and most of my reflections end up as posts on my work blog . Sure, there is an awful lot of change in both technology and law, and keeping on top of all the various legal issues can be challenging, but at least I can work out what I need to do reasonably easily. I find it harder to assess my learning needs in other areas. Not in a box-ticking sort of a way - actual, genuine, “this would be useful”, development. Stuff that it is worth spending my time on. I have no colleagues, and while I’ve asked clients for feedback, specifically what I can do better, or things they’d like me to do differently, or things that they have valued in other professional advisors, I have turned up nothing. I will keep asking every so often, but I cannot rely on this as a source of learning needs. I do my best to assess my own performance, but I struggle. I keep a document of “practice reflections”, in which I note down issues which cross my mind. Looking back on it for this year, themes include ethics (below), IT and cybersecurity, and, perhaps inevitably, AI. I mentor people, but I have not been mentored. Perhaps that is something to explore. Nevertheless, I do what I can - this year, I had a particular focus on ethics, in the light of the Post Office scandal - but I’d like to be better . I could be led by what is on offer, in terms of seeing what CPD providers are offering, and what other resources are available, and seeing if I fancy any of them. But that feels like the wrong way round to me, since it is not centred on my own learning needs - but it could still be a good source of inspiration. So I asked other professionals in the fediverse what they did for their own continuing professional development. (Importantly, I did not ask what they think that I should do, but rather what they themselves did.) I got a range of answers (including many focussed on technical competence), which I have paraphrased / collated here: a company gives a week off each year for CPD, but the training must be nothing to do with their everyday work. I keep a journal, including things that I find myself hesitating to do, or something that I feel that I did poorly. A variation of this was a “leadership lessons” log, with things that the author saw others do well/poorly, and what they themselves did well/poorly. annually, I prepare a document that contains low points, high points and what I learned from the previous year, and new things I want to try or do / things I want to continue doing / things I want to stop doing for the next year. breadth first and depth first investigations. focussed time, periodically, thinking about my career and role. pay attention to the long term changes. paying for a business coach. looking at people I admire and what they can do, that I wish I could do. talking to people in relevant areas, asking them about challenges they face and skills they have, and comparing it to what I can do or struggle with, and asking what they are up to formal reflections following a template. browse the CPD section of their professional institute, for inspiration. I will see what I can take on board here, for the coming year. And, if you are a client, and you think of something that I can do differently, or better, please do let me know! A Ethics, professionalism and judgment B Technical legal practice C Working with other people D Managing themselves and their own work a company gives a week off each year for CPD, but the training must be nothing to do with their everyday work. I keep a journal, including things that I find myself hesitating to do, or something that I feel that I did poorly. A variation of this was a “leadership lessons” log, with things that the author saw others do well/poorly, and what they themselves did well/poorly. annually, I prepare a document that contains low points, high points and what I learned from the previous year, and new things I want to try or do / things I want to continue doing / things I want to stop doing for the next year. breadth first and depth first investigations. focussed time, periodically, thinking about my career and role. pay attention to the long term changes. paying for a business coach. looking at people I admire and what they can do, that I wish I could do. talking to people in relevant areas, asking them about challenges they face and skills they have, and comparing it to what I can do or struggle with, and asking what they are up to formal reflections following a template. browse the CPD section of their professional institute, for inspiration.

0 views
Kev Quirk Yesterday

2026-09-29 11:10: Soooooo Hacker News happened. 🤣

Soooooo Hacker News happened. 🤣 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
Stratechery Yesterday

One More Note on Agents, Meta Connect, Meta Enterprise Platform

Meta has the chance to own the consumer agentic space; going for enterprise is a big mistake.

0 views
Robin Moffatt Yesterday

Interesting links - September 2026

I’m going to try to avoid falling into the trap of making a bad pun about the season…damnit! ;-) Welcome to the September edition of Interesting Links in the Data and AI World . It’s a bumper edition (aren’t they always), with lots and lots about Kafka and related technologies in particular this month. Oh, and AI. Obvs.

0 views
Brain Baking Yesterday

October Is Spooky Video Game Month

It’s just two days shy of being October, the spookiest month of the year. October does not just signify Inktober or any other compound word involving the name of the month. No; October means playing Mega Ran, Richie Branson & Kadesh Flow’s Ghouls ‘N Ghosts albums on repeat ( we’re the kings of the night; GnG resurrected ). I have high hopes of them releasing album number five, but in the meantime, just listen to a few tracks of the latest album and you’ll know why it’s part of the October canon: The first song on the album is a rearrangement of a classic Castlevania track—something Mega Ran loves to do and I love to listen to. The lyrics of the linked track—nr. 2; Make It Out (Siren Head) —set the tone of a dark haunted castle that, once entered, refuses to let you go: Too much time trying to get away Eerie sounds almost had me swayed Thinking there was someone to save Got me dodging an early grave […] I don’t know if I’ll make it out (4x) But Lord knows I’m trying Speaking of which; why don’t we all play as many Castlevania games as we can in October? We’ve got two things to celebrate: the spooky season (and thus the harvest of ample of pumpkins I guess) and the arrival of Castlevania: Belmont’s Curse , a new 2D entry in the mainline series! If you don’t count Igarashi’s Bloodstained series as a mainline Castlevania game, it’s been since Order of Ecclesia in 2008—18 years ago—that we ‘Vania fans are being treated to a brand new 2D metroidvania game. I’m not counting 2009’s The Adventure ReBirth ; the remake of the 1989 Game Boy game; nor 2024’s Haunted Castle Revisited ; the remake of the 1987 arcade game. Yet perhaps it is worth it to paste in a flyer for the arcade game to help get you into a creepy mood. Haunted Castle: Re-Vamp An Old Game With This New Kit! 1 To 2 Players. Doesn’t that penetrating gaze from the beautifully dressed woman kneeling next to a grave marked as “STONE” without getting a single spot of dirt on her very visible shiny legs send a chill down your spine? Or send anything down anything else? How about the gaze of Dracula himself, staring dangerously looking into the foggy distance, or rather, having this I-need-to-pee look? That was the late eighties—they don’t make them anymore like this. But no worries: they are still making a Castlevania game! Someone at Konami finally resurrected the genre after realising that this could be a sure way to fill the coffins back up with lots of cold hard cash; needed for research purposes to do execute some more cross-breeding vampire-werewolf-human experiments. I don’t understand why they realised it so late but better late than never. The Castlevania Collections on multiple platforms are still selling well; shouldn’t that be an indication for an appetite for more? In any case, I will enter October prepared. I already went ahead and played a couple of 16-bit entries that I somehow missed, such as Bloodlines on the MegaDrive and Vampire’s Kiss on the SNES. I play Aria of Sorrow each year: to me, it’s simply the best game in the series, and one of the best games ever created. It executes every typical ‘Vania mechanic flawlessly, has a soundtrack that just slaps, and doesn’t outstay its welcome. Obviously, it’s in my Top 20 GOAT list . Yet for being such a fan of the more “modern” metroidvania adaptations the series evolved towards after Rondo of Blood , I have never truly finished thé most important entry: Symphony of the Night . I wasn’t a Sony/PlayStation kind of person and even after finally having access to it through a hidden unlockable in the Dracula X Chronicles remake on the PSP, I had other more pressing things to do such as trying to figure out how this thing called working works. The game arrived in Europe a year after I graduated. Each year in October, we at the DOS Game Club play a spooky DOS game . Last year, that was Halloween Harry . In two days, you can join us playing Legacy: Realm of Terror . In Legacy , you explore yet another spooky mansion—this time not Dracula’s, but from someone or something much worse: something that serves as a gateway to ancient eldritch horrors. Why don’t you create your own spooky video game backlog to try and work through in the upcoming month? Here’s mine: I don’t expect to finish them all but if you are interested in exploring the Castlevania series, I do recommend to just start with the beginning. The original “classicvania” stage-based games are very short—but also very hard: that was the accepted way to artificially prolong the game length in the eighties/nineties. Play them through the Anniversary Collection or en emulator that features save states in case you get frustrated by bats knocking you off staircases. Trust me, you will. There are enough “best ‘Vania games” lists floating around on the internet. For me, the GBA and DS games are firmly placed at the top. Skip a game if it doesn’t click with you in thirty minutes. Enjoy whipping and be whipped by Death! And don’t forget to make good use of the bathroom if you suddenly find yourself staring at the distance. Related topics: / games / By Wouter Groeneveld on 29 September 2026.  Reply via email . Castlevania: Dracula X Chronicles (the Rondo of Blood PSP remake) Castlevania: Symphony of the Night Diablo II: Resurrected (I’ve played the original to death and feel the sudden urge to do a few more Mephisto hell runs. Plus, the new class looks amazing: official new content in a game that’s basically 26 years old!)

0 views

Deser: Rethinking Rust Serialization

Serde is an amazing serialization library for Rust and it has been a huge reason why I felt productive with it for years. However already while at Sentry I got quite frustrated with some of the limitations with it but actually replacing Serde is tricky because of the might that it has in the ecosystem. Also because it’s quite hard to actually do better without also making some potentially painful compromises. Here are three examples of Serde corner cases that show poor interactions of Serde features or unexpected limitations: An internally tagged enum, with ‘s feature turned on: Serde’s data model has no place for arbitrary precision numbers, so uses in-band signalling with a map with a magic key. The enum has to buffer the fields until it has seen the tag, and the buffer does not know about the magic key. Because Cargo features are unified, it’s enough for any crate in your dependency graph to turn the feature on. on its own parses just fine. JSON keys are always strings, and only turns them into integers if the type asks for one. However once buffers the value, is just a string. The error also points at the end of the document rather than at the key. A function cannot be passed as a type parameter, so there is no way to apply to the inside of an , a or a map. You write another function for every wrapper, and once you have the field is no longer optional unless you also remember to add . None of these are bugs that are easy to fix in Serde. They fall out of its design, and that design is protected by Serde’s stability guarantees. Back in 2022 I started an experiment called Deser . It’s a serialization library for Rust that takes the user experience of Serde and puts it on top of a completely different architecture inspired by miniserde . I never really finished it and it sat around for a few years. I picked it back up, and it has now reached a point where I think it’s worth looking at. Even just to inspire others to see if they want to explore the space. The name is Serde with its two halves swapped. Deser is Serde but the other way around. In Serde, a type drives the deserialization process: a impl asks the deserializer for the kind of value it expects, the format calls back into a visitor. Every nested value is handled by recursion which makes Serde deserialization inherently grow the stack with each level of nesting. Deser on the other hand turns this around and the format tells the type of the next value and pushes events into a sink. When a sink hits the start of a nested value, it doesn’t call into it but hands back a new sink to a driver, which keeps all state on the heap (in fact, in an arena). On the way out, emitters return their nested values instead of recursing into them. That also means that Deser cannot support formats like protobuf that are not self describing. They are in fact quite intentionally left out of the design entirely. Which is one way to say: if you want to “fix” Serde, you need to make some other compromises. Most of the reasons for Deser’s ideas go back to Sentry Relay , which processes enormous amounts of untrusted JSON. Over the years when I was at Sentry we ran into the same set of problems again and again, and many of them are not really bugs in Serde but consequences of its design. Serde’s stability guarantees mean that a lot of them cannot be fixed without breaking every format and every hand written implementation. Most of these problems come from three decisions: One set of traits for all formats. Serde serves both self describing formats (JSON, YAML, TOML, …) and formats where the reader has to know the type upfront (postcard, bincode, protobuf, …). That is incredibly useful, but it means that some features only work with some formats, and you find out at runtime. In case of Serde it also has some odd wrinkles where a derived struct quietly accepts an array in place of an object in JSON for instance. A fixed data model that loses information when buffering. Internally tagged enums, untagged enums and need to buffer values before they know what to do with them. The buffer can’t hold everything the format knew, errors lose their location and extensions to the ecosystem rely on in-band signalling to express things such as arbitrary precision numbers. Recursion on the call stack. Every level of nesting uses stack space. Formats protect against this with a recursion limit, but the moment you go through a code path that doesn’t have one (writing, dynamic values), deeply nested data can take down your process. It also means that a deserialization cannot be paused while you wait for more input. Many of the corresponding Serde issues have been open for years, and I wrote about abusing Serde before. People have tried different angles on this over the years. Some went minimal and dropped most features to get fast compiles and no recursion. dtolnay’s own miniserde is the best example of that, and deser’s trait design was originally modelled after it. Other recent attempts went for runtime reflection, or for a new data model with a focus on binary formats. If you want to read up on all of the collected challenges with Serde’s design, I maintain a lengthy list here . First of all I don’t think it’s likely that one can replace Serde. The orphan rule entrenches Serde incredibly well in the ecosystem. But some things are within the reach of a crate author’s control. In case of Deser it’s completeness. Deser today implements all important self describing formats from YAML, JSON, TOML, CBOR, JSON5 and the likes, but also XML and plist to really close the gap. XML in particular is something Serde has declined to support, and it shows (more on that below). At the very least format support should not be the reason not to use Deser. The second problem usually is that actually solving Serde’s issues comes at a significant cost in compile time and/or runtime performance. Deser is no different. While Deser’s compile times are a bit better than Serde’s, the binary bloat is quite a bit worse and the runtime performance is mixed. It’s roughly comparable if you look at the numbers but depending on the format structure you are losing significantly from some of the tradeoffs. That said, it’s now in a state where it’s at least in principle a drop-in replacement where the tradeoffs might work well for users. Deser does not try to be significantly different than Serde on the surface level. For most uses you derive and and then start using it with your format implementing crate of choice. Most attributes are very similar, though they are taking Rust expressions instead of strings. The difference in the design would become more apparent if you implement a serializer or deserializer yourself. Instead of visitors that call into each other recursively, deserializing a type creates a sink which receives events that are directly emitted by the parser, and serializing produces emitters that hand out values. Nested sinks and emitters are handed back to a driver, which keeps them on the heap. This design, which is entirely stolen from miniserde, gives some interesting consequences: On top of that are a lot of things that I just wanted to have: Here is a small configuration type that shows a few of these together: Adapters are types, so can go inside a , and inside a inside an . Validators are adapters too, so decodes the keys and then checks that there is at least one. The catch-all variant keeps the tag and a recording of everything else in case someone wants to process it later. Errors are something I care a lot about, so here is what happens when a value is wrong: Note that here the tag of the internally tagged enum comes last which means that the values have to be buffered until the tag is known. In Serde this is tricky and we would lose the location if we used some tricks to add it. With Deser however, with the path layer enabled Deser you where in the structure the problem is: Deser really wants to be extensible, and XML is a more extreme example of the differences between Deser and Serde. Here is an Atom entry that mixes in Dublin Core for the authors: XML uses namespaces which means that names need to be matched by their namespace, not by the prefix the document happens to use. Here the document says and the type says . is just the string , which works because attributes are expressions. The two creators are collected into one even though there is another element between them, and the text of goes straight into a datetime. Because the enum is untagged, the entry has to be buffered before a variant is picked, and deser’s buffer keeps both creators. So the result is an with John and Jane. quick-xml, the most popular XML crate for Serde, drops the prefixes and ignores namespaces entirely, so a from some other namespace is happily accepted as the title of the entry. The split list part though is considerably worse. A plain fails with a duplicate field error for , unless you turn on the feature (which, remember, is a global additive flag that any crate could set). That feature makes quick-xml read ahead to the end of the element and buffer everything in between, without a limit unless you set one. But the feature only helps when quick-xml is hooked up to the struct directly and no buffering is taking place. Wrap the struct in the untagged enum and Serde buffers the entry itself. Read from that buffer, sees twice and fails again. The fallback is a map, which keeps only the last , and there is no error. With or without the feature you get this: Notice how John is gone. Format specific extension types such as TOML datetimes are another case. TOML has them natively, Serde’s data model does not, so the crate passes them on as a map with a magic key. In Deser a datetime is an extension value, which formats that know it keep and all others write as a string: The same with gives you , and reading the value into a fails outright with . So now that you know Deser is at least in theory cool, at what cost? It is not free. The design relies on dynamic dispatch and on sinks and emitters that live on the heap, and that has considerable runtime overhead. In my own measurements for JSON, Deser reads somewhere between 33% faster and 60% slower than on the data. On average it’s about 10% slower for reading. Writes are between three times as fast and 70% slower and a wash on average. For YAML and TOML it’s noticeably faster than the Serde based crates, but that is more about the format implementations than the architecture. Compile times slightly are better, but not dramatically so. Because it doesn’t monomorphize everything, release builds of derived code are about 2.3 times as fast as with Serde and that get a tiny bit better in practice for your own code as less recompilation is necessary. To make Deser’s design work at all, it also uses internally. Most of this is to keep the chain of borrowed sinks on the heap. I feel like this is fine in the days of Miri and agents, but I know it makes some folks uneasy. And well, the biggest cost is that it’s just not Serde. Quite a lot actually which might be surprising. In addition to the core there is support for derive . It supports all flavorts of JSON you can think of: JSON , JSONC , JSON5 and HJSON . (Fun fact here: they are all generated out of one shared parser template ) For binary handling it supports CBOR and MessagePack . Additionally it does YAML 1.1 and 1.2, TOML , XML and all three flavors of Apple’s plist as well as CSV/TSV , urlencoded data and environment variables . For more crazy contraptions you can attach path info or capture location data as well as support for debug printing . You can perform validation as you parse, opt into different binary encodings in addition to base64, you can bridge to serde or capture dynamic values , transcode between formats or hook it up with tokio . For documentation see docs.rs/deser and the code itself is on GitHub alongside many examples . One set of traits for all formats. Serde serves both self describing formats (JSON, YAML, TOML, …) and formats where the reader has to know the type upfront (postcard, bincode, protobuf, …). That is incredibly useful, but it means that some features only work with some formats, and you find out at runtime. In case of Serde it also has some odd wrinkles where a derived struct quietly accepts an array in place of an object in JSON for instance. A fixed data model that loses information when buffering. Internally tagged enums, untagged enums and need to buffer values before they know what to do with them. The buffer can’t hold everything the format knew, errors lose their location and extensions to the ecosystem rely on in-band signalling to express things such as arbitrary precision numbers. Recursion on the call stack. Every level of nesting uses stack space. Formats protect against this with a recursion limit, but the moment you go through a code path that doesn’t have one (writing, dynamic values), deeply nested data can take down your process. It also means that a deserialization cannot be paused while you wait for more input. No stack overflows. You can arbitrarily nest structures without issues. For untrusted input you set limits with a layer, and you pick the number that you are comfortable with, which is independent of your stack space. Suspendable. Because the state lives in the driver, a deserialization can be fed input as it arrives. It’s also , so it can move between threads while you wait on IO which makes it much nicer to use with tokio. Formats like JSON, CBOR and MessagePack can be parsed as a stream if you so desire. An extensible data model. The core data model is small and made of atoms, maps and sequences. For all else, there are extension values ( , , etc.) that also all carry a fallback for formats that don’t understand them. Unlike Serde this means it does not rely on in-band signalling of objects with magic keys to smuggle values through. Lossless buffering. When a value has to be buffered (for instance because the tag of an internally tagged enum comes last), Deser records the events together with everything the format knew about them. Protocol specific extension types or error locations all survive. Layers are a middleware system that sit between the format and your types and can track things like paths, enforce safety limits, rename keys or redact values without having to touch specific code paths. Native flattening that doesn’t buffer at all. Allow enum tags to be of any type, not just strings Adapters that compose ( ) Enabling validation as an adapter derive attributes that are real Rust expressions instead of strings bytes as a core functionality in the data model duplicate keys rejected by default and errors that point at the problem

0 views

Donating to open source

I have decided to start donating a small amount of my fun money to open source projects. After some research, the initial set of recipients are These are important to me, they need more money, and I believe they can use donations well. If you disagree, I’d genuinely like to hear what mistakes I’ve made in the analysis below. I hope it shows that this is important to me. (Continue reading the full article on the web.) Perl 5 Core Maintenance Fund

0 views