<?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-22T17:10:51+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">I don’t know what is Apple’s endgame for the Fn/Globe key, and I’m not sure Apple knows either</title><link href="http://www.benjaminoakes.com/2026/03/22/I-dont-know-what-is-Apples-endgame-for-the-FnGlobe-key-and-Im-not-sure-Apple-knows-either/" rel="alternate" type="text/html" title="I don’t know what is Apple’s endgame for the Fn/Globe key, and I’m not sure Apple knows either" /><published>2026-03-22T00:00:00+00:00</published><updated>2026-03-22T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/03/22/I-dont-know-what-is-Apples-endgame-for-the-FnGlobe-key-and-Im-not-sure-Apple-knows-either</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/03/22/I-dont-know-what-is-Apples-endgame-for-the-FnGlobe-key-and-Im-not-sure-Apple-knows-either/"><![CDATA[<blockquote>
  <p>Every modifier key starts simple and humble, with a specific task and a nice matching name.</p>

  <p>This never lasts. The tasks become larger and more convoluted, and the labels grow obsolete. Shift no longer shifts a carriage, Control doesnt send control codes, Alt isnt for alternate nerdy terminal functions.</p>

  <p>Fn is the newest popular modifier key, and it feels were speedrunning it through all the challenges without having learned any of the lessons.</p>
</blockquote>

<p>Source: <a href="https://aresluna.org/fn/">I dont know what is Apples endgame for the Fn/Globe key, and Im not sure Apple knows either - Aresluna</a></p>

<p>This many modifier keys doesn’t seem like the Apple I once knew.</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Every modifier key starts simple and humble, with a specific task and a nice matching name. This never lasts. The tasks become larger and more convoluted, and the labels grow obsolete. Shift no longer shifts a carriage, Control doesnt send control codes, Alt isnt for alternate nerdy terminal functions. Fn is the newest popular modifier key, and it feels were speedrunning it through all the challenges without having learned any of the lessons.]]></summary></entry><entry><title type="html">I’d love to talk to you for a customer discovery interview!</title><link href="http://www.benjaminoakes.com/2026/03/19/Id-love-to-talk-to-you-for-a-customer-discovery-interview/" rel="alternate" type="text/html" title="I’d love to talk to you for a customer discovery interview!" /><published>2026-03-19T00:00:00+00:00</published><updated>2026-03-19T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/03/19/Id-love-to-talk-to-you-for-a-customer-discovery-interview</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/03/19/Id-love-to-talk-to-you-for-a-customer-discovery-interview/"><![CDATA[<p>👋 I’m currently participating in the University of Iowa’s Venture School program, and I’m doing some research on the software tools that people use.</p>

<p>As part of my customer discovery process, I’m looking to learn from a few specific groups of people. I would love to chat if you are:</p>

<ul>
  <li>👨‍💻 A busy developer</li>
  <li>⚡ A tech enthusiast</li>
  <li>🔒 Privacy-focused</li>
  <li>🌐 An Internet user (yes, this means you!)</li>
</ul>

<p>I’m not selling anything–I just want to hear about your experiences and frustrations!</p>

<p>If you have anywhere from a few minutes to half an hour for a video call to answer some questions, I would be incredibly grateful. You can grab a time that works for you right here: 👉 <a href="https://calendar.app.google/bZfe1829SAuZqcqG9">schedule an interview!</a> 👈</p>

<p>Thank you so much in advance!</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[👋 I’m currently participating in the University of Iowa’s Venture School program, and I’m doing some research on the software tools that people use.]]></summary></entry><entry><title type="html">Apples AirPods Max 2 bring H2 chip, boosted ANC in April for $549</title><link href="http://www.benjaminoakes.com/2026/03/17/Apples-AirPods-Max-2-bring-H2-chip-boosted-ANC-in-April-for-549/" rel="alternate" type="text/html" title="Apples AirPods Max 2 bring H2 chip, boosted ANC in April for $549" /><published>2026-03-17T00:00:00+00:00</published><updated>2026-03-17T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/03/17/Apples-AirPods-Max-2-bring-H2-chip-boosted-ANC-in-April-for-549</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/03/17/Apples-AirPods-Max-2-bring-H2-chip-boosted-ANC-in-April-for-549/"><![CDATA[<blockquote>
  <p>The AirPods Max 2 will be available for preorder on March 25 and launch in early April, Apple said. They will cost $549, the same as the original AirPods Max upon launch.</p>
</blockquote>

<p>Source: <a href="https://arstechnica.com/gadgets/2026/03/apples-airpods-max-2-release-with-h2-chip-boosted-anc-in-april-for-549/">Apples AirPods Max 2 bring H2 chip, boosted ANC in April for $549 - Ars Technica</a></p>

<p>I had no idea these headphones I see on so many heads cost so much. It’s Apple so I’m not surprised, but especially on college kids, these make no sense.  Add an iPhone, iPad, and Mac… That’s expensive!</p>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[The AirPods Max 2 will be available for preorder on March 25 and launch in early April, Apple said. They will cost $549, the same as the original AirPods Max upon launch.]]></summary></entry><entry><title type="html">The Latest Front in the Battle Over Climate Lawsuits: Bills Wiping Out Liability</title><link href="http://www.benjaminoakes.com/2026/03/17/The-Latest-Front-in-the-Battle-Over-Climate-Lawsuits-Bills-Wiping-Out-Liability/" rel="alternate" type="text/html" title="The Latest Front in the Battle Over Climate Lawsuits: Bills Wiping Out Liability" /><published>2026-03-17T00:00:00+00:00</published><updated>2026-03-17T00:00:00+00:00</updated><id>http://www.benjaminoakes.com/2026/03/17/The-Latest-Front-in-the-Battle-Over-Climate-Lawsuits-Bills-Wiping-Out-Liability</id><content type="html" xml:base="http://www.benjaminoakes.com/2026/03/17/The-Latest-Front-in-the-Battle-Over-Climate-Lawsuits-Bills-Wiping-Out-Liability/"><![CDATA[<blockquote>
  <p>Republican lawmakers are advancing legislation that would shield major polluters from legal accountability for climate change harms.</p>
</blockquote>

<p>Source: <a href="https://insideclimatenews.org/news/14032026/republican-legislation-shielding-polluters-from-climate-lawsuits/">The Latest Front in the Battle Over Climate Lawsuits: Bills Wiping Out Liability - Inside Climate News</a></p>

<blockquote>
  <p>Last month the court decided to take up a petition lodged by oil companies Suncor and ExxonMobil in a climate-damages case brought against the companies by Boulder, Colorado. The petition argues that Boulders claims are barred by federal law, and if the justices agree, it could knock out not only Boulders lawsuit but also many others like it. The court is expected to hear the case during its upcoming term that starts in October.</p>
</blockquote>]]></content><author><name>Benjamin Oakes</name></author><category term="" /><summary type="html"><![CDATA[Republican lawmakers are advancing legislation that would shield major polluters from legal accountability for climate change harms.]]></summary></entry><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></feed>