Latest Posts (20 found)
Unsung Today

The secrets of your menus

I’m curious if you know of this pattern that existed for as long as I remember. On a Mac, you can hold an ⌥ key (Option) whenever any menu is open, and often see more powerful, advanced, or faster variants of existing commands, helpful for a power user. Here’s Audio Hijack and Forklift: This is not limited to just ⌥. Here in Chrome’s increasingly impenetrable View menu , ⇧ (Shift) works the same way: And in the Finder’s File menu, both ⇧ and ⌥, and even the rare ⌃ (Ctrl) get to play: This feels like a nice, thoughtful extension of the command system. It’s clever, too – the key to reveal secret things is the same key you would use for their shortcuts, so you can make the connection either cerebrally or in your fingers. There are menus that treat it slightly differently, though. Here in Finder and Safari, you can see commands themselves changing when you press ⌥, no shortcut in sight: (By the way, a nice touch in the entire system: Once the menu gets wider to accommodate longer strings, it doesn’t shrink on key release.) And in other places, the modifier key only reveals an alternative shortcut for the same command: I have mixed feelings about this feature. On one hand, it has felt like dying art for a while now. Apple has never invested in the discoverability here, which I think kneecapped it. As far as I know, there is no hint these exist, and no way to see all of these options easily by clicking something on the screen. Even if you know the alternate name and you search for it, it doesn’t always reveal the key to press to see it natively: It’s not as much fun to keep pressing all the modifier keys in every menu to find out what might be hiding in there. I wonder if an alternate version where any modifier key reveals all would be better? (And more compatible with commands without modifiers changing anyway.) On the other hand, I really want this to spread its wings. In theory, the feature makes it possible to build up good motor memory habits, and understand some of the modifier key patterns: ⇧ often means “more,” and ⌥ (ironically) often means “alternate” (try ⌥ while selecting text on a Mac if you haven’t ever done it). It is also a clever way to accommodate power users without blowing up the menus for everyone else. And, once in a while, I have a truly glorious moment – like what happened to me last year. I scan a lot of documents, and merge them into PDFs using a database application called DevonThink. The process usually goes like this: I drag individual page files, select them, right click, and choose Merge: But at the end of that process, I am left with the extra original files I no longer need, so I have to select these, and then delete them: Not a big deal, but any “not a big deal” becomes a big deal if you have to do it dozens of times a month. Yet, only after years of doing it this way, I had a thought. More precisely, my fingers had a thought. Surely, more people must be facing this issue? So, on a lark, I pressed ⌥ with the menu open, and saw this: The precise option I needed was there all along, with a perfect label, hiding exactly in a place and under a key combination that was the first thing my fingers naturally tried. I smiled so much. It’s a really great feeling when you’re rewarded for learning a pattern, when your motor memory does the job for you, and when you sense you’re on the same wavelength as software’s creators. Someone was there ahead of me and cleaned up this rare path for me. #complexity #flow #keyboard #menus #onboarding

0 views

Fine, I’ll build my own text editor!

Hello RSS reader! This post contains interactive features. Please visit the canonical web page for an optimal viewing experience :) “They don’t make ’em like Sublime Text anymore” resonated with a lot of folk. Software these days is garbage. That got me thinking; I’m good at building garbage! Why can’t I build my own text editor? VS Code is built upon Monaco Editor which is a soup hellscape. I was late to the VS Code train because for years my Intel inside™ Mac was too slow. That issue was resolved when I bought Apple silicon. If that’s the standard I have a lot of room to make mistakes. My first experiment renders everything on a element. RSS does not support this interactive feature. Please visit the canonical web page. You can’t tell, but your CPU is doing a lot of work to render that picture at 60–120 frames per second. Lack of interactivity is an obvious problem for a text editor. I made a list of the “minimum viable” features and implemented them. This next demo is interactive, click around and type. RSS does not support this interactive feature. Please visit the canonical web page. Before you @ me about Vim bindings: shut up, I’ve got more pressing issues. Canvas gives me nothing for free. Amongst many desirable features, I’m missing: That last one is critical. Life is too short to implement custom elastic scrollbars. I decided to cheat and use native browser overflow on a hidden element. A is sized to match the canvas text and the scroll position is used to calculate render offsets on the . RSS does not support this interactive feature. Please visit the canonical web page. I’m pleased with how that’s coming along but I’m also disheartened because is entirely inaccessible. I could continue to add text selection and other features but I’m not solving the fundamental accessibility issue. I had a better idea. Instead of rendering text on the I can just render it natively in the overflow and make it editable with a attribute . That attribute has a value that is perfect for code. All content remains within a single text node. Attributes like must be disabled to avoid input latency spikes. Want to guess how many days it took me to discover that fix? Days! Using gives native text selection and undo history etc. So much accessibility goodness is wired up for free by the browser. RSS does not support this interactive feature. Please visit the canonical web page. The provides metrics I use to continue rendering a custom text cursor. is available so I can style that too. I’ve set the native invisible, which is probably a no-no. The technique is promising but I’ve noticed strange performance issues beyond a certain character count. Chromium browsers perform worse than WebKit and whatever Firefox is now but it’s unpredictable. Instead of plaintext would a simple be viable? In short: yes. Turns out a is far more performant for longer text. In this final demo I’ve added syntax highlighting too. RSS does not support this interactive feature. Please visit the canonical web page. My original plan was to use custom on the element. can’t use CSS highlights so a third layer was required. For demo purposes I added some soup for the visible lines to apply MicroLighter . Edit: I’m told the new OpaqueRange API unlocks custom highlights for — neat! Too many CSS highlights are another performance bottleneck. A more robust solution would be to use Tree-sitter to generate a syntax tree and walk that to generate highlights for only visible lines. I was hoping to avoid virtualised scrolling entirely but I could improve it using the inverse sticky technique . Or I can go back to because the file sizes I’d be editing don’t hit the performance wall. Anyway, looking good, right? Looks like 90% of a text editor with 1% of the features. From here it’s pretty straight forward to draw the rest of the owl . I’m tempted to keep drawing but then I think about all the little things like tab indentation. Right now I just hijack the tab key to insert two spaces… My demos above are unoptimised and far from perfectly accessible but at least I’m not starting from a losing position. Rendering on would be a nightmare. I’m filing this project away for a rainy day. JavaScript strings and text ranges work with UTF-16 code units. It’s easy to naively introduce bugs. I’m sure my demos are full of them. I’ll leave with a code example to nerd snipe. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds. Pointer down to position text cursor Arrow keys to move text cursor Highlight current line Type to enter text Fancy cursor animation Text selection Undo/redo history Multi-line paste Overflow scrolling

0 views

Scour - August Update

Hi friends, In August, Scour scoured 878,974 articles from 28,519 feeds . Also, 219 users signed up since my last product update email at the end of June so welcome to you all! If you've been enjoying Scour and would be willing to put a quote on the testimonials section of the home page , please let me know! Here's what's new in the product from July and August: I've spent a lot of the past 2 months working on improving ranking quality. Now, the interests and sources you tend to click on and like get boosted while those that you tend to ignore or dislike are deprioritized. Additionally, Scour got a notch better at matching posts to your interests, so you should see less off-topic content. By the way: liking and disliking items you read on Scour helps make your feed better and also helps me figure out what types of ranking changes to prioritize. Scour now detects groups of articles covering the same event, including across days and even when they don't all link to a common source. You should now see less repeat coverage of the same major news stories across days. Scour is better at detecting and hiding ads, deals, press releases, sponsored placements, listicles, and posts with little substantive content. Also, arXiv papers that have been withdrawn by their authors won't show up in your feed. I got a little excited after adding some of the features in June and the feed got a little too busy. Now, the feed has been cleaned up again. While scanning the feed, you'll see just the information you need to decide whether to click on it. You can tap any row to see additional information including a preview snippet from the post and other articles that cover it or that it links to. Plus, after you love, like, or dislike a post, you'll see additional options for seeing more or less content like that in your feed. Under each post's title, you'll see the estimated reading time, as long as Scour was able to fetch enough of the article's content to determine the length. Adding new interests got easier. You can write any free-form text you want. While you're typing, you'll see "quick add" suggestions based on topics other users have added. Or, when you click Add Interests, Scour will extract appropriate topics from whatever you have written. If you run out of posts from feeds you subscribe to within the given time window, your feed will now continue automatically to show you slightly older posts and then posts from across all of Scour. Here were some of my favorite articles I found on Scour in July and August: Happy Scouring! As I've continued to read and think about how we use AI, particularly in software engineering, these were some I found interesting: Nolan Frausto wrote about The AI Slop Spiral and teams getting into the habit of having AI write plans that are so long and give the appearance of thinking, which are then only reviewed by AI, and then used to have AI produce code, which is then only reviewed by AI, etc. Patrick George Wyndham Smith wonders about how we should think about code review in Faster pull requests are faster horses . He makes the point that "Reading code only as diffs is like trying to view an elephant through a straw." Geoffrey Litt wrote Understanding is the new bottleneck , which contains a thesis I very much agree with and an skill that I tried out for a few days and then turned off. Alex Klos wrote How Do We Stop Vibe Coding? discussing how to build trust with AI-generated code and the dissatisfying array of options for spec-driven development. Ariana Irady wrote The Instagram Rebrand and How Typography Always Wins the Argument . Bradley Emi, co-founder of Pangram, wrote a useful explanation about why LLM-written text is so flat, boring, and detectable in LLMs don't just mimic human text . Irene Zhang of ChinaTalk wrote about the motivations of the DeepSeek founder, Liang Wenfeng, in The DeepSeek Thesis .

0 views

Analysis of Area and Power Overhead for a Synthesizable 4-Phase Bundled-Data Asynchronous RISC-V Processor

Analysis of Area and Power Overhead for a Synthesizable 4-Phase Bundled-Data Asynchronous RISC-V Processor Sean Jacobs, Mark Indovina, and Yashaswini Suresha GLVLSI'26 This paper describes the design of an asynchronous (i.e., there is no clock signal) RISC-V processor. The power and area results are impressive. I’ve only vaguely understood how asynchronous designs operate; this paper helped me understand the space a bit better. As far as I understand, there are two primary advantages of asynchronous circuits: Performance is not limited by infrequently used critical path. Power savings due to not having a clock signal #2 can be mitigated in synchronous designs with the use of clock gating. Inter-pipeline stage communication in this processor uses a 4-phase protocol. This protocol is illustrated in Fig. 2: Source: https://dl.acm.org/doi/10.1145/3787109.3815227 The 4 phases of the protocol are: The request signal transitions from low to high, indicating that all upstream stage outputs are ready to be consumed The acknowledge signal transitions from low to high, indicating that all upstream stage outputs have been consumed by the downstream stage The request signal transitions from high to low The acknowledge signal transitions from high to low The key building block that makes the 4-phase protocol implementable is the Muller C-element. A C-element has two inputs ( and ) and one output ( ). The output remains steady until both inputs are equal, at which point the output value is assigned to be equal to the first input (i.e., ). Fig. 3 illustrates how Muller C-elements and inverters can be used to construct a pipeline that uses the 4-phase protocol: Source: https://dl.acm.org/doi/10.1145/3787109.3815227 The triangles with circles on the input side are active-low inverters. Here is a narrative of how this works. Assume that the bottom ( ) input of the leftmost C-element is 0, the top ( ) input is 1, and the output ( ) is 0. When the input Req signal transitions to 1, it will cause the output of the leftmost C-element to transition to 1. This will send an acknowledgment backward to the unpictured upstream stage and send a request to the downstream (middle C-element) stage. The middle C-element will perform similarly (responding with an acknowledgment and propagating the request down the pipeline). When is set to 1, is set to 0, which will cause the left-most C-element output to return to zero when the unpictured upstream stage sets Req=0. The control path described above can be extended to support an arbitrary feed-forward pipeline as illustrated in Fig. 4: Source: https://dl.acm.org/doi/10.1145/3787109.3815227 The storage elements (pipeline registers) are D-latches (no clock inputs). The combinational logic clouds represent the logic that implements each stage of a RISC-V processor. The delay elements connected to each Muller C-element ensure that the control path does not assert the request signal until after the combinational logic has finished its job. An EDA tool is used to compute the worst possible delay through a logic cloud, and the corresponding delay value is set to be at least that long. The astute reader will realize that the delay elements eliminate one of the primary advantages of using an asynchronous design: the delays are set equal to the worst possible delay (i.e., the critical path). The advantage of this approach is that there is no area overhead added to the combinational logic. It is essentially the same logic that would exist in a synchronous design. Table 1 compares area and power numbers for this asynchronous processor (28nm, 4-stage) against a synchronous processor. Area is essentially unchanged; power is significantly lower. I’m not sure how much clock gating there is in the baseline implementation. Source: https://dl.acm.org/doi/10.1145/3787109.3815227 Dangling Pointers The performance numbers above should be taken with a grain of salt. As far as I can tell, the authors only tested the processor in simulation, they did not fabricate a chip in real life. The Muller C-elements are described with synthesizable RTL, not standard cells. Thanks for reading Dangling Pointers! Subscribe for free to receive new posts. Performance is not limited by infrequently used critical path. Power savings due to not having a clock signal The request signal transitions from low to high, indicating that all upstream stage outputs are ready to be consumed The acknowledge signal transitions from low to high, indicating that all upstream stage outputs have been consumed by the downstream stage The request signal transitions from high to low The acknowledge signal transitions from high to low

0 views

Android Auto Has Been Hammering My Phone’s Battery

I've noticed recently that my phone needs to be charged way more often than I used to have to do it. I used to be able to go for nearly 2 days on an 80% charge, but I started having to charge daily . Sometimes even multiple times per day! My first thought was that my 2.5 year old Pixel 9A might be starting to show signs of age, and the battery was on its way out. But I have always had charging optimised, so it only charges to 80%. Looking at the health of my battery in settings, it shows the health as normal and reports a 100% capacity. So it's not the battery. The final straw came when I went to bed one evening with a charge of around 65%, only to wake up the next morning with just 30% of my battery remaining. How the fuck had my phone used so much battery while I was sleeping?? I checked which apps had used all that battery and to my surprise it was Google Maps and Android Auto. 6.5 hours of "screen time" while I was asleep! Ok, something is clearly fucked with Android Auto here, but I've been using it for years and it's been fine, so what's changed? The only thing that has really changed from an Android Auto perspective was that I'd got a new car which now used wireless Android Auto instead of having to plug a cable in. After some research, it turns out that wireless Android Auto is an absolute resource hog. Unlike standard Bluetooth audio, the wireless projection that Android Auto uses forces your phone to continuously compress and stream a high frame rate video feed over a Wi-Fi link, all while aggressively hammering the GPS and cellular radios too. To make matters worse, if the car is parked anywhere near the house, the phone can get stuck in a persistent background polling loop that blocks deep sleep, basically turning the handset into an expensive pocket radiator. Nice in winter, but not so bueno when you need your phone and it has a dead battery! The fix, dear reader, was rather simple. Disable wireless Android Auto . However, in practice it was more difficult than I had expected. I had to enable developer options within Android Auto's settings so the " disable wireless Auto " option became available. Why is that even a "developer option"? It should be a standard option IMO. Then I had to fiddle with the car's settings to not force wireless Android Auto, but instead prefer plain old Bluetooth. By doing this it allows me to still use Android Auto when I plug a USB C cable in, but by default it only uses Bluetooth. The infotainment display in my car is pretty nice, so I'm not really missing anything by not using Android Auto. Plus, it annoys me that Navigation always shows up - I don't need it most of the time, so why waste the computing power and screen real estate? Anyway, it's been a few days now and my battery is back to lasting me a couple of days. Worst case I need to quickly pull out my phone to open Spotify or my podcast app, AntennaPod, before I drive away, so the car picks up the media stream. If I really need it, full Android Auto is only a USB C cable away, and I know it won't hammer my battery after I get out of the car. I've ranted about how complicated modern cars are before , but this is just another example of how annoying it is. I'm a technical person, so can work this out for myself, but many of my friends and family would have had no chance in figuring this shit out, let alone fixing the problem. It's too much - they're too intrusive. I don't need to be connected everywhere. I don't need phone notifications in my car, and I usually don't need a sat nav - plus my car has it's own sat nav! I just want a way to stream media from my phone, without it getting as hot as the surface of the sun and wasting a tonne of battery power. Is that too much to ask? Anyway, it's fixed now (I think). If you're having battery issues on your phone, it might be worth checking your wireless phone connection to your car too. 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

Bring Back The Noise With HDD Synth

The modernisation of some of the vintage components in old computers comes with its own set of challenges. Things break: thirty plus year old hard drives stop spinning, floppy drive components such as a simple elastic rubber to get mechanical things moving disintegrate, and of course plenty of capacitors leak. Sometimes, things break up to the point that I sometimes wonder whether being a retro hardware enthusiast is worth it at all. The solution to these problems is simple and not so simple: de-solder the component from the board and look for a replacement, and throw out that rubber or the drive entirely to find modern replacements such as the SD-to-IDE interface I use to emulate a HDD. Fixed—now the old motherboard still thinks it’s speaking to a genuine vintage hard drive! Not fixed? The distinctive mark of a humming disk is gone: an SD card has little to say except for crack when you jump on it. The true retro enthusiast—the real appreciator of smelly electronic components that go beep —will want to hear that beep . Not just a beep , but a bzzzzzkkrrrttttt tzk tzk tzk BEEP : your classic spin-up sound when these mechanical drives start spinning. Thankfully, some retro enthusiasts are prepared to do more than just accept the fact that the noise is gone. Some go as far as building their own expansion card that fully emulates the sound of yore. This is the story of my friend Peter Bridger’s HDD Synth . Peter was kind enough to send me two prototypes to play with 1 ; his third revision (Mark III) of the idea, as pictured below, currently in the state of an ISA card. The HDD Synth Mark III, with a 3D-printed bracket screwed on. The first thing I thought when I heard the idea was: how is this going to work if your sound card’s drivers are loaded only after the bootup procedure? Peter’s design makes use of another speaker mounted on the card, separate from your sound card or built-in PC Speaker. It leverages the Raspberry Pico to output sampled sound directly to the custom speaker by listening to the ISA port for HDD activity. Earlier models used the HDD LED in pins on the board to detect activity. As I type this, Peter is working on Mark V to reduce the footprint of the card, including getting rid of the requirement of an ISA slot to enable putting this inside older non-IBM PCs as well. One of the coolest aspects of the HDD Synth is its ability to load custom samples as well. The SD card slot is there to hold both firmware & configuration as well as custom sound samples. This allows the card to emulate any kind of vintage hard disk drive, playing just the right sound for you to evoke that instant jolt of nostalgia. Just add four files in a subdir inside : (the rattling when the HDD used to be busy), (power off), (power on), and (general background noise). The configuration file looks to be fairly straightforward: Here, a subdir —in my case a preset one matching my memories quite well—exists on the SD card where the samples live.The only problem I so far encountered was powering off the computer that too quickly discharges all energy resulting in being cut off halfway through. Even though the HDD Synth is still in beta phase, Peter put in a lot of effort to create an experience: the commissioned stickers remind me of the Game Boy’s Play It Loud campaign and the instruction manual was modelled after the original Sound Blaster manuals, detailing every pin and suggesting troubleshooting tips. As the sticker portraying a PC fan emitting a MHDDLA sound states: I’m A Big Fan ! Get it, fan? No? I thought that was a good one. The HDD Synth manual inspired by the original Sound Blaster manuals. The peripheral card currently claims an ISA slot, but as stated, in future versions the card will shrink and the need for a slot will disappear. Apparently, Peter received the request to build something similar that will fit inside a MacBook. Bring Back The Noise, stupid silent MacBook Air I’m typing this on! I’ll be very curious to see how this will pan out. The card’s hardware (and software) design is fully open-sourced so if you’re a capable electronics expert you can order all the components and solder them on yourself. Thank you Peter for letting me try out one of the prototypes. I feel very honoured to be mentioned in the special thanks print on the back of the PCB. Please keep an eye on Peter’s site Strife Streams for more retro goodness and HDD Synth updates. I now own two cards thanks to the Belgian Post and customs service. There is little need in plugging in two HDD Synths in one machine. Or is there? If anyone is interested in checking out the project, let me know and I’ll send you one!  ↩︎ Related topics: / pc hardware / soundblaster / By Wouter Groeneveld on 1 September 2026.  Reply via email . I now own two cards thanks to the Belgian Post and customs service. There is little need in plugging in two HDD Synths in one machine. Or is there? If anyone is interested in checking out the project, let me know and I’ll send you one!  ↩︎

0 views

Inside Ukraine's Kill Zone

Really interesting (and saddening) look at the front line in the Ukraine/Russia war. Read post ➡ Saw this on Dense Discovery . It's a really interesting look at how the shape of warfare has changes from soldiers with weapons, to drone-based attacks. The days of heavy mechanised manoeuvres are over; a drone costing a few thousand dollars can disable a tank worth millions. I served in Iraq and Afhganistan with the British Army in the early 00's. Back then drones were used , but were in their infancy. The fact that we've completely moved to this kind of warfare in ~20 years in scary. I learned a lot in this post. It's both interesting and extremely saddening. My thoughts are with all those involved in this needless conflict. 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

Nvidia Earnings, Dollars Per Gigawatt, Open and Hugging Face

Nvidia's earnings were remarking and boring — two sides of the same coin. Everything the company does is about avoiding a consolidated world.

0 views
Unsung Yesterday

The Swiss Cheese model, pt. 3

After two more serious posts in this series, I wanted to stop somewhere a bit more lighthearted and inconsequential. “Here’a a fun thing you can try,” begins this 13-minute video from Retro Game Mechanics Explained: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-swiss-cheese-model-pt-3/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/the-swiss-cheese-model-pt-3/yt1-play.1600w.avif" type="image/avif"> The premise of the parlor trick the video describes is a bit convoluted: I’ll let you watch the video for a nice explanation, but this I think is a good example of the Swiss Cheese model: Just like before, the absence of just one of these Swiss Cheese holes would prevent the bug from happening. But the holes line up perfectly. I found this whole thing kind of fun and delightful, and I actually understood why the creators of Mario decided to reset the game (with a small exception) on every game over – it’s brutal but elegant, and something I found myself wishing was easier to do during various projects I worked on in the last few decades. Of course, there might be an argument that this is such a highly manufactured scenario (how did anyone even find that out to begin with!?), and of limited value, particularly if you end up at a random level anyway. We will pull on that thread in a future post, because the story doesn’t end here. People who spend time hacking old games go way further than this. #bugs #super mario bros #youtube Get your Nintendo Entertainment system, put in the Mario cartridge, and power it on, without powering it off, grab the cartridge and replace it with the Tennis cartridge, start the game, wait until the music stops, then move around for a bit, take that cartridge out and put Mario back in, press A+Start and you will see that you will start at a random “invalid” level that doesn’t exist, which should not be possible. A+Start is real feature that allows you to continue the new game at the last level you finished (as opposed to Start, which always goes to Level 1). The NES allows you to take the cartridges out and put them back in while the machine is under power. The creators of Mario decided to make the game reset itself on every game over, and differentiate between cold boot and warm boot in a specific way. Tennis doesn’t wipe the memory on start. Tennis happens to change the memory in a very particular way that ends up being accidentally “compatible” with Mario. The Mario game doesn’t sanitize the level number on entry, so you can start on an invalid/​broken level.

0 views
Jim Nielsen Yesterday

My Experience Has Nuance, Yours Is a Data Point

Eric Bailey has a fun little post about how we need more than a few icons to express the nuance of our shared human experience. For example, he suggests Netflix provide some feedback buttons to indicate the kinds of experiences we all share consuming and rating media: What’s great about the examples in Eric’s post is how familiar they are. We can read them and laugh because we’ve had the same thought — “I’m pressing ‘thumbs up’ here, but what I really mean is…” We know when we click that button that it’s a reductive expression of our experience that’ll be erroneously interpreted, but we do it anyway. As Bryan Cantrill shared from his experience: There's no way to indicate, “I’m engaging with this, but I hate myself for doing it.” I need another mouse button that is like, “I’m clicking on this, but I’m rage clicking on it and for my own mental health could you not drag more of this in front of me please?” We know these feedback mechanisms are often a misrepresentation of our actual experience. Yet we turn around in our professional contexts and see numbers like “142,432 users gave this a ‘thumbs up’” and we forget everything we knew about our own individual experience with these systems. We make it mean what we want it to mean, what’s convenient for measurement and reporting e.g. “Wow, what a great insight about our offerings! Let’s restructure our entire catalog around this new, objective, (pseudo) scientific fact that so many people obviously like this thing!” We reduce the experiences of others to mere data, but grant ourselves exemption from such oversimplifications. Where’s the conversation around: But that’s too introspective. Introspection is slow. Ain’t nobody got time for that. Reply via: Email · Mastodon · Bluesky “Just because I expressed interest in this show does not mean I want to be inundated with recommendations for its genre” “Disregard [that I pressed ‘thumbs up’] my cat walked over the keyboard” “I am making bad choices and hatewatching this” (which reminds me of ) Values, e.g. “Should we provide more of this? We can say no to the data… ” Nuance, e.g. “What do people really mean when they click ‘thumbs up’ in this interface?” Vision, e.g. “If we provide more of this, where will that lead us?”

0 views
Farid Zakaria Yesterday

How safe is follows?

I recently wrote about omniflake , accessible via https://omniflake.com , which indexes over 12,000 flakes and makes them available through a single flake input. One of the earliest requests I had was to support something similar to my tool nix-auto-follows to consolidate every flake’s inputs to a single coherent set. This is the same pattern you see often in every guide to flakes, often highlighting the attribute without much explanation of what it does or why it is used. The attribute consolidates a flake’s inputs to a single source, often used for . This reduces the number of distinct nixpkgs revisions in the dependency graph, which can speed up evaluation and reduce overall closure size. Those with more experience with flakes have a strong opinion about . While it improves evaluation speed and closure size, it can introduce subtle breakages and deviates from the original author’s intent which is counter to the philosophy of Nix which deems “reproducibility” as a core principle. I wanted to dig into the question of how safe it is to use in practice. The folklore is that it is dangerous, but I wanted to see if that was true. Turns out that https://omniflake.com is the perfect tool to try and answer this question. As I mentioned above, lets you consolidate a flake’s inputs to a single source. In the case of nixpkgs, this means that you are asking a flake to build against a nixpkgs revision that its author may never have evaluated it with. This can lead to breakages if the flake relies on specific behavior or attributes of the original nixpkgs revision. Often the delta between the two revisions is a good measure of how likely it is to break. If the nixpkgs revision you are following is only a few days or weeks newer than the original, it is likely to be safe. If it is several months or years newer, the risk of breakage increases. We can look at every flake within omniflake and see how old the nixpkgs revision is that it locks. 11,936 flakes are indexed in the omniflake index, 10,754 of them lock a nixpkgs and between them they name 3,261 distinct nixpkgs revisions . Here is every distinct revisions, placed by the date it was locked by the number of flakes that pinned it. Quite a lot of revisions are pinned by only a single flake. We can also visualize how old each nixpkgs revision is as of August 31, 2026. Half of all flakes are pinned to a nixpkgs older than 506 days , nearly a year and a half, and a twentieth are past 1,768 days (five years). The channels follow the distribution one would largely expect: (red line) pins are the freshest, which is unsurprising for a channel that moves daily. The darwin channel seems scary to replace with , barely 5% of those pins are under a year old What does this all mean? If we consider the median, when you add a line you are, typically, asking a flake to replace it with a nixpkgs likely a year and a half newer than anything its author ever tested. One time in twenty you are asking it to consolidate across five years. 😬 Not all nixpkgs are equal. A flake pinned to a nixpkgs that was a channel bump was built by Hydra and therefore received testing and is available for substitution from https://cache.nixos.org . We can audit the nix release archive to determine whether a given nixpkgs was ever a channel bump. Every channel bump ever published is a directory under , named for the commit it pointed at: If we enumerate all 74 channels, every and channel, we discover 30,850 (commit, channel) pairs to check against. 1 The majority of revisions, four in five, were a published channel bump. That is better than I expected and means that most flakes are pinned to a nixpkgs that was built by Hydra and therefore received testing and is available for substitution from the cache. Few flakes are pinned to a nixpkgs that was never a channel bump. The most common revisions that are shared amongst the flakes are relatively recent as well. The top 8 revisions are all from 2026, and the oldest revision in the top 8 is from May 4, 2026. It was good to see that the most common revisions across flakes are relatively recent. Personally, I enjoy running a release or two behind my personal NixOS laptop to avoid unecessary churn while all the kinks are worked out. How common is that? For each flake, we can take the gap between when the flake was last touched and the date of the nixpkgs it locks. That is how stale the pin was at the moment its author chose it , this is very different than the earlier graph which is how stale it is as of today . The original stateleness is depicted by the green line. It is the age of Nixpkgs the day it was written whereas red is the same pin today. Half of every flake in the index picked a nixpkgs less than three week old, and a quarter picked one inside three days! The shades region is simply time passing. It is how stale the pin has become over time. It is a frequency of how often a flake is updated. So essentially nobody deliberately pins an old nixpkgs. They run , get whatever was current that week, and stop . The ecosystem’s year and a half median is the result of a year and a half of neglect on each flake. Not realy but it was fun to look at the data. omniflake includes an easy way to unify all flake inputs . We could use it to see how many flakes would break if we replaced their nixpkgs with a single revision, but that would only tell us whether it could evaluate. A flake can evaluate perfectly and then fail to build. That’s a lot harder to measure. For now, I still recommend being mindful when you use . It is a powerful primitive that can improve evaluation speed and closure size, but it can also introduce subtle breakages, especially if you rely on . 🤫 The data for this post came from omniflake’s own index, joined against the release archive. It is one file, on a gist using a shebang and the standard library, so it needs nothing installed. Beware of bugs in the above code; I have only proved it correct, not tried it – Donald Knuth Earlier releases used shorter revisions and has no channel directory, its releases sit under .  ↩ Earlier releases used shorter revisions and has no channel directory, its releases sit under .  ↩

0 views
Unsung Yesterday

“You can always click on the mirror icon to turn it into… a mirror.”

You know how much I love simple and clean release notes , and I just stumbled upon these supercasual video release notes by designer Rafael Conde, and they made me smile. The video is just 45 seconds, and the following short thread is filled with a few other fun details of Conde’s app Hand Mirror. Particularly this one caught my attention – an about page mimicking software coming in physical boxes: There’s a lot more delight and perhaps even sugar in these than I usually link to – but hey, it’s Monday. #craft #release notes

0 views
Unsung Yesterday

“This was not the first time the European Commission had attempted to correct for the permissions pollution.”

It seems sometimes that browsing the web these days is just constant closing of pop-ups and banners, and ignoring those that cannot be closed: Yeah, it is somewhat unfair to bundle the cookie banners into this list, but stripped down to the user experience, they are a nuisance – the road to hell is paved with tiny, slow close boxes. Nick Heer at Pixel Envy recently did the lord’s work of writing a succinct summary of recent efforts to fix this experience, and significant energy expended to derail those efforts. At the core of it is the Kill the Cookie Banner initiative , which might be somewhat unfortunate naming; while companies like Meta want to get rid of the cookie banners altogether to avoid having to ask the user for any permission (automatic opt in to data collection), the initiative goes the other way, killing the banner but not its plumbing. It proposes an uber cookie banner inside the browser settings that the user could set up once in a “fire-and-forget” way, and all the sites would have to obey automatically. The site also does a nice job explaining the problem and, if you are in Europe, offers a take action page. #attention #nick heer #web old school modals and in-page ads, Substack-style “subscribe to my newsletter”on-scroll pop-ups, cookie banners and popovers, (relatively new) VERIFY YOU ARE HUMAN, HUMAN_ interstitials.

0 views
Stratechery Yesterday

Meta Settles, A Framework For Regulating Content, The Rest of Big Tech

Meta's settlement makes sense for all parties, but the entire sage highlights why any solution to regulating technology feels off.

0 views
iDiallo Yesterday

Here's a good way to present AI videos

The YouTube tag marking a video as AI-generated is as insignificant as the little "Sponsored" text in search ads. I've taught my mother and her friends to check for that tag, but most, if not all, of the videos they share with me don't even have it. Even though they're clearly AI-generated. If deception is something we want to prevent, and our parents can't tell real videos from fake ones, wouldn't it make sense to put a warning where it's actually effective? Just like movies have warnings beforehand, why not add one before these videos? It would take no more than two or three seconds, and it's entirely controlled by the platform. If someone is willing to watch the content after the warning, more power to them. But for those being deceived, this would actually help. Those are the words YouTube places on videos where it detects AI, but they're buried somewhere in the description. Why not make that notice prominent when the video starts, the same way some videos open with a "Viewer discretion is advised" notice? On YouTube or whichever platform hosting the video, the warning is not embedding into the video, just displayed before. The uploader has no control over it. While I know most people think AI videos are just fun or slop, but I argue that they can be harmful when they deceive us . They are a profitable vector for scammers, and despite YouTube's effort to curb it, they are actively promoting it in their creative studio. If YouTube actually wants to prevent fraud and scams, they can do something about it. Let users know what they are about to watch.

0 views
Kev Quirk Yesterday

Carl's Doomsday Scenario

Author: Matt Dinniman Genre: Fantasy, Sci-fi Released: 2021 Rating: ★★★★★ "The training levels have concluded. Now the games may truly begin." The ratings and views are off the chart. The fans just can't get enough. The dungeon gets more dangerous each day. But in a grinder designed to chew up and spit out crawlers by the millions, Carl and Princess Donut need to work harder than ever just to survive. They call it the Over City. A sprawling, once-thriving metropolis devastated by a mysterious calamity. But these streets are far from abandoned. An undead circus trawls the ruins. Murdered prostitutes rain from the sky. An ancient spell is finally ready to reveal its dark purpose. Carl still has no pants. They call it Dungeon Crawler World. For Carl and Donut, it's anything but a game. Learn more on Goodreads ➡ Similar to the first book I absolutely loved this one too, and finished it in a couple days as well. This book focuses on the next level in the dungeon, level 3, and introduces new concepts to the game, as well as new characters. Of course, Dinniman continues to develop the main characters as well, and I'm finding myself beginning to like Princess Donut. Which is strange, as I'm not a cat person. 🙃 Some intergalactic politics are starting to make their way into the story line too, which acts as a nice reprieve from all the mob killing...sometimes. I hope to see these story lines continue to develop as Carl and Donut (hopefully) continue to find out more about this whole shit show they find themselves in. Blooding loving this series. 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
Lambda Land 2 days ago

Two Ends of Programming

Some years ago I worked with a software developer from Germany. I was an intern at the time. More than once, after I asked this engineer for a review of a pull-request, he’d tell me, “Hauptsache es funktioniert” (translated: as long as it works ). I have heard this sentiment repeated more times than I can count by developers I’ve met in person as well as by people online: the point of the code is to solve a problem. You might see this mentality articulated as “maintainable code is good because it lets us ship more features faster” or the grug-brained developer . This sentiment certainly isn’t wrong: if you can focus on making sure that your code reliably solves a problem for its users and that it improves their lives—great! But something rubbed me the wrong way with Hauptsache es funktioniert , and it still does. It’s been several years since then, and I think I can finally articulate why: when I asked for a code review, I wanted some advice from a senior developer that could help me become a better programmer. Getting push-back on code style, organization, testing methodology, etc. is a phenomenal way to get better. I think, therefore, that there are really two separate ends arise in software engineering, which I will provisionally label product and people . The product viewpoint sees the result for the end-user as the primary objective. Quality code is one that solves a problem in a cost-effective and reliable way. Tests exist in as much as they make the software more reliable for the end user. Code quality matters only to the extent that we can maintain our codebase long-term and continue to develop features that users care about. The developer’s experience in the codebase is secondary: they can grit their teeth and bear the messiness. This matters because end-users are the ones paying for the software and are the ones enabling the developers (as well as everyone else at the company) to earn a living. The people viewpoint looks at how the developers themselves treat with the software and what becomes of them from writing it. Of course, end-users are people too and this viewpoint doesn’t discard that; considering the developers as people involved with the software makes the internals of the code matter a lot more. A codebase that is messy or a slog to work on makes developers miserable, even if it is generating a lot of value for their users. This viewpoint also sees software development as an art—good code is valuable in and of itself. I think both perspectives are valuable. Unfortunately I see the people viewpoint looked down on by people who subscribe primarily to the more “realistic” product viewpoint— especially the last part about good code being an art and a worthy goal in and of itself. Pretty source code doesn’t pay the bills, after all. But if you think of yourself as being more in the product camp, consider this: developers get better when they have a chance to exercise their skills by crafting better source code. Better developers write code that is more maintainable and works better for the users. There are good pragmatic reasons to encourage developers to care about and work on the quality of their software. On the other hand, very developer-oriented folks would do well to keep the user’s experience in mind. I’ve seen good-quality code that was awkward to use because the developers lacked empathy with their end-users. The tool was technologically laudable, but still lacked quality because it was difficult to use. I’m an academic, and the product of a university are students who are made better thinkers. 1 Engaging in student-building naturally places all the emphasis on challenging students to write the best software they can. Kerninghan’s Law states: Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. In a university setting, this means that students ought to write clever code so that they can get smarter by debugging it! If you are a student, always remember that you are the product of your education, not your diploma or certification or whatever. You should not cheat yourself of an opportunity to grow. Take it while it’s available and while you have a support network of teachers, TAs, counselors, and friends to help you! I think that generative AI can help with both goal if used extremely carefully. An LLM can produce source code so fast that it becomes very easy for the human to rubber-stamp everything it puts out and to slip into cognitive atrophy. We are seeing this unfold on an alarmingly short time-frame. I think it is bad if we prioritize the output to the point that we neglect the workers responsible for its construction and maintenance. I’m running out of time to write, so I’ll conclude with this suggestion: companies should adopt a “gym day” for developers where everyone writes and debugs code by hand. I think developers should ask for this if management does not implement it themselves. Developers should have time to sharpen their own skills. It will both improve the long-term sustainability of the company as well as the skills and well-being of the developers. This is, of course, my opinion as of August 31st, 2026, and I reserve the right to change or amend it. But I think it’s a decent opinion and I would like to see this idea carried out. If you are of the persuasion that a university ought to exist primarily to train students for the workspace, oh boy do we have a lot to talk about… That’s a nice by-product, but it shouldn’t be the end-goal. Job training is cheap; creating a society of good thinkers is what is really valuable. ↩ If you are of the persuasion that a university ought to exist primarily to train students for the workspace, oh boy do we have a lot to talk about… That’s a nice by-product, but it shouldn’t be the end-goal. Job training is cheap; creating a society of good thinkers is what is really valuable. ↩

0 views

AI Writing is an Insult to Humanity

Posting LLM generated writing is an afront to the intelligence of everyone that you want to read it, and a direct insult to humanity as a whole. The time to mince words about this is long gone. I saw a piece of writing on Hackernews the other day that was obviously LLM generated, and I had a bit of a crashout. I won’t link the piece here, because I won’t give any validity to what is being shared, nor should you. The writing always has a specific odor about it, it is easy to pick out when you’ve seen it for about 2 minutes, and is littered with corpospeak and feels like you’re talking to a middle manager or someone in HR. If it took you all of 30 seconds to generate a piece of writing, but you expect me to spend 5 minutes reading it, I’m sorry, but the ROI for me isn’t there. Worse, you don’t see me as a human being. You see me as a revenue point or some metric in your analytics. You don’t have anything special, sorry to tell you; Your “prompt library” isn’t worth VC money (you know what, maybe it is - it’s best if idiot-tier VCs go to zero). So, just hand over the prompt that you used to generate your mediocre piece of writing , and I can then have an LLM distill it down to the main talking points, forgoing all of your padding slop. I ain’t reading your LLM’s drivel and “It’s not this, it’s THIS”-isms. I am not going to waste the ever-shortening time that I have on this planet to “consume” computer generated text that you didn’t think was worth the effort of writing yourself. And frankly, nobody else should . If you open a piece of writing and from the get-go it is obviously LLM generated, post a comment of ai;dr and bounce. Save everyone else’s time, do God’s work. The most insufferable thing about this whole phenomenon is that we are accelerating toward a world in which everything is the same; neutered, stale, boring . Mediocre by all measurements. If we continue down this path, my guess is that we will destroy any future ability to create great works, not just for us now, but our children’s children. Everyone is forgetting mastery in the pursuit of convenience. Everyone is trading in greatness for a lie. Sadly, it seems that even many of our fellow human beings are being converted to LLMs in real time with the way that they write. If you read any blog post these days, the incessant LLM-isms in writing that is even hand written is getting out of control. I see it in my own writing - and it frightens me. Long term exposure to this stuff is going to make your IQ drop, there will be studies that come out in a few years time saying this was the new smoking, along with social media use. It seems to me that the way forward is to seek mastery, to stay human, to stay curious - to push forward with a human first perspective and in all things try to find connection. The hilarious thing that “AI” might actually be useful for is sniffing out and then entirely blocking this sort of thing. I will in the near future hash out how to best do this, if there are already projects that are existing with this as the goal, feel free to email me or comment below. But, my thought is that you will run a simple local model that will be trained on AI-isms in writing and immediately blank out the browser tab saying that the writing is generated and to not waste your time. There does seem to be various tools used in academia that provide this sort of service: run on this paragraph If we allow it, the computer can steal your humanity - but I feel that it was meant to encourage you to enhance humanity through your ideas, your words, the code and things you create. We let computers get corporatised, focused on profit and “efficiency”, and they efficiently ripped out the humanity of much of this life. So, in this vein, LLM generated anything seems to be an affront to humanity. Anything created by an algorithm is going to be a direct attack on your being, it is going to be meant to engagement farm you, to pull you in and manipulate your emotions, getting you to stay in the advertisement silo. Perhaps the challenge has always been to stay human - and then pursue the fullest extent of that humanity. As always, God bless, and until next time. If you enjoyed this post, consider Supporting my work , Checking out my book , Working with me , or sending me an Email to tell me what you think.

0 views
ENOSUCHBLOG 2 days ago

Introducing vulnbrocards.com

TL;DR: I’ve turned my April post on Brocards for vulnerability triage into a more permanent website. You can now link to each brocard directly, like this , without having to worry about link rot 1 . This is a short announcement post for vulnbrocards.com : Several people have asked me for a more stable way to reference the brocards in the original post , and this is my long-term solution. I hope you (dear reader) find it useful! My blog’s URLs should be very stable, but a separate domain and site should be even more so.  ↩ My blog’s URLs should be very stable, but a separate domain and site should be even more so.  ↩

0 views