<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/assets/css/rss.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>dbushell.com (notes)</title>
    <description>David Bushell’s Notes only feed</description>
    <link>https://dbushell.com/notes/</link>
    <lastBuildDate>Thu, 30 Apr 2026 06:29:00 GMT</lastBuildDate>
    <atom:link href="https://dbushell.com/rss.xml" rel="self" type="application/rss+xml"/>
    <author>David Bushell</author>
    <language>en-GB</language>
<item>
  <description>CSS has a safe keyword. Ion Prodan has a good demo: safe in flex and grid alignment. I keep forgetting this exists. Pray I remember next time. Other than horizontal scrolling, like a carousel with scroll snap which is not great design strategy, I see little use for it. Maybe a safe-guard against untested content changes. I feel like this should have been the default behaviour with unsafe being the keyword. Maybe not. I’ve thought about it for all of five minutes.</description>
  <link>https://dbushell.com/notes/2026-04-30T06:29Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-30T06:29Z/</guid>
  <pubDate>Thu, 30 Apr 2026 06:29:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>CSS has a <code>safe</code> keyword.</p><p>Ion Prodan has a good demo: <a href="https://iprodan.dev/l/safe-alignment/" rel="noopener noreferrer" target="_blank"><code>safe</code> in flex and grid alignment</a>.</p><p>I keep forgetting this exists. Pray I remember next time.</p><p>Other than horizontal scrolling, like a carousel with <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Scroll_snap" rel="noopener noreferrer" target="_blank">scroll snap</a> which is not great design strategy, I see little use for it. Maybe a safe-guard against untested content changes.</p><p>I feel like this should have been the default behaviour with <code>unsafe</code> being the keyword. Maybe not. I’ve thought about it for all of five minutes.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>“The Sloppelganger Just a normal, professional website, made of normal human website parts. Only the most capable and skilled of teams could have delivered such a neutral yet saccharine tone with such unnaturally high-fidelity imagery. You’re only leaving because the hairs on your neck are standing up for some other reason. Wicked Websites: A Rogues’ Gallery - Tyler Sticka”Brilliant.</description>
  <link>https://dbushell.com/notes/2026-04-29T18:21Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-29T18:21Z/</guid>
  <pubDate>Wed, 29 Apr 2026 18:21:00 GMT</pubDate>
  <content:encoded><![CDATA[<blockquote><p><strong>The Sloppelganger</strong></p><p>Just a normal, professional website, made of normal human website parts. Only the most capable and skilled of teams could have delivered such a neutral yet saccharine tone with such unnaturally high-fidelity imagery. You’re only leaving because the hairs on your neck are standing up for some other reason.</p><p><cite><a href="https://tylersticka.com/journal/wicked-websites-a-rogues-gallery/" rel="noopener noreferrer" target="_blank">Wicked Websites: A Rogues’ Gallery</a> - Tyler Sticka</cite></p></blockquote><p>Brilliant.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Is Warp the first ‘open slop’ project? “Today we are announcing a fundamental change in how we build Warp: the Warp client is now open-source, and the community can participate in building it using an agent-first workflow managed by Oz, our cloud agent orchestration platform. OpenAI is the founding sponsor of the new, open‑source Warp repository, and the new agentic management workflows are powered by GPT models. Warp is now open-source”Warp was a terminal that required an account — hard pass. Eventually they lifted the totally necessary cannot-work-without login requirement. At some point they pivoted to “AI” , naturally. Warp is now claiming to be “open source”. Despite being a “VC funded startup” and having OpenAI as a new “founding sponsor”, they “do not have the resources to compete on price or massively subsidize usage”. Warp are looking to pillage the communities free time and labour, but also: their tokens (“You’re free to use other coding agents as well to contribute”). This is open slop; an utterly bizarre insult to the spirit of open source. Of course, this is also going on over at Microsoft’s GitHub, which by their own admission is drowning in slop.</description>
  <link>https://dbushell.com/notes/2026-04-29T09:51Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-29T09:51Z/</guid>
  <pubDate>Wed, 29 Apr 2026 09:51:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>Is Warp the first ‘open slop’ project?</p><blockquote><p>Today we are announcing a fundamental change in how we build Warp: the Warp client is now open-source, and the community can participate in building it using an agent-first workflow managed by Oz, our cloud agent orchestration platform. OpenAI is the founding sponsor of the new, open‑source Warp repository, and the new agentic management workflows are powered by GPT models.</p><p><cite><a href="https://www.warp.dev/blog/warp-is-now-open-source" rel="noopener noreferrer" target="_blank">Warp is now open-source</a></cite></p></blockquote><p>Warp was a terminal that required an account — hard pass. Eventually they lifted the totally necessary cannot-work-without <a href="https://www.warp.dev/blog/lifting-login-requirement" rel="noopener noreferrer" target="_blank">login requirement</a>. At some point they pivoted to <glossary-term id="--term-ai"><a href="https://dbushell.com/ai/">“AI”</a></glossary-term>, naturally.</p><p>Warp is now claiming to be “open source”. Despite being a “VC funded startup” and having OpenAI as a new “founding sponsor”, they “do not have the resources to compete on price or massively subsidize usage”.</p><p>Warp are looking to pillage the communities free time and labour, but also: their tokens (“You’re free to use other coding agents as well to contribute”).</p><p>This is open slop; an utterly bizarre insult to the spirit of open source.</p><p>Of course, this is also going on over at <a href="https://dbushell.com/2026/04/29/github-is-sinking/">Microsoft’s GitHub</a>, which by <a href="https://github.blog/news-insights/company-news/an-update-on-github-availability/" rel="noopener noreferrer" target="_blank">their own admission</a> is drowning in slop.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>I’ve been listening to the Dungeon Crawler Carl audiobooks. The premise is fun and the story has its moments but I’d have given up if it wasn’t for the narrator Jeff Hays. I thought I was listening to a full cast until I learned that Hays does the female voices too. Audiobooks are my jam. Most narrators change their pitch slightly to differentiate characters. Even a subtle change is remarkably effective if the source material is good. Hays’ Princess Donut is another level.</description>
  <link>https://dbushell.com/notes/2026-04-27T18:39Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-27T18:39Z/</guid>
  <pubDate>Mon, 27 Apr 2026 18:39:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>I’ve been listening to the <a href="https://en.wikipedia.org/wiki/Dungeon_Crawler_Carl" rel="noopener noreferrer" target="_blank">Dungeon Crawler Carl</a> audiobooks. The premise is fun and the story has its moments but I’d have given up if it wasn’t for the narrator Jeff Hays. I thought I was listening to a full cast until I learned that Hays does the female voices too. <a href="https://dbushell.com/notes/2024-10-04T08:41Z/">Audiobooks are my jam.</a> Most narrators change their pitch slightly to differentiate characters. Even a subtle change is remarkably effective if the source material is good. Hays’ Princess Donut is another level.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>replacements.fyi is a neat website that gives alternatives to 687 obsolete NPM packages. Crucially, it suggests modern JavaScript APIs and simple educational tips like how to check if a number is odd. This is from the Ecosystem Performance project that aims to clean up the packaging mess.</description>
  <link>https://dbushell.com/notes/2026-04-27T15:56Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-27T15:56Z/</guid>
  <pubDate>Mon, 27 Apr 2026 15:56:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><a href="https://replacements.fyi/" rel="noopener noreferrer" target="_blank">replacements.fyi</a> is a neat website that gives alternatives to 687 obsolete NPM packages. Crucially, it suggests modern JavaScript APIs and simple educational tips like how to <a href="https://replacements.fyi/is-odd" rel="noopener noreferrer" target="_blank">check if a number is odd</a>. This is from the <a href="https://e18e.dev/" rel="noopener noreferrer" target="_blank">Ecosystem Performance</a> project that aims to clean up the packaging mess.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Folding Ideas on YouTube has a fascinating two-part series: Why was I invited to Beast Studios? Beast Games 2 Strong/Smart: an Exhaustive Review I watch very little YouTube. I loath the algorithm game YouTubers feel like they must play. Content stretched thin presented with a thumbnail like a gurning baboon. The idea of a YouTuber commenting on another YouTuber does not sound appealing. Dan Olson’s series was weirdly engrossing though. The only thing I knew about “Mr Beast” before came from researching the comically overpriced chocolate bars that appeared in my local supermarket. They went on sale for a 3rd of the price and still struggled to sell. It’s quite incredible how all the Beast Game challenges failed spectacularly. You’d think they would have accidentally got one idea to work as planned.</description>
  <link>https://dbushell.com/notes/2026-04-26T11:16Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-26T11:16Z/</guid>
  <pubDate>Sun, 26 Apr 2026 11:16:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><em>Folding Ideas</em> on YouTube has a fascinating two-part series:</p><ol><li><a href="https://www.youtube.com/watch?v=0dwagg5wYY4" rel="noopener noreferrer" target="_blank">Why was I invited to Beast Studios?</a></li><li><a href="https://www.youtube.com/watch?v=2ubYGdMCQTA" rel="noopener noreferrer" target="_blank">Beast Games 2 Strong/Smart: an Exhaustive Review</a></li></ol><p>I watch very little YouTube. I loath the algorithm game YouTubers feel like they must play. Content stretched thin presented with a thumbnail like a gurning baboon. The idea of a YouTuber commenting on another YouTuber does not sound appealing. Dan Olson’s series was weirdly engrossing though.</p><p>The only thing I knew about “Mr Beast” before came from researching the comically overpriced chocolate bars that appeared in my local supermarket. They went on sale for a 3rd of the price and still struggled to sell.</p><p>It’s quite incredible how all the Beast Game challenges failed spectacularly. You’d think they would have accidentally got one idea to work as planned.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Tante’s piece on techno-fascism topped the usual charts last week and the tech bros were in denial. Few want to acknowledge the harm their new toy is doing. Certainly not the source. It becomes harder to ignore reality when experiences like Ky Decker’s are shared. “You join a meeting with a coworker. Your coworker has enabled an AI tool to automatically take notes and summarize the meeting. They do not ask for consent to turn it on. The tool mischaracterizes what you discuss. Do I belong in tech anymore? - Ky Decker”Ky’s post is a depressingly common story. But most who share this experience are silenced. They can’t speak up lest they be harassed and/or fired. The can’t afford to quit. What can they do, other than wait it out? Protect your mental health; rediscover your passion. I have no meaningful advice but I am in a position to speak out. AI is not “just a tool” and I’m getting really sick of those in denial. Time for another big blog rant?</description>
  <link>https://dbushell.com/notes/2026-04-25T06:26Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-25T06:26Z/</guid>
  <pubDate>Sat, 25 Apr 2026 06:26:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><a href="https://tante.cc/2026/04/21/ai-as-a-fascist-artifact/" rel="noopener noreferrer" target="_blank">Tante’s piece on techno-fascism</a> topped the usual charts last week and the tech bros were in denial. Few want to acknowledge <a href="https://dbushell.com/ai/#morals-and-ethics">the harm</a> their new toy is doing. Certainly not the source. It becomes harder to ignore reality when experiences like Ky Decker’s are shared.</p><blockquote><p>You join a meeting with a coworker. Your coworker has enabled an AI tool to automatically take notes and summarize the meeting. They do not ask for consent to turn it on. The tool mischaracterizes what you discuss.</p><p><cite><a href="https://ky.fyi/posts/ai-burnout" rel="noopener noreferrer" target="_blank">Do I belong in tech anymore?</a> - Ky Decker</cite></p></blockquote><p>Ky’s post is a depressingly <a href="https://dbushell.com/notes/2026-03-26T19:02Z/">common story</a>. But most who share this experience are silenced. They can’t speak up lest they be harassed and/or fired. The can’t afford to quit. What can they do, other than <a href="https://bell.bz/wait-it-out/" rel="noopener noreferrer" target="_blank">wait it out?</a> Protect your mental health; <a href="https://whitep4nth3r.com/blog/new-electronica-music-manchester-uk/" rel="noopener noreferrer" target="_blank">rediscover your passion.</a></p><p>I have no meaningful advice but I am in a position to speak out. AI is not “just a tool” and I’m getting <em>really</em> sick of those in denial. Time for another big blog rant?</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Today was day one learning the Godot game engine. I decided I should build a game in my spare time (and full time, if I need to wait for the slopocalypse fallout to blow over.) Godot is a little overwhelming to start but that’s to be expected. Once I focused on simple tasks I found myself learning. My experiments in HTML canvas were fun but I don’t want to write an engine from scratch. I’ve learnt today there are many ways to do things in Godot. Just because a tutorial does it one way, doesn’t mean that is correct for all games. I need to learn the smaller systems so that I can understand how to architecture my projects. I’m not keen on the Python-like GDScript but it’s not a blocker.</description>
  <link>https://dbushell.com/notes/2026-04-24T16:32Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-24T16:32Z/</guid>
  <pubDate>Fri, 24 Apr 2026 16:32:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>Today was day one learning the <a href="https://godotengine.org/" rel="noopener noreferrer" target="_blank">Godot game engine</a>. I decided <a href="https://dbushell.com/2026/03/22/game-developer/">I should build a game</a> in my spare time (and full time, if I need to wait for the slopocalypse fallout to blow over.)</p><p>Godot is a little overwhelming to start but that’s to be expected. Once I focused on simple tasks I found myself learning. My experiments in <a href="https://patchwork.dbushell.com/games/" rel="noopener noreferrer" target="_blank">HTML canvas</a> were fun but I don’t want to write an engine from scratch.</p><p>I’ve learnt today there are many ways to do things in Godot. Just because a tutorial does it one way, doesn’t mean that is correct for all games. I need to learn the smaller systems so that I can understand how to architecture my projects.</p><p>I’m not keen on the Python-like <a href="https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/index.html" rel="noopener noreferrer" target="_blank">GDScript</a> but it’s not a blocker.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>I’ve had my head down these last two weeks. Long shifts in the WordPress mines. WordPress is still “yikes” for bespoke development. I’m tempted to write a follow-up but not much has changed. Pro tip: disable anything Automattic has added in the last five years. Cherry-pick Terence Eden’s big list for more debloating. Use the Classic Editor plugin. Use ACF plugin — minor enshittification since the Delicious Brains acquisition but they still honour my “lifetime” and “unlimited” license so I’m reluctant to complain. Often I’ll hide the editor entirely and use flexible content and CSS subgrid to create what is effectively a block-based page builder. Each block is a PHP template; nothing fancy. It allows for easy development and maintenance. The editing UX is a vast improvement over Gutenberg — client feedback, not my vibes. Should I blog about this? Not sure if anyone cares. There’s a neat trick to dump HTML into the now hidden post_content (for RSS, search, etc). People are quick to suggest WordPress forks. Forks are an impossible sell to my clients. It would probably be irresponsible of me to recommended a fork. Do they have the same security scrutiny? The same plugin compatibility? Will they remain maintained? Shrug, nobody can answer; not an option. Why use WordPress at all? It’s never my choice so I can’t answer that. It works perfectly fine (and it’s work that pays). WordPress remains better than the JavaScript SaaS house of cards people call web development these days. Edit: “Building Modular Themes with ACF Flexible Content Instead of Buggy Builder Frameworks” by Amber Weinberg is almost exactly how I do it (but Amber does it better.)</description>
  <link>https://dbushell.com/notes/2026-04-23T06:04Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-23T06:04Z/</guid>
  <pubDate>Thu, 23 Apr 2026 06:04:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>I’ve had my head down these last two weeks. Long shifts in the WordPress mines.</p><p><a href="https://dbushell.com/2024/05/07/modern-wordpress-themes-yikes/">WordPress is still “yikes”</a> for bespoke development. I’m tempted to write a follow-up but not much has changed. Pro tip: disable anything <em>Automattic</em> has added in the <a href="https://dbushell.com/2021/08/03/wordpress-has-a-gutenberg-problem/">last five years</a>. Cherry-pick <a href="https://shkspr.mobi/blog/2025/11/a-big-list-of-things-i-disable-in-wordpress/" rel="noopener noreferrer" target="_blank">Terence Eden’s big list</a> for more debloating. Use the <a href="https://wordpress.org/plugins/classic-editor/" rel="noopener noreferrer" target="_blank">Classic Editor</a> plugin. Use <a href="https://www.advancedcustomfields.com/" rel="noopener noreferrer" target="_blank">ACF</a> plugin — minor enshittification since the <em>Delicious Brains</em> acquisition but they still honour my “lifetime” and “unlimited” license so I’m reluctant to complain.</p><p>Often I’ll hide the editor entirely and use <a href="https://www.advancedcustomfields.com/resources/flexible-content/" rel="noopener noreferrer" target="_blank">flexible content</a> and <a href="https://dbushell.com/2026/04/02/css-subgrid-is-super-good/">CSS subgrid</a> to create what is effectively a block-based page builder. Each block is a PHP template; nothing fancy. It allows for easy development and maintenance. The editing UX is a vast improvement over Gutenberg — client feedback, not my vibes. Should I blog about this? Not sure if anyone cares. There’s a neat trick to dump HTML into the now hidden <code>post_content</code> (for RSS, search, etc).</p><p>People are quick to suggest WordPress forks. Forks are an impossible sell to my clients. It would probably be irresponsible of me to recommended a fork. Do they have the same security scrutiny? The same plugin compatibility? Will they remain maintained? Shrug, nobody can answer; not an option.</p><p>Why use WordPress at all? It’s never my choice so I can’t answer that. It works perfectly fine (and it’s work that pays). WordPress remains better than the JavaScript SaaS house of cards people call web development these days.</p><p><strong>Edit:</strong> <a href="https://amberweinberg.com/building-modular-themes-with-acf-flexible-content-instead-of-buggy-builder-frameworks/" rel="noopener noreferrer" target="_blank">“Building Modular Themes with ACF Flexible Content Instead of Buggy Builder Frameworks”</a> by Amber Weinberg is almost exactly how I do it (but Amber does it better.)</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Atlassian software is where user experience goes to die. Microsoft aspires to reach the soul destroying level of misery that is Atlassian. I was especially fond of the two-factor roulette game in which I had to guess which one of my “merged” accounts it was expecting. I am finally free 🥹 Atlassian’s latest “we care about privacy” update suggests they’re now feeding it all into the giant plagiarism machine. I’m probably too late but whatever. Long overdue. I’ve had a few clients that used Bitbucket before. I’ll create a burner account per-project if I need to in future (after a diligent warning). Maybe one day I’ll be able to permanently delete GitHub for business work.</description>
  <link>https://dbushell.com/notes/2026-04-17T09:03Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-17T09:03Z/</guid>
  <pubDate>Fri, 17 Apr 2026 09:03:00 GMT</pubDate>
  <content:encoded><![CDATA[<figure class="Image"><img src="https://dbushell.com/images/blog/2026/atlassian-delete.avif" alt="Atlassian - We&#39;ll permanently delete your account" width="436" height="149" decoding="async" fetchpriority="low" loading="lazy" id="--img-ea488e55"/></figure><p>Atlassian software is where user experience goes to die. Microsoft aspires to reach the soul destroying level of misery that is Atlassian. I was especially fond of the two-factor roulette game in which I had to guess which one of my “merged” accounts it was expecting.</p><p>I am finally free 🥹</p><p>Atlassian’s latest <a href="https://bsky.app/profile/did:plc:lmo2olrecqifwxxycczbipmf/post/3mjodmhu7ns2f" rel="noopener noreferrer" target="_blank">“we care about privacy”</a> update suggests they’re now feeding it all into the giant plagiarism machine.</p><p>I’m probably too late but whatever. Long overdue.</p><p>I’ve had a few clients that used Bitbucket before. I’ll create a burner account per-project if I need to in future (after a diligent warning).</p><p>Maybe one day I’ll be able to permanently delete <a href="https://dbushell.com/2026/04/29/github-is-sinking/">GitHub</a> for business work.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Sara Joy asked: “How often have you seen elaborate mid-sentence CSS flex and gap or padding styling within React apps, when all that’s missing is what I’m calling a “React space”: {&#39; &#39;} ? Bluesky @sjoy.lol - Sara Joy” The “React space” is not unique to React I’ve seen it appear in my beloved Svelte before. For those who are lucky (sensible) enough to build websites for the web, and not abstractions in spite of the web, the concept might seem alien. Basically between the frameworks, their formatting tools, and div soup (aka divitis)†, the HTML rendered is not always the HTML desired. The HTML spec also has interesting rules around collapsing whitespace. All this means you might end up with text in elements butting together where a space is required. The React space {&#39; &#39;} is the correct solution, but as Sara Joy notes, developers don’t understand and try to use CSS to fix spacing. The space is just template syntax to force a literal string that React will respect. In Svelte I’ve had success by liberally using new lines between elements to avoid the issue. The React space is a minor example of the arcane knowledge and cost you pay when you buy into a dev stack . Learn the costs! To answer Sara’s question, I’ve seen it once (I used flex gap myself!) † React divitis has never been necessary and could be considered a “skill issue” but after all these years you start to wonder, maybe the tool is the problem?</description>
  <link>https://dbushell.com/notes/2026-04-16T07:30Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-16T07:30Z/</guid>
  <pubDate>Thu, 16 Apr 2026 07:30:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><a href="https://sarajoy.dev/" rel="noopener noreferrer" target="_blank">Sara Joy</a> asked:</p><blockquote><p>How often have you seen elaborate mid-sentence CSS flex and gap or padding styling within React apps, when all that’s missing is what I’m calling a “React space”: <code>{&#39; &#39;}</code> ?</p><p><cite><a href="https://bsky.app/profile/sjoy.lol/post/3mjekvgwem224" rel="noopener noreferrer" target="_blank">Bluesky @sjoy.lol</a> - Sara Joy</cite></p></blockquote><figure class="Image"><img src="https://dbushell.com/images/blog/2026/obiwan-ofcourse.avif" alt="Obi-Wan Kenobi says, &#39;Well, of course I know him. He&#39;s me.&#39;" width="600" height="338" decoding="async" fetchpriority="low" loading="lazy" id="--img-ab56dcc0"/></figure><p>The “React space” is not unique to <glossary-term id="--term-react"><a href="https://jsx.lol/" rel="noopener noreferrer" target="_blank">React</a></glossary-term> I’ve seen it appear in my beloved <glossary-term id="--term-svelte"><a href="https://svelte.dev/" rel="noopener noreferrer" target="_blank">Svelte</a></glossary-term> before. For those who are lucky (sensible) enough to build websites for the web, and not <a href="https://dbushell.com/2026/04/10/no-stack-web-development/">abstractions in spite of the web</a>, the concept might seem alien. Basically between the frameworks, their formatting tools, and <code>div</code> soup (aka <em>divitis</em>)<sup>†</sup>, the HTML rendered is not always the HTML desired. The HTML spec also has interesting rules around collapsing whitespace.</p><p>All this means you might end up with text in elements butting together where a space is required. The React space <code>{&#39; &#39;}</code> is the correct solution, but as Sara Joy notes, developers don’t understand and try to use CSS to fix spacing. The space is just template syntax to force a literal string that React will respect. In Svelte I’ve had success by liberally using new lines between elements to avoid the issue.</p><p>The React space is a minor example of the arcane knowledge and cost you pay when you buy into a <glossary-term id="--term-development-stack"><a href="https://dbushell.com/2026/04/10/no-stack-web-development/" rel="noopener noreferrer" target="_blank">dev stack</a></glossary-term>. Learn the costs!</p><p>To answer Sara’s question, I’ve seen it once (I used flex gap myself!)</p><p><small><sup>†</sup> React divitis has never been necessary and could be considered a “skill issue” but after all these years you start to wonder, maybe the tool is the problem?</small></p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Zig v0.16 update adds “Juicy Main” which provides appropriate defaults for a general purpose memory allocator, an arena allocator, and the new io interface. IO as an interface unlocks async/await patterns in Zig. Async is not concurrency but it does make concurrency with threads easier to code. I haven’t used Zig since the last Advent of Code challenge. Juicy main is perfect to reduce a bit of boilerplate for small projects. Very tempted to jump back in now the big IO update has shipped.</description>
  <link>https://dbushell.com/notes/2026-04-15T11:09Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-15T11:09Z/</guid>
  <pubDate>Wed, 15 Apr 2026 11:09:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><glossary-term id="--term-zig"><a href="https://ziglang.org/" rel="noopener noreferrer" target="_blank">Zig v0.16</a></glossary-term> update adds <a href="https://ziglang.org/download/0.16.0/release-notes.html#Juicy-Main" rel="noopener noreferrer" target="_blank">“Juicy Main”</a> which provides appropriate defaults for a general purpose memory allocator, an arena allocator, and the new <code>io</code> interface. <a href="https://ziglang.org/download/0.16.0/release-notes.html#IO-as-an-Interface" rel="noopener noreferrer" target="_blank">IO as an interface</a> unlocks async/await patterns in Zig. Async is not concurrency but it does make <a href="https://dbushell.com/2025/04/23/zig-smart-lights/#zig-multi-threading">concurrency with threads</a> easier to code.</p><p>I haven’t used Zig since the last <a href="https://dbushell.com/2025/12/12/advent-of-code-2025/#zig">Advent of Code</a> challenge. Juicy main is perfect to reduce a bit of boilerplate for small projects. Very tempted to jump back in now the big IO update has shipped.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Jim Nielsen has an astute observation on skill issues. This human-centred UX lesson applies beyond AI, but as to Jim holding it wrong, I’d add a third explantation. “My inability to find the results others claim with AI often has me saying either 1) “these claims are obviously BS”, or 2) “I guess it’s a skill issue on my part”. That’s a Skill Issue - Jim Nielsen”These two points may be true but they don’t adequately explain why Jim can’t get the magic lamp to sing. I’d add a third point: 3) Jim has taste and standards and cares about quality. Once you realise that a ‘successful’ prompt wizard has a different definition of ‘success’ it all starts to make sense. Jim’s problem is that he’s reviewing the output. Bro, you’re not supposed to look! It’s only a skill issue if the issue is observed. Schrödinger’s skill issue, if you will. Just morge and move on. Only address the issue once it’s observed by a human! That’s what makes it human-centred design.</description>
  <link>https://dbushell.com/notes/2026-04-13T05:35Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-13T05:35Z/</guid>
  <pubDate>Mon, 13 Apr 2026 05:35:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>Jim Nielsen has an <a href="https://blog.jim-nielsen.com/2026/skill-issue/" rel="noopener noreferrer" target="_blank">astute observation on skill issues</a>. This human-centred UX lesson applies beyond AI, but as to Jim holding it wrong, I’d add a third explantation.</p><blockquote><p>My inability to find the results others claim with AI often has me saying either 1) “these claims are obviously BS”, or 2) “I guess it’s a skill issue on my part”.</p><p><cite><a href="https://blog.jim-nielsen.com/2026/skill-issue/#:~:text=My%20inability%20to%20find%20the%20results" rel="noopener noreferrer" target="_blank">That’s a Skill Issue</a> - Jim Nielsen</cite></p></blockquote><p>These two points may be true but they don’t adequately explain why Jim can’t get the magic lamp to sing. I’d add a third point:</p><p>3) Jim has taste and standards and cares about quality.</p><p>Once you realise that a ‘successful’ prompt wizard has a different definition of ‘success’ it all starts to make sense. Jim’s problem is that he’s reviewing the output. Bro, you’re not supposed to look!</p><figure class="Image"><img src="https://dbushell.com/images/blog/2026/leo-lgtm.avif" alt="Leonardo DiCaprio smuggly laughing, from Django Unchained, captioned LGTM" width="375" height="375" decoding="async" fetchpriority="low" loading="lazy" id="--img-47099e4e"/></figure><p>It’s only a skill issue if the issue is <strong>observed</strong>. Schrödinger’s skill issue, if you will. Just <a href="https://dbushell.com/notes/2026-02-16T19:35Z/">morge</a> and move on. Only address the issue once it’s observed by a human! That’s what makes it <em>human</em>-centred design.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Vibecusation - noun - an accusation that a human has presented AI generated work as their own, without explicitly disclosing the work is slop. Typically done with scorn and asserted without evidence. Found on social media and comment sections. I don’t like vibecusations. I’ve done it before and I feel ashamed. ⚠️ This is merely a collection or thoughts on the subject. Some were given more brain power than others. My AI policy covers my actual stance on AI. How can society function when vibecusations without evidence are presented as fact? If wrong a vibecusation is just like any other libel; unfair, damaging, violating. It doesn’t matter how much I loath slop, unless there is clear evidence I try to remain very cautious of making a vibecusation. It can be tempting and restraint is necessary. If I have my suspicions, or I’m familiar with the author and their dirty habits, I will avoid sharing or boosting their work. That too is unfortunate if I’m wrong, but less so than vibecusing them publicly. If I’m right, others will have suspected the same. Let the court of public opinion play out silently. I’ve seen people use “AI vetting” tools which claim to detect AI. They don’t work. Pass these tools a web page written ten years ago and they’ll happily flag a false positive. Many of these tools are openly vibe-coded by yet another dot-ai company in on the grift. It sucks that the AI industry is eroding trust in humanity. It sucks even more how many of my peers are gleefully drinking the Kool-Aid. The best AI detection tool is still an educated human mind. I say “best” I don’t say “flawless”. The human mind is massively flawed for such a task. Wikipedia has a decent article on Signs of AI writing but matching those signs does not guarantee something is slop. Does slop fall into the “I know it when I see it” category? Not sure, that suggests a degree of subjectivity. Either something is AI generated, or it isn’t? AI bros love to play the “what do you mean by ‘AI’?” game. What about AI-tainted or AI-augmented work? i.e. work that started or ended with human edits. Personally to me that is still slop; I have lost all interest. As soon as it’s touched by AI the author stopped caring and so did I. There is no five-second rule for slop to be palatable. “But what if you never notice?”, I can hear retorted. Well done, you’ve tricked me into buying stolen goods and supporting an unethical industry. It doesn’t matter how well your chat box plays the imitation game, that is not a gotcha. If you see a vibecusation in the wild ask for evidence. Make sure the doubts are contextualised so that others can come to their own conclusion. If you use AI to generate work it is very rude not to disclose it.</description>
  <link>https://dbushell.com/notes/2026-04-09T05:29Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-09T05:29Z/</guid>
  <pubDate>Thu, 09 Apr 2026 05:29:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><strong>Vibecusation</strong> - <em>noun</em> - an accusation that a human has presented AI generated work as their own, without explicitly disclosing the work is slop. Typically done with scorn and asserted without evidence. Found on social media and comment sections.</p><figure class="Image"><img src="https://dbushell.com/images/blog/2026/james-doakes.avif" alt="James Doakes, played by actor Erik King, looking ahead suspiciously whist sat at a dimly lit bar. From Dexter TV show." width="640" height="400" decoding="async" fetchpriority="low" loading="lazy" id="--img-cfebea3b"/><figcaption>When you know it’s slop, but you can’t prove it.</figcaption></figure><p>I don’t like <em>vibecusations</em>. I’ve done it before and I feel ashamed.</p><div class="Alert"><p>⚠️ This is merely a collection or thoughts on the subject. Some were given more brain power than others. My <a href="https://dbushell.com/ai/">AI policy</a> covers my actual stance on AI.</p></div><p>How can society function when vibecusations without evidence are presented as fact?</p><p>If wrong a vibecusation is just like any other libel; unfair, damaging, violating.</p><p>It doesn’t matter how much I loath slop, unless there is clear evidence I try to remain very cautious of making a vibecusation. It can be tempting and restraint is necessary.</p><p>If I have my suspicions, or I’m familiar with the author and their dirty habits, I will avoid sharing or boosting their work. That too is unfortunate if I’m wrong, but less so than vibecusing them publicly. If I’m right, others will have suspected the same. Let the court of public opinion play out silently.</p><p>I’ve seen people use “AI vetting” tools which claim to detect AI. They don’t work. Pass these tools a web page written ten years ago and they’ll happily flag a false positive. Many of these tools are openly vibe-coded by yet another dot-ai company in on the grift.</p><p>It sucks that the AI industry is eroding trust in humanity.</p><p>It sucks even more how many of my peers are gleefully drinking the Kool-Aid.</p><p>The best AI detection tool is still an educated human mind. I say “best” I don’t say “flawless”. The human mind is massively flawed for such a task.</p><p>Wikipedia has a decent article on <a href="https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing" rel="noopener noreferrer" target="_blank">Signs of AI writing</a> but matching those signs does not guarantee something is slop.</p><p>Does slop fall into the <a href="https://en.wikipedia.org/wiki/I_know_it_when_I_see_it" rel="noopener noreferrer" target="_blank">“I know it when I see it”</a> category? Not sure, that suggests a degree of subjectivity. Either something is AI generated, or it isn’t?</p><p>AI bros love to play the “what do you mean by ‘AI’?” game.</p><p>What about AI-tainted or AI-augmented work? i.e. work that started or ended with human edits. Personally to me that is still slop; I have lost all interest. As soon as it’s touched by AI the author stopped caring <a href="https://dbushell.com/2026/04/01/i-quit-the-clankers-won/">and so did I</a>. There is no <a href="https://en.wikipedia.org/wiki/Five-second_rule" rel="noopener noreferrer" target="_blank">five-second rule</a> for slop to be palatable.</p><p><em>“But what if you never notice?”</em>, I can hear retorted. Well done, you’ve tricked me into buying stolen goods and supporting an <a href="https://dbushell.com/ai/#morals-and-ethics">unethical industry</a>. It doesn’t matter how well your chat box plays the imitation game, that is not a gotcha.</p><p>If you see a vibecusation in the wild ask for evidence. Make sure the doubts are contextualised so that others can come to their own conclusion.</p><p>If you use AI to generate work it is very rude not to disclose it.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>Morning coffee read: Under the hood of MDN’s new frontend. Big fan of this code snippet: MDN are using a similar conditional import technique to the one I stumbled upon. The difference is that I lazy load based on a specific list that I must maintain. MDN simply check the name of every DOM element. Genius! This loop shouldn’t have performance issues. If the DOM is too big the website render will chug anyway. Instead of * would a :not(:defined) selector work? Is the selector engine any faster than a simple prefix test? This might even be slower if it has to check the element registry for every element. Theoretical micro-optimisations are the enemy!</description>
  <link>https://dbushell.com/notes/2026-04-08T05:58Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-08T05:58Z/</guid>
  <pubDate>Wed, 08 Apr 2026 05:58:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>Morning coffee read: <a href="https://developer.mozilla.org/en-US/blog/mdn-front-end-deep-dive/#web_components" rel="noopener noreferrer" target="_blank">Under the hood of MDN’s new frontend</a>.</p><p>Big fan of this code snippet:</p><pre data-lang="javascript" tabindex="0" id="pre-cb05ea65"><code><span class="line"><span class="syntax-1656d967">for</span><span class="space"> </span><span class="syntax-26f6a8db">(</span><span class="syntax-1656d967">const</span><span class="space"> </span><span class="syntax-26f6a8db">element</span><span class="space"> </span><span class="syntax-1656d967">of</span><span class="space"> </span><span class="syntax-26f6a8db">document.</span><span class="syntax-c01639ae">querySelectorAll</span><span class="syntax-26f6a8db">(</span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">*</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">))</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">const</span><span class="space"> </span><span class="syntax-26f6a8db">tag</span><span class="space"> </span><span class="syntax-1656d967">=</span><span class="space"> </span><span class="syntax-26f6a8db">element.tagName.</span><span class="syntax-c01639ae">toLowerCase</span><span class="syntax-26f6a8db">();</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">if</span><span class="space"> </span><span class="syntax-26f6a8db">(tag.</span><span class="syntax-c01639ae">startsWith</span><span class="syntax-26f6a8db">(</span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">mdn-</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">))</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">const</span><span class="space"> </span><span class="syntax-26f6a8db">component</span><span class="space"> </span><span class="syntax-1656d967">=</span><span class="space"> </span><span class="syntax-26f6a8db">tag.</span><span class="syntax-c01639ae">replace</span><span class="syntax-26f6a8db">(</span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">mdn-</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">,</span><span class="space"> </span><span class="syntax-6168685d">""</span><span class="syntax-26f6a8db">);</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">import</span><span class="syntax-26f6a8db">(</span><span class="syntax-e661ac3e">`../components/</span><span class="syntax-1656d967">${</span><span class="syntax-26f6a8db">component</span><span class="syntax-1656d967">}</span><span class="syntax-e661ac3e">/element.js`</span><span class="syntax-26f6a8db">);</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-26f6a8db">}</span></span>
<span class="line"><span class="syntax-26f6a8db">}</span></span></code></pre><p>MDN are using a similar <a href="https://dbushell.com/2025/08/01/anatomy-of-a-web-component/#:~:text=import%20elements%20dynamically">conditional import technique</a> to the one I stumbled upon.</p><pre data-lang="javascript" tabindex="0" id="pre-e4ffa187"><code><span class="line"><span class="syntax-1656d967">const</span><span class="space"> </span><span class="syntax-26f6a8db">elements</span><span class="space"> </span><span class="syntax-1656d967">=</span><span class="space"> </span><span class="syntax-26f6a8db">[</span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">component-one</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">,</span><span class="space"> </span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">component-two</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">,</span><span class="space"> </span><span class="syntax-6168685d">"</span><span class="syntax-e661ac3e">component-three</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">];</span></span>
<span class="line"><span class="syntax-1656d967">for</span><span class="space"> </span><span class="syntax-26f6a8db">(</span><span class="syntax-1656d967">const</span><span class="space"> </span><span class="syntax-26f6a8db">name</span><span class="space"> </span><span class="syntax-1656d967">of</span><span class="space"> </span><span class="syntax-26f6a8db">elements)</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">if</span><span class="space"> </span><span class="syntax-26f6a8db">(document.</span><span class="syntax-c01639ae">querySelector</span><span class="syntax-26f6a8db">(name))</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">import</span><span class="syntax-26f6a8db">(</span><span class="syntax-e661ac3e">`/elements/</span><span class="syntax-1656d967">${</span><span class="syntax-26f6a8db">name</span><span class="syntax-1656d967">}</span><span class="syntax-e661ac3e">.js`</span><span class="syntax-26f6a8db">);</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-26f6a8db">}</span></span>
<span class="line"><span class="syntax-26f6a8db">}</span></span></code></pre><p>The difference is that I lazy load based on a specific list that I must maintain. MDN simply check the name of every DOM element. Genius! This loop shouldn’t have performance issues. If the DOM is too big the website render will chug anyway.</p><p>Instead of <code>*</code> would a <code>:not(:defined)</code> selector work? Is the selector engine any faster than a simple prefix test? This might even be slower if it has to <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:defined" rel="noopener noreferrer" target="_blank">check the element registry</a> for every element. Theoretical micro-optimisations are the enemy!</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>We’re seeing a sharp rise in Big Tech and unscrupulous VC-funded grifters piggybacking the good name of open source. These parasites love their buzzwords and doublespeak. Look out for red flags like: “Developer experience” “Unified toolchain” “Production grade” “Privacy-preserving” “Democratising” “Disrupting” These terms are strong signs of snake oil. Not everything is malicious but be cautious. Be sure you’re in control of the tool, not becoming the tool. The freedom to build for an open web is not a guarantee. If you sacrifice that power for perceived convenience sold by gate keepers, you soon won’t have a choice.</description>
  <link>https://dbushell.com/notes/2026-04-07T05:48Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-07T05:48Z/</guid>
  <pubDate>Tue, 07 Apr 2026 05:48:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>We’re seeing a sharp rise in <em>Big Tech</em> and unscrupulous VC-funded grifters piggybacking the good name of open source. These parasites love their buzzwords and doublespeak. Look out for red flags like:</p><ul><li>“Developer experience”</li><li>“Unified toolchain”</li><li>“Production grade”</li><li>“Privacy-preserving”</li><li>“Democratising”</li><li>“Disrupting”</li></ul><p>These terms are strong signs of snake oil. Not everything is malicious but be cautious. Be sure you’re in control of the tool, not becoming the tool. The freedom to build for an open web is not a guarantee. If you sacrifice that power for perceived convenience sold by gate keepers, you soon won’t have a choice.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>WordPress and its plugins are notorious for some of the gnarliest CSS selectors and specificity wars you’ll see this side of the galaxy. WP Grid Builder is a prime example. Excellent functionality. It even provides a no-code design interface. But for a bespoke professional theme it’s painfully difficult to style. This filter can help in functions.php: This replaces the plugin specific &lt;link rel=&quot;stylesheet&quot;&gt; with an inline &lt;style&gt; element using the @import statement. The key detail is layer(base) which effectively wraps the entire stylesheet in a cascade layer. In my theme stylesheet I define cascade layers at the top. Now I can write my own styles in a higher layer to override the plugin. I haven’t removed the plugin styles but they have zero specificity. This is much easier to deal with. I can go to bed without crying.</description>
  <link>https://dbushell.com/notes/2026-04-01T13:51Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-04-01T13:51Z/</guid>
  <pubDate>Wed, 01 Apr 2026 13:51:00 GMT</pubDate>
  <content:encoded><![CDATA[<p>WordPress and its plugins are notorious for some of the gnarliest CSS selectors and specificity wars you’ll see this side of the galaxy.</p><p><a href="https://wpgridbuilder.com/" rel="noopener noreferrer" target="_blank">WP Grid Builder</a> is a prime example. Excellent functionality. It even provides a no-code design interface. But for a bespoke professional theme it’s painfully difficult to style.</p><p>This filter can help in <a href="https://developer.wordpress.org/themes/core-concepts/custom-functionality/" rel="noopener noreferrer" target="_blank"><code>functions.php</code></a>:</p><pre data-lang="php" tabindex="0" id="pre-fc2d48d2"><code><span class="line"><span class="syntax-c01639ae">add_filter</span><span class="syntax-26f6a8db">(</span><span class="syntax-6168685d">'</span><span class="syntax-e661ac3e">style_loader_tag</span><span class="syntax-6168685d">'</span><span class="syntax-26f6a8db">,</span><span class="space"> </span><span class="syntax-1656d967">function</span><span class="space"> </span><span class="syntax-26f6a8db">($tag,</span><span class="space"> </span><span class="syntax-26f6a8db">$handle,</span><span class="space"> </span><span class="syntax-26f6a8db">$href,</span><span class="space"> </span><span class="syntax-26f6a8db">$media)</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-7b4433fd">//</span><span class="space"> </span><span class="syntax-7b4433fd">Only</span><span class="space"> </span><span class="syntax-7b4433fd">match</span><span class="space"> </span><span class="syntax-7b4433fd">WP</span><span class="space"> </span><span class="syntax-7b4433fd">Grid</span><span class="space"> </span><span class="syntax-7b4433fd">Builder</span><span class="space"> </span><span class="syntax-7b4433fd">front-end</span><span class="space"> </span><span class="syntax-7b4433fd">styles</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">if</span><span class="space"> </span><span class="syntax-26f6a8db">(</span><span class="syntax-c01639ae">is_admin</span><span class="syntax-26f6a8db">()</span><span class="space"> </span><span class="syntax-1656d967">||</span><span class="space"> </span><span class="syntax-3eeadcf9">strpos</span><span class="syntax-26f6a8db">($handle,</span><span class="space"> </span><span class="syntax-6168685d">'</span><span class="syntax-e661ac3e">wpgb-</span><span class="syntax-6168685d">'</span><span class="syntax-26f6a8db">)</span><span class="space"> </span><span class="syntax-1656d967">!==</span><span class="space"> </span><span class="syntax-765b360f">0</span><span class="syntax-26f6a8db">)</span><span class="space"> </span><span class="syntax-26f6a8db">{</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">return</span><span class="space"> </span><span class="syntax-26f6a8db">$tag;</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-26f6a8db">}</span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-7b4433fd">//</span><span class="space"> </span><span class="syntax-7b4433fd">Replace</span><span class="space"> </span><span class="syntax-7b4433fd">&#x3C;link></span><span class="space"> </span><span class="syntax-7b4433fd">with</span><span class="space"> </span><span class="syntax-7b4433fd">inline</span><span class="space"> </span><span class="syntax-7b4433fd">&#x3C;style></span></span>
<span class="line"><span class="space"> </span><span class="space"> </span><span class="syntax-1656d967">return</span><span class="space"> </span><span class="syntax-6168685d">'</span><span class="syntax-e661ac3e">&#x3C;style>@import</span><span class="space"> </span><span class="syntax-e661ac3e">"</span><span class="syntax-6168685d">'</span><span class="syntax-1656d967">.</span><span class="syntax-26f6a8db">$href</span><span class="syntax-1656d967">.</span><span class="syntax-6168685d">'</span><span class="syntax-e661ac3e">"</span><span class="space"> </span><span class="syntax-e661ac3e">layer(base);&#x3C;/style></span><span class="syntax-6168685d">'</span><span class="syntax-1656d967">.</span><span class="syntax-6168685d">"</span><span class="syntax-1656d967">\n</span><span class="syntax-6168685d">"</span><span class="syntax-26f6a8db">;</span></span>
<span class="line"><span class="syntax-26f6a8db">},</span><span class="space"> </span><span class="syntax-765b360f">10</span><span class="syntax-26f6a8db">,</span><span class="space"> </span><span class="syntax-765b360f">4</span><span class="syntax-26f6a8db">);</span></span></code></pre><p>This replaces the plugin specific <code>&lt;link rel=&quot;stylesheet&quot;&gt;</code> with an inline <code>&lt;style&gt;</code> element using the <code>@import</code> statement. The key detail is <code>layer(base)</code> which effectively wraps the entire stylesheet in a <a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers" rel="noopener noreferrer" target="_blank">cascade layer</a>.</p><p>In my theme stylesheet I define cascade layers at the top.</p><pre data-lang="css" tabindex="0" id="pre-47925b80"><code><span class="line"><span class="syntax-1656d967">@layer</span><span class="space"> </span><span class="syntax-26f6a8db">base,</span><span class="space"> </span><span class="syntax-26f6a8db">components,</span><span class="space"> </span><span class="syntax-26f6a8db">utility;</span></span></code></pre><p>Now I can write my own styles in a higher layer to override the plugin. I haven’t removed the plugin styles but they have zero specificity. This is much easier to deal with. I can go to bed without crying.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>“Even though it may seem like the industry is now made up entirely of tech grifter “AI” bros and vibe-coded websites are seen as the new standard in development: Craftsmanship isn’t dead, it thrives thanks to people like you and me, who have created our own little digital spaces to share knowledge that helps people, not machines. I can’t help myself - Steve Frenzel”</description>
  <link>https://dbushell.com/notes/2026-03-31T07:48Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-03-31T07:48Z/</guid>
  <pubDate>Tue, 31 Mar 2026 07:48:00 GMT</pubDate>
  <content:encoded><![CDATA[<blockquote><p>Even though it may seem like the industry is now made up entirely of tech grifter “AI” bros and vibe-coded websites are seen as the new standard in development: Craftsmanship isn’t dead, it thrives thanks to people like you and me, who have created our own little digital spaces to share knowledge that helps people, not machines.</p><p><cite><a href="https://www.stevefrenzel.dev/posts/i-cant-help-myself/" rel="noopener noreferrer" target="_blank">I can’t help myself</a> - Steve Frenzel</cite></p></blockquote>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>“This is somewhat of a thought experiment, thinking is still free, so let’s indulge.”The Cognitive Dark Forest is fun — by “fun” I mean existential dystopian nightmare. It only works if AI progress hasn’t already stalled. I have a blog draft coming this week that touches on the subject of why publish anything openly every again.</description>
  <link>https://dbushell.com/notes/2026-03-30T08:34Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-03-30T08:34Z/</guid>
  <pubDate>Mon, 30 Mar 2026 08:34:00 GMT</pubDate>
  <content:encoded><![CDATA[<blockquote><p>This is somewhat of a thought experiment, thinking is still free, so let’s indulge.</p></blockquote><p><a href="https://ryelang.org/blog/posts/cognitive-dark-forest/" rel="noopener noreferrer" target="_blank">The Cognitive Dark Forest</a> is fun — by “fun” I mean existential dystopian nightmare. It only works if <glossary-term id="--term-ai"><a href="https://dbushell.com/ai/">AI</a></glossary-term> progress hasn’t already stalled.</p><p>I have a blog draft coming this week that touches on the subject of why publish anything openly every again.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
<item>
  <description>What Is CSS Containment and How Can I Use It? — Harry Roberts explains all with clear examples and gotchas. I’ve used contain sparingly but with this guide I’ll be more confident. Side note: I considered the effect of contain: size in my visually hidden article but without real testing it was worthless speculation. Browsers have a fraught history of dealing with zero-width elements and whether they remain in the accessibility tree. Anyway as Harry notes, you’ll almost always want to specify size in some way with another property.</description>
  <link>https://dbushell.com/notes/2026-03-30T06:51Z/</link>
  <guid isPermaLink="true">https://dbushell.com/notes/2026-03-30T06:51Z/</guid>
  <pubDate>Mon, 30 Mar 2026 06:51:00 GMT</pubDate>
  <content:encoded><![CDATA[<p><a href="https://csswizardry.com/2026/04/what-is-css-containment-and-how-can-i-use-it/" rel="noopener noreferrer" target="_blank">What Is CSS Containment and How Can I Use It?</a> — Harry Roberts explains all with clear examples and gotchas. I’ve used <code>contain</code> sparingly but with this guide I’ll be more confident.</p><p>Side note: I considered the effect of <a href="https://csswizardry.com/2026/04/what-is-css-containment-and-how-can-i-use-it/#size-containment" rel="noopener noreferrer" target="_blank"><code>contain: size</code></a> in my <a href="https://dbushell.com/2026/02/20/visually-hidden/">visually hidden</a> article but without real testing it was worthless speculation. Browsers have a fraught history of dealing with zero-width elements and whether they remain in the accessibility tree. Anyway as Harry notes, you’ll almost always want to specify size in some way with another property.</p>
<hr>
<p>
Thanks for reading! Follow me on <a href="https://dbushell.com/mastodon/">Mastodon</a> and <a href="https://dbushell.com/bluesky/">Bluesky</a>.
Subscribe to my <a href="https://dbushell.com/rss.xml">Blog</a> and <a href="https://dbushell.com/notes/rss.xml">Notes</a> or <a href="https://dbushell.com/merge/rss.xml">Combined</a> feeds.
</p>
]]></content:encoded>
</item>
</channel>
</rss>
