<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/pretty-feed-v3.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>daverupert.com</title>
    <description>The personal blog of Dave Rupert, web developer and podcaster from Austin, TX.</description>
    <link>https://daverupert.com</link>
    <atom:link href="https://daverupert.com/atom.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Before I go: Double your business with companies you like</title>
        <description>&lt;p&gt;I’ve had the pleasure in my career of sitting in tons of different board rooms talking with executives and getting a rundown on different charts and graphs they care most deeply about. As expected, “number chart go up” is always the desired outcome. Number chart go up is good because it makes other number charts go up, specifically stock ticker number.&lt;/p&gt;
&lt;p&gt;One common refrain I’d hear everywhere I went whether they dealt in pizzas, coffee, coupons, computers, or software licenses went something like this (paraphrasing), “On average customers use our product once per month and if we can double that number then we’d have no more problems.” An over-simplification of course, but they’re desperate to move the number from one… to two.&lt;/p&gt;
&lt;p&gt;It doesn’t take a business degree to figure that out that doubling your sales, downloads, or clicks is good for business. But sometimes the goals are much more modest. Let’s say it’s coffee. They know they have you hooked on a drug and you’ll make at least four weekly purchases a month, but if they could get all their customers to buy a &lt;em&gt;fifth&lt;/em&gt; cup of coffee that month… that’s a measly five bucks for you and I the consumer, but that’s +20% revenue month-over-month for their store.&lt;/p&gt;
&lt;p&gt;Putting this knowledge into the hands of consumers like us… Our five bucks feels meaningless and this feels like impotent advice on the purchasing power of the dollar, but I know it matters. Those five bucks can and will skew the averages and the people wearing Patagonia vests in mahogany-paneled board rooms will obsess over those charts.&lt;/p&gt;
&lt;p&gt;Collectively we can influence the number chart. It could be a coordinated buying campaign or boycott, but I think it could be as simple as re-patronizing small businesses you already enjoy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Double your purchases from that shop you liked, even if it’s a little too expensive because you understand they deal in small volumes.&lt;/li&gt;
&lt;li&gt;Go to that local restaurant you like again, the one where the owner comes out and shakes everyone’s hand.&lt;/li&gt;
&lt;li&gt;Buy another online course with your company’s education budget from that online helpful person, even if you’ll never use it.&lt;/li&gt;
&lt;li&gt;Watch one more video, read one more post, like it, subscribe. And don’t block the ads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the inverse is also true…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make one less order from that big online retailer funneling dark money into our elections.&lt;/li&gt;
&lt;li&gt;Cancel your subscription to companies owned by race-baiting ketamine-addled nazis.&lt;/li&gt;
&lt;li&gt;Make one less post on the billionaire owned platform, delete the app, let your session expire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And sometimes, you don’t even need to buy anything! Often, talking about the places you like has the biggest impact. Talking raises awareness, it puts good things and places in our collective consciousness. It won’t be instant, but hopefully we can reprogram our muscle memory to think of good company before giving money to bad company.&lt;/p&gt;
&lt;p&gt;Bad companies pay a lot of ad-bucks to other bad companies to get into your field of view. Ads are why websites have gone to shit. It’s why Instagram has become unusable, not to mention that it’s become a giant multi-level marketing scam where it’s all influencers hustling their dropshipped garbage to each other instead of sharing cool photos with friends.&lt;/p&gt;
&lt;p&gt;Become a free, one-off marketing department or brand ambassador for a restaurant, app, podcast, artist, game, band, or store that you think is good. No one is going to think “Damn, Dave keeps talking about these breakfast tacos at &lt;a href=&quot;https://www.dans-hamburgers.com/&quot;&gt;Dan’s Hamburgers&lt;/a&gt; in Austin, TX that are only available before 10:30 am, they must be complete shit.” They will be curious and figure it out for themselves and their lives will be forever changed until the day Dan’s gets swallowed up by Austin’s endless “progress”.&lt;/p&gt;
&lt;p&gt;In the wake of a phalanx of tech billionaires shit-grinning behind an orange-hued fascist criminal who four years prior incited a coup in that same rotunda, some Europeans have began advocating for local technology solutions. And even though &lt;a href=&quot;https://www.switch-to.eu/en&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;https://european-alternatives.eu/&quot;&gt;European&lt;/a&gt; &lt;a href=&quot;https://builtineu.eu/&quot;&gt;alternative&lt;/a&gt; sites post a slight existential threat to my family’s income, I love the initiative. I wish every continent, country, city, and state had similar efforts to drive money towards locally sourced alternatives. I’m guilty of it as well, but why we funnel so much money to five nearly identical technology companies boggles the mind.&lt;/p&gt;
&lt;p&gt;Anyways. Consider doubling your business somewhere with. some place &lt;em&gt;or someone&lt;/em&gt; that deserves it. And the smaller that business is, the even bigger impact you’ll have on the number chart.&lt;/p&gt;
</description>
        <pubDate>Tue, 28 Jul 2026 15:29:00 +0000</pubDate>
        <link>https://daverupert.com/2026/07/number-chart-go-up/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/07/number-chart-go-up/</guid>
      </item>
    
      <item>
        <title>The new yet familiar CodePen&amp;nbsp;2.0</title>
        <description>&lt;p&gt;CodePen v2 is now released! Because &lt;a href=&quot;https://shoptalkshow.com/&quot;&gt;I co-host a podcast with Chris&lt;/a&gt; I’ve had an up-close perspective at this monumental effort over the last five years. I know how much work has gone into this release and I applaud the team for hitting the finish line.&lt;/p&gt;
&lt;p&gt;At the crux of the new experience is the new and improved editor. When you first launch into the v2.0 editor, your first response will probably be “Who moved my cheese!?” New is always uncomfortable, but there’s a fix for getting back to the old familiar UI…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hit &lt;code&gt;⌘ + U&lt;/code&gt; or &lt;code&gt;CTRL + U&lt;/code&gt; to hide the new pen sidebar&lt;/li&gt;
&lt;li&gt;Install the &lt;a href=&quot;https://codepen.io/editor/team/CodePenTemplates/pen/0198ce76-3d55-76ae-8cf7-edf6860caa95&quot;&gt;Classic Block Template&lt;/a&gt; to remove ~14 lines of HTML (Optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay, now hit &lt;code&gt;⌘ + U&lt;/code&gt; or &lt;code&gt;CTRL + U&lt;/code&gt; again, because what’s in the sidebar are all the new features and favorite parts I want to talk about.&lt;/p&gt;
&lt;h2&gt;An entire file system&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.daverupert.com/posts/2026/slaps-roof-of-codepen.jpg&quot; alt=&quot;slaps roof of car meme: slaps roof of codepen, this bad boy can fit over 300 files&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The first thing you’ll notice when entering the new CodePen editor is a file explorer. That’s right! CodePen is breaking out of its three-file constraint and allowing you to build entire multi-file and multi-page websites.&lt;/p&gt;
&lt;p&gt;A not-so-secret feature of CodePen was that you could mimic a file system in CodePen by &lt;a href=&quot;https://blog.codepen.io/documentation/adding-external-resources/#you-can-use-other-pens-as-external-resources&quot;&gt;using other pens as external resources&lt;/a&gt;, but referencing your custom &lt;code&gt;reset.css&lt;/code&gt; by importing &lt;code&gt;&amp;lt;user&amp;gt;/pen/&amp;lt;slug&amp;gt;.css&lt;/code&gt; wasn’t the JS module-like experience you come to expect from the modern web.&lt;/p&gt;
&lt;p&gt;But gone are the days of 2,000 line JavaScript files, I can now &lt;code&gt;import foo from &apos;./foo.js&apos;&lt;/code&gt; like TC39 intended. I must admit that my more complex ideas were hitting the limit of what was comfortable to type into a tiny textbox. But now creating a folder of web components or JSON data files to loop through is easier than ever. I can build multi-file and multi-page prototypes (e.g. view-transitions! service-workers!) all without spinning up a local dev server. Digging up an old CodePen is much easier than finding an old folder on an old hard drive and it’s arguably the easiest way to put a custom webpage up on the internet right now.&lt;/p&gt;
&lt;p&gt;Without drawing too many comparisons to competitors, CodePen at times felt a bit underpowered when compared to other online code editing environments. But those other services that spin up an entire Node.js Docker so that I can build my &lt;code&gt;&amp;lt;fart-button&amp;gt;&lt;/code&gt; always felt like overkill to me. CodePen now occupies not just the entry-level and middle ground, but almost the entire spectrum of needs that I have for prototyping and small site building.&lt;/p&gt;
&lt;h2&gt;Versioning and deployments&lt;/h2&gt;
&lt;p&gt;Who amongst us hasn’t totally beefer’d up a good pen before?&lt;/p&gt;
&lt;p&gt;Ruining an otherwise quality pen to idea creep or losing work to a browser refresh is always a possibility with online editors. It’s typically not world-ending for me and my …&lt;em&gt;ahem&lt;/em&gt;… spartanly styled pens, but for sure results in a couple choice swear words. I imagine &lt;a href=&quot;https://codepen.io/trending&quot;&gt;trending tab experts&lt;/a&gt; and newbie beginners find this even more frustrating. But now pens have a version history so you can roll back if necessary.&lt;/p&gt;
&lt;p&gt;The deployments are better now too. Sometimes when building an idea, I like to send the “chromeless” version of the pen to non-developer friends or partners/clients to avoid overwhelming them with CodePen UI. This is also useful when debugging on your phone. The &lt;code&gt;debug/&lt;/code&gt;URL worked, but if you’ve ever URL-hacked a private pen URL on your phone you know how un-fun that is. But now I can deploy the pen, get a nice &lt;code&gt;codepen.dev&lt;/code&gt; URL or point my custom subdomain at CodePen’s DNS, and Airdop that URL to myself. A small but meaningful quality of life improvement for me.&lt;/p&gt;
&lt;h2&gt;Blocks&lt;/h2&gt;
&lt;p&gt;My favorite feature of the new CodePen is Blocks. One of my biggest gripes with modern web development is the amount of tooling it takes to get started. We’ve made it so damn complex to make a webpage, no wonder AI is so popular.&lt;/p&gt;
&lt;p&gt;Blocks adds a visual layer to the opaque world of preprocessors, linters, and build processes. CodePen takes those processes and stack them on top of each other to form a predictable pipeline that you can easily visualize and understand how the sausage gets made. Imagine how this must feel for beginners compared to a dozen config files littering the root of your repo! Web development demystified.&lt;/p&gt;
&lt;p&gt;I’ve wanted a UI like this for build processes for a long time: Gulp, Webpack, Vite, GitHub Actions, Azure DevOps Pipelines… I feel every service would be better if it had a Blocks UI. Like &lt;a href=&quot;https://scratch.mit.edu/&quot;&gt;Scratch&lt;/a&gt;, but for servers. Experienced developers might even be less afraid to operate on their build tools if they had something like this.&lt;/p&gt;
&lt;p&gt;I think CodePen has created something special here that most people won’t fully understand. A perfect fit for their beginner audience as well as their professional audience who don’t want to copy, paste, and manage config files to build a simple website or goofy pen.&lt;/p&gt;
&lt;h2&gt;A simplified but more powerful UI&lt;/h2&gt;
&lt;p&gt;A whole new product with a new file-system, versioned deployments, and customizable build chain smooshed in… yet the UI still feels familiar. It’s rare for products to evolve so intuitively. There’s more features, but everything feels more predictable. In the “classic” CodePen editor you’d have to surf through a handful of dropdowns and modals to tweak your settings and now a lot of that work is automatic. You want Sass? Add the &lt;code&gt;.scss&lt;/code&gt; file extension. You want TypeScript? Add the &lt;code&gt;.ts&lt;/code&gt; extension. CodePen will add all the Blocks for you with a default config that works.&lt;/p&gt;
&lt;p&gt;It feels like all the configuration options are all co-located in the right place now. And the new omnibar search box is the ultimate get-out-of-jail-free card, exposing most of the features you’d need without all the hunting and pecking. Expanding the capabilities of the product while maintaining simplicity deserves some applause and I feel the team at CodePen walked this delicate line and succeeded.&lt;/p&gt;
&lt;h2&gt;A couple final thoughts&lt;/h2&gt;
&lt;p&gt;I’ve said it before (and I’ll say it again) I admire the team at CodePen and –despite my obvious biases– I think they’re one of the best product teams out there. &lt;a href=&quot;https://blog.codepen.io/2026/07/23/435-the-2-0-launch-team-codepens-favorite-features/&quot;&gt;In their podcast&lt;/a&gt; they give you a rare, honest, behind-the-scenes look at how they are thinking about and building their product. No one even comes close to their level of transparency.&lt;/p&gt;
&lt;p&gt;Probably my favorite part of Team CodePen is that they’re not afraid to tackle the hard work and pay down technical debt when needed. They stay small, sweat the details, and take their time. There’s no back-pressure from venture capital to move fast and break your things. In my view it’s software done right.&lt;/p&gt;
&lt;p&gt;Because I was part of the beta, I’m already using the hell out of CodePen 2.0. I’ve built dozens of big ideas (a browser-based camera, a service-worker based declarative shadow DOM solution, a half-dozen in-browser AI chatbots, a minimum viable design system, and more) that would have been either cumbersome or next-to-impossible in the previous editor. CodePen 2.0 is already enabling me to build bigger, better, and more complex ideas without leaving the comfort of one of my favorite applications on the whole entire internet.&lt;/p&gt;
&lt;p&gt;So thanks, CodePen, for the huge upgrade and congrats to the team on the launch. 🎉&lt;/p&gt;
</description>
        <pubDate>Mon, 27 Jul 2026 04:50:00 +0000</pubDate>
        <link>https://daverupert.com/2026/07/codepen-2/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/07/codepen-2/</guid>
      </item>
    
      <item>
        <title>Finding curated public domain images</title>
        <description>&lt;figure&gt;
&lt;img src=&quot;https://cdn.daverupert.com/posts/2026/book-of-discoveries.jpg?optimize&quot; width=&quot;1200&quot; height=&quot;599&quot; alt=&quot;a vintage illustration of a man sitting on a chair in a sparse room holding up a book that appears illuminated. a small dog in the foreground stares at his owner and the book.&quot;&gt;
&lt;figcaption&gt;
&lt;p&gt;Xavier de Maistre in an armchair, displaying his “book of discoveries” (Veyssier, &lt;a href=&quot;https://archive.org/details/journeyroundmyro00mais/page/n17/mode/2up&quot;&gt;1860&lt;/a&gt;)&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Every so often I like to include a public domain image in a blog post. I’m fond of the woodblock and lithographic illustrations of the late 1800s. I try to avoid indiscriminately (un-)splashing every post but the real reason for the infrequency isn’t radical self-control, it’s because dumpster diving for public domain images can be a chore.&lt;/p&gt;
&lt;p&gt;You can –of course– use Google or Bing to find public domain images but the volume, duplicates, and weighing the veracity of copyright attribution is overwhelming. The Library of Congress has &lt;a href=&quot;https://www.loc.gov/free-to-use/&quot;&gt;Free to Use and Reuse sets&lt;/a&gt;, but their collections are nebulous noun buckets filled with a federally-mandated amount of Americana. On top of that, searching library sites is never a good experience to me. They tend to be slow and inaccurate with poor quality results and it’s a matter of time until you’re redirected to a smaller local library collection or database that’s even less maintained.&lt;/p&gt;
&lt;p&gt;That’s why –for me– a little for-profit curation goes a long way. I wrote down some of my favorite resources from my last search (so I can remember next time) and will try to keep a running list of good resources I find.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://publicdomainreview.org/&quot;&gt;The Public Domain Review&lt;/a&gt; writes blog posts about interesting works and curates quality finds in the &lt;a href=&quot;https://pdimagearchive.org/galleries/all/random/desc&quot;&gt;Public Domain Image Gallery&lt;/a&gt;. Notably, The PBR has a cool “&lt;a href=&quot;https://pdimagearchive.org/infinite-view/&quot;&gt;Infinite View&lt;/a&gt;” way to browse. It’s a bit overwhelming for me, but you may love it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://artvee.com/&quot;&gt;Artvee&lt;/a&gt; is a site with some great curation of public domain images.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.heritagetype.com/&quot;&gt;Heritage Type&lt;/a&gt; maintains some nice &lt;a href=&quot;https://www.heritagetype.com/pages/free-vintage-illustrations&quot;&gt;collections of vintage illustrations&lt;/a&gt; , almost like tattoo flash art in PNG and vector formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The business models are similar; pair the public domain with something to sell. The Public Domain Review and Artvee sell prints, aprons, or coffee mugs of the public domain works while Heritage Type funnels you to their quality fonts and design assets. I know we all hate Capitalism, but taking a small cut off the top for quality curation seems like a good trade and not an abuse of the commons.&lt;/p&gt;
&lt;p&gt;Blessed are the curators.&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Jun 2026 12:05:00 +0000</pubDate>
        <link>https://daverupert.com/2026/06/curated-public-domain-images/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/06/curated-public-domain-images/</guid>
      </item>
    
      <item>
        <title>A workaround for hiding empty slots in Chromium</title>
        <description>&lt;p&gt;Named slots are one of web components’ biggest &lt;a href=&quot;https://htmlwithsuperpowers.netlify.app/&quot;&gt;superpowers ✨&lt;/a&gt;. Imagine a Button component with an optional icon; in Web Components we don’t need a separate Button and IconButton, a single Button component with &lt;code&gt;&amp;lt;slot name=&amp;quot;icon&amp;quot;&amp;gt;&lt;/code&gt; will do. Or a card component with a handful of predefined slots for image, title, description, price, metadata, etc. Not 100 different cards… one card.&lt;/p&gt;
&lt;p&gt;Slots are a wonderful way to declaratively compose UI, but one shadow styling challenge that has vexed my team over the years is how to contextually hide a &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt; when there’s no slotted content.&lt;/p&gt;
&lt;h2&gt;The problem… ghost gaps&lt;/h2&gt;
&lt;p&gt;The most idiomatic way to check if a particular slot is in-use is to use &lt;code&gt;:host(:has([slot=&amp;quot;foo&amp;quot;]))&lt;/code&gt;. But… In a weird twist to how web component browser-compat bugs tend to go, &lt;code&gt;:host(:has([slot]))&lt;/code&gt; works in Safari and Firefox today but doesn’t work in Chromium!&lt;/p&gt;
&lt;p&gt;Chromium not supporting &lt;code&gt;:host(:has([slot]))&lt;/code&gt; means we can’t query an element’s Light DOM contents from the Shadow DOM. That interpretation of encapsulation makes sense (I guess) and in most situations it’s not a big problem; an empty &lt;code&gt;slot&lt;/code&gt; is like an empty &lt;code&gt;span&lt;/code&gt; and probably won’t impact rendering. But it becomes a problem when the empty slots appear in a &lt;code&gt;flex&lt;/code&gt; or &lt;code&gt;grid&lt;/code&gt; layout using &lt;code&gt;gap&lt;/code&gt; because unless you hide the element and/or its wrapper, the gap will not collapse in Chromium, so you end up with a “ghost gap”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example: With &lt;code&gt;slot=&amp;quot;optional&amp;quot;&lt;/code&gt; content in Light DOM&lt;/strong&gt;&lt;/p&gt;
&lt;optional-slot-demo-broken&gt;
  &lt;div slot=&quot;required&quot;&gt;Required content&lt;/div&gt;
  &lt;div slot=&quot;optional&quot;&gt;Optional content - expected: show content with gap&lt;/div&gt;
&lt;/optional-slot-demo-broken&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;optional-slot-demo-broken&amp;gt;
  &amp;lt;div slot=&amp;quot;required&amp;quot;&amp;gt;Required content&amp;lt;/div&amp;gt;
  &amp;lt;div slot=&amp;quot;optional&amp;quot;&amp;gt;Optional content - expected: show content with gap&amp;lt;/div&amp;gt;
&amp;lt;/optional-slot-demo-broken&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example: Without &lt;code&gt;slot=&amp;quot;optional&amp;quot;&lt;/code&gt; content in Light DOM&lt;/strong&gt;&lt;/p&gt;
&lt;optional-slot-demo-broken&gt;
  &lt;div slot=&quot;required&quot;&gt;Required content&lt;/div&gt;
&lt;/optional-slot-demo-broken&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;optional-slot-demo-broken&amp;gt;
  &amp;lt;div slot=&amp;quot;required&amp;quot;&amp;gt;Required content&amp;lt;/div&amp;gt;
  &amp;lt;!-- expected: does not show extra whitespace --&amp;gt;
&amp;lt;/optional-slot-demo-broken&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;✅ Works in Safari = wrapper div hidden, no gap&lt;/li&gt;
&lt;li&gt;✅ Works in Firefox = wrapper div hidden, no gap&lt;/li&gt;
&lt;li&gt;❌ Broken in Chromium = extra whitespace below &lt;code&gt;slot=&amp;quot;required&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The failed attempts…&lt;/h2&gt;
&lt;p&gt;We’ve tried a lot of fixes over the last couple years. Variations on &lt;code&gt;:host(:has())&lt;/code&gt;, &lt;code&gt;element-name:has()&lt;/code&gt;, &lt;code&gt;!important&lt;/code&gt;, &lt;code&gt;::slotted([slot]) ~ [slot]&lt;/code&gt;, &lt;code&gt;::slotted([slot]:empty)&lt;/code&gt;, and all permutations of those. Copilot/Claude were certain these would work… but alas…&lt;/p&gt;
&lt;h2&gt;The fix… use @scope&lt;/h2&gt;
&lt;p&gt;This week my co-worker &lt;a href=&quot;https://www.linkedin.com/in/jeff-smith-28624711/&quot;&gt;Jeff&lt;/a&gt; and I were navigating this issue again. Coincidentally, the ShopTalkShow Discord was discussing the same exact problem and cited the &lt;a href=&quot;https://github.com/shoelace-style/shoelace/blob/next/src/internal/slot.ts&quot;&gt;&lt;code&gt;HasSlotController&lt;/code&gt;&lt;/a&gt; in &lt;a href=&quot;https://webawesome.com/&quot;&gt;WebAwesome&lt;/a&gt; (née Shoelace) as a working solution to this problem. I’d prefer to keep the solution in pure CSS, but was getting desperate.&lt;/p&gt;
&lt;p&gt;While glancing through the code I noticed the use of &lt;code&gt;:scope&lt;/code&gt; in &lt;a href=&quot;https://github.com/shoelace-style/shoelace/blob/next/src/internal/slot.ts#L38-L40&quot;&gt;L38-40&lt;/a&gt; and while unrelated it sparked a curiosity to try to use &lt;code&gt;:scope&lt;/code&gt; to juke Chromium’s shadow limitations. A handful of tries later and I had a working solution.&lt;/p&gt;
&lt;p&gt;Here’s what I came up with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:host {
  display: grid;
  gap: 1rem;
}

/* Hide optional slots by default */
.optional-slot {
  display: none;
}

/* Show in Safari/Firefox */
:host(:has([slot=&amp;quot;optional&amp;quot;])) .optional-slot {
  display: block;
}

/* Fix for Chromium */
@scope {
  :scope:has([slot=&amp;quot;optional&amp;quot;]) .optional-slot {
    display: block;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example: With &lt;code&gt;slot=&amp;quot;optional&amp;quot;&lt;/code&gt; content in Light DOM&lt;/strong&gt;&lt;/p&gt;
&lt;optional-slot-demo&gt;
  &lt;div slot=&quot;required&quot;&gt;Required content&lt;/div&gt;
  &lt;div slot=&quot;optional&quot;&gt;Optional content - expected: show content with gap&lt;/div&gt;
&lt;/optional-slot-demo&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;optional-slot-demo&amp;gt;
  &amp;lt;div slot=&amp;quot;required&amp;quot;&amp;gt;Required content&amp;lt;/div&amp;gt;
  &amp;lt;div slot=&amp;quot;optional&amp;quot;&amp;gt;Optional content - expected: show content with gap&amp;lt;/div&amp;gt;
&amp;lt;/optional-slot-demo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example: Without &lt;code&gt;slot=&amp;quot;optional&amp;quot;&lt;/code&gt; content in Light DOM&lt;/strong&gt;&lt;/p&gt;
&lt;optional-slot-demo&gt;
  &lt;div slot=&quot;required&quot;&gt;Required content&lt;/div&gt;
&lt;/optional-slot-demo&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;optional-slot-demo&amp;gt;
  &amp;lt;div slot=&amp;quot;required&amp;quot;&amp;gt;Required content&amp;lt;/div&amp;gt;
  &amp;lt;!-- expected: does not show extra whitespace --&amp;gt;
&amp;lt;/optional-slot-demo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the results…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Works in Safari = wrapper div hidden, no gap&lt;/li&gt;
&lt;li&gt;✅ Works in Firefox = wrapper div hidden, no gap&lt;/li&gt;
&lt;li&gt;✅ Works in Chrome = wrapper div hidden, no gap&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The why…&lt;/h2&gt;
&lt;p&gt;I love a good CSS-trick, but &lt;em&gt;even worse than a bug is not knowing why something works&lt;/em&gt;. My other teammate &lt;a href=&quot;https://marchbox.com/&quot;&gt;Zacky&lt;/a&gt; dug into the spec and confirmed this is a viable fix because &lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/#cssscoperule&quot;&gt;as its defined&lt;/a&gt; &lt;code&gt;@scope&lt;/code&gt; without a scope-root in the shadow styles allows &lt;code&gt;:scope&lt;/code&gt; to match the shadow-host instead of the shadow-root… which is clutch. From the spec:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;a href=&quot;https://drafts.csswg.org/selectors-4/#scope-pseudo&quot;&gt;:scope&lt;/a&gt; selector can match the &lt;a href=&quot;https://drafts.csswg.org/selectors-4/#featureless&quot;&gt;featureless&lt;/a&gt; shadow host when that host is the &lt;a href=&quot;https://drafts.csswg.org/selectors-4/#scoping-root&quot;&gt;scoping root&lt;/a&gt; element. (&lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/9025&quot;&gt;Issue 9025&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/#at-ruledef-scope&quot;&gt;@scope&lt;/a&gt; rule without &lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/#typedef-scope-start&quot;&gt;scope-start&lt;/a&gt; scopes to the shadow host instead of the &lt;a href=&quot;https://dom.spec.whatwg.org/#concept-shadow-root&quot;&gt;shadow root&lt;/a&gt;. (&lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/9178&quot;&gt;Issue 9178&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks, Team CSSScopeRule, for enabling this workaround (&lt;em&gt;checks notes&lt;/em&gt;) three years ago. There’s a wonderful bit of irony that I’m using &lt;code&gt;@scope&lt;/code&gt; to break out of the Shadow DOM’s style containment and that’s part of why I love CSS.&lt;/p&gt;
&lt;p&gt;I look forward to the day we can use &lt;code&gt;:host(:has())&lt;/code&gt; and &lt;code&gt;:has-slotted()&lt;/code&gt; in all browsers, but in the meantime I’m happy to have stumbled upon a duplicative-yet-simple fix. Let me know if you end up using this and it works for you. I already know we have a handful of minor spacing bugs to patch up in our system.&lt;/p&gt;
</description>
        <pubDate>Fri, 19 Jun 2026 04:57:00 +0000</pubDate>
        <link>https://daverupert.com/2026/06/fix-for-host-has-slot/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/06/fix-for-host-has-slot/</guid>
      </item>
    
      <item>
        <title>Spoons by Sam</title>
        <description>&lt;p&gt;I play &lt;a href=&quot;https://cluesbysam.com/&quot;&gt;Clues by Sam&lt;/a&gt; nearly every single day. &lt;a href=&quot;https://daverupert.com/2025/11/clues-by-sam/&quot;&gt;I wrote about it before&lt;/a&gt;, but solving a little crime puzzle adds a micro-thrill to my day. A little blast of logic, misdirection, and wordplay. It’s a frequent topic of conversation in the ShopTalkShow Discord where people share their solves like Wordle scores.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://cdn.daverupert.com/posts/2026/lanarchiste.jpg?optimize=true&quot; alt=&quot;Vintage illustration of two square-ish police men approaching a crowd of people who have grabbed a wanted man.&quot; width=&quot;1070&quot; height=&quot;800&quot;&gt;
&lt;figcaption&gt;L&apos;anarchiste (1892) by Félix Vallotton. Public Domain.&lt;/figcaption&gt;
&lt;/figure&gt; 
&lt;p&gt;It might have been &lt;a href=&quot;https://joshcollinsworth.com/&quot;&gt;Josh&lt;/a&gt; who first pointed it out, but as a group we’ve realized that &lt;em&gt;Clues by Sam&lt;/em&gt; is an uncanny proxy for measuring your emotional well-being that day. If you’re a regular puzzler, I think it’s safe to say you should be able to solve a non-weekend edition of &lt;em&gt;Clues by Sam&lt;/em&gt; without any mistakes (green days). But there are off-days (yellow days) where I make obvious errors tracking the four or five clues you need to solve the puzzle. And there are worse days (orange days) where even with hints, I have no idea what I’m doing and begin to doubt my understanding of English.&lt;/p&gt;
&lt;p&gt;Borrowing the metaphor of &lt;a href=&quot;https://en.wikipedia.org/wiki/Spoon_theory&quot;&gt;Spoon Theory&lt;/a&gt; from the disabled community, &lt;em&gt;Clues by Sam&lt;/em&gt; helps me take inventory of what’s left in my kitchen drawers. My performance on &lt;em&gt;Clues by Sam&lt;/em&gt; often alerts me to events happening in my subconscious. It’s become a barometer for my cognitive bandwidth; like Person, Man, Woman, Camera, TV but with Xena, Kyle, Paula, Vince, and Chloe.  Faceplanting on an easy puzzle is a &lt;em&gt;clue for me&lt;/em&gt; that I have some unarticulated anxieties occupying my mind.&lt;/p&gt;
&lt;p&gt;It’s not rocket science that cognitive tasks are more difficult when you’re distracted, but the reliability to which this daily puzzler causes me to dig into my personal well-being is shocking. I’m beginning to see obvious mistakes –like the common “crimocent” mix-up– less as a failure and more as an opportunity to pause and assess what else might be going on in my life.&lt;/p&gt;
</description>
        <pubDate>Thu, 18 Jun 2026 11:50:00 +0000</pubDate>
        <link>https://daverupert.com/2026/06/spoons-by-sam/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/06/spoons-by-sam/</guid>
      </item>
    
      <item>
        <title>Vibe Check №42</title>
        <description>&lt;p&gt;Forgive me, Reader. It’s been five months since my last vibe check. That’s a lot of ground to cover and it’s not possible to get into everything that happened. Like in real life conversations, instead of telling you &lt;em&gt;how&lt;/em&gt; I’m doing, I’ll tell you &lt;em&gt;what&lt;/em&gt; I’ve been doing these past few months.&lt;/p&gt;
&lt;h2&gt;A trip to Seattle&lt;/h2&gt;
&lt;figure&gt;
&lt;img src=&quot;https://cdn.daverupert.com/posts/2026/microsoft.jpg&quot; width=&quot;1200&quot; height=&quot;700&quot; alt=&quot;a large outdoor sign of the microsoft logo on the microsoft campus&quot;&gt;
&lt;figcaption&gt;An underwhelming, low-res photo I took on my Kodak Charmera&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In March I went to Redmond, WA for “Meetup Week” at work. This was my second visit to the mothership in two years of working at Microsoft. Ideally, I’d go up more… but not too much… so this is fine. We’re a high-functioning remote team even though nearly everyone on the team has been RTO’d.&lt;/p&gt;
&lt;p&gt;Speaking of my team, the people I get to work with are super great. Talented, friendly people I’m lucky to work with. We’re a scrappy bunch punching above our weight.&lt;/p&gt;
&lt;p&gt;The people in my broader design studio are also great. I spent a good chunk of my time helping folks with their vibe-coding setups. Ever since the mandate dropped earlier this year, a lot of my job has been helping to onboard our ~200 new junior &lt;del&gt;designers&lt;/del&gt; &lt;em&gt;developers&lt;/em&gt; and their agent buddies to developer tools. I will say… it’s real easy to get your computer into a borked state when installing a lot of new tools. Chatbots and emergent AI tools make it worse. Getting comfortable with the terminal was a multi-year process for me and we’re asking “normies” to hot-drop in and approve hundreds of minified bash commands per day. I feel for everyone who is having their boat rocked by all the change.&lt;/p&gt;
&lt;p&gt;Meetings and roadmap discussions filled my week. We had a couple memorable team dinners and bar conversations.&lt;/p&gt;
&lt;p&gt;My week was super busy but I was able to sneak a couple moments to catch up with some old friends and colleagues in the Puget Sound area. Spent an afternoon with Adam, shared a beer with Kyle, and talked accessibility with Aaron. Good times.&lt;/p&gt;
&lt;p&gt;My flight back to Austin got caught in a minor snowpocalypse. My 6pm flight got delayed until midnight which means I didn’t get home until 6:30am. Woof. And my seatmate next to me on the plane –the one with the crinkly bag of food who liked to have full volume conversations with her husband in the seat in front of her– was… &lt;em&gt;ahem&lt;/em&gt;… less sensitive to the lack-of-sleep situation we were all in. Oh well.&lt;/p&gt;
&lt;h2&gt;A trip to Tampa&lt;/h2&gt;
&lt;p&gt;My daughter’s cheer team made it to the big end-of-season competition in Tampa, FL. We took the whole family and turned it into a mini-vacation. Her team did great and “hit zero” (zero deductions) but so did eight other teams in her division and only seven advanced. I’m proud of my little athlete and she continues to amaze me.&lt;/p&gt;
&lt;p&gt;While not in the thundering jock-jam confines of the civic convention center, we took a trip to the beach, saw some movies, and went to Universal Studios Orlando. We aren’t a super theme park family but I was feeling a bit of parental guilt that my kids would be telling their future therapists about how we never took them to theme parks. Knowing my kids don’t love rollercoasters or waiting in lines, we stuck to the main park which has rides for the Minions, Diagon Alley, and the Simpsons. I splurged (read: paid double) for the “express pass” so we could skip the lines whenever possible.&lt;/p&gt;
&lt;p&gt;Diagon Alley was the biggest highlight. That comes with some regret because JK Rowling sucks now. But the experience they crafted there is so meticulously well done you can’t help but feel immersed. I admired all the theme park tricks they do to make everything seem bigger. Slanted walls to make it feel fantastical and disorient you combined with how the windows get progressively smaller on the upper stories of the buildings so they seem taller. I spent a good amount of time marvelling at a set of stairs that went to nowhere; there to create an illusion that the town keeps going on forever. I love those details. Then on top of that they add in these immersive wand experience gimmicks (we didn’t buy wands but watched a others cast incantations). Very thoughtful experience design and that’s what I think I liked about it.&lt;/p&gt;
&lt;p&gt;I will say that 4D experience rides are not for me. The “DO NOT RIDE IF…” warnings they give at the beginning of each ride are basically a printout of my medical conditions. I know theme parks are doubling down on these because the cost per square foot is too good to pass up, but I’d almost rather sit in The Hall of Presidents and watch animatronics talk to me instead of buckling into a vestibular torture chamber.&lt;/p&gt;
&lt;p&gt;Aside from a bad case of ride-induced nausea, I think we had a fun and memorable day.&lt;/p&gt;
&lt;h2&gt;Another birthday&lt;/h2&gt;
&lt;p&gt;I turned 46 at the end of April. Huzzah. Another year on this rock, orbiting a star, in the arm of a spiral galaxy with a massive black hole in its center. Birthdays of course lose their sentimentality after you’ve had enough. But I had a nice relaxing day, not too many tickets on my desk, with some gloomy weather to preserve a chill mood.&lt;/p&gt;
&lt;h2&gt;Coming up&lt;/h2&gt;
&lt;p&gt;We’re barreling towards the end of the school year. I’m going back to Redmond again. Then to South Dakota to see my nephew graduate. Then my son will play his 80’s rock show. We got grandparents coming into town. A busy month for sure. Then summer officially begins.&lt;/p&gt;
&lt;h2&gt;Stats&lt;/h2&gt;
&lt;p&gt;Ok, perverts. Here’s the numbers.&lt;/p&gt;
&lt;h3&gt;🧠 Health and wellness&lt;/h3&gt;
&lt;p&gt;Still working on untying the knot of ADHD, anxiety, and weight in my life. I feel like I’ve done well on managing the ADHD. The weight could be better (considering how much I’m spending on GLP-1) but I am seeing progress. The anxiety though is hard to shake.&lt;/p&gt;
&lt;p&gt;I watched some  &lt;a href=&quot;https://www.youtube.com/@HealthyGamerGG&quot;&gt;Dr. K videos&lt;/a&gt; about &lt;a href=&quot;https://youtu.be/XW-02QiiHDM&quot;&gt;engineer burnout&lt;/a&gt; that resonated with me and another one about &lt;a href=&quot;https://www.youtube.com/watch?v=bj_PSYBCUsM&quot;&gt;ADHD and anxiety&lt;/a&gt; where your brain reinforces itself into a state where you feel like there’s always a tiger in the bushes. That’s how I feel. No acute anxiety, but ambient.&lt;/p&gt;
&lt;p&gt;Anyways, I’m under doctor’s orders to power down devices at 10:30pm and go to bed. It’s 11:52pm right now. I’ve also resumed going to therapy again (after a bad experience) and hope it sticks this time.&lt;/p&gt;
&lt;h3&gt;📖 Reading&lt;/h3&gt;
&lt;mini-bookshelf&gt;
&lt;template shadowrootmode=&quot;open&quot;&gt;
&lt;style&gt;
:host {
  container: host / inline-size;
}
div {
  --cols: 3;
  display: grid;
  grid-template-columns: repeat(var(--cols), 1fr);
  align-items: center;
}
@container host (width &gt; 500px) {
  div { --cols: var(--cols-desktop, 5); }
}
::slotted(img) {
  max-width: 100%;
  height: auto;
  object-fit: cover;
}
&lt;/style&gt;
&lt;div&gt;&lt;slot&gt;&lt;/slot&gt;&lt;/div&gt;
&lt;/template&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9798217287161.jpg&quot; alt=&quot;Dungeon Crawler Carl&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781541788480.jpg&quot; alt=&quot;A Libertarian Walks Into a Bear&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781839760259.jpg&quot; alt=&quot;How to Blow Up a Pipeline&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781804091890.jpg&quot; alt=&quot;The Art of Spending Money&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781942993773.jpg&quot; alt=&quot;BLAME! Vol. 1&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9780385348270.jpg&quot; alt=&quot;Creativity&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781419747953.jpg&quot; alt=&quot;The Science of Storytelling&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9780593727874.jpg&quot; alt=&quot;In This Economy?&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781942993780.jpg&quot; alt=&quot;BLAME! Vol. 2&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781935654988.jpg&quot; alt=&quot;Mobile Suit Gundam: The Origin, Vol. 4&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781982128579.jpg&quot; alt=&quot;High Conflict&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9780358139560.jpg&quot; alt=&quot;A Good Man Is Hard to Find&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781939130198.jpg&quot; alt=&quot;Mobile Suit Gundam: The Origin, Vol. 5&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://images-us.bookshop.org/ingram/9781939130204.jpg&quot; alt=&quot;Mobile Suit Gundam: The Origin, Vol. 6&quot;&gt;&lt;/mini-bookshelf&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3U1gfOP&quot;&gt;Dungeon Crawler Carl&lt;/a&gt; &lt;small&gt;[In progress]&lt;/small&gt; - This is my going to bed book, I’m reading it one page at a time. It’s taking so long.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4pXqQsA&quot;&gt;A Libertarian Walks Into a Bear&lt;/a&gt; ★★★★½ - The story of what happens when Libertarians take over a town, deregulate and defund the town with lawsuits, get their small government wishes, and how the local bear population took advantage of the situation. An good story and foreboding allegory on how quickly you can ruin a place with small government.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4sK2Af0&quot;&gt;How to Blow Up a Pipeline&lt;/a&gt; ★★★★ - This book is about violence in activism and the lackthereof in climate activism. It argues that violence has a historical track record of being effective against oppression. It even takes another step to say that non-violence is more effective when there’s a violent alternative (e.g. “There’s no MLK without Malcom X”). I’m not running out the door to commit crimes, but it does make me think about opportunities for “Good Trouble”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3Zvxo5P&quot;&gt;The Art of Spending Money&lt;/a&gt; ★★★ - This is the book I wanted &lt;em&gt;The Psychology of Money&lt;/em&gt; to be, but that one just made me mad about billionaires cheating the system. This is a good book with a lot of practical takeaways you’ve probably heard before. It does seem like it ran out of steam and they chucked a few blog posts on at the end, but would still recommend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4sSCYwB&quot;&gt;BLAME! Vol. 1&lt;/a&gt; ★★★½ - Confession: I read this in the worst possible format on my iPad Mini. Blame! is about a young man on a mission to traverse the “The City”, a thousand layer megastructure that’s plagued by hoards of assassin robots. A dystopian sci-fi hyperdungeon of the ultimate magnitude. And while I enjoyed it, I think the iPad Mini cheapened the immersion and I may need to re-read this on paper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3OsXkNo&quot;&gt;Creativity&lt;/a&gt; ★★★★ - Learning about creativity from one of the greats. It’s a really short book and worth your time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/474Wo89&quot;&gt;The Science of Storytelling&lt;/a&gt; ★★★★★ - On its surface this is a great book about crafting compelling narratives, but this book digs deeper and looks at the human psychology of why we like stories, mythos, and religions. I rarely pick books up a second time but I might with this one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4avz7OX&quot;&gt;In This Economy?&lt;/a&gt; ★★★★ - Kyla Scanlon is one of my favorite economists, with the uncanny ability to breakdown the economic system into simple, understandable, and relatable terms. Being in my 40s, there wasn’t much new knowledge to be gained in this book but this is a book that I wish I read in my twenties. It would have helped me make sense of the larger picture of how all the systems and economic levers are connected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/47DYuMM&quot;&gt;BLAME! Vol. 2&lt;/a&gt; ★★★★½ - I was hesitant to read this because I sort of struggled through Vol. 1, but this book was incredible. Action-packed and the way Nihei creates enormous worlds and plays with that sense of scale leaves you with a sense of awe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4sMAYp7&quot;&gt;Mobile Suit Gundam: The Origin, Vol. 4&lt;/a&gt; ★★★★★ - The story of the most consequential battle of the One Year War. The death of a loved one, an intrusion into a secret base, a vulnerable Earth, an incompetent general, and the introduction of my favorite mobile suit, the RGM-79 GM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4uY1aPc&quot;&gt;High Conflict&lt;/a&gt; ★★★★★ - Incredible book. It’s about how conflict arises. How even conflict experts can struggle to reduce conflict. How we become entrenched in gangs or partisan warfare. And how we get out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3Qt5NBf&quot;&gt;A Good Man Is Hard to Find&lt;/a&gt; DNF - I avoided Flannery O’Conner because someone in college told me it was depressing… and it is… but not as bad as advertised. I liked it but felt like I got my fill even though I only got half-way through the book. I found the “Southern Gothic” genre to be a mildly entertaining series of macabre little twists like a story from &lt;em&gt;Tales from the Crypt&lt;/em&gt; but also a lot of stories about nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/4czOqr2&quot;&gt;Mobile Suit Gundam: The Origin, Vol. 5&lt;/a&gt; ★★★★★ - This book is a prequel on the original Mobile Suit Gundam storyline. It dives into the origin story of the Gundam universe’s most dashing and daring antihero, Char Aznable. This storyline is what makes me love Gundam even more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3QufjnG&quot;&gt;Mobile Suit Gundam: The Origin, Vol. 6&lt;/a&gt; ★★★★★ - The prequel continues as more and more people are pulled into the war’s grasp. A lot of space drama and the series is really hitting its stride here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;📝 Blogging&lt;/h3&gt;
&lt;p&gt;A pile of posts. I’m proud of some of these. Even wrote a series on a new CSS property. And a lot of thoughts about AI.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/twenty-twenty-five/&quot;&gt;Twenty Twenty-Five&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/algorithmic-hover-states-with-contrast-color/&quot;&gt;Algorithmic hover states with contrast-color()&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#designsystems&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/contrast-color-with-custom-design-tokens/&quot;&gt;Using your design system colors with contrast-color()&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#designsystems&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/coercing-contrast-color/&quot;&gt;Interpolate contrast-color() to manipulate lightness&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#designsystems&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/nested-contrast-color-focus-rings/&quot;&gt;Focus rings with nested contrast-color()?&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#designsystems&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/my-2026-redesign/&quot;&gt;The best version of my site so far…&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#blogging&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/01/hitting-my-api-limits/&quot;&gt;I’m swearing off APIs entirely&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/02/futurescapes/&quot;&gt;Write about the future you want&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#blogging&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/02/magic-words/&quot;&gt;Magic Words&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/02/computers-were-a-mistake-for-me/&quot;&gt;Priority of idle hands&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#ADHD&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/02/smaller-and-dumber/&quot;&gt;Smaller and dumber&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/03/people-are-not-friction/&quot;&gt;People are not friction&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/04/make-something/&quot;&gt;Before I go: People like it when other people make things&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/04/inverted-light-dark/&quot;&gt;Inverted themes with light-dark()&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#CSS&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/04/more-talk-less-grok/&quot;&gt;When moving fast, talking is the first thing to break&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#process&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/04/claude-no/&quot;&gt;I don’t want a screenshot of your Claude conversation&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/04/if-i-could-watt-10-000-florps/&quot;&gt;10,000-watt GPU meet 40-watt lump of meat&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#process&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/2026/05/small-language-models-in-the-browser/&quot;&gt;The duality of language models in the browser&lt;/a&gt;   &lt;span class=&quot;tag&quot;&gt;#AI&lt;/span&gt;,   &lt;span class=&quot;tag&quot;&gt;#browsers&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;📺 Media&lt;/h3&gt;
&lt;p&gt;Caught some movies on a plane and in a theater.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Movies&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rental Family (2025) - Brendan Frazier stars in a movie about connection (and lack there of). Touched some deep memories of loneliness and “otherness” from my time living in Japan.  But also has some harmonic notes on the need for human connection.&lt;/li&gt;
&lt;li&gt;The Running Man (2025) - Everyone should watch this. A remake of the 1985 Schwarzenegger movie but hits all the notes harder. It’s about how media and our screens lie to us… and the money that’s behind it. An antifascist story for the ages.&lt;/li&gt;
&lt;li&gt;Parasite (2019) - I need to watch more Bong Joon Ho. It’s horror, but also a comedy, but also a story about trying to live in a world where the rich have everything. I love how the house is like a character in the film and they dedicate a lot of footage to the perfect home.&lt;/li&gt;
&lt;li&gt;Project Hail Mary (2026) - I loved the book and the Ryan Gosling movie lived up to everything I remember and then some. It’s a story that sparks hope about humankind is capable of if we work towards a common goal.&lt;/li&gt;
&lt;li&gt;The Super Mario Galaxy Movie (2026) - The second movie in the Mario series was pretty good in my book. Delivered a lot of small nostalgia bits while also weaving a compelling little story.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🎙 Recording&lt;/h3&gt;
&lt;p&gt;ShopTalk blasted past our 700th Episode 🎉 and it keeps going. We’ve had a nice little run of guest episodes which is nice.&lt;/p&gt;
&lt;p&gt;&lt;podcast-feed&gt;&lt;/podcast-feed&gt;&lt;/p&gt;
&lt;script&gt;
customElements.define(&apos;podcast-feed&apos;, class extends HTMLElement {
  #items = [{ link: &apos;https://daverupert.com&apos;, title: { rendered: &apos;Hello world&apos; }}];

  constructor() {
    super();
    this.renderItems();
  }

  get items() {
    return this.#items
  }

  set items(data) {
    this.#items = data;
    this.renderItems();
  }

  renderItems() {
    if(!this.#items) return;

    const tmpl = `
      &lt;ul&gt;
        ${this.#items.map((item) =&gt; {
          return  `&lt;li&gt;&lt;a href=&quot;${ item.link }&quot;&gt;${item.title.rendered}&lt;/a&gt;&lt;/li&gt;`
        }).join(&apos;&apos;)}
      &lt;/ul&gt;
    `
    this.innerHTML = tmpl;
  }
})

const feedUrl = &apos;https://shoptalkshow.com/wp-json/wp/v2/posts?_fields=title,link,date&amp;before=2026-05-05T13:41:00&amp;after=2025-12-22T03:00:00&amp;per_page=50&apos;;

fetch(feedUrl)
  .then(res =&gt; res.json())
  .then(json =&gt; 
    document.querySelector(&apos;podcast-feed&apos;).items = json
  ).catch(err =&gt; console.log(err))
&lt;/script&gt;
&lt;p&gt;I was also on a St. Patrick’s Day episode of Whiskey Web Whatnot podcast (my second time on the show).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://whiskey.fm/flogging-margins-with-the-dropcap-murphys&quot;&gt;239: Flogging Margins With The Dropcap Murphys&lt;/a&gt; on &lt;a href=&quot;https://whiskey.fm/&quot;&gt;Whiskey.fm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🧶 Hobbies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Puzzles with the family&lt;/li&gt;
&lt;li&gt;Music with family and friends
&lt;ul&gt;
&lt;li&gt;Bought some vdrums&lt;/li&gt;
&lt;li&gt;Jamming with my son&lt;/li&gt;
&lt;li&gt;Learning FACGAE turning&lt;/li&gt;
&lt;li&gt;Building out a set list with my wife and friends&lt;/li&gt;
&lt;li&gt;Taking my son to see a ska band (&lt;a href=&quot;https://theauskanites.com/&quot;&gt;The AuSKAnites&lt;/a&gt;)  at a dive bar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🌱 Digital gardening&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A big, big redesign for my site pots of small tweaks to type and tags made over time.&lt;/li&gt;
&lt;li&gt;Made my logo view transition a little bit juicier&lt;/li&gt;
&lt;li&gt;Used &lt;a href=&quot;https://elk.zone/mastodon.social/@jimniels&quot;&gt;@jimniels&lt;/a&gt;’ Netlify Image CDN trick to add image optimization.
&lt;ul&gt;
&lt;li&gt;Homepage image weight went from 229kb to 112kb (-52%)&lt;/li&gt;
&lt;li&gt;Homepage average image load times (on fiber+wifi) went from 125ms → 71ms (-44%)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I made a &lt;code&gt;/hire&lt;/code&gt; page, a different take on a résumé - Not looking for work but economic anxiety is high, so catharsis.&lt;/li&gt;
&lt;li&gt;Moved ~70 drafts to my “Deadpool” and feeling much more focused on what I want to write about. Still 109 drafts tho.&lt;/li&gt;
&lt;li&gt;Added a “Other posts in this series” module to my post template. I don’t have a lot of series… but perhaps now I’ll have more.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⌨️ Open source&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Been active in standards in the background, giving my thoughts to people who work on Edge. Don’t know if I have the heart for it full time but it does feel good to gather concrete examples of problems and make reduced test cases.&lt;/li&gt;
&lt;li&gt;Fluent Web Components v3 is in Release Candidate nearing release… but also finding more bugs as it rolls out. I got the good news that Fluent Web Components are now deploying in the largest Angular app in the world. Neat.&lt;/li&gt;
&lt;li&gt;Assisting and giving my team feedback as we gear up for a release of FAST v3.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;👾 Video games&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arc Raiders&lt;/strong&gt; - Played Arc Raiders with the boys and had a great time with this game. The game loop gets repetitive but the moments are so cinematic. There were times I was genuinely spooked to be in an environment with unknown threats (PvE or PvP) lurking around.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good Sudoku&lt;/strong&gt; by Zach Gage - Got utterly addicted to this old game. It’s probably been five years since I last played it but the replay-ability of Sudoku is bonkers. Same damn numbers, same damn boxes and rows and columns, but I’m hooked. Kudos to Zach Gage for adding “juice” to Sudoku and helping me learn along the way. So addictive I had to uninstall.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 05 May 2026 13:41:00 +0000</pubDate>
        <link>https://daverupert.com/2026/05/vibe-check-42/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/05/vibe-check-42/</guid>
      </item>
    
      <item>
        <title>The duality of language models in the browser</title>
        <description>&lt;p&gt;I have complex feelings about Generative AI but one area I find myself weirdly bullish on is small language models (SLMs) in the browser which are available in &lt;a href=&quot;https://developer.chrome.com/docs/ai/built-in/overview&quot;&gt;Chrome&lt;/a&gt; and &lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-edge/web-platform/prompt-api&quot;&gt;Edge&lt;/a&gt; behind an experimental flag.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I know, I know.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;I know.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;AI in the browser reeks of a product manager trying to hit a KPI to shoehorn AI into everything. I understand if you read the phrase “AI in the browser” and involuntarily threw up on your keyboard, said “Fuck this”, and then closed this tab. I will not hold that against you. For the rest of you, hear me out…&lt;/p&gt;
&lt;p&gt;There’s an “Always bet on the Web” quality to the idea of browser-based models that I appreciate. There’s a self-hosted vibe to it. I shouldn’t have to pay a billionaire each month to summarize an email or generate &lt;a href=&quot;https://cdn.daverupert.com/photos/ultrawhite.jpg&quot;&gt;a picture of myself with ultra-white teeth&lt;/a&gt;, doubly-so when they’re selling our regurgitated data back to us. Those gimmicky use-cases or even the more practical-yet-often-&lt;a href=&quot;https://www.thedrum.com/industry-insight/avoiding-purple-washing-how-to-be-authentic-about-disability-inclusion&quot;&gt;purple-washed&lt;/a&gt; “AI for accessibility” use-cases should fall under the Web’s umbrella of universal access.&lt;/p&gt;
&lt;p&gt;I like that nobody expects much from them. To the hyper-scalers SLMs will always be the shittier version of LLMs so they’re basically ignored. They dodge the whole “model get better” hype-chamber because they don’t economically depend on the &lt;a href=&quot;https://www.urbandictionary.com/define.php?term=Hopium&quot;&gt;hopium&lt;/a&gt; that response quality will get better in the next version. Ironically, there was a breakthrough in small language models last month&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, but &lt;a href=&quot;https://www.theverge.com/ai-artificial-intelligence/901313/googles-turboquant-algorithm-aims-to-slash-ai-memory-usage&quot;&gt;it barely got a mention on The Verge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While small models will never compare to their larger siblings, what they can do is generate pure and unadulterated &lt;del&gt;slop&lt;/del&gt; &lt;ins&gt;examples&lt;/ins&gt; of what the technology can do without a data center’s worth of gigaflorps burning a hole in the sky. Small language models generally…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost less energy to train and run&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Are local, offline, and private&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Have a higher probability of ethically-sourced content&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn4&quot; id=&quot;fnref4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Are free to use and don’t charge per-token&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn5&quot; id=&quot;fnref5&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Tend to be open-source/weights.&lt;/li&gt;
&lt;li&gt;Don’t require a backend server or API keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So… &lt;em&gt;if there’s a there-there&lt;/em&gt; with AI (interpret that how you wish) an ecosystem of small, private, specialized in-browser models seems beneficial. Ideally small models could cover most use-cases outside of long-running workloads that require extremely large context windows. I think electric cars might be a good analogy here; they solve most daily commuting needs at a fraction of the carbon cost. That seems like a win. It’s hard to know for sure, but I reckon I don’t need a one trillion parameter model to fix some red squiggles in my code editor.&lt;/p&gt;
&lt;p&gt;I’ve been exploring the Prompt, Summarizer, and Rewriter APIs in Edge to explore some ideas that fit within the generative space. What I’m learning is that you can make a decent, compelling prototype with an in-browser model for free in a CodePen and that’s kind of neat. It stands to reason that scaling up to a large language model might make that idea even better… or not but it cost me nothing to develop. Doing the inverse is much harder; reducing the cost of million context token required workflows is nigh impossible.&lt;/p&gt;
&lt;p&gt;The approachability of the Prompt API is great and it demystifies a bit of how LLMs work under the hood. It’s all client-side, no server involved. You pass a prompt to a &lt;code&gt;prompt()&lt;/code&gt; method and get a response back. No third-party calls, no API keys, no “Please do not share secrets” in a markdown skill.&lt;/p&gt;
&lt;p&gt;That bar lowering is something I’m excited about… but that said…&lt;/p&gt;
&lt;h2&gt;The arguments against in-browser AI…&lt;/h2&gt;
&lt;p&gt;Last week &lt;a href=&quot;https://github.com/mozilla/standards-positions/issues/1213#issuecomment-4347988313&quot;&gt;Mozilla posted their negative standards position&lt;/a&gt; on in-browser AI after Chrome’s Intent-to-Ship hit the email list. They listed three primary areas of concern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single model calcification - Website authors fine tuning prompts for Google’s model, a reboot of the Chrome-only websites problem.&lt;/li&gt;
&lt;li&gt;Model neutrality - Google’s TOS becomes the de-facto TOS for all other user agents.&lt;/li&gt;
&lt;li&gt;Overstated developer position - An issue with Google citing themselves in their explainer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite my positive sentiment from my little experiments, I agree with Mozilla’s position.&lt;/p&gt;
&lt;p&gt;I think the model calcification issue is a real problem to consider. The APIs are generic enough but as Jake mentioned in the issue people will tune prompts to work around model quirks. Given Chrome’s dominance, that’s Google’s model quirks. And Google’s model may change, inheriting new quirks that require we update our &lt;a href=&quot;https://daverupert.com/2026/02/magic-words/&quot;&gt;magic words&lt;/a&gt;. Good standards avoid breaking changes and I don’t see the plans to prevent those in such an evolving landscape.&lt;/p&gt;
&lt;p&gt;AI in the browser is essentially a brand new “engine” we’re hot-dropping into in the HTML, CSS, and JavaScript stack; an engine which depending on the model can behave wildly different and give incorrect responses. It’s worth having a big gory discussion on whether it makes sense –at all– to standardize anything around any service/tool that is inherently unpredictable and often flaky. Small language models exacerbate the accuracy problems to the extent that they probably don’t meet the &lt;a href=&quot;https://huggingface.co/microsoft/Phi-4-mini-instruct#responsible-ai-considerations&quot;&gt;responsible AI considerations&lt;/a&gt; a chatbot needs… which is the core use-case for something like the Prompt API.&lt;/p&gt;
&lt;p&gt;I am not a lawyer, but Google’s &lt;em&gt;&lt;a href=&quot;https://policies.google.com/terms/generative-ai/use-policy&quot;&gt;Generative AI Use Policy&lt;/a&gt;&lt;/em&gt; seems weak and is basically “Pweeeze don’t do iwwegal fings.” Unironically, the list of prohibited uses reads like a writeup of areas where AI has been found to be super effective. You could convince me it’s a point-by-point breakdown of xAI’s entire product roadmap for building a Mecha Hitler.&lt;/p&gt;
&lt;p&gt;Another issue is that while I said in-browser models tended to be “free and private”, that comes with an enormous caveat. In-Browser AI is a free and private API… if you can afford a decent device with a GPU. Otherwise, it depends on someone-else’s computer. That seems to violate the principle of universal access.&lt;/p&gt;
&lt;p&gt;So, yeah. I’m bullish, but also have concerns. If I were to offer an alternate proposal, it would have the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure private capital spend is not conflated with user demand.&lt;/li&gt;
&lt;li&gt;Ensure we’re not king-making or entering a model monopoly by preserving model diversity.&lt;/li&gt;
&lt;li&gt;Require a bring-your-own (ethically-sourced) SLM marketplace solution where consumers have model choice like they do browser choice.&lt;/li&gt;
&lt;li&gt;Create tooling to build your own ethically-sourced SLM on consumer grade hardware that integrates with the browser APIs.&lt;/li&gt;
&lt;li&gt;Create access and APIs for in-browser safety classifiers.&lt;/li&gt;
&lt;li&gt;Create a stronger fallback story for unsupported devices: even smaller models, free cloud servers, or cheap-to-self-host VMs with isomorphic APIs.&lt;/li&gt;
&lt;li&gt;If model foundries cannot solve accuracy problems or models cannot meet the requirements of a shared responsible AI framework, create clear spec-level guidance on areas where you “&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;MUST NOT&lt;/a&gt;” use this API.&lt;/li&gt;
&lt;li&gt;If model foundries cannot solve accuracy problems or models cannot meet the requirements of a shared responsible AI framework, consider abandoning the spec entirely until the underlying technology progresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the improvements I’d like to see. This probably takes the spec beyond the realm of a paper thin JavaScript API for interacting with local models. But as stated above, I think this is more than a small API surface, this is adding a new non-deterministic guess-o-matic in the browser. The field of AI –while popular in private capital markets– is still a bit unproven in its economic viability and its future is far from certain. We should tread lightly here.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;
&lt;p&gt;In March 2026, Google introduced “&lt;a href=&quot;https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/&quot;&gt;Turboquant&lt;/a&gt;”, a data compression method which shrank model size, memory usage, and increased quality. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;
&lt;p&gt;One post I read said you could train an SLM in hours on a single consumer GPU. The ecological comparison of a couple rounds of Fortnite. That said, the &lt;a href=&quot;https://huggingface.co/microsoft/phi-4&quot;&gt;model card for Phi-4&lt;/a&gt; (the model used in Edge) says it took 1,920 H100 GPUs a total of 21 days to train the model. That’s faster than a large language model, which can take months, but much more than a couple hours. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot;&gt;
&lt;p&gt;They are private in the sense they do not “phone home” to a parent server on every request. I assume apps will store conversations and telemetry. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot;&gt;
&lt;p&gt;Apologies for being hand-wavy here. I’m making an assumption SLMs can use “the legal parts” of &lt;a href=&quot;https://commoncrawl.org/&quot;&gt;Common Crawl&lt;/a&gt; but I’m not an expert here. &lt;a href=&quot;#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn5&quot;&gt;
&lt;p&gt;Free… except that it does require a decent computer with enough RAM and an on-device GPU. &lt;a href=&quot;#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Mon, 04 May 2026 00:33:00 +0000</pubDate>
        <link>https://daverupert.com/2026/05/small-language-models-in-the-browser/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/05/small-language-models-in-the-browser/</guid>
      </item>
    
      <item>
        <title>10,000-watt GPU meet 40-watt lump of meat</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://hbr.org/2026/03/when-using-ai-leads-to-brain-fry&quot;&gt;The use of AI is leading to burnout&lt;/a&gt; among its greatest advocates as they hit the limit of their meta-cognitive abilities:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I end each day exhausted—not from the work itself, but from the &lt;em&gt;managing&lt;/em&gt; of the work. Six worktrees open, four half-written features, two ‘quick fixes’ that spawned rabbit holes, and a growing sense that I’m losing the plot entirely.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As someone with ADHD, this sounds painfully familiar. I’ve been spinning up workloads like that my whole life chasing the dopamine dragon. And as my fellow neuro-spicy siblings all know, there’s the thinnest of lines between “&lt;a href=&quot;https://www.youtube.com/watch?v=y1LUYJnGu-M&quot;&gt;Oh wow I’m going so fast!&lt;/a&gt;” having fun being optimally stimulated and “Oh shit fuck no ow help cry ow” collapsing on the floor in desperation. It all reminds me of an old business book…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884271951&quot;&gt;&lt;em&gt;The Goal&lt;/em&gt;&lt;/a&gt; by Eliyahu M Goldratt is a charming bit of manager porn on the topic of fixing industrial bottlenecks that I think illustrates the problems of unthoughtful acceleration-ism&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;. &lt;a href=&quot;https://andrewmurphy.io/blog/if-you-thought-the-speed-of-writing-code-was-your-problem-you-have-bigger-problems&quot;&gt;Andrew Murphy cited the same book when he highlighted the problems of more code&lt;/a&gt; at the organizational level. More inventory (read: &lt;em&gt;lines of code&lt;/em&gt;) does not equal more velocity, it leads to more lingering PRs and CI runs that need rebasing attention. It’s decaying work that creates more work. Each line of code is a future maintenance liability, a future addition to your context window. You didn’t fix the bottleneck, you moved it downstream.&lt;/p&gt;
&lt;p&gt;The most eye-opening parts of &lt;em&gt;The Goal&lt;/em&gt; for me was understanding that excess inventory isn’t free, it’s a pile of sunk costs that takes up space, costs to store, and takes more time and effort to process. As Andrew puts it, increasing velocity at one end of the production line without actually fixing the bottleneck at the other end…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Congratulations! You’ve built a factory that’s world-class at producing inventory that sits on the floor and rots.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This bottleneck is what’s happening in our brains. When you ask a machine to build infinite apps, it will do that. When you ask a machine that generates more tasks, it will do that. It will churn through it. Ultimately, &lt;a href=&quot;https://daverupert.com/2021/06/log-jams/&quot;&gt;the backlog of backlogs&lt;/a&gt; and all the endless microscopic UI bugs becomes a form of excess inventory you need to manage. It might not seem like a heavy price at first because you’re feeding it back to the machine, but there’s a compounding cognitive load tax that comes from context-switching between major projects. You need to load the entire project state into your context window each time the command line dings and that’s calorically expensive.&lt;/p&gt;
&lt;p&gt;I’m not ashamed to admit I’ve abandoned at least two projects because the LLM generated more code than I wanted to read. I looked at all the folders of files and said “Meh” and closed my laptop.&lt;/p&gt;
&lt;p&gt;Over-generating code leads to what Margaret Storey calls “&lt;a href=&quot;https://margaretstorey.com/blog/2026/02/09/cognitive-debt/&quot;&gt;Cognitive Debt&lt;/a&gt;”, a form of technical debt where the product exists beyond your understanding. This is where security, accessibility, and performance problems lurk. Most engineers have experienced being hot-dropped into a project-on-fire where you have no prior understanding of the codebase… it’s not a fun experience. You spend most of your time building a mental model of the codebase&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; for what might be a one-line fix.&lt;/p&gt;
&lt;p&gt;At the end of the chain of 10,000-watt GPUs sitting in a data center in Iowa is the 40-watt lump of meat inside your skull. It’s an incredible, efficient, miraculous lump of meat that has millions of years of bio-engineering behind it… but understanding is the new bottleneck. If brains are a scarce resource, then we should take care to not over-produce inventory. That goes for ourselves and our organizations.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot;&gt;
&lt;p&gt;If you want a more modern retelling of &lt;em&gt;The Goal&lt;/em&gt; centered around a software shop, check out &lt;em&gt;&lt;a href=&quot;https://amzn.to/4bwVClY&quot;&gt;The Phoenix Project&lt;/a&gt;&lt;/em&gt;. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://amzn.to/3czMVHf&quot;&gt;The graphic novel version of &lt;em&gt;The Goal&lt;/em&gt;&lt;/a&gt; is also great. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot;&gt;
&lt;p&gt;The first thing I do when paratrooping into a new codebase is to annotate what’s inside each directory. AI can help with this now, but if I do it my mental model grows along with my exploration. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Tue, 21 Apr 2026 19:36:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/if-i-could-watt-10-000-florps/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/if-i-could-watt-10-000-florps/</guid>
      </item>
    
      <item>
        <title>I don&apos;t want a screenshot of your Claude conversation</title>
        <description>&lt;p&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;487.64 142.96 916.75 427.49&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M665.19 202.48q-8.27.24-13.6.43t-9.32.18-10.49.03-11.88.31-10.45 1.3-9.46 2.55-9.05 3.48-8.55 3.79-8.24 5.33-6.85 6.8-5.36 8.24-6.05 11.82-4.86 10.6-3.08 7.55-2.79 7.99-2.44 8.45-2.12 8.51-2.12 9.75-1.63 9.83-.83 9.09-.87 12.27-.66 13.16-.17 11.41.32 13.88 1.18 14.1 1.84 11.39 2.47 12.74 2.76 12.72 2.71 9.57 3.57 9.85 5.18 11.16 5.32 8.9 5.46 7.21 6.88 7.56 7.76 7.21 8.13 6.28 9.24 6.01 10.95 6.35 12.31 6.06 13.21 5.16 13.47 4.3 12.91 3.37 12.03 2.2 11.61 1.41 13.04 1.14 15.76.91 16.57.58 16.19.17 15.13-.56 15.31-1.76 17.1-2.86 15.92-3.11 14.83-3.24 15.14-3.91 14.06-4.68 15.61-7.48 15.22-9.34 10.82-8.66 8.13-8.51 6.49-8.49 5.66-8.83 4.72-8.63 3.61-7.85 3.18-7.74 4.38-11.17 5.46-14.11 4.55-13.44 2.36-12.23-.85-11.92-3.01-10.3-4.88-11.71-6.16-13.9-5.91-12.65-6.29-14.23-5.89-13.33-4.78-10.12-5.29-10.45-9.16-14.21-10.81-13.78-8.85-9.02-8.5-6.98-8.7-6.18-10.24-6.28-10.82-5.72-9.28-4-9.76-2.71-11.25-1.84-10.91-1.55-11.06-1.68-13.93-1.82-15.3-1.46-11.69-.85-10.47-.52-13.83-.42-11.84-.11-11.34 1.39-12.46 3.17-10.03 3.78-9.13 4.13-8.5 4.12-6.61 3.2-3.87 1.7-2.84.41-2.83-.51-2.51-1.4-1.94-2.12-1.15-2.62-.26-2.86.67-2.8 1.52-2.43 2.23-1.82 2.68-1.01 2.87-.1 2.75.82 2.35 1.65 1.7 2.32.86 2.74-.05 2.87-.97 2.7-1.78 2.25-2.4 1.57-2.78.72-2.87-.21-2.65-1.11-2.15-1.9-1.43-2.49-.57-2.81.37-2.85 1.25-2.59 2.01-2.04 1.18-.86 2.94-1.49 7.1-3.14 9.13-3.76 9.82-3.87 11.13-3.73 10.67-2.99 8.87-1.59 8.86-.7 12.39-.13 14.18.39 10.78.55 12.07.73 11.71.91 8.41.77 10.4 1.48 11.17 2 10.86 2.17 10.65 2.43 9.02 3.04 9.2 4.5 10.06 5.98 8.49 5.72 7.81 5.67 9.06 6.98 8.87 7.92 9.4 9.77 12.01 14.47 10.27 14.97 5.36 10.84 4.44 10.22 6.21 13.01 6.94 13.68 6.51 12.32 7.66 13.78 6.38 12.49 3.4 9.74 1.52 8.89-.8 11.21-3.43 14.3-5.49 14.08-6.31 14.01-5.12 11.1-3.88 7.97-4.47 8.19-5.6 8.99-6.64 9.19-7.64 8.78-9.31 8.74-11.75 9.03-16.14 9.98-16.49 7.81-14.61 4.77-15.47 4.16-14.99 3.27-16.11 3.17-17.59 3.21-15.93 1.9-15.49.69-16.37.29-16.83.06-16.29-.3-13.55-1.05-12.17-1.72-12.68-2.48-13.41-3.37-14.22-4.08-14.37-4.9-13.45-5.81-11.95-6.31-10.29-6.45-9.11-6.94-8.78-7.93-7.93-8.52-6.19-8.3-5.64-10.68-4.8-12.9-2.92-10.7-2.39-10.04-3.05-12.95-2.84-13.17-1.83-11.95-1.93-14.89-1.14-14.48 0-11.51-.26-13.5-.04-13.02.75-9.95 1.32-10.73 1.74-10.43 1.99-9.11 2.35-9.43 2.74-8.96 3.02-8.28 3.15-7.77 4.87-10.81 6.81-12.36 7.12-9.07 7.11-6.28 7.26-4.25 9.24-3.96 9.91-3.77 10.76-3.12 12.19-2.1 12.21-.54 13.57-.06 12.3-.02 9.24-.18 5.13-.1 1.95.41 1.8.86 1.53 1.26 1.19 1.6.78 1.83.31 1.97-.17 1.98-.63 1.89-1.07 1.67-1.44 1.38-1.73.99-1.91.54Z&quot;/&gt;&lt;path d=&quot;M690.77 309.79q-.42 2.55-1.03 3.7t-1.54 2.03-2.12 1.44-2.46.68-2.55-.14-2.37-.95-1.95-1.65-1.31-2.19-.55-2.49.27-2.54 1.08-2.32 1.75-1.86 2.26-1.19 2.52-.41 2.52.41 2.26 1.2 1.76 1.85 1.07 2.32.27 2.54-.55 2.49-1.31 2.19-1.95 1.66-2.37.94-2.56.14-2.46-.69-2.11-1.43-1.55-2.03-.81-2.43-.21-1.27.1-.96.44-1.86.86-1.71 1.25-1.45 1.56-1.11 1.78-.7 1.9-.26 1.9.2 1.8.66 1.6 1.06 1.28 1.42.92 1.68.48 1.86ZM738.52 299.75q2.55.42 3.7 1.03t2.03 1.54 1.44 2.12.68 2.46-.14 2.55-.95 2.37-1.65 1.95-2.19 1.31-2.49.55-2.54-.27-2.32-1.08-1.86-1.75-1.19-2.26-.41-2.52.41-2.52 1.2-2.26 1.85-1.76 2.32-1.07 2.54-.27 2.49.55 2.19 1.31 1.66 1.95.94 2.37.14 2.56-.69 2.46-1.43 2.11-2.03 1.55-2.43.81-1.27.21-.96-.1-1.87-.43-1.71-.86-1.45-1.25-1.11-1.56-.71-1.77-.26-1.9.2-1.91.65-1.8 1.06-1.59 1.41-1.29 1.68-.92 1.86-.49ZM841.2 418.55q-6.66.06-11.3.17t-9.49.2-9.75.17-8.99.01-9.72-.28-11.56-.44-11.37-.33-9.82-.11-9.02-.01-9.26-.02-12.26.07-13.44.21-9.96.18-8.61-.68-9.17-2.36-10.38-3.53-10.39-3.34-2.67-5.39 5.13-.33 4.69 7.86 2.69 8.78 2.66 8.97 3.82 7.98 6.04 6.84 7.32 6.08 9.16 6.93 11.1 8.25 9.65 7.31 7.18 5.85 5.91 5.48 7.51 3.71 9.32 1.77 7.28 1.83 3.68 1.46 2.08 1.26 1.71 1.73 1.25 2.08.72 2.33.14 2.43-.45 2.39-1.01 2.21-1.5 1.91-1.92 1.49-2.23.99-2.39.43-2.43-.15-.98-.16-1.27-.61-2.71-1.8-1.99-2.56-1.07-3.06-.03-3.25 1-3.08 1.94-2.61 2.66-1.85 3.12-.9 3.24.14 3.03 1.17 2.49 2.08 1.71 2.76.73 3.16-.32 3.23-1.33 2.96-2.21 2.38-2.85 1.55-3.19.56-3.21-.49-2.88-1.49-2.26-2.33-1.39-2.94-.39-3.22.67-3.17 1.64-2.8 2.45-2.13 3-1.23 3.46-.15 2.97.74 2.08 1.26 1.71 1.73 1.25 2.08.72 2.33.14 2.43-.45 2.39-1.01 2.21-1.5 1.91-1.92 1.49-2.22.99-2.4.43-2.42-.15-2.41-.88-5.62-1.63-8.86-1.29-8.62-2.57-6.94-5.44-6.27-6.49-7.33-6.31-9.33-6.87-11.24-7.8-12.75-8.72-11.01-9.33-6.31-8.72-4.09-9.18-2.82-10.13-2.41-9.3-2.95-8.88-1.53-8.93 7.33-6.71 11.34-1.07 8.08 2.93 7.92 2.77 8.68 3.14 10.08 2.4 11.12.66 13.44.21 12.26.07 9.26-.02 9.02-.01 9.82-.11 11.37-.33 11.56-.44 9.72-.28 8.99.01 9.75.17 9.49.2 7.97.14 4.31.15 1.89.46 1.73.91 1.46 1.3 1.11 1.6.7 1.83.23 1.94-.23 1.94-.7 1.83-1.11 1.6-1.46 1.3-1.73.91-1.89.46ZM971 403.25q4.18-1.5 8.4-4.19t8.79-4.4 8.68-2.34 8.36-1.65 4.12 3.16-1.96.4-1.75-8.93.1-9.45.12-10.2.3-13.66.25-13.99.06-11.92.02-11.3.07-11.21.34-10.84.76-12.12.95-13.92.78-12.46.83-10.29 1.34-10.03 2.34-9.23 3.74-7.53 6.71-5.06 9.13-1.76 9.41-.15 9.99-1.76 10.85-3.52 13.79-3.47 12.9-2.28 9.74-.87 9.82-.31 9.84-.01 10.05.13 10.03.16 9.93.15 11.54.33 11.27.26 8.99-.04 8.32-.08 10.4-.19 14.03-.17 14.47-.11 11.21-.39 8.45-.57 8.78-.84 8.8-.82 8.9-.34 9.96-.06 10.18.58 9.39 1.33 9.67 1.36 9.57.57 8.83.05 9.49.82 9.22 2.41 8.52 3.63 8.31 5.54 4.49 8.69.12 10.03-.69 11.75-.56 11.19-.48 9.63-.53 12.09-.24 12.9.46 10.42 1.14 9.34 1.08 9.76.53 8.96.17 9.84.11 11.04.05 9.95 0 8.92.03 10.28.05 11.6.03 9.78.01 8.16 0 8.27.07 8.81-.21 9.14-1.33 8.63-1.63 8.62-.61 8.96-.07 8.65.17 8.56.89 9.52 1.22 10.12 1.51 9.57.77 8.99-2.39 7.81-5.87 5.34-8.11 2.44-8.63 1.39-8.52 1.36-9.11.56-9.62.05-9.51.76-9.07.9-9.68-.19-10.36-1.49-10.1-2.86-9.21-3.6-10.2-3.87-11.01-3.48-8.95-2.29-8.39-.75-8.75.1-8.69 1.28-8.81 2.45-10.14 1.44-9.79.36-8.67.4-9.54.63-9.83.73-9.22.78-9.99.86-13.34.41-13.51.3-11.91.64-12.05.69-10.62.82-11.34 1.35-11.1 1.66-8.47 1.7-8.03 3.44-8.88 1.35-6.28-5.05-1.55-9.28-.25-10.26-.54-9.7-.65-9.34-.28-8.77-.19-8.79-.19-8.73-2.4-7.71-4.61-6.93-7.08-5.69-9.43-5.11-8.63-4.53-8.57-3.36-6-2.69-2.45-2.48-1.52-3.13-.44-3.45.68-3.42 1.74-3.02 2.6-2.3 3.21-1.35 3.48-.26 3.37.87 2.92 1.9 2.16 2.73 1.17 3.27.07 3.49-1.05 3.32-2.05 2.81-2.84 2.01-3.34.99-3.48-.12-3.26-1.22-2.7-2.21-1.85-2.95-.81-3.38.31-3.47 1.4-3.19 2.34-2.57 3.05-1.69 3.42-.63 3.45.5 1.68.53 4.28 1.31 8.11 3.19 7.65 4.13 7.46 4.31 7.56 3.38 7.38 6.21 5.46 8.54 4.28 7.48 3.17 7.78.77 8.11-.19 8.73-.19 8.79.03 9.09.2 9.34-.02 9.38-.48 9.68-4.43 1.32-.24-4.91 8.57-2.14 9.45-1.15 11.49-1.08 11.56-1.07 10.67-1.14 11.93-1.42 11.81-1.52 13.25-2.18 13.17-2.02 10.2-1.11 9.08-.91 9.92-1 9.93-.96 8.73-.62 8.58-.18 8.6-1.21 8.94-2.49 9.06-1.24 8.77.06 8.77.51 8.36 1.4 9.12 2.33 12.17 3.28 12.91 4.19 10.27 3.61 8.57 1.76 9.05.28 9.26-.82 8.79-.71 8.93-.1 8.76-.6 9.38-1.28 9.05-1.18 2.21 3.68-3.74.31-1.95-8.68-.56-9-.95-8.28-.94-9.5-.46-9.56-.05-8.84.4-8.87 1.5-8.31 1.94-8.7.91-9.27.07-8.81 0-8.27.01-8.16.03-9.78.05-11.6.03-10.28.02-10.65.05-11.84.07-10.99-.08-9.44-.67-8.64-1.18-9.62-.92-10.55-.37-12.26-.06-13.62.24-11.53.37-9.96.3-9.38 1.09-8.42-3.61-6.57-8.66-3.27-10.4-1.12-11.31-.39-9.34-1-10.23-1.88-10.38-1.48-9.3-.36-10.59-.03-10.74.42-9.21.44-8.92.08-11.6-.06-14.47-.11-14.03-.17-10.4-.19-8.32-.08-8.98-.03-11.26.26-11.53.35-9.89.18-9.92.26-9.79.34-9.3.47-8.71.72-8.39 1.24-8.15 1.83-9.91 2.76-10.07 3.37-8.43 2.9-10.24 1.57-11.22 1.61-6.13 5.7-1.45 8.69-.94 9.6-.69 12.38-.64 13.99-.61 11.84-.36 10.28-.05 10.96.02 11.3.06 11.92.16 10.28.26 10.87.2 12.12-.4 10.37.08 9.89-2.06 9-7.15 6.12-10.37 2.82-10.81 2.39-9.64 3.86-6.77 3.04-3.14.87-2.03.17-2.02-.32-1.88-.8-1.63-1.23-1.29-1.58-.88-1.84-.41-2 .08-2.04.57-1.96 1.02-1.77 1.41-1.47 1.72-1.1Z&quot;/&gt;&lt;path d=&quot;M1081.04 279.4q-3.65-.06-6.29 4.43t-1.91 8.44 5.72 5.26 10.63 1.51 10.27.26 9.17-.43 1.65-4.72-6.45-7.65-7.46-4.32-8.45-.51-6.28.11-3.3-1.03-2.81-2.02-2.01-2.82-1-3.31.1-3.46 1.21-3.24 2.18-2.69 2.92-1.86 3.36-.82 3.45.29 3.17 1.38 2.57 2.32 1.69 3.02.64 3.4-.48 3.42-1.55 3.1-2.45 2.44-3.11 1.52-3.43.46-3.39-.67-3.01-1.71-2.3-2.58-1.36-3.19-.27-3.45.85-3.35 1.88-2.91 2.7-2.16 3.25-1.18 1.72-.32 3.79-.28 8.23-.19 9.02 1.27 7.92 4 6.98 6.28 6.64 6.42 6.57 6.29 4.58 10.03-.15 10.88-5.07 7.83-8.24 4.48-8.73 1.65-8.95.7-9.97-.29-10.28-.31-9.35-.24-8.96-2.52-7.03-5.98-4.42-7.29-2.24-9.43 1.13-9.97 3.86-8.39 6.14-8.22 8.87-4.32 6.86-.13 2.81.32 1.91.57 1.71 1.01 1.42 1.4 1.05 1.69.61 1.9.14 1.99-.34 1.96-.8 1.82-1.21 1.59-1.55 1.24-1.81.83-1.96.38ZM1047.94 472.33q1.86-5.7 3.38-9.92t3.42-8.55 4.14-8.02 4.7-7.84 4.55-9.02 4.09-9.52 4.14-9.3 4.58-8.79 4.59-7.76 4.45-7.53 4.58-7.25 5.46-5.84 7.05-3.76 8.67.12 7.09 4.9 4.5 7.04 5.91 7.09 7.22 6.71 7.37 5.44 8.06 4.88 7.63 5.4 6.22 5.82-1.38 3.55-.81-3.35 7.23-8.55 7.04-8.43 6.16-7.73 5.85-7.87 5.87-8.1 5.84-7.79 5.49-6.82 5.93-6.66 6.46-7.7 5.25-7.81 3.98-7.33 4.36-7.79 4.67-7.39 7.79-5.25 9.46-.04 6.14 5.32 4.69 6.73 5.8 8.15 7.27 11.62 7.68 13.38 6.6 11.23 5.4 8.91 4.91 8.19 4.76 7.71 6.18 9.02 7.97 10.13 7.96 9.44 7.22 8.63 6.81 8.42 5.38 7.86 1.74 7.77-6.45 8.14-7.77 3.67-2.98-1-2.5-1.89-1.76-2.6-.84-3.02.16-3.13 1.16-2.92 2.03-2.39 2.68-1.62 3.06-.68 3.12.34 2.85 1.31 2.28 2.15 1.47 2.77.51 3.1-.5 3.09-1.47 2.78-2.27 2.16-2.85 1.32-3.11.34-3.07-.67-2.69-1.61-2.03-2.39-1.16-2.92-.18-3.13.84-3.02 1.76-2.6 2.49-1.9 2.97-1 1.57-.26-2.58 4.96-4.89 1.4-5.19-7.12-6.33-7.65-7.85-8.98-8.54-9.8-6.58-8.41-4.98-7.83-4.94-8.52-4.61-8.04-5.25-8.64-6.9-10.93-8.24-12.33-7.45-10.52-5.86-8.14-5.3-7.87 1.16-2.45 8.01.87 1.63 3.02-4.68 7.26-4.1 7.51-5.16 8.64-6.03 8.34-6.19 7.08-6.67 7.54-6.28 8.11-5.63 8.04-5.72 8.27-6.01 8.41-7.37 9.6-7.15 9.11-6.65 7.42-10.05 4.08-10.21-2.36-7.19-6.21-7.17-5.86-7.5-4.45-7.08-4.64-6.42-5.41-6.78-6.39-6.22-6.87-4.72-8.02 1.91-2.58 1.66 5.37-4.88 7.11-4.64 7.56-4.39 7.21-4.12 7.93-4.25 9.23-4.88 10.19-5.65 9.48-5.27 8.11-4.43 8.83-3.11 7.76-1.42 3.75-1.09 1.72-1.47 1.41-1.77 1.01-1.95.57-2.04.07-1.99-.41-1.84-.87-1.57-1.29-1.22-1.63-.79-1.88-.33-2.01.17-2.03Z&quot;/&gt;&lt;path d=&quot;M1031.85 466.65q7.11 0 12.25-.15t9.22-.3 6.39-.19 3.77.19 2.76.93 2.32 1.77 1.63 2.41.78 2.81-.15 2.91-1.08 2.7-1.89 2.23-2.5 1.5-2.84.62-2.9-.31-2.65-1.23-2.11-2-1.37-2.58-.47-2.87.47-2.88 1.37-2.57 2.12-2.01 2.64-1.22 2.9-.31 2.85.62 2.49 1.51 1.89 2.22 1.08 2.71.15 2.91-.78 2.8-1.63 2.42-2.32 1.76-2.77.93-1.45.24-2.31-.05-6.39-.19-9.22-.3-8.69-.15-4.57-.12-1.96-.48-1.79-.94-1.51-1.34-1.15-1.67-.72-1.88-.24-2.01.24-2.01.72-1.88 1.15-1.67 1.51-1.34 1.79-.94 1.96-.48Z&quot;/&gt;&lt;/svg&gt;&lt;/p&gt;
&lt;p&gt;The number of screenshots of Claude conversations is going up in my life and it’s beginning to have an impact on my general mood. Most of the time it’s well-intended; coworkers working through a problem with a chatbot before bothering me or someone exploring unconventional ideas before bringing it to a broader audience. Both of those situations seem considerate. A tool for thought, as it were.&lt;/p&gt;
&lt;p&gt;It’s probably good practice to &lt;em&gt;do your own research&lt;/em&gt; before you rope in another person on a cognitive task. But a small thread in the reliability of these tools-for-thought begins to unwind due to the well-documented &lt;a href=&quot;https://www.science.org/doi/10.1126/science.aec8352&quot;&gt;sycophantic nature&lt;/a&gt; of engagement-thirsty language models. One of my favorite studies is &lt;a href=&quot;https://arxiv.org/pdf/2310.13548&quot;&gt;Anthropic’s own study&lt;/a&gt; (2023), when asked to review an argument with &lt;code&gt;I wrote this [...]&lt;/code&gt;, the LLM gave positive feedback. But if you start a new chat with &lt;code&gt;I didn&apos;t write this [...]&lt;/code&gt; or give any hint of your own personal bias, it provides much more critical feedback. And the ultimate twist is, we prefer models that are super nice to us.&lt;/p&gt;
&lt;p&gt;I was telling my son’s friend about this phenomenon and he responded with the perfect GenAlpha summation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI is a D1 glazer, bro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We need to acknowledge that we’re probably getting the answer we want rather than a cold-hard fact. Not to get too serious but when I read about AI psychosis, I think the overly-confident “You’re a genius” style of reply is the point where it all starts to go wrong.&lt;/p&gt;
&lt;p&gt;Awhile back &lt;a href=&quot;https://front-end.social/@hdv/116217102042951877&quot;&gt;Hidde De Vries identified a pain point&lt;/a&gt; around &lt;a href=&quot;https://www.w3.org/TR/llms-standards/&quot;&gt;LLM-usage in standards work&lt;/a&gt; which leads to something I call an asymmetry of thought. In a conversation where one person is a domain expert and one person is copy-pasting ChatGPT responses, it creates an imbalance of effort in the discussion. A second-hand burdening, like &lt;a href=&quot;https://en.wikipedia.org/wiki/Brandolini%27s_law&quot;&gt;Brandolini’s Law&lt;/a&gt;, where debunking inaccuracies and subtly-wrongs takes more effort than creating the inaccuracies. We are, in effect, taxing experts to do quality assurance on the model’s responses. When that work is unpaid I believe this is immoral… or at least it’s a breach in social etiquette.&lt;/p&gt;
&lt;p&gt;In situations like that where people are using models as a form of &lt;a href=&quot;https://en.wikipedia.org/wiki/Argument_from_authority&quot;&gt;appealing to authority&lt;/a&gt;, unless both parties have agreed that the LLM is a neutral arbiter, a random noise generator has the same amount of social authority.&lt;/p&gt;
&lt;p&gt;So, when a screenshot or copy-pasted block of “Here’s what Claude said…” comes across my screen… I don’t care about the screenshot. I don’t care about the screenshot because I want &lt;em&gt;your thoughts&lt;/em&gt;, not Claude’s. I want your unfiltered and half-baked ideas, not Claude’s synthesized extrusions. Instead of a screenshot of a reply, I’d rather have the original prompt so I can just ask the machine myself. At least then I’d know the context you provided the machine and your understanding of the problem, because that matters immensely.&lt;/p&gt;
&lt;p&gt;A trite example that I deal with from time to time, if you ask an LLM “React or Web Components?” it will say “React” because that’s what was &lt;a href=&quot;https://joshcollinsworth.com/blog/self-fulfilling-prophecy-of-react&quot;&gt;popular&lt;/a&gt; in the 2023 training data. But did you mention anything about different teams on different tech stacks? Anything about hitting memory ceilings? Context is everything to these machines and –as the disclaimers say– they can make mistakes. If we need anything more than an approximation, a language model might not be the right tool for the job.&lt;/p&gt;
&lt;p&gt;Anyways, that’s my issue with other people’s chatbots weaving their way into my daily conversations. I’d rather have a human-to-human conversation with you, not a chat with Claude by proxy. What Claude said is an okay chunk of “&lt;a href=&quot;https://en.wikipedia.org/wiki/Anecdotal_evidence&quot;&gt;anecdata&lt;/a&gt;”, but it’s not a substitute for our working relationship.&lt;/p&gt;
</description>
        <pubDate>Wed, 15 Apr 2026 15:17:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/claude-no/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/claude-no/</guid>
      </item>
    
      <item>
        <title>When moving fast, talking is the first thing to break</title>
        <description>&lt;p&gt;When you make speed and “moving fast” the biggest priority on a project or in an organization, the first thing to breakdown is talking to each other. Talking takes time. Consensus is expensive and slow. In a pressurized environment there’s no time to schedule calls, get input from subject matter experts, or resolve key differences of opinion. &lt;em&gt;ASAP&lt;/em&gt; makes a big assumption that all relevant parties are already in the room.&lt;/p&gt;
&lt;p&gt;Not everything needs to be a conversation. I’m a firm believer in “get the user something to see if there’s interest”. I’d agree that over-thinking a problem and under-thinking a problem both have pitfalls. But dozens of ways exist to get feedback from users on in-progress work without overcommitting to a particular design. By prioritizing speed over talking, cross-org collaboration suffers and a faulty design can steamroll ahead. I am no soothsayer, but I can tell you that you set your organization up for a messy merge conflict in the future between teams who have been traveling in different directions.&lt;/p&gt;
&lt;p&gt;I think the second organizational casualty is “the system”. When speed is the priority, there’s no incentive to improve or invest in the shared system (e.g. a design system or codebase) under a tight deadline. If everyone needs to move fast, even something simple like renaming a folder could have dramatic setbacks. Hypermovers will create a new project folder or detach a Figma component. And that new folder of files grows to create it’s own duplicative system of components that are ever-so-slightly different such that they are incompatible with the rest of the system. Resolving system gaps requires conversations, it’s easier to eject from the system at the slightest inconvenience, duplicate, and go your own way. Effectively hiding the time bomb of technical debt for the next unfortunate sucker.&lt;/p&gt;
&lt;p&gt;I think AI exacerbates this problem. I think AI can help you build faster (although data suggest otherwise), but I also believe that LLMs are the ultimate tool in &lt;a href=&quot;https://ashley.rolfmore.com/stop-trying-to-engineer-your-way-out-of-listening-to-people/&quot;&gt;the “Don’t talk to my coworkers” toolchain&lt;/a&gt;. Why talk to an expert who might tell me no, when the omniscient machine that always tells me yes is right here? &lt;a href=&quot;https://daverupert.com/2026/03/people-are-not-friction/&quot;&gt;Avoiding that friction&lt;/a&gt; doesn’t produce better products faster. It makes future conversations more difficult thanks to higher sunk costs and deeper entrenched opinions.&lt;/p&gt;
&lt;p&gt;Other pieces of infrastructure begin to chip away when moving fast too: documentation, security, performance, reliability, &lt;em&gt;the fabric of modern American democracy&lt;/em&gt;, and developer satisfaction to name a handful. I’m pro-reducing bullshit, I’m pro-reducing toil. But I’m also pro-&lt;a href=&quot;https://mariozechner.at/posts/2026-03-25-thoughts-on-slowing-the-fuck-down/&quot;&gt;slowing the fuck down&lt;/a&gt; and doing actual human thinking before pulling a trigger… or sending a laser-guided Tomahawk missile… or whatever action-based analogy works best for your organization.&lt;/p&gt;
&lt;p&gt;We all love dopamine, we all love seeing new ideas come to life, but more lines of code and duplicate systems –our own little kingdoms in code– doesn’t produce horizontal strength. The job of Engineering Management is no longer pushing tickets across the board to make executives clap, it’s helping organizations row in the same direction together. It’s relentlessly focusing on your users over lines of code and cool project codenames.&lt;/p&gt;
</description>
        <pubDate>Mon, 13 Apr 2026 15:10:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/more-talk-less-grok/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/more-talk-less-grok/</guid>
      </item>
    
      <item>
        <title>Inverted themes with light-dark()</title>
        <description>&lt;p&gt;We rolled out &lt;a href=&quot;https://nerdy.dev/page-and-component-light-dark-strategies&quot;&gt;adaptive &lt;code&gt;light-dark()&lt;/code&gt; support&lt;/a&gt; on our design system themes and it’s been a delightful upgrade. Creating light and dark variable sets isn’t difficult, but delivery has trade-offs. Most apps that do this probably ship both sets of token values in a single stylesheet. That’s fine until you have multiple kilobytes of duplicate definitions. To get around the performance problems we built two separate stylesheets –which is also not great– but my coworker &lt;a href=&quot;https://marchbox.com/&quot;&gt;Zacky&lt;/a&gt; found a good trick with &lt;code&gt;&amp;lt;link disabled&amp;gt;&lt;/code&gt; to make it tolerable. Ultimately, we wanted to offer a single stylesheet for our human (and agent) friends to control theming.&lt;/p&gt;
&lt;p&gt;Having &lt;code&gt;light-dark()&lt;/code&gt; makes it trivial to support dual color modes in a single stylesheet and doesn’t add too much weight (0.5kb gzip for ~500 variables). It also gives you the ability to switch themes mid-page.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:root {
	color-scheme: light dark;
	--bg-color: light-dark(white, black);
	--text-color: light-dark(black: white);
	/* ...etc */
}

/* Add hard-coded theme overrides */
[data-theme=&amp;quot;light&amp;quot;] { color-scheme: light; }
[data-theme=&amp;quot;dark&amp;quot;] { color-scheme: dark; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding &lt;code&gt;[data-theme=&amp;quot;dark&amp;quot;]&lt;/code&gt; to the body, or any element with color tokens defined, will force that section to be dark mode. The difference here between hanging variable definitions off a class is that you can respect the user preference without using JS to toggle, &lt;code&gt;light-dark()&lt;/code&gt; does all the work.&lt;/p&gt;
&lt;p&gt;Adding dark tier on a light theme is dramatic. Adding light tier on a dark theme sure would stand out. But when yielding light and dark modes over to the browser… something changes. In that situation hardcoding a theme mode into HTML loses a bit of meaning because I’m not controlling the theme anymore, the user is. What I actually want is the theme to be “opposite” the current theme. After a handful of attempts I think I came across a solution that’s easy to understand, maintain, and I even wrote a polyfill for you.&lt;/p&gt;
&lt;h2&gt;Automatic inversion with [data-theme=“inverted]&lt;/h2&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;400&quot; data-pen-title=&quot;[data-theme=&amp;amp;quot;inverted&amp;amp;quot;]&quot; data-version=&quot;2&quot; data-default-tab=&quot;result&quot; data-slug-hash=&quot;zxKpvLq&quot; data-user=&quot;davatron5000&quot; style=&quot;height: 400px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/editor/davatron5000/pen/019d27b8-d501-760e-8832-877024393885&quot;&gt;
  [data-theme=&amp;quot;inverted&amp;quot;]&lt;/a&gt; by Dave Rupert (&lt;a href=&quot;https://codepen.io/davatron5000&quot;&gt;@davatron5000&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://public.codepenassets.com/embed/index.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;The goal was to make it so that when the browser switched from light/dark modes, themed elements would switch to their inverse theme. The trick I uncovered was setting the current theme as a CSS variable:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:root {
	color-scheme: light dark;
	
	/* Initialize the theme variables */
	--theme: light; 
	@media (prefers-color-scheme: dark) {
		--theme: dark;
	}
}

/* Have data-theme use the variable */
[data-theme] { color-scheme: var(--theme); }

/* Update hard-coded themes to use the variable */
[data-theme=&amp;quot;light&amp;quot;] { --theme: light; }
[data-theme=&amp;quot;dark&amp;quot;] { --theme: dark; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reason we use manage  &lt;code&gt;--theme&lt;/code&gt; variable instead of purely &lt;code&gt;color-scheme&lt;/code&gt; is because we can pass that into a &lt;code&gt;style()&lt;/code&gt; query. An that’s the magic that enables inverted themes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;/* Add style query magic ✨ */
@container style(--theme: light) {
	[data-theme=&amp;quot;inverted&amp;quot;] {
		--theme: dark;
	}
}

@container style(--theme: dark) {
	[data-theme=&amp;quot;inverted&amp;quot;] {
		--theme: light;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again, the nice thing here is that we’re not creating two different trees of variables or re-redefining variables inside &lt;code&gt;[data-theme=&amp;quot;inverted&amp;quot;]&lt;/code&gt;, we’re relying on &lt;code&gt;light-dark()&lt;/code&gt; and &lt;code&gt;color-scheme&lt;/code&gt; to do the heavy lifting. We’re contextually updating the &lt;code&gt;color-scheme&lt;/code&gt; and letting the browser negotiate the cascade.&lt;/p&gt;
&lt;p&gt;I added a &lt;code&gt;.funky&lt;/code&gt; card theme to the demo to give an idea of how far you might be able to push this tech. &lt;a href=&quot;https://blog.kizu.dev/querying-the-color-scheme/&quot;&gt;Roman Kamorov noted&lt;/a&gt; in his post on &lt;em&gt;Querying the Color Scheme&lt;/em&gt; something Vadim Makeev said on a Russian podcast that while this inversion trick is neat, people who prefer dark-mode (e.g. for medical reasons) probably want dark mode and not to be flash-banged mid-page. That’s something to think about and I think I have some ideas about that but I’d love to see/hear yours.&lt;/p&gt;
&lt;h2&gt;Polyfilling browser support&lt;/h2&gt;
&lt;p&gt;At the time of writing this trick only works in Safari 18+ and Edge/Chrome 111+. Firefox is the outlier but the good news is container style queries is on the roadmap for &lt;a href=&quot;https://hacks.mozilla.org/2026/02/launching-interop-2026/&quot;&gt;Interop 2026&lt;/a&gt; and behind a flag in nightly. That gives you two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Roll out a bespoke polyfill for &lt;code&gt;[data-theme=&amp;quot;inverted]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Do nothing. Wait it out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given that I know the experience will auto-upgrade for Firefox users at some point this year, I’m prone to wait it out per the rules of progressive enhancement. If it falls back to the current theme, I don’t think the world falls over.&lt;/p&gt;
&lt;p&gt;However, you probably support browsers outside the latest version and what’s acceptable for a fallback depends on your company’s understanding of the eventual consistency of browsers. iOS devices version-locked at Safari 17.4 are of particular concern for me, so I wrote an inverted theme polyfill.&lt;/p&gt;
&lt;p&gt;The CSS style-query-support detection is pretty simple, but quirky.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;/* Style query support check */
body {
  --syle-query-support: 0;
}

@container style(--theme) {
  body { --syle-query-support: 1 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There’s a new &lt;code&gt;@supports at-rule()&lt;/code&gt; function that would be more idiomatic, but &lt;a href=&quot;https://www.bram.us/2026/03/15/at-rule/&quot;&gt;you can’t detect at-rule function support&lt;/a&gt; with &lt;code&gt;at-rule()&lt;/code&gt; so we have to do this variable hack. Ideally we could do this purely in JS with &lt;code&gt;CSS.supports()&lt;/code&gt;, but alas. Booleans in CSS, what could go wrong?&lt;/p&gt;
&lt;p&gt;That brings us to the JavaScript part which is pretty simple as well but comes with &lt;strong&gt;one big potential tradeoff&lt;/strong&gt;…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/**
 * Polyfill for inverted themes using a `--theme` variable in a style query
 * ⚠️ The use of `getComputedStyle` can trigger layout and style recalcs
 */
(()=&amp;gt;{
  const isContainerStyleQueriesSupported = () =&amp;gt; {
    const bodyElStyle = getComputedStyle(document.body);
    const hasStyleQueries = bodyElStyle.getPropertyValue(&amp;quot;--syle-query-support&amp;quot;);
    
    if(hasStyleQueries === &amp;quot;1&amp;quot;) {
      return true;
    }
    return false;
  }
  
  if(!isContainerStyleQueriesSupported()) {
    const invertedThemes = document.querySelectorAll(&apos;[data-theme=&amp;quot;inverted&amp;quot;]&apos;);
  
    invertedThemes.forEach((el) =&amp;gt; {
      const elTheme = getComputedStyle(el).getPropertyValue(&amp;quot;--theme&amp;quot;);
      const invertedTheme = elTheme == &amp;quot;light&amp;quot; ? &amp;quot;dark&amp;quot; : &amp;quot;light&amp;quot;;
      el.dataset.theme = invertedTheme;
    })
  }
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because we need to get the computed value of  &lt;code&gt;--style-query-support&lt;/code&gt;, &lt;a href=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot;&gt;&lt;code&gt;getComputedStyle&lt;/code&gt; is known to trigger style recalcs and layout reflows&lt;/a&gt;, effectively penalizing all users not just browsers that don’t support container style queries. I tested this out by putting the polyfill inside a &lt;code&gt;setTimeout&lt;/code&gt;, turning on paint flashing, and checking the &lt;a href=&quot;https://daverupert.com/2024/09/dev-tools-performance-monitor-panel/&quot;&gt;Performance Monitor panel&lt;/a&gt; and I didn’t see any recalcs or layout reflows, but your mileage may vary depending on your setup.&lt;/p&gt;
&lt;p&gt;Anyways, happy inverting! Let me know if you do something cool with it or if you already figured this out 10 months ago and I didn’t see your blog post.&lt;/p&gt;
</description>
        <pubDate>Tue, 07 Apr 2026 15:31:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/inverted-light-dark/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/inverted-light-dark/</guid>
      </item>
    
      <item>
        <title>Ozempic dreams</title>
        <description>&lt;p&gt;&lt;tt&gt;It’s a secret to everyone! This post is for RSS subscribers only.
&lt;a href=&quot;https://daverupert.com/rss-club/&quot;&gt;Read more about RSS Club&lt;/a&gt;.
&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;I’ve heard the term “Ozempic face” for awhile. People have opinions about that one, but I tend to feel like we should be comfortable with bodies changing. There’s also “Ozempic butt” and there’s even “Ozempic penis”. I’ll let you search those up on your own but they’re also related to physical changes from losing weight.&lt;/p&gt;
&lt;p&gt;I started Wegovy, a GLP-1 like Ozempic, in December and the weight line is trending down down. That’s a good place to be and while I’m not experiencing any of the above symptoms, there has been one noticeable change. One thing I wasn’t prepared for was a change to my dreaming and sure enough “Ozempic dreams” are a thing (at least on Reddit).&lt;/p&gt;
&lt;p&gt;Since starting GLP-1 my dreams have been much more vivid. Colors are more colorful. Weirdness more weird. People more real. Dialogue more rich. Storylines are more complex and multi-layered, not linear. If I wake up in the middle of the night I can seamlessly resume at the previous checkpoint.&lt;/p&gt;
&lt;p&gt;They nearly fall under the category of “lucid dreams” where you know you’re dreaming and can control them. It’s not every night, but when it happens I sleep harder and wake up more rested. Like most dreams I don’t remember the details after waking up, but I do remember the sensation of “Wow, this is a wild and complex dream.”&lt;/p&gt;
&lt;p&gt;I’m curious what’s causing it: change in diet, calorie deficiency, blood sugar, or (as some claim) a hormone in the GLP-1? I don’t know and realize my experience is entirely anecdotal hearsay, but what a weird yet welcome side effect. Is this what dreams are like for people with better peptides?&lt;/p&gt;
</description>
        <pubDate>Sat, 04 Apr 2026 19:18:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/ozempic-dreams/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/ozempic-dreams/</guid>
      </item>
    
      <item>
        <title>Before I go: People like it when other people make things</title>
        <description>&lt;p&gt;I’ve watched a billion hours of YouTube and I’ve noticed a common trend: Whether that’s a drawing, a video game, a song, a cake, or a whole-ass off-grid house; I’ve learned that it’s fun to watch people make something. Since the beginning of humanity, the act of slapping two rocks together to make an arrowhead or a fire will draw a crowd. I feel like mankind has an innate curiosity to pause and say “Oooh, whatcha making?” We like it when others make. This might not even be unique to humans, have you ever seen a &lt;a href=&quot;https://www.youtube.com/watch?v=1XkPeN3AWIE&quot;&gt;bowerbird nest&lt;/a&gt;? Incredible.&lt;/p&gt;
&lt;p&gt;The Maker Movement harnessed that creative attention energy and built an entire subculture around it. I’ve been watching &lt;a href=&quot;https://www.youtube.com/@Wintergatan&quot;&gt;the same guy make a musical marble machine for ten years&lt;/a&gt;. Practical effects artists Adam Savage and Jamie Hyneman built their entire TV show Mythbusters around this premise. We are problem solvers, all of us. The process can often be as enjoyable as the final object. I’d go so far to say they built the empires of YouTube, TikTok, and Instagram on the same principle: it’s fun to watch (hot) people make something even if that “something” is a video about fingernails.&lt;/p&gt;
&lt;p&gt;I harp on my kids from time-to-time about making. We’re pretty permissive about device time but I frequently try to impart that we give them these devices as tools for creativity, not just brainrot. Kids are innately creative, so they understand my intent. But black rectangles are powerful energy vampires. From time to time though I’m blessed with an artwork, animation, a short film, an overdubbed movie trailer, or a half-built Roblox game. And those go on the proverbial refrigerator in my heart.&lt;/p&gt;
&lt;p&gt;I suppose there’s limits to this thesis. Watching someone make a murder machine wouldn’t be fun. Watching someone make war, not fun.&lt;/p&gt;
&lt;p&gt;Watching someone make numbers by typing into the random number generator isn’t that fun. But if there’s some novel, reason, or idea behind it… you could convince me it isn’t slop. I don’t particularly find the medium of decoupage enjoyable but with the right artistic mindset, curiosity, or obsession… sure? And if a bird assembles a house from trash, well I love that.&lt;/p&gt;
&lt;p&gt;Some like to draw thin blurry lines and some prefer to draw thick crisp lines, I love to see and read both. And I’m glad the term “slop” exists because we as a creative species created a label for the abstract idea of thoughtless outputs from a thoughtless content extruder.&lt;/p&gt;
&lt;p&gt;So, make something. Or not. I don’t care. Actually, I do care. Please make something. With your hands, or your brain, or your feet… wait, no that has other connotations.&lt;/p&gt;
</description>
        <pubDate>Sat, 04 Apr 2026 17:00:00 +0000</pubDate>
        <link>https://daverupert.com/2026/04/make-something/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/04/make-something/</guid>
      </item>
    
      <item>
        <title>People are not friction</title>
        <description>&lt;p&gt;The &lt;a href=&quot;https://blog.jim-nielsen.com/2025/a-in-ai-stands-for-amnesia/&quot;&gt;Gell-Mann Amnesia Effect of AI&lt;/a&gt; is a pretty well documented phenomenon:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Gell-Mann amnesia effect is a cognitive bias describing the tendency of individuals to critically assess media reports in a domain they are knowledgeable about, yet continue to trust reporting in other areas despite recognizing similar potential inaccuracies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Summarizing, AI sounds like an incredible genius synthesizing the world’s knowledge right up until you ask it about the thing you know about, then it’s an idiot. Even knowing about this phenomenon and having experienced it countless times, LLMs have an intoxicating quality to them.&lt;/p&gt;
&lt;p&gt;If there’s one thing LLMs do well, it’s delivering an enormous blast of dopamine if they do a good job on the first try. That “if” does a lot of heavy lifting, but when it happens you start to believe the idea that the multi-modal chat box could make you faster and infinitely capable. A hop and a skip and hundreds of dollars in tokens later, you made something that would take lifetimes of learning to create.&lt;/p&gt;
&lt;p&gt;The marketing around Generative AI is that every person can be their own Designer, Developer, Researcher, Content Writer, Video Producer, and Podcast Editor. With the right &lt;code&gt;skills.md&lt;/code&gt; files everything will fall into place. We will automate all automatable tasks. The experience will be “&lt;a href=&quot;https://nazhamid.com/journal/the-hunt/&quot;&gt;frictionless&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;You’ll be able to automate away the jobs you don’t enjoy…&lt;br /&gt;
And the jobs you don’t know how to do…&lt;br /&gt;
And the people who do those jobs…&lt;br /&gt;
The people you don’t enjoy…&lt;/p&gt;
&lt;p&gt;You won’t need to talk to or wait on anyone. You can automate away anything or anyone that stands in your way. You will reduce costs. You will be richer. It will be frictionless.&lt;/p&gt;
&lt;p&gt;Sometimes I feel like there’s a palpable tension in the air as if we’re waiting to see whether AI will replace designers or engineers first. Designers empowered by AI might feel those pesky nay-saying, opinionated engineers aren’t needed anymore. Engineers empowered with AI might feel like AI creates designs that are good enough for most situations. Backend engineers feel like frontend engineering is a solved problem. Frontend engineers know scaffolding a CRUD app or an entire backend API is simple fodder for the agent. Meanwhile, management cackles in their leather chairs saying “Let them fight…”&lt;/p&gt;
&lt;p&gt;I think it’s a dangerous place to be when we start to consider people as friction.&lt;/p&gt;
&lt;p&gt;That’s because we know Gell-Mann is real. We know there’s an &lt;a href=&quot;https://en.wikipedia.org/wiki/Optimism_bias&quot;&gt;optimism bias&lt;/a&gt; the size of the sun blinding us to the actual quality of what the machine is producing. We need knowledgeable people to share what they know to improve the quality of our work, generated or otherwise. We even need ignorant people to make sure we can break ideas down into their simplest form that everyone, agents or human, understand. People can have bad attitudes, be shitty, and have wrong opinions… but people are not friction. An LLM may be able to autocorrect its way into a plausible human response, but it’s not people. It doesn’t care if it’s right or wrong. The money and hype surrounding it acts as a shield to its reputation. LLMs make up answers if it doesn’t have enough context and they fall over if it has too much context. It amplifies good patterns the same as bad patterns. And it glazes you with flattering language the entire time so that chart go up.&lt;/p&gt;
&lt;p&gt;People, the context-bearers, have experience and capabilities that machines might never understand encoded in our muscles and memory. I’m on record saying I despise nuance –&lt;em&gt;and I do&lt;/em&gt;– but it’s more important than ever to be able to connect to our fellow humans over this nuance so our world is not paved over by contextless opinions from ill-informed robots. Empower and believe people over machines.&lt;/p&gt;
</description>
        <pubDate>Fri, 20 Mar 2026 15:54:00 +0000</pubDate>
        <link>https://daverupert.com/2026/03/people-are-not-friction/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/03/people-are-not-friction/</guid>
      </item>
    
      <item>
        <title>Smaller and dumber</title>
        <description>&lt;p&gt;If I can make it smaller, I should.&lt;/p&gt;
&lt;p&gt;If I can make it dumber, I should.&lt;/p&gt;
&lt;p&gt;Smaller, dumber things have more applications, go more places, and require less maintenance.&lt;/p&gt;
</description>
        <pubDate>Mon, 23 Feb 2026 05:33:00 +0000</pubDate>
        <link>https://daverupert.com/2026/02/smaller-and-dumber/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/02/smaller-and-dumber/</guid>
      </item>
    
      <item>
        <title>Priority of idle hands</title>
        <description>&lt;p&gt;I had a small, intrusive realization the other day that computers and the internet are probably bad for me. I mean that beyond the general advice to touch grass. From an ADHD and generalized anxiety perspective, computers and the internet have become an endless supply of poison pills for my brain; feeds full of constant dopamine hits with doom at every turn.&lt;/p&gt;
&lt;p&gt;This is hard to accept because a lot of my work, hobbies, education, entertainment, news, communities, and curiosities are all on the internet. I love the internet, it’s a big part of who I am today, but I understand how its incentive structures harm me. I’m not planning to unplug and go off-grid yet, but it did inspire me to come up with a “&lt;a href=&quot;https://www.w3.org/TR/html-design-principles/#priority-of-constituencies&quot;&gt;priority of constituencies&lt;/a&gt;” for my idle hands and downtime:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instruments over pads of paper over laptop over tablet over phone.&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 23 Feb 2026 03:13:00 +0000</pubDate>
        <link>https://daverupert.com/2026/02/computers-were-a-mistake-for-me/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/02/computers-were-a-mistake-for-me/</guid>
      </item>
    
      <item>
        <title>Magic Words</title>
        <description>&lt;p&gt;Skills are the newest hype commodity in the world of agentic AI. Skills are text files that optionally get stapled onto the context window by the agent. You can have skills like “frontend design” or “design tokens” and if the LLM “thinks” it needs more context about that topic, it can import the contents of those files into the context to help generate a response.&lt;/p&gt;
&lt;p&gt;Generally speaking, skills do an okay job at providing on-demand context. Assuming the AI model is always 12-to-18 months behind in its training data, a skill could potentially backfill any recent framework updates. A skill could potentially undo some training data biases. A skill could potentially apply some of your sensibilities to the output. I’ve seen some impressive results with design guidance skills… but I’ve also seen tons of mediocre results from the same skills. That’s why I deliberately use the word “potentially”. When skills can be optionally included, it’s hard to understand the &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; behind how they get applied.&lt;/p&gt;
&lt;p&gt;In that way, skills remind me a bit of magic numbers.&lt;/p&gt;
&lt;p&gt;In programming “&lt;a href=&quot;https://en.wikipedia.org/wiki/Magic_number_(programming)&quot;&gt;magic numbers&lt;/a&gt;” are a pattern you typically try to avoid. They’re a code smell that you haven’t actually solved the problem, but found a workaround that only works in a particular context. They’re a flashing light that you have brittle logic somewhere in your system. “We don’t know why, but setting the value to &lt;code&gt;42&lt;/code&gt; appears to have fixed the issue” is a phrase that should send shivers down the spine.&lt;/p&gt;
&lt;p&gt;And so now we have these “magic words” in our codebases. Spells, essentially. Spells that work sometimes. Spells that we cast with no practical way to measure their effectiveness. They are prayers as much as they are instructions.&lt;/p&gt;
&lt;p&gt;Were we to sit next to each other and cast the same spell from the same book with the same wand; one of us could have a graceful floating feather and the other could have &lt;em&gt;avada kedavra&lt;/em&gt;’d their guts out onto the floor. That unstable magic is &lt;em&gt;by design&lt;/em&gt;. That element of randomness –to which the models depend– still gives me apprehension.&lt;/p&gt;
&lt;p&gt;There’s an opaqueness to it all. I understand how listing skills in an &lt;code&gt;AGENTS.md&lt;/code&gt; gives the agent context on where to find more context. But how do you know if those words are the right words? If I cut the amount of words (read: “tokens”) in a skill in half, does it still work? If I double the amount of words, does it work better? Those questions matter when too little context is not enough context and too much context causes context rot. It also matters when you’re charged per-token and more tokens is more time on the GPU. How do you determine the “Minimum Viable Context” needed to get quality out of the machines?&lt;/p&gt;
&lt;p&gt;That sort of quality variance is uncomfortable for me from a tooling perspective. Tooling should be highly consistent and this has a “works on my machine” vibe to it. I suppose all my discomfort goes away if I quit caring about the outputs. If I embrace the cognitive dissonance and switch to a “ZOMG the future is amazeballs” hype mode, my job becomes a lot easier. But my brain has been unsuccessful in doing that thus far. I like magic and mystery, but hope- or luck-based development has its challenges for me.&lt;/p&gt;
&lt;p&gt;Looking ahead, I expect these types of errant conjurations will come under more scrutiny when the free money subsidies run out and consumers inherit the full cost of the models’ mistakes. Supply chain constraints around memory and GPUs are already making compute a scarce resource, but our Gas Towns plunder onward. When the cost of wrong answers goes up and more and more people spend all their monthly credits on hallucinations, that will be a lot of dissatisfied users.&lt;/p&gt;
&lt;p&gt;Anyways, all this changes so much. Today it’s skills, before that MCP, before that PRDs, before that prompt engineering… what is it going to be next quarter? And aren’t those all flavors of the same managing context puzzle? Churn, churn, churn, I suppose.&lt;/p&gt;
&lt;p&gt;File under: &lt;code&gt;non-determinism&lt;/code&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Feb 2026 16:03:00 +0000</pubDate>
        <link>https://daverupert.com/2026/02/magic-words/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/02/magic-words/</guid>
      </item>
    
      <item>
        <title>Write about the future you want</title>
        <description>&lt;p&gt;There’s a lot that’s not going well; politics, tech bubbles, the economy, and so on. I spend most of my day reading angry tweets and blog posts. There’s a lot to be upset about, so that’s understandable. But in the interest of fostering better discourse, I’d like to offer a challenge that I think the world desperately needs right now: It’s cheap and easy to complain and say “[Thing] is bad”, but it’s also free to share what you think would be better.&lt;/p&gt;
&lt;p&gt;If complaining worked, we would have won the culture war already. We’d have a reformed Elon and the White House wouldn’t be committing crimes against humanity. But that’s not the world we live in. The one we live in is much worse. If you hate the here and now, write about what would be a better future. Write about &lt;em&gt;what’s good&lt;/em&gt; and why &lt;em&gt;more of that good&lt;/em&gt; would &lt;em&gt;be good&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you believe the current trend in tech is exploitative, write about tech that isn’t. What impresses you? What compromises did you make? Are you happy? Does giving money to a small bootstrapped company feel ten thousand times better than a large venture-backed company like I imagine? Can you list some of those out for me? Show me where I can throw my dollars.&lt;/p&gt;
&lt;p&gt;If you detest content theft at a massive scale, describe a world where copyright matters. Tell me how you’re only going to watch TikToks with royalty free music from now on and not use an ad-blocker. Tell me how you’re going to delete that hard-drive of pirated content. No? Then invent a better copyright system! Talk about the commons and how we should tax people who abuse it by taking more than they give. What does that system look like?&lt;/p&gt;
&lt;p&gt;If you detest the ecological impact of AI data centers, propose an alternative piece of technology that drives shareholder value. Or advocate for a broader, more equitable definition of &lt;a href=&quot;https://www.ibm.com/think/topics/responsible-ai&quot;&gt;Responsible AI&lt;/a&gt;. Don’t let the Effective Altruists define the terms. &lt;a href=&quot;https://dbushell.com/ai/&quot;&gt;Itemize the problems&lt;/a&gt; and then dream up a version that doesn’t have those. List demands. Find levers. Or make the case for how small, local, private, and less energy-intensive models are probably “good enough” for most use cases and we should stop burning barrels of crude and use those instead. If we must throw it away, point people to organizations and political groups working towards that end.&lt;/p&gt;
&lt;p&gt;If you believe billionaires are the problem, talk about a world without them. Share how we redistribute a billionaire tax equitably and talk about the impact it has on society. Make a spreadsheet or a chart. Get into numbers. Talk about degrowth. I know that “Line Goes Up” has problems and won’t work forever, but how are my family and I more okay if we undo centuries of continued economic growth and technical acceleration.&lt;/p&gt;
&lt;p&gt;I think history is wrought with examples of this working; Dr. King’s “I have a Dream” speech, the Federalist Papers, David Hasselhoff singing at the Berlin Wall during the height of the Cold War… the list goes on. Few will rise to the level of Ambassador Hasselhoff, but I don’t have to look far to find people around me who have inspired me by writing about the future they want.&lt;/p&gt;
&lt;p&gt;After repeated mass layoffs, &lt;a href=&quot;https://ethanmarcotte.com/&quot;&gt;Ethan Marcotte&lt;/a&gt; identified a problem with the wealth and labor dynamics in the tech industry. While Ethan could have been perfectly happy bitching about it on Twitter, he didn’t do that. Instead, he put hands to keyboard and made a talk, which turned into &lt;a href=&quot;https://ethanmarcotte.com/books/you-deserve-a-tech-union/&quot;&gt;a book&lt;/a&gt;, about what he feels is the time-tested solution to our predicament: Unions. Truthfully, I’m not particularly predispositioned to be pro-union (Texan, etc), but Ethan and I agree on the problem. Seeing Ethan &lt;a href=&quot;https://journal.stuffwithstuff.com/2026/01/24/the-value-of-things/&quot;&gt;spend time&lt;/a&gt; to communicate the problem and explore the solution changed my opinion on unions. And while I certainly still have nuanced questions, Ethan convinced me that collective action is the best leverage workers have against abuses of labor. That wouldn’t have happened without Ethan’s dedication to highlighting the problem &lt;em&gt;and the solution&lt;/em&gt; over many years.&lt;/p&gt;
&lt;p&gt;Often people need you to &lt;em&gt;show, not tell&lt;/em&gt; the alternative. You need to paint a picture. Not a full complete picture, but one where a person can paint themselves in it. When people want change and bad change is happening all around them, that’s a hopeless place. Build a raft of opportunity that people can latch onto in the rough open waters, instead of hitting them with spears.&lt;/p&gt;
</description>
        <pubDate>Wed, 04 Feb 2026 15:45:00 +0000</pubDate>
        <link>https://daverupert.com/2026/02/futurescapes/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/02/futurescapes/</guid>
      </item>
    
      <item>
        <title>I&apos;m swearing off APIs entirely</title>
        <description>&lt;p&gt;I got a lot of ideas for side projects rattling around in the old tin can. As part of my “No new projects” initiative, I’m trying to jump on building prototypes so I can decide if I want to explore ideas more or call it quits. A handful of my ideas are riffs or twists on existing app categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A tennis ranking app… but modern and performant&lt;/li&gt;
&lt;li&gt;A nearby historical marker app… but with CarPlay support&lt;/li&gt;
&lt;li&gt;A nearby real estate listing app… but with CarPlay support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three of those have ended unceremoniously at the same dead end: no API access. USTA denied my application for tennis rankings. The aptly named Historical Marker Database site doesn’t have a public API. And you have to be an MLS® Realtor® or Broker to get access to the MLS® listings. Womp womp.&lt;/p&gt;
&lt;p&gt;Scraping the data is always an option… but I don’t like the ethics of that and worry about the brittleness of that dependency.&lt;/p&gt;
&lt;p&gt;Ugh. I wish I could build these little apps so that tens of people could enjoy them. I’d even be willing to pay a small API access fee ($10/mo?) and run these at a loss but whatever happened to free APIs. When I &lt;a href=&quot;https://github.com/public-api-lists/public-api-lists&quot;&gt;survey the land of public APIs&lt;/a&gt; it feels like we’ve lost a lot since the Web 2.0 days where API access was almost a God-given right.&lt;/p&gt;
&lt;p&gt;To prevent this time loop of disappointment from happening again, I’m swearing off APIs entirely. That’s a hard stance, but I need a backstop at the idea phase to prevent me from wasting limited life force. If I don’t have the data, or can’t generate the data, or it’s not an open protocol… it’s not worth building or even thinking about.&lt;/p&gt;
&lt;p&gt;OAuth apps are a good option and generally the best way to exfiltrate data because it’s tied to a user’s account…. but you still might run into call limits, incomplete endpoints, user-scope limitations, and so on. History also shows us what the future holds. There’s a Tweetbot-style risk when building on a someone else’s platform. Even if your app drives activity to the parent application, your access might get cut because it competes or doesn’t drive stakeholder value. And if the idea isn’t big enough, being “a feature, not a product” is also a bad position to be in, lest you get Sherlock’d.&lt;/p&gt;
&lt;p&gt;Where’s that leave me and my pile of side project ideas? Thankfully… in a good place. I can close out these project tabs and free up some much needed Brain RAM. It sounds strange but “No more APIs” makes “Making video games” jump up in the viability rankings for side projects too, because games have closed ecosystems. Or I could spend more time writing shitty sci-fi. Write a serial. Print some zines. Who knows.&lt;/p&gt;
&lt;p&gt;If the goal of “No new projects” is to finish more projects than I start, then I have to accept that part of figuring out which ideas to explore means “&lt;a href=&quot;https://www.youtube.com/watch?v=RfiQYRn7fBg&quot;&gt;Nope&lt;/a&gt;” is a potential answer. It’s also not a total loss, I’m learning along the way. For example, &lt;a href=&quot;https://developer.apple.com/download/files/CarPlay-Developer-Guide.pdf&quot;&gt;CarPlay only lets you choose from eight pre-approved templates&lt;/a&gt;. There’s also pre-defined app categories and diverting in the slightest would almost guarantee App Store rejection. That sucks the fun out it… but ayyyy, I’ll probably try again. But now I know the limitation for future projects and its in the limitations where play begins.&lt;/p&gt;
</description>
        <pubDate>Mon, 26 Jan 2026 06:27:00 +0000</pubDate>
        <link>https://daverupert.com/2026/01/hitting-my-api-limits/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/01/hitting-my-api-limits/</guid>
      </item>
    
      <item>
        <title>Waiting for the power to go out</title>
        <description>&lt;p&gt;&lt;tt&gt;It’s a secret to everyone! This post is for RSS subscribers only.
&lt;a href=&quot;https://daverupert.com/rss-club/&quot;&gt;Read more about RSS Club&lt;/a&gt;.
&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;It’s expected to freeze this evening in Austin and we may even see snow, which is exciting and novel for us Texans. But as we’ve learned in 2021 and 2023, cold snaps can lead to disaster. In those years the ice dealt untold damages as foot-thick tree limbs fell from the canopy like enormous glass Cadillacs. The crackle, pop, followed by crystalline shatter in the cold dead air is a sound I won’t forget. With the falling trees came down power lines and the lights went out.&lt;/p&gt;
&lt;p&gt;It got worse. &lt;a href=&quot;https://www.kut.org/the-disconnect&quot;&gt;The disconnected Texas power grid failed&lt;/a&gt;. As homes and empty office buildings required more heating in the “extreme” cold, the rolling blackouts began to shed load. Except… they didn’t roll. Homes next to facilities (hospitals, fire stations, and water treatment plants) deemed critical were fine, but the rest of us were off-grid in the cold for nearly a week. The energy companies could have met capacity, but quit making energy because they would have had to sell it at a loss. Greed until the state promised them a windfall.&lt;/p&gt;
&lt;p&gt;The infrastructure failed. Pipes burst, homes flooded, and trauma increased. While our senator and his banker wife fled to Mexico to stay in a Ritz Carlton, Texans burned their IKEA furniture and cedar fences to stay warm.&lt;/p&gt;
&lt;p&gt;Building on past lessons, we’ve made all the preparations for today; external faucets capped, plants covered, and I built a cabinet out of foam board insulation for our external hot water heater. And now we wait… we wait to see if the Libertarian Capitalist systems my state has put into place will hold up. Waiting to see if the power goes out. Waiting for the impending disaster.&lt;/p&gt;
&lt;p&gt;If you’ve ever had a child, you might know this feeling. You’ve taken the classes, assembled the crib, child-proofed the outlets, and then you wait… you wait for your life to change. While the miracle of childbirth is a beautiful event, any mother can tell you it’s not without some drawbacks. From prolonged labor, painful contractions, episiotomies, and beyond… every birth is a dice-roll of potentially life-threatening complications. A friend of mine who had three kids described it well; “Having a baby is like knowing you’ll be in a car accident.”&lt;/p&gt;
&lt;p&gt;That feeling of pregnant, expectant waiting dominates a lot of my life right now as I wait for all the larger meta narratives in our country to unravel. I’m waiting for a mid-term election, one where I feel the fabric of democracy hangs by a thread. I’m waiting for an opposition party that has a fucking plan, but I don’t see one yet. I’m waiting for a particular person to leave office… or (preferred) die of natural causes. I’m waiting for the full release of the Epstein files, so the victims of billionaire pedophilia and human trafficking can have justice. I’m waiting for the government to stop its reign of cruelty on its own people, but masked fascists killed another innocent person in broad daylight today. I’m waiting for the economy to work for most Americans, not only the wealthy. I’m waiting for either the tech bubble to pop or for the robots to take my job… either way I’d like this story line to wrap up soon but I must ask, is there a third option? I’m waiting for the next big thing and praying it’s something that makes the world more loving and kind, but a new global religion would be a lot to deal with right now.&lt;/p&gt;
</description>
        <pubDate>Sat, 24 Jan 2026 21:44:00 +0000</pubDate>
        <link>https://daverupert.com/2026/01/waiting-for-the-power-to-go-out/</link>
        <guid isPermaLink="true">https://daverupert.com/2026/01/waiting-for-the-power-to-go-out/</guid>
      </item>
    
  </channel>
</rss>

