Latest Posts (20 found)

Declarative Dialog Menu with Invoker Commands

The off-canvas menu — aka the Hamburger , if you must — has been hot ever since Jobs’ invented mobile web and Ethan Marcott put a name to responsive design . Making an off-canvas menu free from heinous JavaScript has always been possible, but not ideal. I wrote up one technique for Smashing Magazine in 2013. Later I explored in an absurdly titled post where I used the new Popover API . I strongly push clients towards a simple, always visible, flex-box-wrapping list of links. Not least because leaving the subject unattended leads to a multi-level monstrosity. I also believe that good design and content strategy should allow users to navigate and complete primary goals without touching the “main menu”. However, I concede that Hamburgers are now mainstream UI. Jason Bradberry makes a compelling case . This month I redesigned my website . Taking the menu off-canvas at all breakpoints was a painful decision. I’m still not at peace with it. I don’t like plain icons. To somewhat appease my anguish I added big bold “Menu” text. The HTML for the button is pure declarative goodness. I added an extra “open” prefix for assistive tech. Aside note: Ana Tudor asked do we still need all those “visually hidden” styles? I’m using them out of an abundance of caution but my feeling is that Ana is on to something. The menu HTML is just as clean. It’s that simple! I’ve only removed my opinionated class names I use to draw the rest of the owl . I’ll explain more of my style choices later. This technique uses the wonderful new Invoker Command API for interactivity. It is similar to the I mentioned earlier. With a real we get free focus management and more, as Chris Coyier explains . I made a basic CodePen demo for the code above. So here’s the bad news. Invoker commands are so new they must be polyfilled for old browsers. Good news; you don’t need a hefty script. Feature detection isn’t strictly necessary. Keith Cirkel has a more extensive polyfill if you need full API coverage like JavaScript events. My basic version overrides the declarative API with the JavaScript API for one specific use case, and the behaviour remains the same. Let’s get into CSS by starting with my favourite: A strong contrast outline around buttons and links with room to breath. This is not typically visible for pointer events. For other interactions like keyboard navigation it’s visible. The first button inside the dialog, i.e. “Close (menu)”, is naturally given focus by the browser (focus is ‘trapped’ inside the dialog). In most browsers focus remains invisible for pointer events. WebKit has bug. When using or invoker commands the style is visible on the close button for pointer events. This seems wrong, it’s inconsistent, and clients absolutely rage at seeing “ugly” focus — seriously, what is their problem?! I think I’ve found a reliable ‘fix’. Please do not copy this untested . From my limited testing with Apple devices and macOS VoiceOver I found no adverse effects. Below I’ve expanded the ‘not open’ condition within the event listener. First I confirm the event is relevant. I can’t check for an instance of because of the handler. I’d have to listen for keyboard events and that gets murky. Then I check if the focused element has the visible style. If both conditions are true, I remove and reapply focus in a non-visible manner. The boolean is Safari 18.4 onwards. Like I said: extreme caution! But I believe this fixes WebKit’s inconsistency. Feedback is very welcome. I’ll update here if concerns are raised. Native dialog elements allow us to press the ESC key to dismiss them. What about clicking the backdrop? We must opt-in to this behaviour with the attribute. Chris Ferdinandi has written about this and the JavaScript fallback . That’s enough JavaScript! My menu uses a combination of both basic CSS transitions and cross-document view transitions . For on-page transitions I use the setup below. As an example here I fade opacity in and out. How you choose to use nesting selectors and the rule is a matter of taste. I like my at-rules top level. My menu also transitions out when a link is clicked. This does not trigger the closing dialog event. Instead the closing transition is mirrored by a cross-document view transition. The example below handles the fade out for page transitions. Note that I only transition the old view state for the closing menu. The new state is hidden (“off-canvas”). Technically it should be possible to use view transitions to achieve the on-page open and close effects too. I’ve personally found browsers to still be a little janky around view transitions — bugs, or skill issue? It’s probably best to wrap a media query around transitions. “Reduced” is a significant word. It does not mean “no motion”. That said, I have no idea how to assess what is adequately reduced! No motion is a safe bet… I think? So there we have it! Declarative dialog menu with invoker commands, topped with a medley of CSS transitions and a sprinkle of almost optional JavaScript. Aren’t modern web standards wonderful, when they work? I can’t end this topic without mentioning Jim Nielsen’s menu . I won’t spoil the fun, take a look! When I realised how it works, my first reaction was “is that allowed?!” It work’s remarkably well for Jim’s blog. I don’t recall seeing that idea in the wild elsewhere. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views

Unresponsive Buttons on My Fastest Hardware Ever

This is one of those small things that drives me nuts. Why? I don’t know. I think it has something to do with the fact that I have a computer that is faster than any computer I’ve ever used in my entire life — and yet, clicking on buttons results in slight but perceptible delays. Let me explain. Imagine a button that looks like this: For SPA apps, when the user clicks that button it takes a split second (even on a fast connection) for anything to happen because: When clicking on that button, even on a fast connection, my brain glitches for a second, my thought process going something like: Granted those thoughts occur in my brain in under a second, but I hate that pause of indetermination. I clicked, I want (perceptibly) instant feedback. If something is happening, tell me! For SPA apps, you could put some state in there, like: This would provide more immediate feedback. But it also raises a whole set of other questions: Oh boy, this is getting complicated isn’t it? This is why, I assume, lots of apps just don’t deal with it. They accept there will be a slight delay in the responsiveness of the UI (and that it might error, but the user can just click again) and justify that it’s really not that big of a deal if there’s a slight, almost imperceptible delay between clicking a button and seeing the UI respond. “We’ve got bigger fish to fry.” And it makes sense. I mean, a slight delay in UI responsiveness, is that why people will or won’t buy your thing? Seems like a small detail. Who’s got the time to spend on details like this?Who cares? I care. That’s why I’m writing this post. To my original point, every piece of hardware I currently own is the fastest version of that device I’ve ever had in my life. And yet, everywhere I go I encounter lag. Lag everywhere. And I’m grumpy about it, hence this post. Reply via: Email · Mastodon · Bluesky The browser makes a request to the server The server talks to Stripe to get a session The server responds with the session data to the client The client redirects [nothing happens] I think “Did that work?” Just as I’m about to click again, I see the URL bar change I think, “Oh, ok, it’s doing something .” I stop myself from clicking again while I wait for the UI to redraw Is that actually the interaction you want, where the text changes? That’s probably gonna shift layout. Maybe you want something different, like a spinner in place of the text. How do you handle that? What if you have multiple places to upgrade? Do you have to implement state in all those places too? What if the trigger in each place is slightly different? A button here, some text there, and icon over yonder? How do you handle all of those different interactions in a standard, immediate way? Errors. What if it fails? Well, we already weren’t handling that in the first code example were we? But maybe we should…

0 views

my little filou,

It’s already been over 2 years since you have left us. You still leave an incredible hole in our home and our hearts. Only toward the end of last year, I finally got rid of your old medication and your food. I haven’t taken down the sign at my door with your face on it. Every year, we use the reusable photo calendar with pictures of you on it. We have Christmas tree decorations with your face, too. The time shortly after was rough. Then it got a little easier, slowly. It all felt like one big vacation you were on. You weren’t gone, just somewhere else, living your own life, traveling. But recently, it feels like it’s been too long, like someone you love who’s taking longer than usual to return home. It feels like slowly losing touch because everything is changing, we are changing, and you can no longer witness it. We can’t see you change, either. We are no longer growing together, and it’s becoming more apparent with time. You’ll always stay stuck the way you were, and we increasingly become different people than we were with you. It’s so scary to feel like it all happened in a parallel universe. Each walk we go on, we miss you and want you with us. It’s surreal to know we used to walk the same paths in the forest together. I’m scared that with time, I will forget the way you felt, the way you smelled, and all your little quirks and silly behaviors. We have videos and we still have your fur, but it feels like it’s not enough. Vigdís wrote a poem for you yesterday: Grief is not a Liquid Though it flows Grief is not a Plant Though it grows Grief is not a Thorn Though it stings Grief is not a Bird Though it sings Grief is not a String Though it tears Grief is not a Fire Though it sears Grief is not a Robber Though it takes Grief is not a Mourner Though it wakes Grief is not a Stone Though it weighs Grief is not a Friend But it stays At least I can write about you so everyone knows you existed and you mattered. Reply via email Published 11 Feb, 2026

0 views

A Random List of Silly Things I Hate

Apparently this is a thing now , so I'm gonna join in. 🙃 Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️ You can reply to this post by email , or leave a comment . Rude people. Late people. People who don't like dogs. What's that all about?? The sight of blood. I'll faint. Immediately. Like Manu, blogs that don't have a simple way to contact the author. The hold that mobile phones have on our society. Over-population. Large cities.

0 views
iDiallo Today

Last year, all my non-programmer friends built apps

Last year, all my non-programmer friends were building apps. Yet today, those apps are nowhere to be found. Everyone followed the ads. They signed up for Lovable and all the fancy app-building services that exist. My LinkedIn feed was filled with PMs who had discovered new powers. Some posted bullet-point lists of "things to do to be successful with AI." "Don't work hard, work smart," they said, as if it were a deep insight. I must admit, I was a bit jealous. With a full-time job, I don't get to work on my cool side project, which has collected enough dust to turn into a dune. There's probably a little mouse living inside. I'll call him Muad'Dib. What was I talking about? Right. The apps. Today, my friends are silent. I still see the occasional post on LinkedIn, but they don't garner the engagement they used to. The app-building AI services still exist, but their customers have paused their subscriptions. Here's a conversation I had recently. A friend had "vibe-coded" an Android app. A platform for building communities around common interests. Biking enthusiasts could start a biking community. Cooking fans could gather around recipes. It was a neat idea. While using the app on his phone, swiping through different pages and watching the slick animations, I felt a bit jealous. Then I asked: "So where is the data stored?" "It's stored on the app," he replied. "I mean, all the user data," I pressed. "Do you use a database on AWS, or any service like that?" We went back and forth while I tried to clarify my question. His vibe-knowing started to show its limits. I felt some relief, my job was safe for now. Joking aside, we talked about servers, app architecture, and even GDPR compliance. These weren't things the AI builder had prepared him for. This conversation happens often now when I check in on friends who vibe-coded their way into developing an app or website. They felt on top of the world when they were getting started. But then they got stuck. An error message they couldn't debug. The service generating gibberish. Requests the AI couldn't understand. How do you build the backend of an app when you don't know what a backend is? And when the tool asks you to sign up for Google Cloud and start paying monthly fees, what are you supposed to do? Another friend wanted to build a newsletter. Right now, ChatGPT told him to set up WordPress and learn about SMTP. These are all good things to learn, but the "S" in SMTP is a lie. It's not that simple. I've been trying to explain to him why the email he is sending from the command line is not reaching his gmail. The AI services that promise to build applications are great at making a storefront you don't want to modify. The moment you start customizing, you run into problems. That's why all Lovable websites look exactly the same. These services continue to exist. The marketing is still effective. But few people end up with a product that actually solves their problems. My friends spent money on these services. They were excited to see a polished brochure. The problem is, they didn't know what it takes to actually run an app. The AI tools are amazing at generating the visible 20% of an app. But the remaining invisible 80% is where the actual work is. The infrastructure, the security, maintenance, scaling issues, and then the actual cost. The free tier on AWS doesn't last forever. And neither does your enthusiasm when you start paying $200/month for a hobby project. My friends' experiments weren't failures. They learned something valuable. Some now understand why developers get paid what they do. Some even started taking programming bootcamp. But the rest have moved on. Their app sits dormant in an abandoned github repo. Their domain will probably expire this year. They're back to their day jobs, a little wiser about the difference between a demo and a product. Their LinkedIn profiles are quieter now, they have stopped posting about "working smart, not hard." As for me, I should probably check on Muad'Dib. That side project isn't going to build itself. AI or no AI.

1 views

Spotify Earnings, Individualized Networks, AI and Aggregation

Spotify's nature as a content network means that AI is a sustaining technology, particularly because they have the right business model in place.

0 views

I Choose Living Over Documenting

Over the past few weeks, I’ve been sitting with a growing feeling that my life has (once again! unfortunately, this is not the first time) become… busy in a very specific way. Not busy with people or experiences or even work, but busy with tools. With systems. With capturing, tracking, logging, and organising. At some point, and this keeps happening, I start living inside my artifacts. It doesn’t happen all at once. It creeps in quietly - every new app, every new method, every new process… disguised as something fun and even mildly productive. I capture thoughts in Day One. I open monthly notes in Bear. Then weekly notes. Weekly notes become blog posts (which I actually kind of like and will probably keep) . Then I add a monthly recap. Then trackers - books, movies, mood, walking, yoga, food. The purpose is, I tell myself, to consolidate. Reflect. Optimise. Learn something profound about myself, I guess. But most of it was probably because I can , because it gives me a sense of control, like tidying up and minimising my house when my work and life get too busy and too frantic. The moment of clarity came last week. I’d just finished my January monthly recap that I added to my monthly Bear notes , a system I am trialling. I’d written it carefully, linked all my blog posts to it, and spent a good 45 minutes on it. And then Bear didn’t sync due to some Bear Web glitch. The whole thing disappeared. My first reaction was annoyance as I was getting ready to write it all again. And then clarity. I realised I didn’t actually want to do it again. Or even recover it. In fact, I didn’t want to be doing it at all. I deleted the monthly recaps. I kept a very simple monthly note, but that may go as well if it doesn’t prove to be useful. I’m stopping movie tracking entirely. I’ll keep book tracking , but only because that’s where I consolidate notes and highlights, and I like having it in one place. I still journal in Day One, and my blog will remain my creative outlet - writing when I want to write, not because I put any pressure on myself to write. And I’m done trying to tie it all together into some grand, optimised life dashboard. What I really want is to come home and do nothing. Or go for a walk. Or do something small with the kids. Yesterday I went for a walk at lunchtime without my headphones and realised how rare it’s become to just be out of my head. Not recording my thoughts into an app (it’s such a cool app, though; I will share more about it soon). But that’s the part that’s been bothering me the most - how much time I’ve spent thinking about and analyzing my life instead of living it. I even caught myself halfway through justifying a new laptop purchase, as if the answer to anything was more tech. I don’t need a new MacBook. I don’t need better tools. I need fewer of them. So here are some notes to self. living over documenting. to focus on work while I’m at work. to focus on my kids and my life when I’m not. presence over optimisation. tools that support me while I live my life. to finish things, let things go, and stop carrying half-alive projects in my head. living over documenting. to focus on work while I’m at work. to focus on my kids and my life when I’m not. presence over optimisation. tools that support me while I live my life. to finish things, let things go, and stop carrying half-alive projects in my head.

0 views

Contentment is a spectrum, too

I am quite content to be alone except on a mild evening at twilight. During the quick hours of the day I am busy. Busy with things I enjoy doing, for the most part. Or busy with people I enjoy being around. I count myself among the luckiest alive. During the night I am dreaming. Night is dreaming time whether I am asleep or awake. The dreams are all mine. I stretch out in the bed and in my mind. I  never had such space before. Even in my childhood, my dreams were so small, so bordered. Always tied to some other person, some predetermined identity, some set of standards to uphold. Now my dreams and I can wander at will. For this spaciousness, this freedom, I gladly pay the price of whatever loneliness may peek over the headboard or rattle in the closet. I don’t mean fantasies, here. Though the physical need for another person, another body, is real and present. That’s just a fact of being human, for most of us.  Not loneliness so much as lust. I handle both with the means at hand, and am largely content. But twilight comes. On a cold winter day, twilight enhances the coziness of my space, my routine, the comforts of my home and children and friends and hobbies. I can make a pot of stew and dance in the kitchen and get lost in a book and there are no emotions to navigate but my own. This is a peace I do not take lightly. But twilight comes. Twilight comes on a day when the windows are open and the light is mellow. The sunset streaks of gray and orange and blue linger behind a row of trees. I want to turn to someone and say, Look. The music filters through an open door as a bird sings. I want to turn to someone and say, Listen. I want to let this awe and gratitude bubble out and be seen for a moment by another person before it lifts up and away and disappears, as all things do. I want to be a point of reflection for someone else’s awe and wonder. Or pain. We all contain multitudes. Contentment is a spectrum. As is loneliness. I have been together and I have been alone. Loneliness is part of both experiences but it has different flavors. I have been together and I have been alone. Contentment is part of both experiences but it too has different flavors. We have to decide, each moment, what problem we are solving. Sometimes we get so busy solving the problem of loneliness, or lust, or ambition, or insecurity, or sadness, or fear, that we don’t see the larger context. Our larger context, our story, in which this one emotion, this one want , is but a single piece. A significant one, perhaps. But not the wholeness of our being. I want to fold things in, not push them away.

0 views

On screwing up

The most shameful thing I did in the workplace was lie to a colleague. It was about ten years ago, I was a fresh-faced intern, and in the rush to deliver something I’d skipped the step of testing my work in staging 1 . It did not work. When deployed to production, it didn’t work there either. No big deal, in general terms: the page we were working on wasn’t yet customer-facing. But my colleague asked me over his desk whether this worked when I’d tested it, and I said something like “it sure did, no idea what happened”. I bet he forgot about it immediately. I could have just messed up the testing (for instance, by accidentally running some different code than the code I pushed), or he knew I’d probably lied, and didn’t really care. I haven’t forgotten about it. Even a decade later, I’m still ashamed to write it down. Of course I’m not ashamed about the mistake . I was sloppy to not test my work, but I’ve cut corners since then when I felt it was necessary, and I stand by that decision. I’m ashamed about how I handled it. But even that I understand. I was a kid, trying to learn quickly and prove I belonged in tech. The last thing I wanted to do was to dwell on the way I screwed up. If I were in my colleague’s shoes now, I’d have brushed it off too 2 . How do I try to handle mistakes now? The most important thing is to control your emotions . If you’re anything like me, your strongest emotional reactions at work will be reserved for the times you’ve screwed up. There are usually two countervailing emotions at play here: the desire to defend yourself, find excuses, and minimize the consequences; and the desire to confess your guilt, abase yourself, and beg for forgiveness. Both of these are traps. Obviously making excuses for yourself (or flat-out denying the mistake, like I did) is bad. But going in the other direction and publicly beating yourself up about it is just as bad . It’s bad for a few reasons. First, you’re effectively asking the people around you to take the time and effort to reassure you, when they should be focused on the problem. Second, you’re taking yourself out of the group of people who are focused on the problem, when often you’re the best situated to figure out what to do: since it’s your mistake, you have the most context. Third, it’s just not professional. So what should you do? For the first little while, do nothing . Emotional reactions fade over time. Try and just ride out the initial jolt of realizing you screwed up, and the impulse to leap into action to fix it. Most of the worst reactions to screwing up happen in the immediate aftermath, so if you can simply do nothing during that period you’re already off to a good start. For me, this takes about thirty seconds. How much time you’ll need depends on you, but hopefully it’s under ten minutes. More than that and you might need to grit your teeth and work through it. Once you’re confident you’re under control, the next step is to tell people what happened . Typically you want to tell your manager, but depending on the problem it could also be a colleague or someone else. It’s really important here to be matter-of-fact about it, or you risk falling into the “I’m so terrible, please reassure me” trap I discussed above. You often don’t even need to explicitly say “I made a mistake”, if it’s obvious from context. Just say “I deployed a change and it’s broken X feature” (or whatever the problem is). You should do this before you’ve come up with a solution. It’s tempting to try to conceal your mistake and just quietly solve it. But for user-facing mistakes, concealment is impossible - somebody will raise a ticket eventually - and if you don’t communicate the issue, you risk someone else discovering it and independently raising it. In the worst case, while you’re quietly working on a fix, you’ll discover that somebody else has declared an incident. Of course, you understand the problem perfectly (since you caused it), and you know that it was caused by a bad deploy and is easily fixable. But the other people on the incident call don’t know all that. They’re thinking about the worst-case scenarios, wondering if it’s database or network-related, paging in all kinds of teams, causing all kinds of hassle. All of that could have been avoided if you had reported the issue immediately. In my experience, tech company managers will forgive mistakes 3 , but they won’t forgive being made to look like a fool . In particular, they won’t forgive being deprived of critical information. If they’re asked to explain the incident by their boss, and they have to flounder around because they lack the context that you had all along , that may harm your relationship with them for good. On the other hand, if you give them a clear summary of the problem right away, and they’re able to seem like they’re on top of things to their manager, you might even earn credit for the situation (despite having caused it with your initial mistake). However, you probably won’t earn credit. This is where I diverge from the popular software engineering wisdom that incidents are always the fault of systems, never of individuals. Of course incidents are caused by the interactions of complex systems. Everything in the universe is caused by the interactions of complex systems! But one cause in that chain is often somebody screwing up 4 . If you’re a manager of an engineering organization, and you want a project to succeed, you probably have a mental shortlist of the engineers in your org who can reliably lead projects 5 . If an engineer screws up repeatedly, they’re likely to drop off that list (or at least get an asterisk next to their name). It doesn’t really matter if you had a good technical reason to make the mistake, or if it’s excusable. Managers don’t care about that stuff, because they simply don’t have the technical context to know if it’s true or if you’re just trying to talk your way out of it. What managers do have the context to evaluate is results , so that’s what they judge you on. That means some failures are acceptable, so long as you’ve got enough successes to balance them out. Being a strong engineer is about finding a balance between always being right and taking risks . If you prioritize always being right, you can probably avoid making mistakes, but you won’t be able to lead projects (since that always requires taking risks). Therefore, the optimal amount of mistakes at work is not zero. Unless you’re working in a few select industries 6 , you should expect to make mistakes now and then, otherwise you’re likely working far too slow. From memory, I think I had tested an earlier version of the code, but then I made some tweaks and skipped the step where I tested that it worked even with those tweaks. Though I would have made a mental note (and if someone more senior had done this, I would have been a bit less forgiving). Though they may not forget them. More on that later. It’s probably not that comforting to replace “you screwed up by being incompetent” with “it’s not your fault, it’s the system’s fault for hiring an engineer as incompetent as you”. For more on that, see How I ship projects at large tech companies . The classic examples are pacemakers and the Space Shuttle (should that now be Starship/New Glenn)? From memory, I think I had tested an earlier version of the code, but then I made some tweaks and skipped the step where I tested that it worked even with those tweaks. ↩ Though I would have made a mental note (and if someone more senior had done this, I would have been a bit less forgiving). ↩ Though they may not forget them. More on that later. ↩ It’s probably not that comforting to replace “you screwed up by being incompetent” with “it’s not your fault, it’s the system’s fault for hiring an engineer as incompetent as you”. ↩ For more on that, see How I ship projects at large tech companies . ↩ The classic examples are pacemakers and the Space Shuttle (should that now be Starship/New Glenn)? ↩

0 views
fLaMEd fury Yesterday

Robin Hood (2025)

What’s going on, Internet? Haven’t done these in a while so here we go. I just finished up watching all ten episodes of Robin Hood (2025) . It probably isn’t a great television show but it was entertaining enough to watch across four evenings. I did find Robb a bit whingey at first, but I enjoyed how quickly he went from reluctant to ruthless. Tuck the monk was a great addition to the crew, I liked his wrestling with his faith and where he drew the line, but ultimately came back around. Little John was a weird one though, where he was literally hunting Robb, bested him and the millers, and then immediately joined the cause after a vision. That felt a bit rushed. The Earl of Huntingdon was an absolute munter though. Easy to dislike, which I suppose is the point. It’s always good to see Sean Bean in a show, he had such an impact on Game of Thrones in only a single season, but his portrayal of the Sheriff of Nottingham wasn’t as impactful. And Priscilla, his daughter, no idea what was going on there, lol. The show has me thinking about a Robin Hood: Prince of Thieves rewatch, a favourite when I was younger - maybe because of that banger Bryan Adams song on the soundtrack. The stories are similar but different enough to get me interested. I find the time period and story of Robin Hood interesting and the show has me keen to dive into some history of the Norman conquests - if you have any recs, let me know. Hey, thanks for reading this post in your feed reader! Want to chat? Reply by email or add me on XMPP , or send a webmention . Check out the posts archive on the website.

0 views

Introducing Showboat and Rodney, so agents can demo what they’ve built

A key challenge working with coding agents is having them both test what they’ve built and demonstrate that software to you, their overseer. This goes beyond automated tests - we need artifacts that show their progress and help us see exactly what the agent-produced software is able to do. I’ve just released two new tools aimed at this problem: Showboat and Rodney . I recently wrote about how the job of a software engineer isn't to write code, it's to deliver code that works . A big part of that is proving to ourselves and to other people that the code we are responsible for behaves as expected. This becomes even more important - and challenging - as we embrace coding agents as a core part of our software development process. The more code we churn out with agents, the more valuable tools are that reduce the amount of manual QA time we need to spend. One of the most interesting things about the StrongDM software factory model is how they ensure that their software is well tested and delivers value despite their policy that "code must not be reviewed by humans". Part of their solution involves expensive swarms of QA agents running through "scenarios" to exercise their software. It's fascinating, but I don't want to spend thousands of dollars on QA robots if I can avoid it! I need tools that allow agents to clearly demonstrate their work to me, while minimizing the opportunities for them to cheat about what they've done. Showboat is the tool I built to help agents demonstrate their work to me. It's a CLI tool (a Go binary, optionally wrapped in Python to make it easier to install) that helps an agent construct a Markdown document demonstrating exactly what their newly developed code can do. It's not designed for humans to run, but here's how you would run it anyway: Here's what the result looks like if you open it up in VS Code and preview the Markdown: Here's that demo.md file in a Gist . So a sequence of , , and commands constructs a Markdown document one section at a time, with the output of those commands automatically added to the document directly following the commands that were run. The command is a little special - it looks for a file path to an image in the output of the command and copies that image to the current folder and references it in the file. That's basically the whole thing! There's a command to remove the most recently added section if something goes wrong, a command to re-run the document and check nothing has changed (I'm not entirely convinced by the design of that one) and a command that reverse-engineers the CLI commands that were used to create the document. It's pretty simple - just 172 lines of Go. I packaged it up with my go-to-wheel tool which means you can run it without even installing it first like this: That command is really important: it's designed to provide a coding agent with everything it needs to know in order to use the tool. Here's that help text in full . This means you can pop open Claude Code and tell it: And that's it! The text acts a bit like a Skill . Your agent can read the help text and use every feature of Showboat to create a document that demonstrates whatever it is you need demonstrated. Here's a fun trick: if you set Claude off to build a Showboat document you can pop that open in VS Code and watch the preview pane update in real time as the agent runs through the demo. It's a bit like having your coworker talk you through their latest work in a screensharing session. And finally, some examples. Here are documents I had Claude create using Showboat to help demonstrate features I was working on in other projects: row-state-sql CLI Demo shows a new command I added to that same project. Change grouping with Notes demonstrates another feature where groups of changes within the same transaction can have a note attached to them. I've now used Showboat often enough that I've convinced myself of its utility. (I've also seen agents cheat! Since the demo file is Markdown the agent will sometimes edit that file directly rather than using Showboat, which could result in command outputs that don't reflect what actually happened. Here's an issue about that .) Many of the projects I work on involve web interfaces. Agents often build entirely new pages for these, and I want to see those represented in the demos. Showboat's image feature was designed to allow agents to capture screenshots as part of their demos, originally using my shot-scraper tool or Playwright . The Showboat format benefits from CLI utilities. I went looking for good options for managing a multi-turn browser session from a CLI and came up short, so I decided to try building something new. Claude Opus 4.6 pointed me to the Rod Go library for interacting with the Chrome DevTools protocol. It's fantastic - it provides a comprehensive wrapper across basically everything you can do with automated Chrome, all in a self-contained library that compiles to a few MBs. All Rod was missing was a CLI. I built the first version as an asynchronous report prototype , which convinced me it was worth spinning out into its own project. I called it Rodney as a nod to the Rod library it builds on and a reference to Only Fools and Horses - and because the package name was available on PyPI. You can run Rodney using or install it like this: (Or grab a Go binary from the releases page .) Here's a simple example session: Here's what that looks like in the terminal: As with Showboat, this tool is not designed to be used by humans! The goal is for coding agents to be able to run and see everything they need to know to start using the tool. You can see that help output in the GitHub repo. Here are three demonstrations of Rodney that I created using Showboat: After being a career-long skeptic of the test-first, maximum test coverage school of software development (I like tests included development instead) I've recently come around to test-first processes as a way to force agents to write only the code that's necessary to solve the problem at hand. Many of my Python coding agent sessions start the same way: Telling the agents how to run the tests doubles as an indicator that tests on this project exist and matter. Agents will read existing tests before writing their own so having a clean test suite with good patterns makes it more likely they'll write good tests of their own. The frontier models all understand that "red/green TDD" means they should write the test first, run it and watch it fail and then write the code to make it pass - it's a convenient shortcut. I find this greatly increases the quality of the code and the likelihood that the agent will produce the right thing with the smallest amount of prompts to guide it. But anyone who's worked with tests will know that just because the automated tests pass doesn't mean the software actually works! That’s the motivation behind Showboat and Rodney - I never trust any feature until I’ve seen it running with my own eye. Before building Showboat I'd often add a “manual” testing step to my agent sessions, something like: Both Showboat and Rodney started life as Claude Code for web projects created via the Claude iPhone app. Most of the ongoing feature work for them happened in the same way. I'm still a little startled at how much of my coding work I get done on my phone now, but I'd estimate that the majority of code I ship to GitHub these days was written for me by coding agents driven via that iPhone app. I initially designed these two tools for use in asynchronous coding agent environments like Claude Code for the web. So far that's working out really well. 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 . Proving code actually works Showboat: Agents build documents to demo their work Rodney: CLI browser automation designed to work with Showboat Test-driven development helps, but we still need manual testing I built both of these tools on my phone shot-scraper: A Comprehensive Demo runs through the full suite of features of my shot-scraper browser automation tool, mainly to exercise the command. sqlite-history-json CLI demo demonstrates the CLI feature I added to my new sqlite-history-json Python library. row-state-sql CLI Demo shows a new command I added to that same project. Change grouping with Notes demonstrates another feature where groups of changes within the same transaction can have a note attached to them. krunsh: Pipe Shell Commands to an Ephemeral libkrun MicroVM is a particularly convoluted example where I managed to get Claude Code for web to run a libkrun microVM inside a QEMU emulated Linux environment inside the Claude gVisor sandbox. Rodney's original feature set , including screenshots of pages and executing JavaScript. Rodney's new accessibility testing features , built during development of those features to show what they could do. Using those features to run a basic accessibility audit of a page . I was impressed at how well Claude Opus 4.6 responded to the prompt "Use showboat and rodney to perform an accessibility audit of https://latest.datasette.io/fixtures " - transcript here .

0 views
ava's blog Yesterday

album: girls by princess nokia

As I said before, I’m a lazy listener . I don’t listen to a lot of music; I often just like one song of an artist, and I tend to listen to single songs and playlists instead of albums. But recently, I finally checked out the new album of an artist I enjoy: Princess Nokia. It’s been a few months since the “GIRLS” release, but it totally passed me by until now. After listening to the album, I felt changed. Healed. It felt like a whole body experience! For once, an album that I wanna experience as a whole. I do not dare to pluck out songs from it, remove them from their context, or to play one over and over and over again. I want the whole thing, I want the experience of each song being embedded in the rest, I want to “earn” listening to my faves and eagerly await their turn. That’s a new experience for me. So I wanted to write down how the songs (except FM intro and interlude) made me feel, what moves me about them. I’ll bring up something that continues on throughout the album irrespective of specific songs: Uplifting songs, and specifically women empowerment songs are often rather… clean. They’ll talk about all their material wealth, their perfect looks, their moods and hobbies in a way that feels sanitized. Good vibes only, being confident but not too much, treading carefully, still being kind and nurturing, not pushing many boundaries, no talking about trauma or resentment, no offending anyone. There is just clean self improvement in a way that doesn't gross anyone out. They sound like “ I like myself, but don’t worry, I am not arrogant or anything, I’m not a downer and I still look fuckable in the eyes of men and will laugh at your bad jokes. ” I sometimes miss the darker, more embarrassing emotions; anger that doesn’t feel watered down, accusations that aren’t sugarcoated, beauty that doesn’t hinge on heterosexual performance. Grossness, imperfection, self-isolation that isn’t depressed or sad, a vibe that doesn’t feel like a curated version of the Manic Pixie Dream Girl. Songs that treat women fully as people with all kinds of uncomfortable edges and unreasonable feelings, not just advertising space, a decorative item, a housewife, the main character’s development, and a hole. Things that are embarrassing, that the world heavily wants to police you for. You are always supposed to forgive and forget, to be relatable and put others’ needs first, to be the bigger person and give in. You’re supposed to read everyone’s mind. You’re the homemaker. You’re supposed to wear eyeliner “ so sharp it kills a man ”, but do it for him. You can sing about getting all the guys and driving in your sports car, but it has to feel like a persona, a trend, an act (not real), a revenge on rap music, and you have to still shake ass for them. You’re defiant, but you're so palatable. Queer art and sexuality feels different, more free, less in this box. Your body is sexy like it is, but not because it is contorted and watched. There’s more room to be evil and disgusting, your worst instead of best version. The mainstream empowering songs can feel like you’re only your “true” self when half of your humanity is missing; you love everyone and not take anything personally and are above everything, and every struggle is already therapized, processed, and neatly packaged up into a relatable lesson for everyone’s consumption, with an unspoken vow to never do it again. Not here, at least in the beginning. We are in the struggle, we are holding grudges. We know healing isn’t linear, and indulging in our worst thoughts and re-entering some grief and anger about what happened to you every now and then is normal and healthy. The vibe is eerie, it’s deep at night, the wolves are howling. We’re up late, we’re sick with anger, we can’t and don’t want to sleep. Girlhood is a spectrum Pretty is destruction I just fell from grace And I made it into something Everywhere around us, we’re inundated with beauty ads under the guise of self care. Put on all these products to become happy and look your best, queen! Not doing this is so slob, so bedrotting, so depression. Have you done your morning shed? Your 5 minute gratitude journaling? To be a woman, you have to take care of yourself, be in your feminine era! I enjoy using some products to make me feel good and affirm my gender - that’s not a crime! But the goalposts keep moving, more and more products are presented as staples, and getting started with a routine feels overwhelming. Do I do it for me, or for you? For us? I nick myself while shaving my leg and bleed, and waxing hurts more; my trash can is full of sheet masks, and we’re all scrolling while the conditioner does its magic. The hair gets tangled up anyway, hurts while brushing. It mats in the neck while you’ve called in sick due to cramps and you keep rolling around in bed trying to find a comfortable position. Everything we carefully draw on our faces gets demolished again, every acrylic nail fades into dust, and there’s a callus where the nail tech hits your skin with the e-file. It's two-fold. What makes you pretty can also make you a target and bring you destruction; the attention of evil people, jealousy. Now I'm fucked up and I'm bended If only I could understand the reason for my crying If only I could stop the fear of dreaming that I’m dying This is also partially a quote from Jennifer Lynch from The Secret Diary of Laura Palmer. What bends can snap. Every time I know it’s coming, every time I think I am prepared, but I’m not. The feelings overpower me, but why am I so sad? Why does everything seem so dark and hopeless? Why does my mind wander to worrying about terrible events and tragedies? Why do I simultaneously want to kill myself and fear I won’t wake up again tomorrow? Even a look in the cycle tracking app doesn’t make that go away. I have to wait for it to pass and trust that this isn’t the truth. This is for my rapist And all of my abusers You may have all the world fooled But I see right through you [...] I've been a statistic, and everyone ignored me [...] But I am a girl, so they hate my fucking guts They tell me I ain't shit And that I fucking suck If I was a man, I would get away with murder But I am a girl, so I have mental disorder So many like me have coped by directing it all against themselves. The outside world can’t be reasoned with; they’ll blame you, they won’t believe you, they’ll make themselves out to be a victim because your criticisms or accusations made them feel bad. Every time you try to fix it or extend an olive branch, the other party stomps on it and the situation gets worse. So you comply, you grey-rock, you plan your escape, you write it in your journal, you daydream about a different life. You starve yourself, you overexercise, you cut and you burn, you give yourself a bad haircut at 3am, you spend money you don’t have to make yourself happy, you numb yourself with the benzos you got your your anxiety. You do everything but not punch their face, scream at them, or give them the silent treatment, because if push comes to shove, you. will. lose. You are dependent on them and their approval. Everyone who feeds you can also starve you. It also reminds me of the Ashnikko quote " God made me pretty, you made me mean. " I am very girly And also very violent The juxtaposition of girlhood and violence makes the final girl so compelling. The final girl is a woman who is the sole survivor of a group in (usually) a slasher film, who are chased by the villain. She gets the final confrontation with the villain and often ends up killing him. Final girls tend to be very beautiful and have a certain aura, an implied moral superiority through refusing certain behaviors or acting "like a lady". I’m past my expiration date He called me damaged goods I’m the rotten fruit Low hanging in the woods How dare you weaponize my looks? I’m a bad bitch You’re impotent and bald We all know why you’re angry You’ve hit the wall, they say. 30 year old women are ancient. Your life is over. You are undesirable. If no one chose you by now, there’s something wrong with you. Even if you tried getting with people, each relationship was one too many; now you’re a whore. You’re easy. You’re the last option. You are not allowed to have standards, be happy someone picked you at all. Make it work with them no matter what. Never be mean to him back! If he acts out, that’s your fault. Stop expecting anything of him, stop nagging him, stop being such a bore and a prude, stop bring slutty in public. Why can’t you be agreeable? Why can’t you maintain your body in a pristine condition? Who wants you with a buzzcut and your blood and sweat? It’s a projection. The people throwing these things at you do not age well either and are afraid of being alone. Manipulating women with kindness is such a sin to me Premeditated You pretend to be a friend of me And rip out my wings while I’m sleeping You’re fucking dead to me I remember the time when my friendships with boys started to transform in early puberty. They suddenly acted odd. They weren’t carefree and silly anymore, but more macho, sarcastic, weirdly flexing. It’s like they went from being a person to being the image of a gender, forcefully. They put on a mask and looked at me differently. Now hangouts became unsafe. Every conversation could send the wrong message. I was now expected to do the work of managing these hormonal moods around me, juggle everyone’s feelings, and fawn. Make people comfortable. Reject them, but not too much, and not in a way that would hurt them so deeply that they’d retaliate physically or by spinning up rumors. But you first have to learn that, so by the time you’re 16, you know that in the eyes of others you are simultaneously ugly and fat but also a slut, and everyone whose romantic interest you had to handle like a fragile flower and spend nights worrying about allegedly didn’t want you anyway. Friendship destroyed. But some are more sly than that, and that’s even more painful. They’ll strike when you least expect it and disarm you with kindness and safety before you know what’s happening. They wield your connection like a sword. He’d never do that; that was probably unintentional; he didn’t mean it like that; he just needed some support in a stressful time; I must have sent mixed signals; I didn’t say no, so it was my fault. My friend’s brother went and did some weird shit Do I tell her Or keep it to myself? Is it common? Does she already know now? If I told her, I think she’d be embarrassed I think about it and all the girls just like me I dance around it ‘cause I don’t wanna hurt her This is what keeps rapists and similar folks so protected in our society; they’re embedded in the systems we rely on. Not just emotionally, where they have the potential to destroy our friendships. They’re your coworker, and you don’t wanna create a weird environment at work (even though they did), or they’re your boss and you need that promotion; they’re your grandpa, your uncle, your older brother, and you’d make everyone sad and split the family, ruining the family get-togethers (even though they did). The common solution once again falls on the girl. She will suck it up, she will keep it a secret, she will direct the anger against herself and protect everyone else from seeing it. Succubus male demon I know what you did I know what you did I know what you did But the mood begins to lift. We got the pain and crying out of our system. Our pants are stained, our beds are messy. It’s laundry day. We kill ourselves a thousand times in our head, but now we’re better, we reemerge on the scene. The vibe is hopeful. Now we want it all and we don’t mince our words. Eat your heart out, cunt I’m holding nothing back Of course I’m wishing death on you I hope you have a heart attack Sorry, did I do that? I have not one remorse There’s a pivotal shift in your life, maybe because of therapy, when you stop internalizing everything and directing everything against you, no longer taking on the blame for everything and denying your own feelings. The time of making amends towards these people and prioritizing their comfort over yours is over. Now you let them know. You have become independent, you have a backup plan, you’ll make your escape. You’ll give them a piece of your mind. You allow yourself to have these dark thoughts and wishes that you have always swallowed and pushed away. You own it now. “ I’m a bitch? Okay, I’ll be that. ” You’ll get called mean for things men pat each other on the back for. And I’d rather be seen as arrogant while I love myself, than being seen as arrogant for self-isolating and sitting in the corner with a resting bitch face because I’m nervous, insecure and just want to hide. I heard I’m a fucking cunt I know I’m a fucking bitch I’m judgmental, mean as shit My autism make me tick This song makes me cry. The longing for a girlhood like the movies and TV shows depicted is as much as I memory as the real girlhood we lived. We searched for it and saw glimpses of it in the cherry-flavored glitter lipgloss we put on at 8 because it was included in some horse magazine for girls, the short skirts we aspired to wear while we played browser dress-up games at 12, or in the iced latte we got at Starbucks at 15, feeling like those Instagram girls older than us. Lemon girl, kiss, kiss, she's so sorbet Lip gloss, glass skin, and a doll-like face Bows tied, mini skirt, skirt, skirt, ballet Iced chai, stardew, internet cafe I like that this song doesn’t feel rooted in the past or too nostalgic; it still mentions more modern elements of girlhood of the girls growing up right now, not just the singers’ upbringing - like Chappell Roan, glass skin and matcha. Things change, but some things stay. The core is the same. The yearning, the collage of all these things we want to be, the Pinterest boards, the feeling of what it is like to enter puberty or be a teen, or your “second puberty” in your 20s. The idea of sleepovers, the stereotypical cliques, Mean Girls, giving the other girls gum or your Labello in class, strawberry cented paper or pens. Even if we didn’t live it, a part of us wanted to. So badly. And even just listening to songs that have this vibe feels like a throwback to that time where we thought this was in the cards for us. It's so healing, even when older, to occasionally do these really girly nights for you. Make your phone pink, add glitter, wear something pink, play a browser game again, add charms to everything. It's going to be alright. Brow tint Lash lift Nails done Life’s great In the first song, pretty is destruction . But here, it’s also self care, a way to feel reborn, make yourself feel good. Beauty rituals and feeling put together gives us a little boost. It’s affirming, it’s relatable, you’re in the in-group. No matter other disagreements or differences, stuff like this is what can transcend barriers between women, in a way. Even if the beauty standards themselves or the procedures and rituals differ, we share in knowing how it feels. It’s a gift and a curse; on one hand, strutting down the street feeling your best after getting your nails done, but also having phases of wanting to do away with all of it. It costs so much time and money, and is it feminist? Is it not? Who am I really doing it for? Would I do these things if no gender roles and beauty standards existed? The feelings around it are messy. Can you truly own something, make it yours, do it for yourself if it is so mandated? We try. I’m in love with her See myself in her Think I know that girl I’m in love with her See myself in her I think I am that girl This piece makes me feel warm and connected to any woman, no matter the age, upbringing, or the time when she first started pursuing womanhood. It makes me recognize myself in every woman, and recognize them in me. It also makes me proud of everything that I have already achieved and look forward to achieving more. I simultaneously feel like the little girl I was, and the protective adult woman I am, and the motherly figure I needed. I want to give all versions of me a deep hug. I know everything I admire in other women, I also have in me. God, boys are so out Girls are in, girls are in And I'm obsessed with them, I love everything about them Their hair, their nails, their accessories Their poetry, their songs The cherry girls, the latte girls, the lemon girls, the coconut girls, the tropical girls The girls who get it, the girls who don't get it The girls who rot in bed all day, the girls who get up and go to Pilates and yoga Like, I'm somewhere in between both of them and I just love it I love being a girl, there's nothing else in this world I'd want to be Do you know what I mean? This is the power song. The song to put on at the gym, the song for getting ready to go out, the song for strutting down the street in the summer in your best fit. The kind of song that makes you think of music videos showing moments of parties and jumping into the pool. The song for when you are sick of the sad songs after a breakup and start to own singlehood again, feeling relief and contentment with it all. Acceptance. A way forward. A little manic. Girlhood, girls bleed Mean girl, girl fun Girl books, girl code Girl hate, girl love Free the girls Hope they all get divorced It’s time to shock yourself awake, remember you have free will, do some daring stuff, reinvent yourself. What does the average common man have to reinvent himself? A new car? A change in beard style? Going bald? But you . You have everything. New makeup, new nails, new haircut, new hair color, new style, new clothes, new bags, new rings… even plastic surgery, if you want. New aesthetically pleasing home decor where his shit used to be. It’s a new chapter. Drop dead gorgeous Scream queen fun Beauty pageant killer She's the one It continues with a similar vibe: This song makes me feel like an it girl, a red carpet girl, a girl hunted by paparazzi. A girl dressed by Chanel and other luxury brands. The kind of super model that is inexplicably always somewhere in France. Once again, a nod to Gossip Girl (which I still have to watch!), what seems to be a staple in many teen and early 20s women's lives. This one is kind of the weakest song for me on the album, but still enjoyable. It feels like a breather in-between; just a nice imagery about loving the sea, craving the beach and feeling like a mermaid; beautiful, mysterious, a siren. My favorite on the album, and the second song to make me cry. Sound-wise, it’s very clearly inspired by, and a nod to, Lana Del Rey, who was also mentioned in a lyric in Drop Dead Gorgeous (“ Lana del Rey, side of fries and a Diet Coke ”). I first thought Lana had a feature on it, it’s that close. Tired of surviving, I just wanna live White picket fence with no man and no kid Love is romantic, I know that it is Love by myself is the love that I give The track fills me with hope for my future, that I can make it, that I can create the life I want for myself and the ones close to me. That even if everything goes wrong, I’ll still have the love I give to myself. Our wishes sometimes get distorted, we get influenced by marketing or the goals of others and wonder: Am I asking for too little? Should I aim higher? Am I a fool for wanting so little? If I reach my easy goals, what then? Am I missing out? The most peace we can give ourselves in life is to be happy with little and having the appropriate amount of gratitude towards the things we already have. You can aim high, but you can always be happy with less. Isn’t all that we want some damn safety, getting out of the stressful areas, some time with loved ones and ourselves, and time for our hobbies? Green juice, Bling Ring Soft girl life, take it easy Pink room, pink clothes Brand new house, Pink Bronco I remember being a teen and imagining the life I’d live once I moved out. Not just the aesthetic of the furniture, but how the fridge would be sorted and how my clothes rack would look. Always having fresh flowers on my desk. Hanging out on the balcony in the summer. A whole apartment to myself, not just a room that felt like it was rented from a parent. I’ve been out of my parent’s home for close to a decade now, and the dreaming continues; now about living in a different city, closer to friends and family, in a bigger place, with my wife. I have outgrown the person I was when I moved into this apartment. Back then, I was recently broken up with, in the middle of a traineeship, not earning much, financially reliant on parents, and it was my first own apartment. I was very frugal, modest, minimalist and very attached to an all-white, empty home. I swore never to move in with anyone again. But I have changed, and my needs have too. Nowadays, I work full time, I am no longer reliant on anyone financially, I am halfway through a degree, I got more qualifications and I am married. I welcome color now, textures, a bit more decoration, less sterile. I’m willing to let someone in, to live with someone again, to share a space. I want character. It’s time for a new chapter, to build something together. It has manifested in the desire to sell a lot of my furniture and get new one with my wife at flea markets, antique stores, and eBay. I am willing to let go of who I was and embrace my new goals, my new perspective and new life. I wonder about the room we’ll paint pink in our new place. This song reminds me of what I’m doing it all for. My pink Bronco are the degrees I want, the job I want, the home I want, the entire life I want. After everything I've been through, and all the hard work I put in, I deserve it. I want pink diamonds, pink flowers, pink sand Took off my hair and rolled in the sand Starting life over, it's my second chance Packed up my suitcase and never looking back I'm standing firmly, the past is the past Well, pink is forever, at least in my head I had to actually research who that is! She’s an influential fashion designer, and her current fashion brand also bears her name. The song is filled with references to powerful and influential women (real and fictional): Phoebe Philo Joan Didion Emily Dickinson Chloë Sev (= Chloë Sevigny) Beth Dutton Maxxxine (reference to the movie with its character Maxine Minx) Suspiria (reference to the movie its character Mother Suspiriorum) It’s clearly a girlboss-fantasy (“ I’m dodging taxes babe ”). I never thought I’d miss the boss babe era of online content and that stream of feminism, but now that influencers have shifted into romanticizing being a SAHM and tradwife, I kinda do. The lyrics and beat remind me of The Devil Wears Prada somehow; I think of Meryl Streep as Miranda Priestly. It makes me feel as if I’m walking to my luxurious fashion industry job, wearing a fashionable long coat, some heels, and huge sunglasses with a fitting fancy bag. This is more like Princess Nokia’s previous albums (especially Everything Sucks ) both the sound and the lyrics. It’s rap, it’s competitive, it’s Sugar Honey Iced Tea and It’s Not My Fault . It's a message to people that love to see you fail, that doubt you, that are jealous. There's a difference from a star and a girl in a moment Half of y'all is temporary and you don't even know it You had your fifteen and I seen that you blown it My bad, I had to show it, I think you had to know it The song, and therefore the album, ends with a little message I can relate to, applied to me and my circumstances. I’ll let it close this blog post, too. I finally understand myself and my process And I respect everyone, but I know myself best And I don't like working with writers I don't like working with a lot of producers The formula to my success is silence, isolation, stillness My talent is best suited in that environment I know what works and I know what doesn't work I know what I like, who I like, what I want to make And everyone who works with me, they respect me They don't question it, in fact they encourage it And yeah, I wrote this entire album by myself in a span of one year And I had the best fucking time and it's the greatest album I've ever made So I know what I'm doing I trust my process Reply via email Published 10 Feb, 2026

0 views
neilzone Yesterday

Injecting deno into yt-dlp venv via pipx

gave me an error message of WARNING: [youtube] No supported JavaScript runtime could be found. Only deno is enabled by default; to use another runtime add –js-runtimes RUNTIME[:PATH] to your command/config. YouTube extraction without a JS runtime has been deprecated, and some formats may be missing. See https://github.com/yt-dlp/yt-dlp/wiki/EJS for details on installing one This baffled me for a bit, as it suggested that there was a runtime enabled by default (deno), and yet there was no supported JavaScript runtime. I have installed via (so ). I did not know about the “inject” command: And bingo. I now have an installed, supported, JavaScript runtime.

0 views
Brain Baking Yesterday

A Note on File History in Emacs

Once you start digging beyond the surface, you discover that an ancient piece of text editing software called Emacs was light years ahead of its time. It already contained a clipboard history ( ) and automatic saves/backups decades before contemporary editors took a half-baked stab at mimicking these features. Granted, I don’t make use of the kill ring because Alfred manages that for me across different applications, but it’s still pretty damn impressive. If you manage to stumble past the initial setup, that is. Many default settings in Emacs are… weird? The first thing to configure to transition to a bit of a sane default system is moving all those and backup and auto-save files to a central location to stop the editor from littering all over the place. That’s pretty easy to do but begs the question why they don’t change these defaults? Nobody wants random backup files popping up in their Git change set! Do you even need those files? The system feels archaic at first, but the more you think about the possibilities, the more brilliant the idea becomes. Let’s ignore the auto-save system for now—that doesn’t auto-save but auto-saves an auto-save backup that’s not a backup. Got all that? On every manual , a backup file is created or replaced, depending on your configuration. These files can act as your local file history in case you’re not rocking a version control system. If you do, Emacs notices this and stops producing backups. I do recommend setting to as you might lose interesting historical data before doing a commit. That is one of the more useful features of IntelliJ-based IDEs: to go back in time a few minutes to half an hour. Why would you need that? Emacs has a built-in undo history system! Very true, and perhaps better, as that doesn’t require a save, but isn’t persistent. I can hear you say it. You’re right: there’s a package for that . It’s called undo-fu-session and it serialises the undo information without changing any inner logic. This is even more brilliant if coupled with that helps you step through this. If you increase the three related settings, you will have a powerful way to go back in time. Perhaps a bit too powerful? What is a good limit? Contrary to IntelliJ, Emacs does not persist timestamps: it only works with bytes and limits those, so you’ll have to write a function that periodically cleans up those persisted backups. But are you going to remove the entire tree or just prune a bit? Because if you don’t, this is how your session will look like: The vundo tree: a visualised undo tree with a lot of nodes to diff... And that’s just a clean tree with no branching reapplied undo paths. Good luck trying to hop between different nodes, selecting the right ones to diff and revert to. Without timestamp info, a big undo tree is useless. So I removed : too much power, too much responsibility. Let’s keep that history local and non-persistent (even with a daemon you’ll end up with more than enough). I started fine-tuning the built-in backup settings: Which translates to: There’s a bit of a catch here: Emacs only saves a backup once per editing session and then assumes you’re safe. To force it to create a backup every time you save you’ll have to add to the . Or, as I learned from Alex , save with . Ridiculous. GNU Emacs already featured this snapshot backup system in 1985, when I was born! Fine, we now have a bunch of backup files. Then what? This is where things can get interesting. Since they’re just files, you can obviously run a diff tool against them. But which backup file to choose, and how to easily select the right file from the UI and go from there? Consult to the rescue. Consult is a completing-read on steroids that plugs seamlessly into Vertico, my minibuffer completion framework. It’s basically a fuzzy search tool you can throw anything at—including a list of backup files to choose from. Which is exactly what I did. You can change the label (parse the timestamps), choose a lovely icon if you’re using nerd-icons et al., and tell Consult what to do when (1) you preview the candidate and (2) when you select it. So the plan is this: The result looks like this: Selecting different backups automatically changes the opened diff on the right. I have no idea if I butchered , I tried a few things until it sort-of worked and had some help with the rest. You can find the source somewhere in the Bakemacs config files , look for . It could very well be that something like that already exists, but I haven’t found it so far. does something else. sounds good but requires you to navigate to the backup file yourself. The added advantage of mode is that you can revert the diff and re-apply specific hunks. The idea that I’ll never lose anything stupid I wrote will make me sleep better later tonight. Sublime Text’s persistent but unsaved changed file system and IntelliJ’s local history saved my ass more than once. The fact that I cobbled together a working thing using Consult makes this even more satisfying. Isn’t fooling around in Emacs the best thing ever? I hope these nerdy posts are not alienating too many faithful Brain Baking readers… Because, you know, the Lisp Alien mascot? No? Took it too far? Related topics: / emacs / By Wouter Groeneveld on 10 February 2026.  Reply via email . Keep multiple backup files : , , … Also backup even if it’s under version control Clean up older files: keep the oldest 2 and the last 10. Copy the file, don’t turn the existing one into a backup and save the buffer as the new file. For the current buffer, find all backup files. Easy: , substitute a few weird chars into !, read them from , done. (This very file has a backup called ) Sort and properly format a timestamp to show in the Consult minibuffer using . When previewed, with the current buffer into a new window on the right. When selected, make that diff window permanent. When cancelled with , cleanup the mess.

0 views

EDM: An Ultra-Low Latency Ethernet Fabric for Memory Disaggregation

EDM: An Ultra-Low Latency Ethernet Fabric for Memory Disaggregation Weigao Su and Vishal Shrivastav ASPLOS'25 This paper describes incremental changes to Ethernet NICs and switches to enable efficient disaggregation of memory without the need for a separate network ( e.g., CXL) for memory traffic. Fig. 1 shows the north star: Source: https://dl.acm.org/doi/10.1145/3669940.3707221 Servers are partitioned into Compute Nodes and Memory Nodes . When a compute node wants to access remote memory, it issues a request to its local NIC, which sends the request to the correct memory node (via a switch). The key problem this paper addresses is Ethernet fabric latency (i.e., the time taken for requests/responses to flow between NICs and switches). The paper assumes that the latency between the processor and the NIC is low (and cites other papers which describe techniques for reducing this latency to below 100ns). Typical Ethernet fabric latency is measured in microseconds, which is much higher than a local memory access. The Ethernet hardware stack can be decomposed into MAC and PHY layers. The MAC is higher level and sits on top of the PHY. The paper proposes implementing EDM (Ethernet Disaggregated Memory) with modifications to the PHY layer in both the NIC and the switch. Normal network packets flow through the MAC and PHY as they usually would, but a side channel exists which allows remote memory accesses to be handled directly by the enhanced PHY layer. Fig. 3 illustrates the hardware changes in Ethernet NICs and switches. Source: https://dl.acm.org/doi/10.1145/3669940.3707221 Remote memory access requests and responses are smaller than typical Ethernet packets. Additionally, end-to-end application performance is more sensitive to remote memory access latency than the latency of regular network traffic. The bulk of the paper describes how EDM achieves low latency for remote memory traffic. The EDM PHY modifications allow a memory request to preempt a non-memory packet. Say the MAC sends a 1KiB packet to the PHY, which begins to send the packet over the wire in 66-bit blocks. If a memory request shows up in the middle of transmitting the network packet, the PHY can sneak the memory request onto the wire between 66-bit blocks, rather than waiting for the whole 1KiB to be sent. Standard Ethernet requires 96 bits of zeros to be sent on the wire between each packet. This overhead is small for large packets, but it is non-trivial for small packets (like remote memory access requests). The EDM PHY modifications allow these idle bits to be used for remote memory accesses. The MAC still sees the gaps, but the PHY does not. If you ask an LLM what could possibly go wrong by trying to use the inter-frame gap to send useful data, it will spit out a long list. I can’t find too much detail in the paper about how to ensure that this enhancement is robust. The possible problems are limited to the PHY layer however, as the MAC still sees the zeros it expects. To avoid congestion and dropping of memory requests, EDM uses an in-network scheduling algorithm somewhat like PFC. The EDM scheduler is in the PHY layer of the switch. Senders notify the switch when they have memory traffic to send, and the switch responds later with a grant , allowing a certain amount of data to be sent. The authors implemented EDM on FPGAs (acting as both NIC and switch). Table 1 compares latencies for TCP/IP, RDMA, raw Ethernet packets, and EDM, breaking down latencies at each step: Source: https://dl.acm.org/doi/10.1145/3669940.3707221 Fig. 7 throws CXL into the mix: Source: https://dl.acm.org/doi/10.1145/3669940.3707221 Dangling Pointers Section 3.3 “Practical Concerns” has a discussion of what could go wrong ( e.g., fault tolerance and data corruption). It is hard to judge how much work is needed to make this into something that industry could rely on. Subscribe now

0 views

Package-Inferred Systems are Dangerous

Read on the website: Package-inferred systems follow a useful one-file-per-package convention structure. But package-inferred systems themselves are harmful and should not be used. rss.xml:z15n

0 views
Stratechery Yesterday

Amazon Earnings, CapEx Concerns, Commodity AI

Amazon's massive CapEx increase makes me much more nervous than Google's, but it is understandable.

0 views

Dorodango

I've realized that I have two primary ways that I'm building software with AI. The first is the one that Superpowers excels at. I'll spend a significant amount of time up front thinking through exactly what I want to build. Usually this is in conversation with the brainstorming skill. When I say "a significant amount of time," sometimes that's five minutes for a tiny little thing. And sometimes it's four-plus hours over the course of a day as we rigorously explore a problem space and what the solution looks like. The output of that is often an initial spec document that is many thousands of lines long and covers all sorts of details about the implementation. From there, I can ask Claude or Codex to write out an implementation plan. That implementation plan might run for anywhere between a few minutes and 7-8 hours. The end result is, ideally, a fully baked, usable implementation. When it's done, I ask it to prove to me that the implementation works. Typically that's by asking it to run through end-to-end test scenarios and to take screenshots, transcripts, or screen recordings of the work and to present them to me in a directory. Doing this with an orchestrator I've been working on last week, I woke up to find Codex telling me that it had successfully completed the project with a pointer to where on disk I could find the movie of all the screenshots it had taken. It was named something like "e2e-test-full-run-33.mp4" ..."run 33" I poked around a little bit. And indeed, there were artifacts from run 1 through run 32. Run 1 didn't even start. But as the agent worked through problems one-by-one, it managed to get further and further each time. And by run 33, it worked. Pretty cool. Sometimes things don't go as planned and the product that comes out the other end is really not what I wanted or needed. At that point, the right thing to do is usually to start over from the original specs (and possibly the wrong code) and restart the spec and design process. Then implement again from scratch. There are absolutely projects that I've run through this process five or six times as I figured out what I actually wanted or the right way to explain what I was going for. That's what often gets called 'fast waterfall' style development. Big up-front design and then a complete implementation with...no intermediate steps. Agents have made this process viable, sort of. And then there's the other modality. This is the one that Superpowers doesn't (currently) provide a ton of process support for. Often I'll have a feature request for a working product. Usually this is something small, like "oh, the panel should be on the left" or "let's change streaming mode output so that instead of chunking by token, it chunks by sentence." This is typically something that's a relatively small change that the agent can probably one-shot from a one or two-line prompt. The way I do it is usually by having the product open, looking at it, asking Claude to make the change, and looking at it again. It's basically a "polishing" workflow. Ideally, everything I'm changing should have been part of the original spec, but the changes are usually too small to make it worthwhile to run through a rebuild or a "serious" change cycle. As I was thinking about how to explain this flow, I was reminded of the Japanese art of Dorodango. Dorodango is, essentially, the process of polishing a ball of dirt into a beautiful, high-gloss sphere. The result is genuinely amazing. If you look at the Wikipedia article , it starts with this disambiguation statement: "Mud ball" redirects here. For the computer code style, see  Big Ball of Mud And there's something beautiful and...right about that. There's definitely a perception I've heard from folks who haven't spent a lot of time with the tools that the output of coding agents is always going to be a classical big ball of mud -- a horrible monstrosity with no clear architecture...just a jumbled mess of code that kind of somehow does the thing. It's not true , but that's what many folks think. So why not lean into it? I find myself engaging in software Dorodango pretty much every day. [Photo by Asturio Cantabrio - Own work, CC BY-SA 4.0](https://commons.wikimedia.org/w/index.php?curid=94863887]

0 views
xenodium Yesterday

Introducing winpulse

Hard to say officially, but I've been primarily using Emacs for roughly a couple of decades. Maybe my eyesight isn't what it used to be, or maybe I've just been wanting a stronger visual signal as I navigate through Emacs windows. Either way, today's the day I finally did something about it… I asked around to see if a package already existed for this purpose. Folks shared a handful of great options: I wanted my windows to temporarily flash when switching between them. Of these options, pulsar came closest, though highlighting the current line only. This is Emacs, so I should be able to get the behavior I want by throwing some elisp at the problem. With that, I give you winpulse , a package to temporarily highlight focused Emacs windows. This package is fresh out of the oven and likely has some edge cases I haven't yet considered. If you're still keen to check it out, it's available on GitHub . Enjoying this package or my content? I'm an indie dev. Consider sponsoring to help make it sustainable. pulsar: Emacs package to pulse the current line after running select functions. dimmer.el: Interactively highlight the active buffer by dimming the others. window-dim.el: A window dimmer package for Emacs.

0 views