<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://www.benjaminoakes.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://www.benjaminoakes.com/" rel="alternate" type="text/html" /><updated>2026-03-05T18:32:38+00:00</updated><id>http://www.benjaminoakes.com/feed.xml</id><title type="html">Benjamin Oakes</title><subtitle>A programmer, sustainability enthusiast, and community builder in Iowa City.
</subtitle><author><name>Benjamin Oakes</name></author><entry><title type="html">Parenting as a Solo Founder</title><link href="http://www.benjaminoakes.com/2026/03/05/Parenting-as-a-Solo-Founder/" rel="alternate" type="text/html" title="Parenting as a Solo Founder" /><published>2026-03-05T00:00:00+00:00</published><updated>2026-03-05T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/03/05/Parenting-as-a-Solo-Founder</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/03/05/Parenting-as-a-Solo-Founder/"><![CDATA[<p>In reply to <a href="https://newsletter.masilotti.com/p/the-kid-at-the-co-working-space">The kid at the co-working space</a>:</p>

<p>This is me at least once a week, Joe.</p>

<p>There’s been a lot of sickness in our house this winter.  Managing it is a balance between being a parent and also appreciating that SciShow Kids is educational and magical when it’s on headphones… and trying to find work that’s okay to interrupt because I don’t know when the next interruption is.  Or when my 6 year old is just content to read by himself for an hour and something I needed to do actually got done.</p>

<p>It’s always nice to see your posts.  Hopefully I’ll see you again at a Ruby conference in the future.</p>

<p>Take care!</p>

<p>Ben <br />
<a href="https://cloudbreak.app">cloudbreak.app</a></p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[In reply to The kid at the co-working space:]]></summary></entry><entry><title type="html">The Great Flood of Adequate Software</title><link href="http://www.benjaminoakes.com/2026/01/05/The-Great-Flood-of-Adequate-Software/" rel="alternate" type="text/html" title="The Great Flood of Adequate Software" /><published>2026-01-05T00:00:00+00:00</published><updated>2026-01-05T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/01/05/The-Great-Flood-of-Adequate-Software</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/01/05/The-Great-Flood-of-Adequate-Software/"><![CDATA[<blockquote>
  <p>Last week, I saw three different tools for cramming entire codebases into a single text file. Nobody was asking for this. But sometimes you just need to feed your whole project to Claude and think “you know what would make this easier?”</p>
</blockquote>

<p>Source: <a href="https://worksonmymachine.ai/p/the-great-flood-of-adequate-software?publication_id=286732&amp;post_id=168009785">The Great Flood of Adequate Software</a></p>

<p>You know, it’s funny.  I’ve found AI generated code to be needlessly verbose more often than not.  Even the above example is probably just a <code class="language-plaintext highlighter-rouge">find</code> command like this:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find <span class="nb">.</span> <span class="nt">-name</span> <span class="s1">'*.rb'</span> <span class="nt">-type</span> f <span class="nt">-exec</span> <span class="nb">awk</span> <span class="s1">'FNR==1{print "--- " FILENAME " ---"} 1'</span> <span class="o">{}</span> <span class="se">\;</span> <span class="o">&gt;</span> out.txt
</code></pre></div></div>

<p>That’s half AI generated and half human generated.  And that’s the point.  I know these tools and what I can do with them.  It’s often still faster to know what I’m doing.  On the other hand, If I asked any AI for something like this in English, it would probably spit out a 200 line Python program that does a bunch of error handling and tree traversal.  And is that okay?  Sometimes.  Very often it’s just “okay, good enough” (adequate).  However, it can lead to massive codebases if not done well.  So, there’s a line.  And you need to have experience to know where the line is.</p>

<p>So yeah, I’ve generated tons of adequate code and just said “meh” and gone with it.  And other times?  Well, when it’s important it requires more attention because the AI just did something very stupid.</p>

<p>It’s a great thing that it’s easy to generate lots of code that would have taken weeks in years past.  That said, lots of code is often not the right solution.  If you lean on the AI for everything without understanding, it’s going to take you down the wrong path eventually.  I’m wary of anyone who says otherwise.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Last week, I saw three different tools for cramming entire codebases into a single text file. Nobody was asking for this. But sometimes you just need to feed your whole project to Claude and think “you know what would make this easier?”]]></summary></entry><entry><title type="html">Userscript: Google Gemini Tab Renamer</title><link href="http://www.benjaminoakes.com/2025/12/03/Userscript-Google-Gemini-Tab-Renamer/" rel="alternate" type="text/html" title="Userscript: Google Gemini Tab Renamer" /><published>2025-12-03T00:00:00+00:00</published><updated>2025-12-03T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/12/03/Userscript-Google-Gemini-Tab-Renamer</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/12/03/Userscript-Google-Gemini-Tab-Renamer/"><![CDATA[<p>Use with <a href="https://www.tampermonkey.net/">Tampermonkey</a> or a compatible userscript manager.</p>

<p>Known issue: if the chat name isn’t on the screen, it uses the name of the first chat instead.  It turns out Gemini doesn’t even know the name of the chat on the screen until scrolling down to it in the history (check the top of the screen to see what I mean).  I’m opting to ignore the issue until Google improves the situation.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ==UserScript==</span>
<span class="c1">// @name         Google Gemini Tab Renamer</span>
<span class="c1">// @namespace    https://benjaminoakes.com/</span>
<span class="c1">// @version      1.0</span>
<span class="c1">// @description  Sets tab title to the title of the selected chat</span>
<span class="c1">// @author       Benjamin Oakes</span>
<span class="c1">// @license      CC0-1.0</span>
<span class="c1">// @match        https://gemini.google.com/*</span>
<span class="c1">// @grant        none</span>
<span class="c1">// ==/UserScript==</span>

<span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="dl">'</span><span class="s1">use strict</span><span class="dl">'</span><span class="p">;</span>

    <span class="kd">function</span> <span class="nx">syncTitle</span><span class="p">()</span> <span class="p">{</span>
        <span class="kd">const</span> <span class="nx">targetElement</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">.conversation-title</span><span class="dl">'</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="nx">targetElement</span> <span class="o">&amp;&amp;</span> <span class="nx">targetElement</span><span class="p">.</span><span class="nx">innerText</span><span class="p">.</span><span class="nx">trim</span><span class="p">().</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">const</span> <span class="nx">newTitle</span> <span class="o">=</span> <span class="nx">targetElement</span><span class="p">.</span><span class="nx">innerText</span><span class="p">.</span><span class="nx">trim</span><span class="p">();</span>

            <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">title</span> <span class="o">!==</span> <span class="nx">newTitle</span><span class="p">)</span> <span class="p">{</span>
                <span class="nb">document</span><span class="p">.</span><span class="nx">title</span> <span class="o">=</span> <span class="nx">newTitle</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nx">setInterval</span><span class="p">(</span><span class="nx">syncTitle</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
<span class="p">})();</span>
</code></pre></div></div>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Use with Tampermonkey or a compatible userscript manager.]]></summary></entry><entry><title type="html">Better local development with .localhost subdomains</title><link href="http://www.benjaminoakes.com/2025/11/12/Better-local-development-with-localhost-subdomains/" rel="alternate" type="text/html" title="Better local development with .localhost subdomains" /><published>2025-11-12T00:00:00+00:00</published><updated>2025-11-12T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/11/12/Better-local-development-with-localhost-subdomains</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/11/12/Better-local-development-with-localhost-subdomains/"><![CDATA[<blockquote>
  <p>A comprehensive guide to using .localhost domains for better local development environments.</p>
</blockquote>

<p>Source: <a href="https://ibnuhx.com/better-local-development-with-localhost-subdomains">Better local development with .localhost subdomains</a></p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[A comprehensive guide to using .localhost domains for better local development environments.]]></summary></entry><entry><title type="html">The ‘Toy Story’ You Remember</title><link href="http://www.benjaminoakes.com/2025/11/12/The-Toy-Story-You-Remember/" rel="alternate" type="text/html" title="The ‘Toy Story’ You Remember" /><published>2025-11-12T00:00:00+00:00</published><updated>2025-11-12T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/11/12/The-Toy-Story-You-Remember</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/11/12/The-Toy-Story-You-Remember/"><![CDATA[<blockquote>
  <p>Toy Story was a transitional project. Since Pixar couldnt send digital data to theaters, every one of the movies frames was printed on analog film. When Toy Story originally hit home video, that 35 mm version was its source. Only years later, after technology advanced, did Pixar start doing digital transfers - - cutting out the middleman. And Toy Storys look changed with the era.</p>
</blockquote>

<p>Source: <a href="https://animationobsessive.substack.com/p/the-toy-story-you-remember">The ‘Toy Story’ You Remember - by Animation Obsessive Staff</a></p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Toy Story was a transitional project. Since Pixar couldnt send digital data to theaters, every one of the movies frames was printed on analog film. When Toy Story originally hit home video, that 35 mm version was its source. Only years later, after technology advanced, did Pixar start doing digital transfers - - cutting out the middleman. And Toy Storys look changed with the era.]]></summary></entry><entry><title type="html">Chat Control in the EU and Germany’s role</title><link href="http://www.benjaminoakes.com/2025/10/08/Chat-Control-in-the-EU-and-Germanys-role/" rel="alternate" type="text/html" title="Chat Control in the EU and Germany’s role" /><published>2025-10-08T00:00:00+00:00</published><updated>2025-10-08T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/10/08/Chat-Control-in-the-EU-and-Germanys-role</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/10/08/Chat-Control-in-the-EU-and-Germanys-role/"><![CDATA[<p>Basically, the EU is trying to spy on everyone’s chat messages (SMS, FB Messenger, Signal, you name it).  Even if it’s encrypted.  (All providers would have to give access through some kind of backdoor in order to be legal in the EU.)  As often happens, they are trying to use <em>actual bad things</em> as an excuse to try to overstep and achieve mass surveillance.</p>

<p>Here’s an LLM summary that matches my understanding:</p>

<blockquote>
  <p>Chat Control is an EU legislative proposal to mandate detection and reporting of child sexual abuse material (CSAM) online, including requiring clientside scanning for endtoend encrypted services and creating an EU centre to coordinate reports. Critics warn it undermines privacy and encryption, risks false positives and centralisation harms, and its effectiveness and legal proportionality remain hotly disputed.</p>
</blockquote>

<p>Germany is trying to stop it now, as people <a href="https://news.ycombinator.com/item?id=45464921">were pushing for</a>.  Update from yesterday: <a href="https://news.ycombinator.com/item?id=45506143">German government comes out against Chat Control</a></p>

<p>Nothing like this in the US yet, but we shouldn’t get complacent.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Basically, the EU is trying to spy on everyone’s chat messages (SMS, FB Messenger, Signal, you name it). Even if it’s encrypted. (All providers would have to give access through some kind of backdoor in order to be legal in the EU.) As often happens, they are trying to use actual bad things as an excuse to try to overstep and achieve mass surveillance.]]></summary></entry><entry><title type="html">Chrome OS is “combining” with Android, but what does that mean?</title><link href="http://www.benjaminoakes.com/2025/07/14/Chrome-OS-is-combining-with-Android-but-what-does-that-mean/" rel="alternate" type="text/html" title="Chrome OS is “combining” with Android, but what does that mean?" /><published>2025-07-14T00:00:00+00:00</published><updated>2025-07-14T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/07/14/Chrome-OS-is-combining-with-Android-but-what-does-that-mean</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/07/14/Chrome-OS-is-combining-with-Android-but-what-does-that-mean/"><![CDATA[<blockquote>
  <p>Android and Chrome OS have been developed in parallel for years, but Google is planning to streamline its operating systems. In a recent interview, Android Ecosystem President Sameer Samat stated bluntly that Android and Chrome OS are merging. This shift, a long time in the making, could give Google more room to maneuver as it plans for new mobile computing experiences.</p>
</blockquote>

<p>Source: <a href="https://arstechnica.com/gadgets/2025/07/googles-android-head-confirms-chrome-os-and-android-are-merging/">Chrome OS is “combining” with Android, but what does that mean? - Ars Technica</a></p>

<p>I want my Android phone to be more like ChromeOS, and I don’t think that’s what they plan.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Android and Chrome OS have been developed in parallel for years, but Google is planning to streamline its operating systems. In a recent interview, Android Ecosystem President Sameer Samat stated bluntly that Android and Chrome OS are merging. This shift, a long time in the making, could give Google more room to maneuver as it plans for new mobile computing experiences.]]></summary></entry><entry><title type="html">Belkin shows tech firms getting too comfortable with bricking customers stuff</title><link href="http://www.benjaminoakes.com/2025/07/13/Belkin-shows-tech-firms-getting-too-comfortable-with-bricking-customers-stuff/" rel="alternate" type="text/html" title="Belkin shows tech firms getting too comfortable with bricking customers stuff" /><published>2025-07-13T00:00:00+00:00</published><updated>2025-07-13T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/07/13/Belkin-shows-tech-firms-getting-too-comfortable-with-bricking-customers-stuff</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/07/13/Belkin-shows-tech-firms-getting-too-comfortable-with-bricking-customers-stuff/"><![CDATA[<blockquote>
  <p>In a somewhat anticipated move, Belkin is killing most of its smart home products. On January 31, the company will stop supporting the majority of its Wemo devices, leaving users without core functionality and future updates.</p>
</blockquote>

<p>Source: <a href="https://arstechnica.com/gadgets/2025/07/belkin-shows-tech-firms-getting-too-comfortable-with-bricking-customers-stuff/">Belkin shows tech firms getting too comfortable with bricking customers stuff</a></p>

<p>From what I can tell:</p>

<p>Wemo smart plugs will stop working in Google Home and the official Wemo app on January 31st, 2026. The company that makes it (Belkin) doesn’t want to support it anymore, probably because they want people to buy new ones.</p>

<p>The good news is that it should (?) keep working in <a href="https://www.home-assistant.io/">Home Assistant</a> indefinitely. In fact, that would seem to be the only way older Wemo devices will work anymore. This is because it can work only over Wi-Fi, but I guess they don’t do that for the official way of making it work.  It’s not clear if you can still set up Wi-Fi on newly obtained devices.</p>

<p>Thank goodness for the people who made Home Assistant.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[In a somewhat anticipated move, Belkin is killing most of its smart home products. On January 31, the company will stop supporting the majority of its Wemo devices, leaving users without core functionality and future updates.]]></summary></entry><entry><title type="html">Let me pay for Firefox!</title><link href="http://www.benjaminoakes.com/2025/07/13/Let-me-pay-for-Firefox/" rel="alternate" type="text/html" title="Let me pay for Firefox!" /><published>2025-07-13T00:00:00+00:00</published><updated>2025-07-13T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/07/13/Let-me-pay-for-Firefox</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/07/13/Let-me-pay-for-Firefox/"><![CDATA[<blockquote>
  <p>Am I suggesting Mozilla entirely pivot to this business model overnight? Of course not. But at least give us the option. Run an experiment. Publish a version of Firefox with no sponsored content, no telemetry, no Google (by default), and ad-blocking built in. I wouldnt hesitate to pay.</p>

  <p>If Mozilla doesnt do it, I fear someone else will.</p>
</blockquote>

<p>Source: <a href="https://discourse.mozilla.org/t/let-me-pay-for-firefox/141297">Let me pay for Firefox!</a></p>

<p>And…</p>

<blockquote>
  <p>I use Firefox because I dont believe in an advertising funded web, otherwise Id still be using chrome. Paying for the cloud features of firefox would make sense to me.</p>
</blockquote>

<p>Yes.  This should be an option instead of them contorting themselves out of recognition into somehow getting money from someone other than users.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Am I suggesting Mozilla entirely pivot to this business model overnight? Of course not. But at least give us the option. Run an experiment. Publish a version of Firefox with no sponsored content, no telemetry, no Google (by default), and ad-blocking built in. I wouldnt hesitate to pay. If Mozilla doesnt do it, I fear someone else will.]]></summary></entry><entry><title type="html">microsoft/azurelinux: Linux OS for Azure 1P services and edge appliances</title><link href="http://www.benjaminoakes.com/2025/06/27/microsoftazurelinux-Linux-OS-for-Azure-1P-services-and-edge-appliances/" rel="alternate" type="text/html" title="microsoft/azurelinux: Linux OS for Azure 1P services and edge appliances" /><published>2025-06-27T00:00:00+00:00</published><updated>2025-06-27T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2025/06/27/microsoftazurelinux-Linux-OS-for-Azure-1P-services-and-edge-appliances</id><content type="html" xml:base="http://www.benjaminoakes.com/2025/06/27/microsoftazurelinux-Linux-OS-for-Azure-1P-services-and-edge-appliances/"><![CDATA[<blockquote>
  <p>Azure Linux is an internal Linux distribution for Microsofts cloud infrastructure and edge products and services. Azure Linux is designed to provide a consistent platform for these devices and services and will enhance Microsofts ability to stay current on Linux updates.</p>
</blockquote>

<p>Source: <a href="https://github.com/microsoft/azurelinux">microsoft/azurelinux: Linux OS for Azure 1P services and edge appliances</a></p>

<p>Linux, from Microsoft.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Azure Linux is an internal Linux distribution for Microsofts cloud infrastructure and edge products and services. Azure Linux is designed to provide a consistent platform for these devices and services and will enhance Microsofts ability to stay current on Linux updates.]]></summary></entry></feed>