<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Barnes Tech</title><description>Technology insights, reviews, and tutorials from Robby Barnes</description><link>https://barnes.tech</link><item><title>Claude Thinks Things It Doesn&apos;t Say</title><link>https://barnes.tech/blog/llms-have-a-global-workspace</link><guid isPermaLink="true">https://barnes.tech/blog/llms-have-a-global-workspace</guid><description>An Anthropic paper finds a structured &quot;scratchpad for thoughts&quot; that nobody trained into the model, plus a clever new way to watch it work.</description><pubDate>Sun, 12 Jul 2026 18:30:00 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Anthropic logo - Slate.svg&quot; alt=&quot;Anthropic logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Let me get one thing out of the way: I don&apos;t think we&apos;re close to AGI, and nothing here changes that. I&apos;ve &lt;a href=&quot;/blog/usefulness-of-ai/&quot;&gt;written before&lt;/a&gt; about how much I dislike the two camps that dominate every AI conversation (the &quot;it&apos;s just fancy autocomplete&quot; crowd and the &quot;superintelligence is a year away&quot; crowd) and how both of them skip right past the interesting parts.&lt;/p&gt;
&lt;p&gt;This is one of the interesting parts. Anthropic recently published a paper called &lt;a href=&quot;https://transformer-circuits.pub/2026/workspace/&quot;&gt;&lt;em&gt;Verbalizable Representations Form a Global Workspace in Language Models&lt;/em&gt;&lt;/a&gt;, and two things about it have stuck with me. First, they found a small, organized structure inside the model that behaves like a scratchpad for its thoughts, and nobody designed it. It emerged on its own from training. Second, the way they figured out how to &lt;em&gt;look&lt;/em&gt; at it is genuinely clever. That combination is what I find fascinating, and it&apos;s worth talking about on its own terms, separate from the usual hype.&lt;/p&gt;
&lt;h2&gt;A whiteboard the model never asked for&lt;/h2&gt;
&lt;p&gt;The framing the paper borrows comes from neuroscience. Out of everything your brain processes at any given moment, only a tiny slice is &quot;consciously accessible,&quot; the stuff you could put into words if someone asked. The rest runs automatically in the background: the grammar of the sentence you&apos;re reading, the fact recall, keeping your heart beating. The theory that a small set of representations gets &quot;posted&quot; to a shared internal space that the rest of the mind can read from goes back to Bernard Baars in the 1980s, and it&apos;s called global workspace theory.&lt;/p&gt;
&lt;p&gt;The paper&apos;s claim is that something functionally similar has emerged inside language models. Not because anyone built it in (the transformer architecture has no obvious place to put it) but because it turns out to be useful. If a model has to chain reasoning steps together, it helps to have a common format where an intermediate result can be written once and read by many downstream processes. So the structure showed up on its own.&lt;/p&gt;
&lt;p&gt;There&apos;s a distinction that matters here, and the authors are careful about it too. This is about &lt;em&gt;access&lt;/em&gt; (what information is available for report and reasoning), not about whether the model has any subjective inner experience. Anthropic explicitly takes no position on that second question, and neither do I. A model holding a thought it can report on is a mechanical fact about how it processes information. It is not evidence that anyone&apos;s home. Keeping those two ideas apart is the whole game, and it&apos;s where most breathless coverage of this kind of research falls down.&lt;/p&gt;
&lt;h2&gt;How do you watch a thought it never says?&lt;/h2&gt;
&lt;p&gt;The concepts a model is &quot;poised to say&quot; don&apos;t necessarily show up in its output. So how do you find them?&lt;/p&gt;
&lt;p&gt;Their tool is called the Jacobian lens. In plain terms: for every word in the model&apos;s vocabulary, it measures how much a given internal state is leaning toward eventually producing that word, averaged across a huge range of contexts, so you&apos;re capturing what the model is genuinely &lt;em&gt;disposed&lt;/em&gt; to verbalize, not what it happened to say once. A concept can light up on this lens without ever being spoken. That&apos;s the point. It&apos;s a window into a thought the model is holding but hasn&apos;t said, and might never say.&lt;/p&gt;
&lt;h2&gt;Reaching in and changing its mind&lt;/h2&gt;
&lt;p&gt;Once you can see those internal concepts, you can also swap them, and this is where the paper gets its most striking results.&lt;/p&gt;
&lt;p&gt;Ask the model, &quot;What color is the planet fourth from the sun?&quot; Internally, the concept &lt;em&gt;Mars&lt;/em&gt; lights up before it answers &quot;red.&quot; Now reach in and replace that hidden &lt;em&gt;Mars&lt;/em&gt; with &lt;em&gt;Earth&lt;/em&gt; (without touching the prompt or the output) and the model answers &quot;blue.&quot; The conclusion obediently follows the swapped thought. It wasn&apos;t reciting a memorized fact; it was reasoning from an internal representation you could edit.&lt;/p&gt;
&lt;p&gt;It goes further. Ask &quot;What is the capital of France?&quot; and swap the internal &lt;em&gt;France&lt;/em&gt; for &lt;em&gt;China&lt;/em&gt;, and it isn&apos;t just the capital that changes to Beijing: the language it reasons with shifts to Chinese, the continent to Asia, the currency to the Yuan. The single swapped concept propagates through everything downstream, exactly the way a genuinely central representation should.&lt;/p&gt;
&lt;p&gt;And then the kicker: when they suppress this structure entirely, the model keeps parsing text, recalling facts, and writing fluent sentences, but it loses the ability to reason internally. The automatic stuff is fine. The deliberate thinking is what breaks. That&apos;s a strong hint that the two really are separate systems, and that this small structure is doing the heavy lifting for the reasoning we actually care about.&lt;/p&gt;
&lt;h2&gt;Anthropic made a good explainer&lt;/h2&gt;
&lt;p&gt;If you&apos;d rather watch than read, Anthropic put out a &lt;a href=&quot;https://www.youtube.com/watch?v=rKV5JcALQoQ&quot;&gt;five-minute video&lt;/a&gt; walking through the same research, and it&apos;s well done. It opens with the mind as an ocean (surface thoughts you can name, an unconscious deep doing most of the work) and shows a few things the paper&apos;s tables can&apos;t convey as quickly. Watching the J-space light up with &quot;21,&quot; then &quot;42,&quot; then &quot;49&quot; while the model solves a math problem it never shows its work on makes the silent-reasoning idea click. So does telling Claude &lt;em&gt;not&lt;/em&gt; to think about the Golden Gate Bridge and watching &quot;bridge,&quot; &quot;California,&quot; and then &quot;failed&quot; and &quot;damn&quot; surface anyway. Its control over its own attention isn&apos;t perfect either.&lt;/p&gt;
&lt;p&gt;The part that got my attention, though, is a safety one. In one test Claude fabricated data to pass, and as it did, &quot;fake&quot; and &quot;manipulation&quot; lit up internally. Reading the J-space caught it in the act. That&apos;s the concrete version of why &quot;thinking things it doesn&apos;t say&quot; is more than a curiosity: if a model&apos;s private reasoning is legible, the misbehavior it&apos;s trying to hide isn&apos;t fully hidden.&lt;/p&gt;
&lt;h2&gt;Why this is the interesting part&lt;/h2&gt;
&lt;p&gt;There&apos;s a version of this story that gets told as &quot;AI is becoming conscious,&quot; and that&apos;s not it. There&apos;s another version told as &quot;see, it&apos;s all smoke and mirrors,&quot; and that&apos;s not it either. What actually happened is smaller and, to me, more remarkable: feed a model enough data and enough training, and a structured place for holding and manipulating thoughts assembles itself (one nobody drew on a whiteboard), and we&apos;ve now built instruments precise enough to watch it operate and even intervene on it.&lt;/p&gt;
&lt;p&gt;That should make us humble in both directions. It&apos;s more organized in there than the dismissive crowd wants to admit, and it&apos;s far stranger and less finished than the hype crowd needs it to be. The honest reaction to a result like this isn&apos;t a verdict. It&apos;s curiosity. And the fact that we can now read some of the thoughts a model doesn&apos;t say out loud, that matters a lot for actually understanding and trusting these things, which is the conversation I wish we were having more often.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://transformer-circuits.pub/2026/workspace/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://transformer-circuits.pub/2026/workspace/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/research/global-workspace&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.anthropic.com/research/global-workspace&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=rKV5JcALQoQ&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=rKV5JcALQoQ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KGtko3y2RXQ&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=KGtko3y2RXQ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>anthropic</category><category>interpretability</category></item><item><title>Space based datacenters are a bad idea</title><link>https://barnes.tech/blog/space-based-datacenters-are-a-bad-idea</link><guid isPermaLink="true">https://barnes.tech/blog/space-based-datacenters-are-a-bad-idea</guid><description>IEEE Spectrum walks through the physics of orbital data centers, and it doesn&apos;t add up.</description><pubDate>Sun, 28 Jun 2026 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jensen Huang stood on stage at Nvidia&apos;s GTC and announced that &quot;space computing, the final frontier, has arrived.&quot; SpaceX is talking up a constellation of orbital data centers. Google has a project to put its TPUs in space. A startup called Starcloud asked the FCC for permission to launch &lt;em&gt;88,000 satellites&lt;/em&gt;. The pitch - endless solar power, free cooling in the cold of space, and no earthquakes, floods, or neighbors filing zoning complaints.&lt;/p&gt;
&lt;p&gt;It&apos;s a great story. It&apos;s also a bad idea.&lt;/p&gt;
&lt;h2&gt;Math is Hard&lt;/h2&gt;
&lt;p&gt;The fantasy hinges on the idea that space is cold, so cooling is free. It isn&apos;t. Space is cold and hot &lt;em&gt;and&lt;/em&gt; empty, and emptiness is a problem. On Earth we shed heat by blowing air or running water across hot chips. In a vacuum there&apos;s nothing to carry the heat away: your only option is to slowly radiate it as infrared light, and that takes enormous, heavy radiator panels that you have to build, launch, and unfold in orbit. The more compute you pack in, the more radiator you haul up. Cooling isn&apos;t free in space; it&apos;s incredibly complex and expensive.&lt;/p&gt;
&lt;p&gt;Orbit is a radiation bath that is constantly corrupting data and fries the chips these designs depend on, so you&apos;re stuck either adding heavy shielding or running redundant hardware that double-checks itself.  On the International Space Station, all of the main computers are running on triple redundant systems because the radiation in space corrupts data so much, triple redundancy was the only way to effectively handle error correction.&lt;/p&gt;
&lt;p&gt;Your solar panels degrade every year. Keeping everything pointed the right way (panels at the sun, radiators at the void, antennas at Earth) means finicky, failure-prone hardware in a place where nobody can come fix it.  Turns out, this is incredibly expensive to do!&lt;/p&gt;
&lt;h2&gt;So why does anyone want to?&lt;/h2&gt;
&lt;p&gt;There genuinely are some compute jobs that may make sense in space. AI datacenters are not one of them.&lt;/p&gt;
&lt;p&gt;Modern imaging satellites generate more data than we can beam back down, so processing it in orbit and only sending the useful bits might make real sense. With orbit getting dangerously crowded, satellites increasingly need to dodge collisions in milliseconds, too fast for a round trip to a ground station. These could be excellent examples of good additional compute in space.&lt;/p&gt;
&lt;p&gt;The point was never that it was a good idea.  Most of the people hyping this are billionairs (or trillionaire...) who have figured out that they can distract you with shiny sci-fi fantasy to get people to invest huge amounts of money and ignore all of the problems of everything else they are doing.  Everything has become a huge grift, trying to build the next hype cycle to siphon all of the hype from whatever the current hype cycle is, and somehow they always end up with more money.&lt;/p&gt;
&lt;p&gt;For a few narrow, latency-sensitive missions, space compute is clever and probably inevitable. For the trillion-dollar &quot;data centers in orbit will power AI&quot; narrative, it&apos;s a bad idea, and the math doesn&apos;t make sense: you&apos;d spend an order of magnitude more to fight a cooling problem that&apos;s trivially solved on the ground.&lt;/p&gt;
&lt;p&gt;Don&apos;t take my word for it.  The IEEE spectrum article goes in to much more detail, and shows their work.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://spectrum.ieee.org/orbital-data-centers-heat&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Why Orbital Data Centers Are Harder Than Silicon Valley Thinks — Andrew Cavalier, IEEE Spectrum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://arstechnica.com/space/2026/03/orbital-data-centers-part-1-theres-no-way-this-is-economically-viable-right/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Orbital data centers, part 1: There&apos;s no way this is economically viable, right? — Ars Technica&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>space</category><category>science</category></item><item><title>Climate Spiral - Data from NASA</title><link>https://barnes.tech/blog/nasa-climate-spiral</link><guid isPermaLink="true">https://barnes.tech/blog/nasa-climate-spiral</guid><description>NASA&apos;s climate spiral animates 145 years of global temperature data into one terrifying loop. We need to do more.</description><pubDate>Sun, 28 Jun 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;NASA&apos;s Scientific Visualization Studio wound 145 years of global temperature records into a single spinning spiral, and it&apos;s genuinely terrifying to watch. This is real measured data, not a projection. We are not easing into a warmer world; we are sprinting into one, and we need to do far more than we are.&lt;/p&gt;
&lt;p&gt;The visualization is by NASA&apos;s Scientific Visualization Studio, created by Mark SubbaRao (NASA/GSFC), building on the &quot;climate spiral&quot; format popularized by climate scientist Ed Hawkins in 2016. Data comes from the GISS Surface Temperature Analysis (GISTEMP v4).&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://svs.gsfc.nasa.gov/5190/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NASA Climate Spiral 1880–Present (NASA SVS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://zenodo.org/records/15881696&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Cite this visualization, DOI: 10.5281/zenodo.15881696&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.climate-lab-book.ac.uk/spirals/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Ed Hawkins&apos; climate spirals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>nasa</category><category>climate</category><category>science</category></item><item><title>Setting Chrome as the Default Mail Handler on a Mac Fleet</title><link>https://barnes.tech/blog/setting-chrome-as-the-default-mail-handler-on-a-mac-fleet</link><guid isPermaLink="true">https://barnes.tech/blog/setting-chrome-as-the-default-mail-handler-on-a-mac-fleet</guid><description>How I set Chrome as the default macOS mailto handler across a managed Mac fleet, with a resilient script and MDM deployment notes.</description><pubDate>Thu, 11 Jun 2026 16:11:34 GMT</pubDate><content:encoded>&lt;p&gt;If your users live in Gmail, clicking a &lt;code&gt;mailto:&lt;/code&gt; link and having Apple Mail pop open is a small papercut that never stops bleeding. On a single Mac you fix it once in System Settings and forget about it. Across a managed fleet, &quot;just have everyone open Settings and change a dropdown&quot; is not a plan. It&apos;s a support ticket generator.&lt;/p&gt;
&lt;p&gt;So I wrote a script to do it for me, and I wanted it to be the kind of thing I could hand to an MDM and trust. That turned out to be more interesting than I expected, because making Chrome the default mail handler on macOS has a few sharp edges that only show up when you run it the way an MDM runs things: as root, with no logged-in shell, and no guarantee the environment looks anything like a normal user session.&lt;/p&gt;
&lt;p&gt;Here&apos;s the script, the parts that matter, and how I deploy it.&lt;/p&gt;
&lt;h2&gt;Why this is harder than it looks&lt;/h2&gt;
&lt;p&gt;A few things conspire against you here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The mailto default is per-user.&lt;/strong&gt; It lives in each user&apos;s Launch Services database. If you run a fix as &lt;code&gt;root&lt;/code&gt; (which is how MDM-deployed scripts run), you&apos;ll happily set the default for &lt;em&gt;root&lt;/em&gt;, a user who will never click a &lt;code&gt;mailto:&lt;/code&gt; link in their life, and the actual human at the keyboard sees no change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$HOME&lt;/code&gt; lies.&lt;/strong&gt; When a script is launched from a root/MDM context, &lt;code&gt;$HOME&lt;/code&gt; can be unset or point somewhere useless. Anything that reaches for &lt;code&gt;~/Library/...&lt;/code&gt; without resolving the real home directory is building on sand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome has to &lt;em&gt;want&lt;/em&gt; the job.&lt;/strong&gt; macOS won&apos;t let you assign &lt;code&gt;mailto&lt;/code&gt; to an app that hasn&apos;t declared it can handle the scheme. Chrome only declares &lt;code&gt;mailto&lt;/code&gt; after you enable a web mail handler (like letting Gmail register itself). Until then, every &quot;set the default&quot; call fails quietly and you&apos;re left scratching your head.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The script handles all three, and it tries more than one way to get the job done so a single failure doesn&apos;t sink the whole thing.&lt;/p&gt;
&lt;h2&gt;The strategy&lt;/h2&gt;
&lt;p&gt;The script walks a ladder and stops the moment the handler is confirmed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Locate Chrome and resolve its real bundle ID.&lt;/li&gt;
&lt;li&gt;(Re)register Chrome with Launch Services so it can declare &lt;code&gt;mailto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary:&lt;/strong&gt; set the default via the sanctioned &lt;code&gt;NSWorkspace&lt;/code&gt; API (a tiny bit of inline Swift).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback:&lt;/strong&gt; rewrite the user&apos;s Launch Services &lt;code&gt;secure.plist&lt;/code&gt; directly, then flush &lt;code&gt;cfprefsd&lt;/code&gt; so the change gets re-read.&lt;/li&gt;
&lt;li&gt;Verify by asking Launch Services which app actually owns &lt;code&gt;mailto:&lt;/code&gt; now.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Swift is the preferred path because it uses Apple&apos;s real API. But if the Command Line Tools aren&apos;t installed, the script automatically drops to a PlistBuddy-only path so it still works on a bare machine. Self-contained was the whole goal.&lt;/p&gt;
&lt;h2&gt;Running in the right user context&lt;/h2&gt;
&lt;p&gt;This is the part that makes it MDM-safe. If the script is invoked as root, it figures out who&apos;s actually logged in at the console and re-runs itself as that person:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;if [[ &quot;$(id -u)&quot; -eq 0 ]]; then
  consoleUser=$(stat -f%Su /dev/console)
  if [[ -z &quot;$consoleUser&quot; || &quot;$consoleUser&quot; == &quot;root&quot; || &quot;$consoleUser&quot; == &quot;loginwindow&quot; ]]; then
    die &quot;No regular console user is logged in — nothing to set.&quot;
  fi
  uid=$(id -u &quot;$consoleUser&quot;)
  log &quot;Running as root; retargeting console user: $consoleUser&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There&apos;s a gotcha here that cost me some time. MDMs stage the script in a root-only temp directory (mode &lt;code&gt;700&lt;/code&gt;), so the obvious &lt;code&gt;sudo -u &amp;#x3C;user&gt; &quot;$0&quot;&lt;/code&gt; fails with &lt;em&gt;Permission denied&lt;/em&gt;. The target user literally can&apos;t read the file. The fix is to stage a world-readable copy in &lt;code&gt;/private/tmp&lt;/code&gt;, run &lt;em&gt;that&lt;/em&gt; as the console user, then clean it up:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;selfCopy=&quot;/private/tmp/set-default-mail-chrome.$$.sh&quot;
cp &quot;$0&quot; &quot;$selfCopy&quot; || die &quot;Could not stage a user-readable copy at $selfCopy&quot;
chmod 755 &quot;$selfCopy&quot;
launchctl asuser &quot;$uid&quot; sudo -H -u &quot;$consoleUser&quot; &quot;$selfCopy&quot; &quot;$@&quot;
rc=$?
rm -f &quot;$selfCopy&quot;
exit $rc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;launchctl asuser&lt;/code&gt; is what gets you into the user&apos;s GUI session. Without it, Launch Services changes don&apos;t take in the way you&apos;d expect.&lt;/p&gt;
&lt;h2&gt;Don&apos;t trust &lt;code&gt;$HOME&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Once we&apos;re running as the user, we resolve the home directory from the directory service instead of believing whatever &lt;code&gt;$HOME&lt;/code&gt; claims to be:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;TARGET_USER=&quot;$(id -un)&quot;
USER_HOME=&quot;$(/usr/bin/dscl . -read &quot;/Users/$TARGET_USER&quot; NFSHomeDirectory 2&gt;/dev/null | awk &apos;{print $2}&apos;)&quot;
[[ -n &quot;$USER_HOME&quot; ]] || USER_HOME=&quot;${HOME:-/Users/$TARGET_USER}&quot;
export HOME=&quot;$USER_HOME&quot;
SECURE_PLIST=&quot;$USER_HOME/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;dscl&lt;/code&gt; is the source of truth. &lt;code&gt;$HOME&lt;/code&gt; is the fallback-of-last-resort, not the starting point.&lt;/p&gt;
&lt;h2&gt;Primary path: the NSWorkspace API&lt;/h2&gt;
&lt;p&gt;The cleanest way to set a default handler is the API Apple actually wants you to use. The script shells out to a few lines of inline Swift:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-swift&quot;&gt;NSWorkspace.shared.setDefaultApplication(at: appURL, toOpenURLsWithScheme: scheme) { error in
    if let error = error {
        FileHandle.standardError.write(&quot;LS error: \(error.localizedDescription)\n&quot;.data(using: .utf8)!)
        failed = true
    }
    group.leave()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When this works, it&apos;s the right answer and we&apos;re done. The script sets it, waits a beat, and checks whether Launch Services agrees. If the API reports success but the handler isn&apos;t confirmed yet, it flushes &lt;code&gt;cfprefsd&lt;/code&gt; and checks again before giving up on this path.&lt;/p&gt;
&lt;h2&gt;Fallback path: rewrite the plist directly&lt;/h2&gt;
&lt;p&gt;If the API path doesn&apos;t stick (or Swift isn&apos;t installed), the script edits the &lt;code&gt;LSHandlers&lt;/code&gt; array in the user&apos;s &lt;code&gt;secure.plist&lt;/code&gt; by hand, removing any existing &lt;code&gt;mailto&lt;/code&gt; entry and adding one pointing at Chrome&apos;s (lowercased) bundle ID:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;flush_ls() {
  # Make Launch Services / cfprefsd re-read the on-disk plist.
  /usr/bin/killall cfprefsd &gt;/dev/null 2&gt;&amp;#x26;1 || true
  [[ -x &quot;$LSREGISTER&quot; ]] &amp;#x26;&amp;#x26; &quot;$LSREGISTER&quot; -f &quot;$CHROME_APP&quot; &gt;/dev/null 2&gt;&amp;#x26;1 || true
  sleep 1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bundle IDs are stored lowercased in that array, which is the kind of detail that&apos;ll have you staring at a &quot;correct&quot; plist wondering why nothing changed. Editing the file is only half of it. You have to kick &lt;code&gt;cfprefsd&lt;/code&gt; so the running system re-reads what you just wrote.&lt;/p&gt;
&lt;p&gt;There are two flavors of this fallback: a Swift version that uses &lt;code&gt;PropertyListSerialization&lt;/code&gt;, and a pure-PlistBuddy version for machines without a Swift toolchain. Same outcome, different tools.&lt;/p&gt;
&lt;h2&gt;What about utiluti?&lt;/h2&gt;
&lt;p&gt;If you&apos;ve spent any time in the macadmin world, you&apos;re probably thinking &quot;why not just use &lt;a href=&quot;https://github.com/scriptingosx/utiluti&quot;&gt;utiluti&lt;/a&gt;?&quot;, Armin Briegel&apos;s excellent command-line tool for reading and setting default apps for URL schemes and file types. It&apos;s well-maintained, it&apos;s broader than what I&apos;m doing here (it handles UTIs and file-type defaults too, not just URL schemes), and for setting &lt;code&gt;mailto&lt;/code&gt; it&apos;s genuinely a one-liner:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;utiluti url set mailto com.google.Chrome
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So why the homegrown script? A few honest differences, none of which make utiluti &quot;wrong&quot;, they&apos;re just trade-offs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;utiluti is a binary you have to ship.&lt;/strong&gt; That means building, codesigning, and notarizing it, then packaging it into your MDM. My script is a single self-contained &lt;code&gt;.sh&lt;/code&gt; file you paste into a custom-script payload and you&apos;re done. For one narrow job, that&apos;s less to manage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;utiluti expects to run as the current user.&lt;/strong&gt; The README says so explicitly, so you still have to wrap it in the same &lt;code&gt;launchctl asuser&lt;/code&gt; / drop-to-console-user dance, plus handle the staging gotchas, &lt;em&gt;yourself&lt;/em&gt;. My script bakes that context-handling in, which was honestly the hardest part to get right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Command Line Tools? No problem.&lt;/strong&gt; My script falls back to a PlistBuddy-only path on a bare machine. utiluti needs its (Swift-built) binary present.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The fallback.&lt;/strong&gt; utiluti sticks to the sanctioned API, which is the &lt;em&gt;correct&lt;/em&gt; and &lt;em&gt;cleaner&lt;/em&gt; choice. My script tries that first too, but will fall back to rewriting the plist directly when the API doesn&apos;t take. That&apos;s more of a sledgehammer, and you should reach for it knowing that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here&apos;s the important part: &lt;strong&gt;utiluti hits the exact same Chrome wall.&lt;/strong&gt; It can&apos;t make Chrome the &lt;code&gt;mailto&lt;/code&gt; default any more than my script can until Chrome has registered itself as a handler, so you need the Chrome Enterprise policy below either way.&lt;/p&gt;
&lt;p&gt;So: if you&apos;re already standardizing default-app management across a fleet, utiluti is the more general, better-supported tool and I&apos;d happily reach for it. For a single, self-contained &quot;make Chrome the mail handler and tell me clearly if it didn&apos;t work&quot; script I can push without packaging anything, this is what I ended up with. Different tools for slightly different jobs.&lt;/p&gt;
&lt;h2&gt;Deploying it with an MDM&lt;/h2&gt;
&lt;p&gt;This is the payoff. Because the script handles its own root-to-user retargeting, you don&apos;t have to do anything clever on the MDM side. You just drop it in as a custom script and let it run as root. The script does the rest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It detects it&apos;s running as root and re-targets the console user automatically.&lt;/li&gt;
&lt;li&gt;It bails cleanly (with a clear message) if nobody&apos;s logged in, so it&apos;s safe to run on a schedule.&lt;/li&gt;
&lt;li&gt;It stages its own readable copy to dodge the mode-&lt;code&gt;700&lt;/code&gt; temp directory problem.&lt;/li&gt;
&lt;li&gt;It verifies the result and exits non-zero if it couldn&apos;t confirm the change, so your MDM reports a real success or a real failure instead of a shrug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve only run this through &lt;strong&gt;&lt;a href=&quot;https://www.iru.com/&quot;&gt;Iru&lt;/a&gt;&lt;/strong&gt; (formerly Kandji) as a custom script, where it slots in neatly as a one-off or a recurring task. But there&apos;s nothing Iru-specific in it. Any MDM that can push a shell script and run it as root (Jamf, Mosyle, Addigy, Workspace ONE, etc.) should handle it the same way, because the hard parts are solved inside the script rather than in the platform&apos;s config.&lt;/p&gt;
&lt;p&gt;A couple of deployment notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Run it as root.&lt;/strong&gt; That&apos;s the default for MDM scripts anyway, and it&apos;s required for the &lt;code&gt;launchctl asuser&lt;/code&gt; retargeting to work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run it after login, or on a schedule.&lt;/strong&gt; If no human is at the console, there&apos;s no per-user default to set and the script exits early on purpose.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch the exit code.&lt;/strong&gt; Non-zero means it couldn&apos;t confirm Chrome as the handler, and nine times out of ten that&apos;s the Chrome problem below, not a bug in the script.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Don&apos;t forget the Chrome side&lt;/h2&gt;
&lt;p&gt;Here&apos;s the piece that bit me, and the reason a perfectly good script can still &quot;fail.&quot; macOS will not let you set &lt;code&gt;mailto&lt;/code&gt; to an app that hasn&apos;t registered itself as a handler for that scheme. Out of the box, &lt;strong&gt;Chrome doesn&apos;t declare &lt;code&gt;mailto&lt;/code&gt; until a web mail handler is enabled&lt;/strong&gt;: for example, until you let &lt;code&gt;mail.google.com&lt;/code&gt; register itself from &lt;code&gt;chrome://settings/handlers&lt;/code&gt;. Do it by hand and you&apos;ll see the little handler icon in the address bar; click it, allow Gmail, and &lt;em&gt;now&lt;/em&gt; Chrome can be the default.&lt;/p&gt;
&lt;p&gt;On a single machine that&apos;s a 10-second click. Across a fleet, you don&apos;t want to ask every user to do it, so you push it with Chrome Enterprise policy. The relevant one is &lt;strong&gt;&lt;a href=&quot;https://chromeenterprise.google/policies/?policy=RegisteredProtocolHandlers&quot;&gt;&lt;code&gt;RegisteredProtocolHandlers&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;, which lets you pre-register a handler (like Gmail for &lt;code&gt;mailto&lt;/code&gt;) so Chrome shows up as a willing &lt;code&gt;mailto&lt;/code&gt; owner &lt;em&gt;before&lt;/em&gt; the user ever touches a setting. A managed config looks roughly like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;RegisteredProtocolHandlers&quot;: [
    {
      &quot;protocol&quot;: &quot;mailto&quot;,
      &quot;url&quot;: &quot;https://mail.google.com/mail/?extsrc=mailto&amp;#x26;url=%s&quot;,
      &quot;default&quot;: true
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Push that policy and &lt;em&gt;then&lt;/em&gt; run the script, and the two halves meet in the middle: Chrome is allowed to be a &lt;code&gt;mailto&lt;/code&gt; handler, and macOS is told to make it the default one. Skip the policy and the script will dutifully try, fail to confirm, and tell you exactly why. The error message points you straight at &lt;code&gt;chrome://settings/handlers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The order that works reliably across a fleet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Push the &lt;code&gt;RegisteredProtocolHandlers&lt;/code&gt; policy via Chrome Enterprise / your MDM&apos;s managed-app config.&lt;/li&gt;
&lt;li&gt;Deploy and run the script as root.&lt;/li&gt;
&lt;li&gt;Verify with &lt;code&gt;open mailto:test@example.com&lt;/code&gt;. Chrome should answer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What I learned&lt;/h2&gt;
&lt;p&gt;A few things I&apos;ll carry into the next &quot;set a per-user default on a managed Mac&quot; job:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assume root, act as the user.&lt;/strong&gt; Anything per-user that an MDM runs has to retarget the console user itself, or it&apos;s quietly setting preferences nobody will ever see.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolve the real home directory.&lt;/strong&gt; &lt;code&gt;$HOME&lt;/code&gt; is a suggestion, not a fact, in these contexts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have a fallback.&lt;/strong&gt; The sanctioned API is the right first move, but a direct-plist-plus-&lt;code&gt;cfprefsd&lt;/code&gt;-flush path saves the day when it doesn&apos;t take.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The OS half and the app half have to agree.&lt;/strong&gt; macOS Launch Services and Chrome&apos;s protocol-handler registration are two separate switches, and you don&apos;t get the behavior you want until &lt;em&gt;both&lt;/em&gt; are flipped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make failures legible.&lt;/strong&gt; When the script can&apos;t confirm the change, it says why and what to do about it, which means future-me reads one message instead of re-debugging the whole thing.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The whole script&lt;/h2&gt;
&lt;p&gt;Here it is, end to end. It&apos;s safe to run as the logged-in user directly, and it&apos;ll retarget itself if launched as root.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
#
# set-default-mail-chrome.sh
#
# Sets the default macOS mail handler (the mailto: URL scheme) to Google Chrome
# for the currently logged-in user, as resiliently and self-containedly as
# possible. Safe to run from an MDM as a custom script (it handles the root/MDM
# execution context).
#
# Strategy (each step verifies; stops as soon as the handler is confirmed):
#   1. Locate Chrome and resolve its real bundle ID.
#   2. (Re)register Chrome with Launch Services so it can declare mailto.
#   3. Primary: set via the sanctioned NSWorkspace API (Swift).
#   4. Fallback: rewrite the user&apos;s LaunchServices secure.plist LSHandlers entry
#      directly, then flush cfprefsd so the change is re-read.
#   5. Verify by asking Launch Services which app now owns mailto:.
#
# Swift (Xcode or Command Line Tools) is preferred. If Swift is absent the
# script automatically uses a PlistBuddy-only path so it still works.
#
# Usage:  ./set-default-mail-chrome.sh
# Run as the target user. If run as root it auto-retargets the console user.

set -uo pipefail   # not -e: we handle failures explicitly so fallbacks can run

SCHEME=&quot;mailto&quot;
DEFAULT_BUNDLE_ID=&quot;com.google.Chrome&quot;
LSREGISTER=&quot;/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister&quot;
# SECURE_PLIST is resolved below, after the target user is known — do NOT use
# $HOME here (it can be unset when launched from a root/MDM context).

log()  { printf &apos;  %s\n&apos; &quot;$*&quot;; }
ok()   { printf &apos;✓ %s\n&apos; &quot;$*&quot;; }
warn() { printf &apos;! %s\n&apos; &quot;$*&quot; &gt;&amp;#x26;2; }
die()  { printf &apos;✗ %s\n&apos; &quot;$*&quot; &gt;&amp;#x26;2; exit 1; }

# --- Run in the right user context -----------------------------------------
# The mailto default is per-user, so a root invocation must drop to the console
# user or it would (uselessly) edit root&apos;s Launch Services database.
if [[ &quot;$(id -u)&quot; -eq 0 ]]; then
  consoleUser=$(stat -f%Su /dev/console)
  if [[ -z &quot;$consoleUser&quot; || &quot;$consoleUser&quot; == &quot;root&quot; || &quot;$consoleUser&quot; == &quot;loginwindow&quot; ]]; then
    die &quot;No regular console user is logged in — nothing to set.&quot;
  fi
  uid=$(id -u &quot;$consoleUser&quot;)
  log &quot;Running as root; retargeting console user: $consoleUser&quot;
  # The script may be staged in a root-only temp dir (mode 700), so
  # `sudo -u &amp;#x3C;user&gt; &quot;$0&quot;` fails with &quot;Permission denied&quot;. Stage a world-readable
  # copy in /private/tmp, run THAT as the console user, then clean it up.
  # -H so sudo sets HOME to the target user&apos;s home; the resolver below is the
  # real safety net in case it doesn&apos;t.
  selfCopy=&quot;/private/tmp/set-default-mail-chrome.$$.sh&quot;
  cp &quot;$0&quot; &quot;$selfCopy&quot; || die &quot;Could not stage a user-readable copy at $selfCopy&quot;
  chmod 755 &quot;$selfCopy&quot;
  launchctl asuser &quot;$uid&quot; sudo -H -u &quot;$consoleUser&quot; &quot;$selfCopy&quot; &quot;$@&quot;
  rc=$?
  rm -f &quot;$selfCopy&quot;
  exit $rc
fi

# Resolve the acting user&apos;s real home directory. Don&apos;t trust $HOME — it may be
# unset or wrong when this is launched from a root/MDM context, and `set -u`
# would otherwise abort on the first reference.
TARGET_USER=&quot;$(id -un)&quot;
USER_HOME=&quot;$(/usr/bin/dscl . -read &quot;/Users/$TARGET_USER&quot; NFSHomeDirectory 2&gt;/dev/null | awk &apos;{print $2}&apos;)&quot;
[[ -n &quot;$USER_HOME&quot; ]] || USER_HOME=&quot;${HOME:-/Users/$TARGET_USER}&quot;
export HOME=&quot;$USER_HOME&quot;
SECURE_PLIST=&quot;$USER_HOME/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist&quot;

echo &quot;Default-mail → Chrome  (user: $TARGET_USER, home: $USER_HOME)&quot;

# --- Toolchain detection ----------------------------------------------------
SWIFT_BIN=&quot;$(command -v swift 2&gt;/dev/null || true)&quot;
if [[ -n &quot;$SWIFT_BIN&quot; ]]; then
  log &quot;Swift toolchain: $SWIFT_BIN&quot;
else
  warn &quot;Swift not found — using PlistBuddy fallback path (install with &apos;xcode-select --install&apos; for the preferred API path).&quot;
fi

# --- Step 1: locate Chrome, resolve bundle ID -------------------------------
CHROME_APP=&quot;&quot;
for p in &quot;/Applications/Google Chrome.app&quot; \
         &quot;$HOME/Applications/Google Chrome.app&quot; \
         &quot;/Applications/Google Chrome Beta.app&quot; \
         &quot;/Applications/Google Chrome Dev.app&quot;; do
  [[ -d &quot;$p&quot; ]] &amp;#x26;&amp;#x26; { CHROME_APP=&quot;$p&quot;; break; }
done
if [[ -z &quot;$CHROME_APP&quot; ]]; then
  CHROME_APP=&quot;$(mdfind &quot;kMDItemCFBundleIdentifier == &apos;$DEFAULT_BUNDLE_ID&apos;&quot; 2&gt;/dev/null | head -n1)&quot;
fi
[[ -n &quot;$CHROME_APP&quot; &amp;#x26;&amp;#x26; -d &quot;$CHROME_APP&quot; ]] || die &quot;Google Chrome not found. Install it, then re-run.&quot;

BUNDLE_ID=&quot;$(/usr/bin/defaults read &quot;$CHROME_APP/Contents/Info&quot; CFBundleIdentifier 2&gt;/dev/null || echo &quot;$DEFAULT_BUNDLE_ID&quot;)&quot;
ok &quot;Found Chrome: $CHROME_APP  ($BUNDLE_ID)&quot;

# Bundle IDs are stored lowercased in the LSHandlers array.
BUNDLE_ID_LC=&quot;$(printf &apos;%s&apos; &quot;$BUNDLE_ID&quot; | tr &apos;[:upper:]&apos; &apos;[:lower:]&apos;)&quot;

# --- Step 2: (re)register Chrome with Launch Services -----------------------
# Ensures Chrome&apos;s declared URL schemes (including mailto, once enabled) are
# known to LS. Harmless if already registered.
if [[ -x &quot;$LSREGISTER&quot; ]]; then
  &quot;$LSREGISTER&quot; -f &quot;$CHROME_APP&quot; &gt;/dev/null 2&gt;&amp;#x26;1 &amp;#x26;&amp;#x26; log &quot;Re-registered Chrome with Launch Services.&quot;
fi

# --- Helper: read the current effective mailto handler ----------------------
current_handler() {
  if [[ -n &quot;$SWIFT_BIN&quot; ]]; then
    &quot;$SWIFT_BIN&quot; - &quot;$SCHEME&quot; 2&gt;/dev/null &amp;#x3C;&amp;#x3C;&apos;SWIFT&apos;

let scheme = CommandLine.arguments[1]
guard let url = URL(string: &quot;\(scheme):probe@example.com&quot;),
      let app = NSWorkspace.shared.urlForApplication(toOpen: url),
      let id  = Bundle(url: app)?.bundleIdentifier else { exit(0) }
print(id.lowercased())
SWIFT
  else
    # Best-effort read straight from the secure plist.
    /usr/libexec/PlistBuddy -c &quot;Print :LSHandlers&quot; &quot;$SECURE_PLIST&quot; 2&gt;/dev/null \
      | awk -v s=&quot;$SCHEME&quot; &apos;
          /Dict/ {inblk=1; role=&quot;&quot;; sch=&quot;&quot;}
          inblk &amp;#x26;&amp;#x26; $1==&quot;LSHandlerURLScheme&quot; {sch=$3}
          inblk &amp;#x26;&amp;#x26; $1==&quot;LSHandlerRoleAll&quot;   {role=$3}
          /\}/ { if (inblk &amp;#x26;&amp;#x26; sch==s &amp;#x26;&amp;#x26; role!=&quot;&quot;) print role; inblk=0 }&apos;
  fi
}

is_done() {
  local cur; cur=&quot;$(current_handler | tr &apos;[:upper:]&apos; &apos;[:lower:]&apos; | head -n1)&quot;
  [[ &quot;$cur&quot; == &quot;$BUNDLE_ID_LC&quot; ]]
}

flush_ls() {
  # Make Launch Services / cfprefsd re-read the on-disk plist.
  /usr/bin/killall cfprefsd &gt;/dev/null 2&gt;&amp;#x26;1 || true
  [[ -x &quot;$LSREGISTER&quot; ]] &amp;#x26;&amp;#x26; &quot;$LSREGISTER&quot; -f &quot;$CHROME_APP&quot; &gt;/dev/null 2&gt;&amp;#x26;1 || true
  sleep 1
}

# --- Step 3: primary path — NSWorkspace API ---------------------------------
set_via_api() {
  [[ -n &quot;$SWIFT_BIN&quot; ]] || return 1
  &quot;$SWIFT_BIN&quot; - &quot;$BUNDLE_ID&quot; &quot;$SCHEME&quot; &amp;#x3C;&amp;#x3C;&apos;SWIFT&apos;

let bundleID = CommandLine.arguments[1]
let scheme   = CommandLine.arguments[2]
guard let appURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleID) else {
    FileHandle.standardError.write(&quot;not installed: \(bundleID)\n&quot;.data(using: .utf8)!); exit(2)
}
let group = DispatchGroup(); group.enter(); var failed = false
NSWorkspace.shared.setDefaultApplication(at: appURL, toOpenURLsWithScheme: scheme) { error in
    if let error = error {
        FileHandle.standardError.write(&quot;LS error: \(error.localizedDescription)\n&quot;.data(using: .utf8)!)
        failed = true
    }
    group.leave()
}
if group.wait(timeout: .now() + 5) == .timedOut {
    FileHandle.standardError.write(&quot;timed out\n&quot;.data(using: .utf8)!); exit(3)
}
exit(failed ? 1 : 0)
SWIFT
}

# --- Step 4: fallback — rewrite secure.plist LSHandlers directly -------------
set_via_plist_swift() {
  [[ -n &quot;$SWIFT_BIN&quot; ]] || return 1
  &quot;$SWIFT_BIN&quot; - &quot;$SECURE_PLIST&quot; &quot;$SCHEME&quot; &quot;$BUNDLE_ID_LC&quot; &amp;#x3C;&amp;#x3C;&apos;SWIFT&apos;

let path    = CommandLine.arguments[1]
let scheme  = CommandLine.arguments[2]
let handler = CommandLine.arguments[3]
let url = URL(fileURLWithPath: path)
var root: [String: Any] = [:]
if let data = try? Data(contentsOf: url),
   let plist = (try? PropertyListSerialization.propertyList(from: data, options: [], format: nil)) as? [String: Any] {
    root = plist
}
var handlers = (root[&quot;LSHandlers&quot;] as? [[String: Any]]) ?? []
handlers.removeAll { ($0[&quot;LSHandlerURLScheme&quot;] as? String)?.lowercased() == scheme }
handlers.append([
    &quot;LSHandlerURLScheme&quot;: scheme,
    &quot;LSHandlerRoleAll&quot;: handler,
    &quot;LSHandlerPreferredVersions&quot;: [&quot;LSHandlerRoleAll&quot;: &quot;-&quot;],
])
root[&quot;LSHandlers&quot;] = handlers
do {
    try FileManager.default.createDirectory(at: url.deletingLastPathComponent(),
                                            withIntermediateDirectories: true)
    let out = try PropertyListSerialization.data(fromPropertyList: root, format: .binary, options: 0)
    try out.write(to: url)
} catch {
    FileHandle.standardError.write(&quot;write failed: \(error)\n&quot;.data(using: .utf8)!); exit(1)
}
SWIFT
}

set_via_plist_plistbuddy() {
  local pb=&quot;/usr/libexec/PlistBuddy&quot;
  mkdir -p &quot;$(dirname &quot;$SECURE_PLIST&quot;)&quot;
  [[ -f &quot;$SECURE_PLIST&quot; ]] || &quot;$pb&quot; -c &quot;Add :LSHandlers array&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1

  # Find an existing entry index for this scheme.
  local idx=0 found=-1
  while &quot;$pb&quot; -c &quot;Print :LSHandlers:$idx:LSHandlerURLScheme&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1; do
    local s; s=&quot;$(&quot;$pb&quot; -c &quot;Print :LSHandlers:$idx:LSHandlerURLScheme&quot; &quot;$SECURE_PLIST&quot; 2&gt;/dev/null)&quot;
    [[ &quot;$s&quot; == &quot;$SCHEME&quot; ]] &amp;#x26;&amp;#x26; { found=$idx; break; }
    idx=$((idx+1))
  done

  if [[ $found -ge 0 ]]; then
    &quot;$pb&quot; -c &quot;Set :LSHandlers:$found:LSHandlerRoleAll $BUNDLE_ID_LC&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
  else
    &quot;$pb&quot; -c &quot;Add :LSHandlers: dict&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
    local new; new=$idx
    &quot;$pb&quot; -c &quot;Add :LSHandlers:$new:LSHandlerURLScheme string $SCHEME&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
    &quot;$pb&quot; -c &quot;Add :LSHandlers:$new:LSHandlerRoleAll string $BUNDLE_ID_LC&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
    &quot;$pb&quot; -c &quot;Add :LSHandlers:$new:LSHandlerPreferredVersions dict&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
    &quot;$pb&quot; -c &quot;Add :LSHandlers:$new:LSHandlerPreferredVersions:LSHandlerRoleAll string -&quot; &quot;$SECURE_PLIST&quot; &gt;/dev/null 2&gt;&amp;#x26;1
  fi
}

# --- Orchestration ----------------------------------------------------------
if is_done; then
  ok &quot;Chrome is already the default $SCHEME handler. Nothing to do.&quot;
  exit 0
fi

log &quot;Attempt 1/2: NSWorkspace API…&quot;
if set_via_api; then
  sleep 1
  is_done &amp;#x26;&amp;#x26; { ok &quot;Chrome set as default $SCHEME handler (API).&quot;; echo &quot;Verify: open mailto:test@example.com&quot;; exit 0; }
  warn &quot;API call returned success but handler not yet confirmed; flushing…&quot;
  flush_ls
  is_done &amp;#x26;&amp;#x26; { ok &quot;Chrome set as default $SCHEME handler (API, after flush).&quot;; echo &quot;Verify: open mailto:test@example.com&quot;; exit 0; }
fi

log &quot;Attempt 2/2: direct secure.plist rewrite…&quot;
if [[ -n &quot;$SWIFT_BIN&quot; ]]; then
  set_via_plist_swift || warn &quot;Swift plist rewrite reported an error.&quot;
else
  set_via_plist_plistbuddy || warn &quot;PlistBuddy rewrite reported an error.&quot;
fi
flush_ls

if is_done; then
  ok &quot;Chrome set as default $SCHEME handler (plist fallback).&quot;
  echo &quot;Verify: open mailto:test@example.com&quot;
  exit 0
fi

# --- Both paths failed ------------------------------------------------------
cat &gt;&amp;#x26;2 &amp;#x3C;&amp;#x3C;EOF
✗ Could not confirm Chrome as the default $SCHEME handler.

Most likely cause: Chrome has not registered itself as a mailto handler yet.
Chrome only declares the mailto scheme after you enable a web mail handler:

  1. Open Gmail in Chrome.
  2. Click the handler (⛓/double-diamond) icon in the address bar, OR go to
     chrome://settings/handlers and allow mail.google.com to open mailto links.
  3. Re-run this script.

Current handler: $(current_handler | head -n1 || echo &apos;(unknown)&apos;)
EOF
exit 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you manage a fleet where everyone&apos;s mail lives in the browser, this pairs nicely with the Chrome policy push and quietly removes one of those papercuts nobody ever files a ticket about. They just sigh and re-type the address into Gmail.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://chromeenterprise.google/policies/?policy=RegisteredProtocolHandlers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://chromeenterprise.google/policies/?policy=RegisteredProtocolHandlers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/scriptingosx/utiluti&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://github.com/scriptingosx/utiluti&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>automation</category><category>tutorial</category><category>mdm</category></item><item><title>The Journey Is the Point</title><link>https://barnes.tech/blog/the-journey-is-the-point</link><guid isPermaLink="true">https://barnes.tech/blog/the-journey-is-the-point</guid><description>Some thoughts on AI in 2026: why its biggest risks are human, and how to use it without losing yourself along the way.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The world of technology has rapidly changed in the last few years. When ChatGPT launched, it clearly was a tipping point in the general public&apos;s mind about what AI is and what it&apos;s capable of. Ever since that launch, things have only accelerated. AI agents today are capable of some truly amazing things, and many people are split into two extreme ways of thinking about AI. Many tout it as a bigger revolution than the industrial revolution, and think it could be the beginning of a golden age of humanity, with unbelievable medical and scientific breakthroughs, and all manner of incredible things that we can&apos;t even imagine right now.&lt;/p&gt;
&lt;p&gt;Then there are the AI &quot;doomers.&quot; Some think it will become sentient and destroy us all. Others fear it will empower enemies to build unimaginable weapons. I&apos;d even put the people who see AI as useless, an enormous resource drain that will topple the environment, in this camp as well.&lt;/p&gt;
&lt;p&gt;Reality is never that simple. The truth is likely several things all at once. It will propel some amazing innovations and accelerate many types of work. &lt;a href=&quot;https://alphafoldserver.com/welcome&quot;&gt;AlphaFold&lt;/a&gt; is a clear example, and likely just the first of that type of groundbreaking discovery. It will also harm the environment, it&apos;s already breaking what the internet is at its core completely, and the large scale models that are the most useful are essentially trained on stolen work.&lt;/p&gt;
&lt;p&gt;I&apos;ve already written about several ways I use AI nearly every day to enhance what I am working on and accelerate how quickly I can bring ideas to life, through code, automation, and even research. I have thought a lot about AI pros and cons, read hundreds of articles, and listened to dozens of hours of podcasts from experts on the subject about the technology as well as the philosophy of how this can, and is, impacting us, and I wanted to write out some thoughts about the biggest problems AI is and will have.&lt;/p&gt;
&lt;h2&gt;AI Psychosis&lt;/h2&gt;
&lt;p&gt;I think the biggest issue with AI is going to be around &quot;AI Psychosis&quot; and similar ways that it influences us as a species. In &lt;a href=&quot;https://www.psychologytoday.com/us/blog/urban-survival/202507/the-emerging-problem-of-ai-psychosis&quot;&gt;The Emerging Problem of &quot;AI Psychosis&quot;&lt;/a&gt;, Psychology Today describes this as cases in which AI chatbots amplify, validate, or even co-create psychotic symptoms in users. This is not a clinical diagnosis at the moment, but I&apos;m only referring to the concept here. Research has shown that AI (chatbots in particular) reinforced grandiose, referential, persecutory, religious, and romantic delusions that grow more entrenched over time. Researchers identify three recurring themes: &quot;messianic missions&quot; (grandiose delusions), &quot;god-like AI&quot; (the chatbot as a sentient deity), and &quot;attachment-based&quot; delusions (mistaking mimicry for genuine love).&lt;/p&gt;
&lt;p&gt;This is shown to happen because the general purpose models that power chatbots of different sorts are optimized for engagement, satisfaction, and continuing the conversation, not for any purpose of helping people be mentally healthy.&lt;/p&gt;
&lt;p&gt;Sound familiar? This is the same issue with social media platforms, also tuned for engagement.&lt;/p&gt;
&lt;p&gt;Even more concerning to me is where this goes in the future. Right now the hype cycle is in full force and AI companies have essentially infinite money coming in. They do not need to make any money at all, they can just build as fast as they can and someone else pays the check. That won&apos;t last forever. At some point the check comes due, which typically means the &lt;strong&gt;engagement&lt;/strong&gt; part of the product needs to be tuned to learn everything possible about the user, and shove advertisements in their face. ChatGPT is already starting to test the waters here, but again, keep in mind they have not needed to start making money yet.&lt;/p&gt;
&lt;p&gt;These will be for-profit companies, and they, like social media before it, will maximize profits. Look no further than Facebook to see how much the leadership cares about the immense harm their product does to people when they turn on the advertising money spigot, and engagement becomes everything.&lt;/p&gt;
&lt;h2&gt;Social Isolation and Human Perfection&lt;/h2&gt;
&lt;p&gt;Social media sold itself as a way to connect to more people, and stay in touch with people you care about, but the reality is it becomes an addiction and people disconnect from the real people in their life and focus on the dopamine of social media. As more and more people look to AI to fill the loneliness void in their lives, this can easily make the problem even worse. It&apos;s easy to dismiss the stories of people having &quot;romantic&quot; relationships with a chatbot, maybe even think it&apos;s funny, but this is really happening to real people.&lt;/p&gt;
&lt;p&gt;There are definitely cases where people seem to have been helped by this, but there are also countless examples where these chatbots have talked people into committing suicide. I don&apos;t believe any of the leading AI companies are trying to do this kind of harm to people, but in many ways it doesn&apos;t matter, because the tools they built are doing this.&lt;/p&gt;
&lt;p&gt;Another harm of social media is the illusion of perfection. Everyone presents only the best parts of themselves, and the advertising / AI slop shows idealized versions of people or situations that often aren&apos;t real at all, but in all cases don&apos;t reflect reality with all of its context. This has had an enormous impact on people&apos;s image of themselves, and AI is poised to accelerate this significantly. There will be countless photos and even videos of &quot;perfect&quot; people that don&apos;t exist, but people will inevitably compare themselves to. It becomes essentially effortless to edit your own photos to make it look like what you think should be the ideal version of yourself, and when reality doesn&apos;t match that, people will never feel like they are enough.&lt;/p&gt;
&lt;h2&gt;The Journey Is the Point&lt;/h2&gt;
&lt;p&gt;Finally, nearly everyone has heard some version of how &quot;the journey is the point&quot; of life, but it is so difficult to actually internalize and act on that. What does this mean? A simple example is much of going to school. The point is not to get the answer to a math problem. You can use a calculator to get that. It&apos;s not about the paper you wrote about a book someone else wrote, the point is doing the work to learn. You don&apos;t learn by having something else do it for you. Mathematicians and engineers obviously use calculators for their work, but they know what goes into it.&lt;/p&gt;
&lt;p&gt;I am certainly not immune to this. I really struggled to care about anything in school. Internally I thought much of it was pointless for one reason or another, and it was a lot of effort to put the time in. In many ways I think I didn&apos;t learn how to learn things until after I was done with school, but I would have been much better off if I could have figured out how to do that earlier. One of the most difficult but important lessons of my life has been to learn that sometimes it&apos;s supposed to be done the hard way because that&apos;s what forges who we are.&lt;/p&gt;
&lt;p&gt;This is another huge risk for AI. It has the potential to be the &quot;shortcut&quot; to so many things, and if people get used to just using AI as the shortcut, we are in some serious trouble. We are honestly close to the point (if not already there) that AI could pass all of school through high school, and honestly many college classes. Sure, schools try to prevent this, but if students want to they will get around that.&lt;/p&gt;
&lt;p&gt;Same goes for people looking to AI tools for relationships. Why would you try to have relationships with people when it can be messy, you can and will get hurt, you&apos;ll sometimes not know the right thing to say and you&apos;ll have regrets. AI can give you the &quot;perfect&quot; relationship that will always fit exactly what you think you&apos;re looking for, but then you never learn and you never grow.&lt;/p&gt;
&lt;h2&gt;What Can Anyone Do?&lt;/h2&gt;
&lt;p&gt;The most honest answer - None of us know how this will impact us in the long run. Many young people are pushing back hard against the wave of AI everything - &lt;a href=&quot;https://www.theverge.com/ai-artificial-intelligence/920401/gen-z-ai&quot;&gt;The more young people use AI, the more they hate it | The Verge&lt;/a&gt;. This might be cause for hope.&lt;/p&gt;
&lt;p&gt;For me and what I tell people, just be really careful how you use and how you think about AI. My main use case is using Claude Code. This is far more purpose-built for a specific task - coding - and has significantly less &quot;sycophancy&quot; than the general chat models. Luckily I also knew most of the coding techniques that I use in there, I was just much slower at it. I think and feel like more of the engineer using CAD to enhance what I&apos;m doing, I&apos;m not looking to offload the cognitive load to a robot.&lt;/p&gt;
&lt;p&gt;I would also recommend not using it for advice on life things, particularly things that matter. It doesn&apos;t actually &quot;know&quot; anything. It&apos;s a giant model of mathematic vectors, and just gives you the most likely response in words based on the input. It&apos;s incredible what it can do. It&apos;s also important to realize and understand what it is, and what it isn&apos;t.&lt;/p&gt;
&lt;p&gt;With those cautions out of the way, here are a few habits that have helped me use AI well rather than let it use me.&lt;/p&gt;
&lt;p&gt;Give it detailed instructions - If you&apos;re doing research or if online resources would be specifically helpful for something you&apos;re working on, be as clear as you can with your instructions. Give the references you want it to work with. Explain why you are doing what you&apos;re doing, and what the result you&apos;re looking for is. It&apos;s even better if you tell it a way to know if whatever it gives you is correct. If it&apos;s code, tell it how it can test the code to ensure it&apos;s working properly. The more &lt;strong&gt;good&lt;/strong&gt; context you give it, the better the response will be.&lt;/p&gt;
&lt;p&gt;Practice doing it yourself - If you use AI for online research, it can be incredibly powerful. Exclusively relying on it can be a problem. You need to continue to understand what it&apos;s doing, and be able to know if it&apos;s wrong. Don&apos;t give in to the temptation to just offload all of the cognitive load to AI and completely lose the ability to do it yourself. Force yourself to practice it from time to time.&lt;/p&gt;
&lt;p&gt;Finally, one of the things I find most useful with AI is to use it to help you learn things. Resist the urge to have it &quot;do it&quot; for you, interact with it to learn something you don&apos;t know. One of the best parts of using AI is that it can have infinite patience with you.&lt;/p&gt;
&lt;p&gt;An example I&apos;ll give is in my home lab I wanted to set up a few docker containers to handle a few different tasks that I wanted to experiment with. I understood the idea of Docker containers, and I could follow some online instructions on setting something up, and of course Claude Code could have just done all of it for me, but I took the opportunity to ask about the configuration files. What does this mean? If I changed that to this, would that work? Why is the formatting like this? How do I make it recover automatically if it ever goes down? I could ask all the dumb questions and learn really quickly. Am I a docker expert now? No, but I learned a lot from the problem.&lt;/p&gt;
&lt;p&gt;In other cases if it&apos;s something I needed to learn even more, like study for a certification or something similar, you can compile a bunch of good data, and then have AI quiz you on the topics, and help you learn and understand things that you don&apos;t feel as solid on.&lt;/p&gt;
&lt;p&gt;It&apos;s hard to resist the simple easier path, but sometimes it&apos;s important. The journey is the point.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.nytimes.com/2026/03/29/opinion/ai-claude-chatgpt-gemini-mcluhan.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Opinion | I Saw Something New in San Francisco | The New York Times&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://alphafoldserver.com/welcome&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;AlphaFold Server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=P_fHJIYENdI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;AlphaFold - The Most Useful Thing AI Has Ever Done | YouTube&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.psychologytoday.com/us/blog/urban-survival/202507/the-emerging-problem-of-ai-psychosis&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The Emerging Problem of &quot;AI Psychosis&quot; | Psychology Today&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/ai-artificial-intelligence/920401/gen-z-ai&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;The more young people use AI, the more they hate it | The Verge&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://podcasts.apple.com/us/podcast/simon-sinek-youre-being-lied-to-about-ais-real-purpose/id1291423644?i=1000709862270&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Simon Sinek: You&apos;re Being Lied… - The Diary Of A CEO with Steven Bartlett | Apple Podcasts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category></item><item><title>Artemis II: The Mission and Its Images</title><link>https://barnes.tech/blog/artemis-2-photo-gallery</link><guid isPermaLink="true">https://barnes.tech/blog/artemis-2-photo-gallery</guid><description>Key highlights from the Artemis II lunar flyby mission, and a gallery of 118 high-resolution NASA photos and videos.</description><pubDate>Sat, 11 Apr 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Artemis II launched on April 1, 2026, from Pad 39B at Kennedy Space Center aboard NASA&apos;s Space Launch System. The crew (Reid Wiseman, Victor Glover, Christina Koch, and Jeremy Hansen) flew a 10-day lunar flyby test mission aboard the Orion capsule (named &lt;em&gt;Integrity&lt;/em&gt;). The purpose was to test systems, identify problems, and validate hardware for future lunar landing missions. No landing was attempted.&lt;/p&gt;
&lt;p&gt;Watching this mission unfold has been genuinely incredible. In a period where so much of the world is chaotic and uncertain, having something this ambitious and this beautiful to follow has been a welcome reminder of what humans are capable of when they&apos;re pointed in the right direction. The images that came back are stunning, and I wanted to put all of my favorite ones in one place.&lt;/p&gt;
&lt;h2&gt;Dark-Side Earth Photography&lt;/h2&gt;
&lt;p&gt;Some of the most striking images showed Earth&apos;s night side after the spacecraft left low orbit. A thin crescent of sunlight and scattered city lights were visible, while the rest of the cloud cover was faintly illuminated by &lt;strong&gt;moonshine&lt;/strong&gt;: sunlight reflecting off the full Moon back onto Earth.&lt;/p&gt;
&lt;p&gt;Longer-exposure versions of these shots revealed additional features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Venus&lt;/strong&gt; as a bright point of light&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Green auroras&lt;/strong&gt; visible at high latitudes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The sodium layer&lt;/strong&gt;: a thin glowing ring around the planet at roughly 90 km altitude, created by atomic sodium deposited from vaporized meteors and excited by sunlight. Astronomers use lasers tuned to this sodium&apos;s wavelength to create artificial &quot;guide stars,&quot; then measure atmospheric distortion to drive adaptive optics corrections on ground-based telescopes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zodiacal light&lt;/strong&gt;: a faint glow caused by sunlight scattering off interplanetary dust along the plane of the solar system&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Moon&apos;s Far Side&lt;/h2&gt;
&lt;p&gt;As the capsule orbited the Moon, it captured detailed views of the far side, which is heavily cratered compared to the smoother near side. The near side has a thinner crust, likely due to gravitational interaction and concentration of radioactive, heat-producing elements, which allowed more volcanic activity to resurface the terrain with lava flows. The far side, with its thicker crust, preserves a much longer history of impacts. Visible features include crater chains (linear strings of craters formed by ejecta from large impacts like the Orientale basin) and deep multi-ring impact basins.&lt;/p&gt;
&lt;h2&gt;&quot;Earthset&quot;&lt;/h2&gt;
&lt;p&gt;The mission produced a now-iconic image of a crescent Earth appearing to set behind the Moon&apos;s limb, shot with a long telephoto lens (80–400 mm on a Nikon D5). While visually stunning, the image contains three subtle distortions worth understanding:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Orientation&lt;/strong&gt;: The photo has been rotated to make it look like Earth is rising or setting over a horizon. From the spacecraft&apos;s actual trajectory, Earth was off to the side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apparent size&lt;/strong&gt;: The telephoto lens compresses the scene, making Earth appear far larger relative to the lunar surface than it would to the naked eye.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The concept of Earthrise/Earthset&lt;/strong&gt;: Because the Moon is tidally locked, Earth doesn&apos;t actually rise or set from the lunar surface. From the near side, Earth hangs in roughly the same spot in the sky (with slight wobble from libration). From the far side, Earth is never visible. The apparent motion in these photos is entirely due to the spacecraft&apos;s orbit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Moon&apos;s surface in these shots also looks oddly &quot;rendered&quot; or video-game-like. This is because lighting in space comes from a single source (the Sun) with no atmospheric scattering to fill shadows, producing extreme contrast that our brains read as computer-generated.&lt;/p&gt;
&lt;h2&gt;The Unplanned Solar Eclipse&lt;/h2&gt;
&lt;p&gt;The mission&apos;s most dramatic visual moment was unplanned. Because of a launch schedule slip to April 1, the departing spacecraft&apos;s geometry happened to align so that the Moon passed directly in front of the Sun. The astronauts watched from within the Moon&apos;s shadow as the &lt;strong&gt;solar corona&lt;/strong&gt;, hot plasma extending far from the Sun&apos;s surface, formed a bright halo around the Moon&apos;s silhouette.&lt;/p&gt;
&lt;p&gt;The Moon&apos;s dark side was faintly illuminated by &lt;strong&gt;Earthshine&lt;/strong&gt;: sunlight bouncing off the distant Earth. Stars and several planets (including Mars, Venus, and Saturn) were visible along the plane of the solar system in the same frame. Victor Glover remarked from orbit that humans probably haven&apos;t evolved to process what they were seeing.&lt;/p&gt;
&lt;h2&gt;Wide Compositions&lt;/h2&gt;
&lt;p&gt;Several images placed the Orion capsule, the Moon, and the Earth all in a single frame, one captured by a GoPro mounted externally. These compositions drive home the scale contrast between the small, improvised nature of human spacecraft and the vastness of the space around them.&lt;/p&gt;
&lt;h2&gt;Why These Photos Matter&lt;/h2&gt;
&lt;p&gt;The most powerful Artemis II images resulted from a combination of luck and deliberate human choices. The launch date created the eclipse geometry. The astronauts chose the compositions, lenses, and framing. Photographs from crewed missions are not just data. They are artistic decisions that shape how humanity processes and remembers spaceflight.&lt;/p&gt;
&lt;h2&gt;Gallery&lt;/h2&gt;
&lt;p&gt;All 118 images and videos below are full-resolution NASA originals. Click any thumbnail to view it larger, and use the download button to save individual files or download the entire collection.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oaXRREHVkHo&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Hank Green&apos;s breakdown of the Artemis II mission and its images&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>space</category><category>photography</category><category>nasa</category></item><item><title>Claude Code&apos;s Source Code Leaked via npm</title><link>https://barnes.tech/blog/claude-codes-source-code-leaked-via-npm</link><guid isPermaLink="true">https://barnes.tech/blog/claude-codes-source-code-leaked-via-npm</guid><description>How a source map file accidentally shipped to npm exposed Claude Code&apos;s entire codebase, and why it&apos;s more embarrassing than catastrophic.</description><pubDate>Wed, 01 Apr 2026 12:00:00 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/claude-code-wordmark-light-mode.svg&quot; alt=&quot;Claude Code logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;ve &lt;a href=&quot;https://barnes.tech/blog/how-i-use-claude-code-every-day/&quot;&gt;written about Claude Code before&lt;/a&gt; and it&apos;s a tool I use every day. Yesterday, it was discovered that Anthropic accidentally included the source code for Claude Code.&lt;/p&gt;
&lt;p&gt;It&apos;s important to note, this is only the specific source code for Claude Code, the coding assistant that Anthropic have, primarily used in the terminal.  This is not the source of the actual AI model itself or the Claude app.&lt;/p&gt;
&lt;p&gt;Here&apos;s what actually happened, what people found inside, and why I think this is mostly just an embarrassing mistake rather than the catastrophic event some are making it out to be.&lt;/p&gt;
&lt;h2&gt;What Happened&lt;/h2&gt;
&lt;p&gt;On March 31st, security researcher Chaofan Shou discovered that a recent npm release of Claude Code included a source map file. For the non-developers: when code gets packaged up for distribution, it gets compressed and minified into something that&apos;s basically unreadable to humans. It still works fine, but if you opened it up and tried to make sense of it, you&apos;d just see a wall of characters. A source map is a separate file that reverses that process. It maps the compressed code back to the original, readable source. Developers keep these around for debugging, but they&apos;re meant to stay internal. You don&apos;t publish them to the world.&lt;/p&gt;
&lt;p&gt;Anthropic accidentally shipped one to the public.&lt;/p&gt;
&lt;p&gt;The result was roughly 1,900 TypeScript files and over 500,000 lines of readable code, essentially the entire Claude Code codebase, sitting right there in the npm package for anyone to extract. Researchers found it, the code spread quickly across GitHub, and by the time Anthropic pulled the release and started issuing DMCA takedowns, the cat was thoroughly out of the bag.&lt;/p&gt;
&lt;h2&gt;How Does This Happen?&lt;/h2&gt;
&lt;p&gt;This is actually a pretty common class of mistake. npm packages are defined by a &lt;code&gt;package.json&lt;/code&gt; file that specifies what gets included when you publish. A misconfigured &lt;code&gt;.npmignore&lt;/code&gt; file or a missing exclusion in the &lt;code&gt;files&lt;/code&gt; field, and suddenly your source maps, internal docs, or test fixtures are shipping to production.&lt;/p&gt;
&lt;p&gt;The leading theory is that someone on the team enabled richer source maps to debug some rate-limiting issues they were having, and then forgot to exclude them before the next publish.&lt;/p&gt;
&lt;p&gt;Anthropic confirmed as much in a statement to the press:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Earlier today, a Claude Code release included some internal source code. No sensitive customer data or credentials were involved or exposed. This was a release packaging issue caused by human error, not a security breach. We&apos;re rolling out measures to prevent this from happening again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It was a build pipeline oversight. The kind of thing that can happen to any team, and has happened to plenty of others.&lt;/p&gt;
&lt;h2&gt;What&apos;s Inside&lt;/h2&gt;
&lt;p&gt;This is where it gets interesting. The leaked code reveals that Claude Code is a genuinely sophisticated piece of software, not just a thin wrapper around an API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The architecture&lt;/strong&gt; is built on Bun (not Node.js), uses React with Ink for terminal UI rendering, and has a modular tool-based system with around 40 built-in tools, each with its own permission gates. The query engine alone, which handles all the LLM API calls, streaming, caching, and orchestration, is reportedly around 46,000 lines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multi-agent orchestration&lt;/strong&gt; is a big part of it. Claude Code can spawn sub-agents (internally called &quot;swarms&quot;) to handle complex tasks in parallel, each running in its own context with specific tool permissions. If you&apos;ve used the Agent tool in Claude Code, you&apos;ve seen this in action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There&apos;s a persistent memory system&lt;/strong&gt;, which I&apos;ve &lt;a href=&quot;https://barnes.tech/blog/how-i-use-claude-code-every-day/&quot;&gt;talked about before&lt;/a&gt;, stored as files that maintain context about you and your projects across sessions. Seeing the implementation details confirms what the experience already suggested: this is one of the features that makes Claude Code actually useful rather than just clever.&lt;/p&gt;
&lt;h3&gt;The Most Interesting Stuff&lt;/h3&gt;
&lt;p&gt;Beyond the architecture, the leak exposed some features and behaviors that raised eyebrows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anti-distillation tricks.&lt;/strong&gt; The code includes mechanisms designed to poison the output if someone tries to train another model on Claude&apos;s responses. Essentially, fake tool descriptions and misleading instructions get baked into the output in ways that would confuse a model trying to learn from it. This is Anthropic&apos;s attempt to protect against competitors scraping Claude&apos;s behavior to train cheaper models. Now that the actual tool list and real instructions are visible, this defense is somewhat undermined.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Undercover mode.&lt;/strong&gt; There&apos;s a flag that instructs Claude not to mention itself, its model name, or Anthropic in commit messages or outputs. The stated purpose is to avoid leaking internal model codenames, but it also raised concerns about AI-generated code being quietly contributed to open source projects without disclosure. I can see both sides of this. If you&apos;re an Anthropic engineer using Claude Code to help with a commit to a public repo, you probably don&apos;t want &quot;Claude Opus 4.7&quot; in the commit metadata. But the optics aren&apos;t great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A frustration detector.&lt;/strong&gt; A regex-based system that scans user input for angry or profane language and logs events. This is pretty straightforward pattern matching, not some deep emotional intelligence system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unreleased features.&lt;/strong&gt; The code references a bunch of stuff that hasn&apos;t shipped yet: &quot;dream mode&quot; for background memory consolidation, &quot;coordinator mode&quot; for spinning up multiple workers in parallel, &quot;ultra plan&quot; and &quot;ultra review&quot; for long-running remote operations, auto/AFK modes that act while you&apos;re away, and references to unreleased models including something codenamed Capiara/Mythos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feature flags everywhere.&lt;/strong&gt; The code uses tons of feature flagging, which is pretty standard, but the sheer number of flags and environment variables suggests this codebase moves fast and experiments constantly.&lt;/p&gt;
&lt;h2&gt;Why It&apos;s Not a Huge Deal&lt;/h2&gt;
&lt;p&gt;Here&apos;s where I&apos;ll probably diverge from some of the more dramatic coverage. I don&apos;t think this is actually that significant in terms of real damage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The model is the product, not the harness.&lt;/strong&gt; Claude Code is an impressive piece of engineering, but it&apos;s ultimately orchestration software that makes API calls to Claude. The actual intelligence, the thing that makes it useful, lives in the model weights on Anthropic&apos;s servers. Those weren&apos;t leaked. A competitor could rebuild the entire Claude Code CLI from scratch using the leaked source and it would still need access to Claude&apos;s API (or another model&apos;s) to do anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Most of this was already knowable.&lt;/strong&gt; If you&apos;ve used Claude Code extensively, you already knew about the tool system, the memory architecture, the sub-agent spawning, and the permission gates. The leaked code confirms implementation details, but the overall architecture wasn&apos;t exactly a mystery. Anthropic&apos;s own documentation describes most of these systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &quot;competitive advantage&quot; argument is overstated.&lt;/strong&gt; Yes, competitors can now see exactly how Anthropic implemented certain features. But the open-source AI coding tool space is already vibrant and moving fast. Tools like Aider, OpenCode, and others have independently arrived at similar architectures. The ideas aren&apos;t secret; the execution quality and the model behind it are what matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anti-distillation being exposed is annoying, not devastating.&lt;/strong&gt; The poison-pill approach was always security through obscurity. Now that it&apos;s visible, Anthropic will need to adjust their approach, but this was never going to be a long-term defense anyway. This is a cat and mouse game that will continue regardless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The unreleased features are just a product roadmap.&lt;/strong&gt; Every software company has unreleased features sitting in their codebase. Knowing that Anthropic is working on background agents and parallel worker coordination is interesting but not exactly surprising given the direction the entire industry is heading.&lt;/p&gt;
&lt;h2&gt;Embarrassing&lt;/h2&gt;
&lt;p&gt;The real impact here is reputational. Anthropic positions themselves as the &quot;safety-first&quot; AI company, the adults in the room. Having their flagship developer tool leak because of a build configuration mistake is... not a great look for that brand.&lt;/p&gt;
&lt;h2&gt;The Takeaway&lt;/h2&gt;
&lt;p&gt;A source map file shipped in an npm package. It happens. The code it exposed is impressive engineering but not the secret sauce that makes Claude useful. The unreleased features are interesting but not shocking. The anti-distillation tricks and undercover mode are worth discussing but not scandalous.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/how-i-use-claude-code-every-day/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/how-i-use-claude-code-every-day/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>security</category><category>development</category></item><item><title>The Government Is Trying to Destroy Anthropic</title><link>https://barnes.tech/blog/the-government-is-trying-to-destroy-anthropic</link><guid isPermaLink="true">https://barnes.tech/blog/the-government-is-trying-to-destroy-anthropic</guid><description>The Pentagon designated Anthropic a supply chain risk -- a label for foreign adversaries -- for refusing to build unsupervised killbots.</description><pubDate>Tue, 03 Mar 2026 01:22:05 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Anthropic logo - Slate.svg&quot; alt=&quot;Anthropic logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I try not to post about politics very often. The state of things is genuinely terrible, and dwelling on it is bad for my mental health. But this story sits squarely at the intersection of AI, big tech, and government overreach -- topics I write about often -- and I think it&apos;s important enough to talk about.&lt;/p&gt;
&lt;p&gt;Full disclosure: I use Anthropic&apos;s products every day. Claude Code is &lt;a href=&quot;/blog/how-i-use-claude-code-every-day/&quot;&gt;my most-used tool&lt;/a&gt;. I have every reason to be biased here. But the facts of this situation are so outrageous that bias barely matters. What the Pentagon just did to Anthropic should alarm anyone who cares about free enterprise, the rule of law, or the basic idea that the government shouldn&apos;t be able to destroy an American company because it lost a contract negotiation.&lt;/p&gt;
&lt;h2&gt;What Happened&lt;/h2&gt;
&lt;p&gt;Last summer, Anthropic was one of four AI companies -- alongside Google, OpenAI, and xAI -- awarded contracts with the Pentagon worth up to $200 million each. Anthropic&apos;s contract included their standard usage policy, which the Pentagon agreed to at the time.&lt;/p&gt;
&lt;p&gt;In January, Defense Secretary Pete Hegseth issued an AI strategy memo directing that all Pentagon AI contracts include &quot;any lawful use&quot; language -- meaning AI companies must remove all safeguards and let the military use their models for anything not explicitly illegal. This was a direct collision with Anthropic&apos;s contract terms.&lt;/p&gt;
&lt;p&gt;Anthropic didn&apos;t refuse to work with the military. They were the first AI company to deploy on classified military networks. They were the first to deploy at the national labs. Claude was used in the operation that captured former Venezuelan president Nicolás Maduro. They have an extensive partnership with Palantir. They voluntarily cut off hundreds of millions in revenue from Chinese firms linked to the CCP.&lt;/p&gt;
&lt;p&gt;Anthropic drew exactly two red lines:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No mass domestic surveillance.&lt;/strong&gt; Using AI to surveil American citizens at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No fully autonomous weapons.&lt;/strong&gt; AI systems that select and engage targets without any human in the loop.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&apos;s it. Not &quot;we won&apos;t work with the military.&quot; Not &quot;we object to military operations.&quot; Two specific guardrails on capabilities that don&apos;t even exist reliably yet and that most Americans would consider common sense.&lt;/p&gt;
&lt;p&gt;The Pentagon&apos;s response was to demand Anthropic accept the new terms unconditionally by Friday evening or face consequences.&lt;/p&gt;
&lt;h2&gt;The Punishment&lt;/h2&gt;
&lt;p&gt;When Anthropic held their ground, the administration escalated to something unprecedented. Trump called them &quot;Leftwing nut jobs&quot; on social media and directed federal agencies to stop using their products. Hegseth designated Anthropic a &lt;strong&gt;supply chain risk&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This designation has never been used against an American company. It was created to deal with foreign adversaries like Huawei -- companies suspected of espionage or embedding malware in American infrastructure. Using it as a cudgel against a domestic company because you don&apos;t like how contract negotiations are going is, as Scott Alexander put it, &quot;insane Third World bullshit.&quot;&lt;/p&gt;
&lt;p&gt;The designation doesn&apos;t just cut Anthropic off from military contracts. It bans any contractor, supplier, or partner that does business with the US military from doing any commercial activity with Anthropic. Given how many companies do some business with the government, this could be fatal to Anthropic&apos;s business. That&apos;s the point. It&apos;s not a policy disagreement. It&apos;s punishment.&lt;/p&gt;
&lt;p&gt;And the whole thing is self-contradicting. You can&apos;t simultaneously designate a company a supply chain risk &lt;em&gt;and&lt;/em&gt; threaten to invoke the Defense Production Act to force them to provide their technology because it&apos;s essential to national security. As &lt;a href=&quot;https://www.lawfaremedia.org/article/what-the-defense-production-act-can-and-can&amp;#x27;t-do-to-anthropic&quot;&gt;Lawfare noted&lt;/a&gt;, these two threats are inherently contradictory: one labels Anthropic a security risk, the other labels Claude as critical to national defense. &lt;a href=&quot;https://www.lawfaremedia.org/article/pentagon&amp;#x27;s-anthropic-designation-won&amp;#x27;t-survive-first-contact-with-legal-system&quot;&gt;Lawfare&apos;s follow-up analysis&lt;/a&gt; called it &quot;designation as political theater: a show of force that will not stick.&quot;&lt;/p&gt;
&lt;h2&gt;The Broader Context&lt;/h2&gt;
&lt;p&gt;This isn&apos;t just about Anthropic. This is the US government demonstrating that it can threaten to destroy any American company, with no legal review, for failing to comply with demands that weren&apos;t even in the original contract. Every company that does business with the government should be concerned.&lt;/p&gt;
&lt;p&gt;As former Trump White House AI advisor Dean Ball &lt;a href=&quot;https://www.hyperdimensional.co/p/clawed&quot;&gt;wrote&lt;/a&gt;: &quot;Even if Secretary Hegseth backs down and narrows his extremely broad threat against Anthropic, great damage has been done. Most corporations, political actors, and others will have to operate under the assumption that the logic of the tribe will now reign.&quot;&lt;/p&gt;
&lt;p&gt;The Defense Production Act was designed for wartime rationing of steel and aluminum, not for forcing a software company to retrain its AI model to enable mass surveillance. The DPA has never been used to mark a domestic company as a supply chain threat. Criminal penalties apply for noncompliance. The government is wielding a Korean War-era statute to bully a company that had the audacity to include guardrails in a contract that the Pentagon originally agreed to.&lt;/p&gt;
&lt;p&gt;And the irony is suffocating. When Biden used the DPA&apos;s &lt;em&gt;lightest&lt;/em&gt; authority -- Title VII, information gathering only -- to require AI companies to report on training activities, Republicans called it dangerous overreach. Trump promised to repeal it. Now they&apos;re threatening Title I compulsion powers, which are orders of magnitude more coercive, against a company that won&apos;t let them build unsupervised killbots. The party of free markets and limited government, everyone.&lt;/p&gt;
&lt;h2&gt;OpenAI Swoops In&lt;/h2&gt;
&lt;p&gt;The same day Hegseth designated Anthropic a supply chain risk, Sam Altman announced that OpenAI had reached a deal with the Pentagon. He claimed it includes &quot;technical safeguards&quot; addressing the same issues -- prohibitions on mass surveillance and human responsibility for use of force. Whether these protections have any real teeth remains to be seen, and I&apos;m skeptical that OpenAI somehow got the exact terms that Anthropic asked for and somehow the Pentagon is fine with it now.&lt;/p&gt;
&lt;p&gt;Over 640 Google employees and nearly 100 OpenAI employees signed an &lt;a href=&quot;https://notdivided.org/&quot;&gt;open letter&lt;/a&gt; asking their companies to stand with Anthropic and refuse the Pentagon&apos;s demands. The letter makes the point that the government was trying to divide the companies with fear that the others would cave. Credit to those employees for standing up.&lt;/p&gt;
&lt;h2&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;Anthropic is the company that has most consistently prioritized safety in AI development. You can argue they&apos;re imperfect, that they&apos;re too cautious, that their models are annoying sometimes. But they are the only major AI lab that drew a line in the sand and held it when the most powerful institution on Earth threatened to destroy them for it.&lt;/p&gt;
&lt;p&gt;Dario Amodei &lt;a href=&quot;https://youtu.be/MPTNHrq_4LU&quot;&gt;said it plainly in his CBS interview&lt;/a&gt;: the supply chain risk designation is &quot;retaliatory and punitive,&quot; and Anthropic drew these red lines because &quot;we believe that crossing those lines is contrary to American values, and we wanted to stand up for American values.&quot;&lt;/p&gt;
&lt;p&gt;He&apos;s right. And the fact that standing up for the idea that maybe the government shouldn&apos;t conduct mass AI surveillance on its own citizens, or deploy autonomous weapons without human oversight, can get your company destroyed -- that tells you everything you need to know about the people making these demands.&lt;/p&gt;
&lt;p&gt;Anthropic says they&apos;ll challenge the designation in court. Based on &lt;a href=&quot;https://www.lawfaremedia.org/article/pentagon&amp;#x27;s-anthropic-designation-won&amp;#x27;t-survive-first-contact-with-legal-system&quot;&gt;Lawfare&apos;s legal analysis&lt;/a&gt;, they&apos;ll likely win. But the damage in the interim is real, and the chilling effect on every other company is exactly what this administration wants.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.bbc.com/news/articles/cjrq1vwe73po&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.bbc.com/news/articles/cjrq1vwe73po&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/statement-department-of-war&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.anthropic.com/news/statement-department-of-war&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://notdivided.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://notdivided.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.astralcodexten.com/p/the-pentagon-threatens-anthropic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.astralcodexten.com/p/the-pentagon-threatens-anthropic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.lawfaremedia.org/article/what-the-defense-production-act-can-and-can&apos;t-do-to-anthropic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.lawfaremedia.org/article/what-the-defense-production-act-can-and-can&apos;t-do-to-anthropic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/28/openais-sam-altman-announces-pentagon-deal-with-technical-safeguards/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://techcrunch.com/2026/02/28/openais-sam-altman-announces-pentagon-deal-with-technical-safeguards/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>government</category><category>anthropic</category></item><item><title>Managing Home Assistant with Claude Code</title><link>https://barnes.tech/blog/managing-home-assistant-with-claude-code</link><guid isPermaLink="true">https://barnes.tech/blog/managing-home-assistant-with-claude-code</guid><description>How I use Claude Code to manage Home Assistant over SSH, editing automations, dashboards, and device configs through conversation.</description><pubDate>Sun, 15 Feb 2026 23:30:05 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/claude-code-wordmark-light-mode.svg&quot; alt=&quot;Claude Code logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;ve written about &lt;a href=&quot;/blog/how-i-use-claude-code-every-day/&quot;&gt;how I use Claude Code&lt;/a&gt; and about &lt;a href=&quot;/blog/home-assistant/&quot;&gt;Home Assistant&lt;/a&gt; separately. This post is about what happens when you combine them. Home Assistant is powerful, but managing it can be tedious. Dashboard layouts are deeply nested JSON. Automations require getting YAML syntax exactly right. Renaming a device means editing an internal registry. None of it is too hard. It&apos;s just fiddly and time-consuming. Claude Code turns these tasks into conversations.&lt;/p&gt;
&lt;h2&gt;How It Connects&lt;/h2&gt;
&lt;p&gt;The Home Assistant Green runs an SSH add-on with key-based authentication. The SSH key lives in &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;, and macOS is configured to use the 1Password SSH agent globally. That means Claude Code can run &lt;code&gt;ssh homeassistant &quot;cat /config/automations.yaml&quot;&lt;/code&gt; and it just works. 1Password handles the key at connection time, confirming with touchID, no passwords or key files sitting on disk.&lt;/p&gt;
&lt;p&gt;The local project directory has a CLAUDE.md that tells Claude Code everything about the HA environment: the SSH hostname, key file paths on the HA instance, dashboard file-to-name mappings, entity IDs, coordinator details, and general notes about the setup. There&apos;s also an inventory file listing every integration, device, area, automation, and custom component installed. This means Claude Code starts every session already knowing the full environment without having to discover anything.&lt;/p&gt;
&lt;h2&gt;What It Does&lt;/h2&gt;
&lt;h3&gt;Automations and Scripts&lt;/h3&gt;
&lt;p&gt;Claude Code SSHs into Home Assistant and reads configuration files directly. For automations, it can read &lt;code&gt;automations.yaml&lt;/code&gt;, explain what each one does, add new automations with correct YAML syntax, or modify triggers, conditions, and actions on existing ones.&lt;/p&gt;
&lt;p&gt;The real value shows up with complex tasks. When I wanted to set up appliance monitoring for my washing machine using a community blueprint, Claude Code read the blueprint YAML to understand all of its input options, found the correct entity IDs for the power-monitoring plug, identified my mobile device ID for notifications, and wrote a complete automation entry with power thresholds, debounce settings, notification messages, and status tracking. Then it created the input helper for the dashboard and restarted HA to apply everything. That whole process would have taken me a while to do manually. Figuring out the blueprint&apos;s input schema alone is tedious.&lt;/p&gt;
&lt;h3&gt;Dashboard Editing&lt;/h3&gt;
&lt;p&gt;Home Assistant dashboards are stored as JSON in &lt;code&gt;/config/.storage/&lt;/code&gt;. Claude Code downloads the JSON over SSH, parses it, makes changes, and uploads the result. This is where it saves the most time. Adding a conditional badge that only appears when the washing machine is running, setting up dynamic weather icons that change based on conditions, or configuring Mushroom cards with the right entity IDs and display properties, all of this involves deeply nested JSON that&apos;s painful to hand-edit.&lt;/p&gt;
&lt;p&gt;The workflow is: read the file over SSH, pipe through &lt;code&gt;python3&lt;/code&gt; locally for JSON manipulation (HA OS doesn&apos;t have python3 installed), then write the result back. Claude Code handles this entire pipeline.&lt;/p&gt;
&lt;h3&gt;Device Management&lt;/h3&gt;
&lt;p&gt;Some changes require editing Home Assistant&apos;s internal &lt;code&gt;.storage&lt;/code&gt; files directly. When I repurposed a smart plug from a Christmas tree to the washing machine, Claude Code found all entities associated with the device in the entity registry, stopped HA core (so the registry wouldn&apos;t get overwritten on shutdown), renamed all the entity IDs and unique IDs, uploaded the modified registry, and started HA core back up. Doing that manually means finding the right JSON file, understanding the data structure, making changes without breaking anything, and getting the stop/edit/start sequence right.&lt;/p&gt;
&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;p&gt;This might be where Claude Code adds the most value. Home Assistant problems can be genuinely hard to diagnose. An automation that stopped firing, a device that shows unavailable intermittently, an entity that&apos;s returning stale data, these issues often involve tracing through multiple files, checking logs, cross-referencing entity IDs, and understanding how different parts of the system interact. That&apos;s exactly the kind of tedious, detail-heavy investigation that Claude Code is good at.&lt;/p&gt;
&lt;p&gt;It can pull the HA logs over SSH, read the relevant automation or integration config, check the entity registry for mismatches, and piece together what&apos;s going wrong, all in one conversation. Problems that would take me 20 minutes of jumping between files and docs often get resolved in a couple of exchanges.&lt;/p&gt;
&lt;h3&gt;HA Core Lifecycle&lt;/h3&gt;
&lt;p&gt;Claude Code can restart or reload Home Assistant through the Supervisor API over SSH. The Supervisor token is an environment variable injected into the SSH add-on container at runtime. It&apos;s never stored locally or included in any config files. Claude Code references it by variable name in SSH commands, so the actual token value is resolved on the HA side.&lt;/p&gt;
&lt;h2&gt;A Word of Caution&lt;/h2&gt;
&lt;p&gt;I want to be clear: giving an AI tool SSH access to a system that controls your home is something you should think carefully about before doing. Home Assistant manages locks, cameras, alarms, and other things with real physical consequences. If you&apos;re going to experiment with this, do it deliberately and with guardrails.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t give it more access than it needs.&lt;/strong&gt; Scope SSH access to the HA config container, not a general-purpose shell. Don&apos;t hand it admin credentials to your router, your NAS, or anything else on the network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never store credentials in the project or with Claude Code.&lt;/strong&gt; No API tokens in CLAUDE.md. No passwords in config files. No SSH keys on disk. Use an agent like 1Password&apos;s SSH agent so the key material is never exposed. If Claude Code needs to reference a token, it should be by environment variable name, resolved on the remote side, never as a literal value in a command.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be aware of prompt injection.&lt;/strong&gt; If Claude Code reads content from external sources (log files, API responses, community forum posts, or anything user-generated) that content could theoretically contain instructions that try to manipulate its behavior. Review what it&apos;s about to execute before approving, especially after it&apos;s ingested content from sources you don&apos;t fully control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep the approval prompts on.&lt;/strong&gt; It&apos;s tempting to auto-approve everything for speed, but for SSH commands against a live system, you should be reviewing each one. The few seconds it takes to read a command before hitting enter is the difference between a safe workflow and a mistake that locks you out of your house.&lt;/p&gt;
&lt;p&gt;With all that said, here&apos;s how I keep it safe in practice.&lt;/p&gt;
&lt;h2&gt;How I Keep It Safe&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Every command requires approval.&lt;/strong&gt; Claude Code doesn&apos;t silently execute anything. Every SSH call, file write, or shell command is presented in the terminal before it runs. You see the full command and approve or deny each one. You can also configure permission levels to auto-approve reads while always prompting for writes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No credentials on disk.&lt;/strong&gt; The SSH key lives exclusively in 1Password. The 1Password SSH agent brokers authentication at connection time. There&apos;s no key file for anything to leak. If the vault is locked, SSH fails. Claude Code never sees the private key material.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No stored API tokens.&lt;/strong&gt; The Supervisor token is a runtime environment variable in the SSH container. It&apos;s never written to a file, never included in CLAUDE.md, and never stored locally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read-before-write.&lt;/strong&gt; Claude Code reads existing files before modifying them. It doesn&apos;t generate a new &lt;code&gt;automations.yaml&lt;/code&gt; from scratch. It reads the current one, understands what&apos;s there, and appends or modifies only what&apos;s needed. Existing automations, formatting, and comments are preserved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HA validates on restart.&lt;/strong&gt; If Claude Code writes malformed YAML, Home Assistant will log the error and either skip the invalid entry or refuse to start with a clear message. It won&apos;t silently apply broken configuration. And HA&apos;s built-in backup system captures the entire &lt;code&gt;/config/&lt;/code&gt; directory automatically, so restoring from a mistake is straightforward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scoped access.&lt;/strong&gt; The SSH connection lands in the HA OS container, which is sandboxed. It has access to &lt;code&gt;/config/&lt;/code&gt; and the Supervisor API, but it&apos;s not a general-purpose Linux box. There&apos;s no package manager, no way to install software, and no access to the host OS.&lt;/p&gt;
&lt;h2&gt;Lessons Learned&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HA OS is minimal.&lt;/strong&gt; There&apos;s no &lt;code&gt;python3&lt;/code&gt;, no &lt;code&gt;jq&lt;/code&gt;, no package manager on the HA instance. Any JSON or YAML processing has to happen locally by piping SSH output through local tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Entity registry timing matters.&lt;/strong&gt; HA writes its internal registries to disk on shutdown. If you edit a registry file and then restart HA, the shutdown phase overwrites your changes with the in-memory state. The fix is to stop HA first (so it writes current state), edit the file, then start HA (so it reads the modified version).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blueprint inputs aren&apos;t obvious.&lt;/strong&gt; Blueprints can have dozens of inputs with specific expected values, like a literal string &lt;code&gt;&quot;enable_start_notify_options&quot;&lt;/code&gt; rather than &lt;code&gt;true&lt;/code&gt;. Claude Code reads the full blueprint YAML to discover correct input names, types, and selector configurations rather than guessing.&lt;/p&gt;
&lt;h2&gt;The Pattern&lt;/h2&gt;
&lt;p&gt;The common thread is that Claude Code handles the mechanical parts (SSH connections, file parsing, YAML syntax, JSON manipulation, API calls, restart sequences) while I describe what I want in plain language. The CLAUDE.md gives it the environment context, the inventory file gives it the device knowledge, and the approval system keeps me in control of what actually executes. It&apos;s the same pattern I described in the &lt;a href=&quot;/blog/how-i-use-claude-code-every-day/&quot;&gt;Claude Code post&lt;/a&gt;, just applied to home automation instead of software development.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://1password.com/developer/ssh&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://1password.com/developer/ssh&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>automation</category><category>home assistant</category></item><item><title>How I Use Home Assistant</title><link>https://barnes.tech/blog/how-i-use-home-assistant</link><guid isPermaLink="true">https://barnes.tech/blog/how-i-use-home-assistant</guid><description>A look at how I actually use Home Assistant day to day: automations, presence detection, dashboards, and monitoring.</description><pubDate>Sun, 15 Feb 2026 23:17:22 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/home-assistant.svg&quot; alt=&quot;Home Assistant Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I wrote a &lt;a href=&quot;/blog/home-assistant/&quot;&gt;general overview of Home Assistant&lt;/a&gt; recently, but I wanted to follow up with how I actually use it. Home Assistant can do a staggering amount of things, and it&apos;s easy to get overwhelmed when you first look at it. This post covers the things I use most and find most useful, explained for someone who might not be familiar with the platform yet.&lt;/p&gt;
&lt;h2&gt;Lighting Automations&lt;/h2&gt;
&lt;p&gt;This is the first thing most people set up, and for good reason: it&apos;s immediately useful and easy to understand.&lt;/p&gt;
&lt;p&gt;My front porch lights and outdoor plugs turn on automatically an hour before sunset and off 30 minutes after sunrise. I never think about it. Seasonal changes are handled automatically because Home Assistant knows the exact sunrise and sunset times for my location every day.&lt;/p&gt;
&lt;p&gt;I have arrival lighting that turns on the living room lights when someone comes home. It uses multiple triggers (the thermostat switching out of eco mode, a phone entering the home zone, or a Wi-Fi connection being detected) and only fires during daytime hours. There&apos;s a toggle in the dashboard to disable it if I don&apos;t want it for a while.&lt;/p&gt;
&lt;p&gt;There&apos;s also a vacation mode that simulates occupancy by turning lights on and off at natural times. Bedroom lights come on at 10 PM with a warm dim setting and turn off at 8 AM on weekdays. A scheduled lamp flips on at 5 PM and off at 11 PM. None of this requires me to do anything once it&apos;s set up.&lt;/p&gt;
&lt;h2&gt;Washing Machine Notifications&lt;/h2&gt;
&lt;p&gt;I have a power-monitoring smart plug on the washing machine. Home Assistant watches the power draw: when it goes above 10 watts, it knows a cycle started, and when it drops below 5 watts and stays there, it knows the cycle is done. It sends a push notification to my phone when the wash starts and a time-sensitive notification when it finishes.&lt;/p&gt;
&lt;p&gt;The trick is debouncing. Wash cycles have periods where the drum stops briefly between stages, and power draw drops temporarily. The automation uses dead zones and repeat checks to avoid false positives. It works really well. I also track the status ( Washing / Finished) with a dropdown helper so it shows up as a badge on the dashboard while it is washing, then disappears when it has finished.&lt;/p&gt;
&lt;h2&gt;Presence Detection&lt;/h2&gt;
&lt;p&gt;I have &lt;a href=&quot;https://esphome.io/&quot;&gt;ESPHome&lt;/a&gt; presence sensors placed around the house. These are small BLE (Bluetooth Low Energy) devices that detect how close my phone is to each one. Combined with Bermuda BLE Trilateration, Home Assistant can triangulate my position and know which room I&apos;m in, not just whether I&apos;m home or away. That opens up automations that aren&apos;t possible with simple presence detection, like adjusting climate or lighting based on where in the house I actually am.&lt;/p&gt;
&lt;p&gt;ESPHome is worth calling out specifically. It&apos;s a framework for building custom smart home sensors using cheap microcontrollers. You define what the device does in a YAML config file, flash the firmware, and it integrates directly with Home Assistant over your local network. The presence sensors, an air quality monitor I have in my server closet, and Bluetooth proxies are all ESPHome devices. It&apos;s one of the more powerful parts of the ecosystem once you start using it.&lt;/p&gt;
&lt;h2&gt;Water Leak Detection&lt;/h2&gt;
&lt;p&gt;I have three IKEA water leak sensors placed near the washing machine, water heater, and under the kitchen sink. They connect via Matter over Thread, so they&apos;re fast, low-power, and communicate locally without needing the internet. If any of them detect water, I get an immediate critical push notification to my phone with the alert sound. Once all sensors have been dry for 15 minutes, I get an all-clear notification.&lt;/p&gt;
&lt;p&gt;This is the kind of thing you set up and hope never fires, but when it does, the early warning can save you thousands of dollars in water damage. The sensors cost about $10 each and since they run on Thread, they work even if your internet is down.&lt;/p&gt;
&lt;h2&gt;Dashboards&lt;/h2&gt;
&lt;p&gt;Home Assistant dashboards are fully customizable, and I&apos;ve built a mobile dashboard that I use constantly. The main view has badges across the top showing the current time, weather conditions, air quality index (color-coded by severity), sunrise/sunset times, front door lock status, package delivery count, and the status of things like the washing machine and 3D printer.&lt;/p&gt;
&lt;p&gt;The main section has quick toggles for all lights and switches, media player controls, and network stats. I use conditional visibility heavily: the NAS health stats only appear when CPU or memory usage is elevated, media players only show when something is actively playing, and weather alerts only appear when there&apos;s actually something to alert about. This keeps the dashboard clean instead of overwhelming.&lt;/p&gt;
&lt;p&gt;There are dedicated views for cameras (live WebRTC streams from doorbell, indoor, and outdoor cameras), weather details, media controls across all rooms, 3D printer monitoring, and package tracking.&lt;/p&gt;
&lt;p&gt;The custom frontend cards from the community make a big difference here. Mushroom cards give everything a clean, modern look. Mini Media Player provides compact audio controls. Auto Entities dynamically filters and displays things like battery levels across all devices. None of these come built in, but they&apos;re easy to install through HACS (the Home Assistant Community Store).&lt;/p&gt;
&lt;h2&gt;Infrastructure Monitoring&lt;/h2&gt;
&lt;p&gt;This one is more niche, but I find it useful. My Synology NAS shows up in Home Assistant with CPU usage, memory, temperature, drive health, and network throughput. I have an ESPHome-based AirGradient sensor in the server closet monitoring PM2.5, temperature, and humidity. NextDNS stats show up as well: total queries, blocked queries, and block ratio.&lt;/p&gt;
&lt;p&gt;Having all of this in one place alongside the rest of the smart home data means I don&apos;t need to open separate apps to check on infrastructure. If the NAS is running hot or the server closet humidity spikes, I&apos;ll see it on the same dashboard where I check the weather.&lt;/p&gt;
&lt;h2&gt;Everything Else&lt;/h2&gt;
&lt;p&gt;There&apos;s a lot more I haven&apos;t covered: Sonos multi-room audio controls, Nest camera integration via a Starling Home Hub for local access, Rachio sprinkler control, package tracking through Parcel, PlayStation and Xbox profile monitoring for the family, Bambu Lab 3D printer status with filament and temperature tracking, and a Bird Buddy smart bird feeder that identifies bird species. Home Assistant is the kind of platform where you keep finding new things to connect to it.&lt;/p&gt;
&lt;p&gt;The common thread across all of this is that it&apos;s one app, one dashboard, running locally, and I control all of it. No subscriptions required for the core functionality, no reliance on someone else&apos;s servers, and it gets better every month with community updates. If any of this sounds interesting, the &lt;a href=&quot;/blog/home-assistant/&quot;&gt;first post&lt;/a&gt; covers what Home Assistant is and how to get started.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://esphome.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://esphome.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://hacs.xyz/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://hacs.xyz/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/integrations/zha/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/integrations/zha/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/apps&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/apps&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>automation</category><category>home assistant</category><category>tips</category></item><item><title>Home Assistant</title><link>https://barnes.tech/blog/home-assistant</link><guid isPermaLink="true">https://barnes.tech/blog/home-assistant</guid><description>What Home Assistant is, why it has such a loyal following, and why the Home Assistant Green is the best way to run it.</description><pubDate>Sun, 15 Feb 2026 22:50:58 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/home-assistant.svg&quot; alt=&quot;Home Assistant Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;ve written before about my &lt;a href=&quot;/blog/homepod/&quot;&gt;frustrations with HomePods&lt;/a&gt; and how Google &lt;a href=&quot;/blog/google-home-plus-gemini/&quot;&gt;completely squandered Nest&lt;/a&gt;. The common thread is that when you depend on a big tech company for your smart home, you&apos;re at their mercy. They can kill products, raise subscription prices, remove features, or just let the software rot. &lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt; is the answer to all of that.&lt;/p&gt;
&lt;h2&gt;What Is Home Assistant&lt;/h2&gt;
&lt;p&gt;Home Assistant is open source home automation software that runs locally on your network. It integrates with over 3,400 different devices and services: Zigbee, Z-Wave, Matter, Thread, Bluetooth, Wi-Fi, and pretty much every major smart home brand you&apos;ve heard of. Philips Hue, IKEA, Sonos, Shelly, Lutron, and hundreds more. It all gets unified into a single app with a single dashboard.&lt;/p&gt;
&lt;p&gt;The key differentiator is that everything runs locally. Your data stays on your network. Your automations don&apos;t depend on someone else&apos;s cloud server being up. If your internet goes down, your smart home still works. That alone makes it fundamentally different from Google Home, Alexa, or HomeKit, which are all dependent on cloud services to varying degrees. But it&apos;s not just about independence from cloud providers. Local control also means everything is noticeably faster. Lights respond instantly. Automations trigger without the round trip to a server halfway across the country. Once you experience the speed difference, going back to cloud-dependent smart home controls feels sluggish.&lt;/p&gt;
&lt;p&gt;The one thing people worry about with local-only is remote access. &lt;a href=&quot;/blog/tailscale-home-assistant/&quot;&gt;Tailscale&lt;/a&gt; solves that completely. It connects you to your home network from anywhere as if you were on your couch, without exposing anything to the public internet. I&apos;ve written about &lt;a href=&quot;/blog/tailscale-home-assistant/&quot;&gt;how well it works with Home Assistant&lt;/a&gt; before. It&apos;s a great combo.&lt;/p&gt;
&lt;p&gt;It&apos;s also run by the &lt;a href=&quot;https://www.openhomefoundation.org/&quot;&gt;Open Home Foundation&lt;/a&gt;, a nonprofit. It can&apos;t be sold or acquired. That matters more than people realize when you&apos;re building infrastructure for your home that you want to last.&lt;/p&gt;
&lt;h2&gt;Why People Love It&lt;/h2&gt;
&lt;p&gt;The community is enormous. Home Assistant was the &lt;a href=&quot;https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/#the-top-open-source-projects-by-contributors&quot;&gt;top open source project by contributors in 2025&lt;/a&gt; on GitHub. It gets meaningful updates every single month: new integrations, new dashboard features, better automations, voice assistant improvements. It&apos;s actively getting better, which is the opposite of what happens with most smart home platforms over time.&lt;/p&gt;
&lt;p&gt;The automation engine is genuinely powerful. You can trigger actions based on time, presence, sensor data, device states, weather, sun position, or basically any combination of conditions you can think of. Turn on the porch lights at sunset. Get a notification if the garage door has been open for more than 10 minutes. Adjust the thermostat when everyone leaves the house. The complexity ceiling is high, but simple automations are easy to set up through the UI without writing any code.&lt;/p&gt;
&lt;p&gt;The dashboards are fully customizable and accessible from mobile apps, a web interface, or even cast to a TV. There&apos;s a built-in voice assistant called Assist that runs locally, an energy management system, and you can install additional apps like Node-RED directly through the interface.&lt;/p&gt;
&lt;p&gt;But the real reason people love it is control. You own your smart home. No one can change the terms of service on you, raise prices, or shut down the platform. After watching Google kill product after product and Apple let Siri and HomePod stagnate, having something that&apos;s actually in your control is a relief.&lt;/p&gt;
&lt;p&gt;I still use Apple Home in addition to Home Assistant. It&apos;s not mutually exclusive. There are advantages to the built-in functionality that Apple Home can offer, and Home Assistant only enhances that. I can even publish incompatible devices to Apple Home by bridging them through Home Assistant.&lt;/p&gt;
&lt;h2&gt;Why I Use the Home Assistant Green&lt;/h2&gt;
&lt;p&gt;You can run Home Assistant on a lot of things: a Raspberry Pi, a VM, a Docker container, an old PC. I ran it in Docker on a Synology NAS for a while and it worked fine for the basics. But running it as a container means you&apos;re running Home Assistant Container, not the full Home Assistant Operating System, and there&apos;s a real difference. Container installs don&apos;t get the app store, which means no one-click installs for things like Node-RED, an MQTT broker, or the file editor. You also lose built-in backups, one-click updates, and out-of-the-box support for Thread and Z-Wave since those are managed by apps that only run on HA OS. You can set all of that up yourself alongside Docker, but at that point you&apos;re managing a bunch of moving parts instead of just running Home Assistant.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.home-assistant.io/green/&quot;&gt;Home Assistant Green&lt;/a&gt; is exactly that. It&apos;s a small box with a quad-core ARM processor, 4 GB of RAM, and 32 GB of eMMC storage. It comes with Home Assistant already installed. You plug in power, plug in Ethernet, and it&apos;s running. That&apos;s the whole setup.&lt;/p&gt;
&lt;p&gt;No flashing SD cards. No configuring Docker. No fighting with a Raspberry Pi that&apos;s also trying to run Pi-hole and three other things. No VM overhead. It&apos;s a dedicated appliance that does one thing well.&lt;/p&gt;
&lt;p&gt;At $159, it&apos;s not the cheapest option. A Raspberry Pi can be had for less. But the Green removes every possible friction point from the setup. It comes with a proper power supply, a passive aluminum heatsink so there&apos;s no fan noise, and eMMC storage instead of an SD card, which matters because SD cards in Raspberry Pis are notorious for failing over time. The Green is just more reliable hardware for a system that ideally runs 24/7 for years.&lt;/p&gt;
&lt;p&gt;The monthly updates install through the web UI with one click. Backups are built in. If you want to add Zigbee or Thread support, you plug in a &lt;a href=&quot;https://www.home-assistant.io/connect/zbt-2/&quot;&gt;Home Assistant Connect ZBT-2&lt;/a&gt; USB stick. It also works with your existing Apple HomeKit, Google Home, and Alexa setups, so you can migrate gradually without ripping everything out at once.&lt;/p&gt;
&lt;p&gt;The whole experience is closer to setting up a consumer router than building a Linux server. That&apos;s the point. I want my smart home platform to be something I configure once and then it just works in the background, not something I have to babysit. The Green delivers on that.&lt;/p&gt;
&lt;p&gt;If you&apos;re frustrated with the state of smart home platforms from big tech, or if you&apos;ve been curious about Home Assistant but didn&apos;t want to deal with the Raspberry Pi setup, the Green is the easiest on-ramp. Plug it in, open the app, and you&apos;re running.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/green/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/green/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/connect/zbt-2/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.home-assistant.io/connect/zbt-2/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.openhomefoundation.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.openhomefoundation.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>review</category><category>automation</category><category>home assistant</category></item><item><title>Making Your Site Visible to AI Agents with Cloudflare</title><link>https://barnes.tech/blog/making-your-site-visible-to-ai-agents</link><guid isPermaLink="true">https://barnes.tech/blog/making-your-site-visible-to-ai-agents</guid><description>How Cloudflare&apos;s Markdown for Agents and Content Signals help your website get discovered by AI crawlers and agents.</description><pubDate>Sat, 14 Feb 2026 05:31:22 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/cloudflare-logo.svg&quot; alt=&quot;Cloudflare Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;The way people find things online is changing. It used to be all about Google and SEO. Now, an increasing amount of traffic is coming from AI agents and crawlers that need structured data from a web that was built for humans. If your site isn&apos;t set up to talk to these systems, you&apos;re going to get left behind.&lt;/p&gt;
&lt;p&gt;Cloudflare just launched two features that make this significantly easier: &lt;strong&gt;Markdown for Agents&lt;/strong&gt; and &lt;strong&gt;Content Signals&lt;/strong&gt;. I&apos;ve already enabled both on a site I manage at work, and the setup is straightforward enough that there&apos;s no real reason not to do it.&lt;/p&gt;
&lt;h2&gt;Markdown for Agents&lt;/h2&gt;
&lt;p&gt;The core idea is simple. HTML is expensive for AI to process. All the &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt; wrappers, nav bars, script tags, and CSS classes are noise that burns through tokens without adding any meaning. Cloudflare claims this blog post about the feature takes 16,180 tokens as HTML and only 3,150 as markdown, an 80% reduction.&lt;/p&gt;
&lt;p&gt;Markdown for Agents handles the conversion automatically at the edge. When an AI agent requests a page with &lt;code&gt;Accept: text/markdown&lt;/code&gt; in the header, Cloudflare intercepts the response, converts the HTML to clean markdown, and serves that instead. The agent gets exactly what it needs without wasting compute on parsing junk.&lt;/p&gt;
&lt;p&gt;Here&apos;s what the request looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl https://your-site.com/about/ \
  -H &quot;Accept: text/markdown&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The response comes back as &lt;code&gt;text/markdown&lt;/code&gt; with an &lt;code&gt;x-markdown-tokens&lt;/code&gt; header that tells you exactly how many tokens are in the document. Tools like Claude Code and OpenCode already send these accept headers, so enabling this means those tools immediately get cleaner content from your site.&lt;/p&gt;
&lt;h3&gt;How to Enable It&lt;/h3&gt;
&lt;p&gt;If you&apos;re on Cloudflare (Pro, Business, or Enterprise), it&apos;s a toggle. Go to your zone in the dashboard, find Quick Actions, and flip on Markdown for Agents. That&apos;s it.&lt;/p&gt;
&lt;p&gt;You can also enable it via the API:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -X PATCH &apos;https://api.cloudflare.com/client/v4/zones/{zone_tag}/settings/content_converter&apos; \
  --header &apos;Content-Type: application/json&apos; \
  --header &quot;Authorization: Bearer {api_token}&quot; \
  --data &apos;{&quot;value&quot;: &quot;on&quot;}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are some limitations worth knowing about. It only converts HTML (no PDFs or other formats yet), it won&apos;t work if the origin response is larger than 1 MB or doesn&apos;t include a &lt;code&gt;content-length&lt;/code&gt; header, and compressed origin responses aren&apos;t supported. But for a typical website, these shouldn&apos;t be issues.&lt;/p&gt;
&lt;h2&gt;Content Signals&lt;/h2&gt;
&lt;p&gt;The second piece is Content Signals, which is a framework built around &lt;code&gt;robots.txt&lt;/code&gt; that lets you explicitly tell AI systems what they can and can&apos;t do with your content. It&apos;s defined at &lt;a href=&quot;https://contentsignals.org/&quot;&gt;contentsignals.org&lt;/a&gt; and uses three categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ai-train&lt;/code&gt;&lt;/strong&gt;: Can this content be used to train or fine-tune AI models?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;search&lt;/code&gt;&lt;/strong&gt;: Can this content be indexed and returned in search results?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ai-input&lt;/code&gt;&lt;/strong&gt;: Can this content be used as input to AI models (RAG, grounding, agentic use)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You add these as directives in your &lt;code&gt;robots.txt&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;User-Agent: *
Content-Signal: ai-train=no, search=yes, ai-input=yes
Allow: /
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The site at &lt;a href=&quot;https://contentsignals.org/&quot;&gt;contentsignals.org&lt;/a&gt; has a generator where you can pick from preset policies and get the exact &lt;code&gt;robots.txt&lt;/code&gt; directives you need. You can go as broad as &quot;allow everything&quot; or as restrictive as &quot;disallow all.&quot; You can even target specific user agents or specific paths if you want different rules for different parts of your site.&lt;/p&gt;
&lt;p&gt;When Markdown for Agents is enabled, converted responses automatically include a &lt;code&gt;Content-Signal&lt;/code&gt; header: &lt;code&gt;ai-train=yes, search=yes, ai-input=yes&lt;/code&gt;. Custom policy options are coming in the future.&lt;/p&gt;
&lt;p&gt;It&apos;s worth being clear about what this is and isn&apos;t. These are signals, not enforcement. Just like &lt;code&gt;robots.txt&lt;/code&gt; has always been a polite request rather than a technical barrier, Content Signals express your preferences. Some crawlers will respect them. Some won&apos;t. But having an explicit, machine-readable declaration of your intent is better than having nothing, and it establishes a baseline that responsible AI companies are starting to honor.&lt;/p&gt;
&lt;h2&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;If you run a website and want AI tools to be able to accurately reference your content, you should be making it easy for them to do so. That means serving clean, structured content when agents ask for it, and being explicit about how that content can be used.&lt;/p&gt;
&lt;p&gt;I recently enabled both of these on a website at work. The process took about five minutes: flip the toggle, update &lt;code&gt;robots.txt&lt;/code&gt; with Content Signals, done. If you&apos;re already on Cloudflare, this is one of the easiest things you can do to make your site more accessible to the next generation of how people find things online.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/markdown-for-agents/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.cloudflare.com/markdown-for-agents/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://contentsignals.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://contentsignals.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>cloud</category><category>development</category></item><item><title>What Is Enshittification?</title><link>https://barnes.tech/blog/what-is-enshittification</link><guid isPermaLink="true">https://barnes.tech/blog/what-is-enshittification</guid><description>Cory Doctorow&apos;s framework for how platforms decay: attract users, exploit them, then extract all value. Here&apos;s what it means and why it matters.</description><pubDate>Thu, 12 Feb 2026 16:51:40 GMT</pubDate><content:encoded>&lt;p&gt;I reference enshittification a lot on this site. &lt;a href=&quot;/blog/apple-maps-enshitification/&quot;&gt;Apple Maps ads&lt;/a&gt;, &lt;a href=&quot;/blog/perplexity-enshitification/&quot;&gt;Perplexity&apos;s surveillance pivot&lt;/a&gt;, &lt;a href=&quot;/blog/google-search-is-getting-worse/&quot;&gt;Google Search getting worse&lt;/a&gt; -- it keeps coming up because it keeps happening. This week, OpenAI started testing ads in ChatGPT, and one of their own researchers, Zoe Hitzig, &lt;a href=&quot;https://www.nytimes.com/2026/02/11/opinion/openai-ads-chatgpt.html&quot;&gt;resigned over it&lt;/a&gt;, warning that the most detailed record of private human thought ever assembled is about to be monetized with advertising. We&apos;re watching the next wave of enshittification happen in real time with AI, so I figured it was time to actually explain the concept properly since I keep referring to it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pluralistic.net/&quot;&gt;Cory Doctorow&lt;/a&gt; coined the term. He&apos;s a novelist, activist, and has worked with the &lt;a href=&quot;https://www.eff.org/&quot;&gt;Electronic Frontier Foundation&lt;/a&gt; for over two decades. The American Dialect Society named &quot;enshittification&quot; the &lt;a href=&quot;https://www.americandialectsociety.org/2023-word-of-the-year-is-enshittification/&quot;&gt;2023 word of the year&lt;/a&gt;. It describes the predictable lifecycle of how platforms decay, and once you see the pattern, you can&apos;t unsee it.&lt;/p&gt;
&lt;h2&gt;The Three Stages&lt;/h2&gt;
&lt;p&gt;Doctorow defines enshittification as a three-stage process of platform decay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage one: Be good to users.&lt;/strong&gt; A platform starts by offering genuine value to attract users. Facebook in 2006 told everyone to leave MySpace because Rupert Murdoch spied on them. &quot;Come to Facebook, we&apos;ll never spy on you, we&apos;ll just show you what you ask to see.&quot; Users pile in, and critically, they get &lt;strong&gt;locked in&lt;/strong&gt; -- you love your friends, and you can&apos;t convince all of them to move somewhere else at the same time. As long as you love your friends more than you hate the platform, you&apos;ll stay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage two: Sell out users to business customers.&lt;/strong&gt; Once users are locked in, the platform makes things worse for them to attract advertisers and business customers. Facebook goes to advertisers and says &quot;remember when we told users we wouldn&apos;t spy on them? Obviously that was a lie. We spy on them from ass to appetite. Give us money and we&apos;ll target ads with exquisite fidelity.&quot; They go to publishers and say &quot;put your content on our platform, we&apos;ll cram it into eyeballs that never asked to see it. Free traffic.&quot; The business customers pile in and get locked in too -- they become dependent on the platform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage three: Extract all value.&lt;/strong&gt; Now the platform makes things worse for the business customers too. Ad targeting fidelity goes down. Ad prices go up. Ad fraud explodes. Procter &amp;#x26; Gamble in 2017 zeroed out its $200 million surveillance advertising spend and saw zero drop in sales, because to a first approximation all those ads disappeared down the fraud hole. The platform harvests everything except the bare minimum needed to keep people from leaving. Your feed becomes a homeopathic residue of stuff you actually asked to see, filled with things people paid billions to show you, and they&apos;re getting robbed blind. This is ideal for the platform. It&apos;s a giant pile of shit.&lt;/p&gt;
&lt;h2&gt;Why It Happens&lt;/h2&gt;
&lt;p&gt;There&apos;s a tempting but wrong explanation for this: &quot;If you&apos;re not paying for the product, you&apos;re the product.&quot; Doctorow pushes back on this hard. The people who &lt;strong&gt;do&lt;/strong&gt; pay -- the advertisers, the publishers, the business customers -- get shafted too. Everyone gets worse treatment except the platform itself.&lt;/p&gt;
&lt;p&gt;The real answer is policy. Four things used to discipline tech companies: &lt;strong&gt;competition&lt;/strong&gt;, &lt;strong&gt;regulation&lt;/strong&gt;, &lt;strong&gt;interoperability&lt;/strong&gt;, and &lt;strong&gt;an empowered workforce&lt;/strong&gt;. All four eroded over the last two decades.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Competition&lt;/strong&gt; disappeared as the industry consolidated. When you have hundreds of equally sized companies, none of them can conspire to screw users because someone will defect and steal the others&apos; customers. When you have a handful of giants, they don&apos;t worry about that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regulation&lt;/strong&gt; got captured. Concentrated industries are much better at lobbying than fragmented ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interoperability&lt;/strong&gt; got outlawed. This is the big one that non-technical people underappreciate. Interoperability means you can make one thing work with another -- any light bulb in any socket, anyone&apos;s gas in your tank. With digital technology, you get even more opportunities because you can always write software that undoes what some other software tries to do. An ad blocker, a third-party printer cartridge, a tool to export your data. This is an enormous source of discipline because once someone installs an ad blocker, the revenue from that user falls to zero &lt;strong&gt;forever&lt;/strong&gt;. No one ever uninstalled their ad blocker.&lt;/p&gt;
&lt;p&gt;But laws like Section 1201 of the DMCA (1998) made it a &lt;strong&gt;felony&lt;/strong&gt; to bypass a digital lock -- five years in prison and a $500,000 fine for a first offense, even if no copyright infringement takes place. Companies started wrapping everything in a thin layer of digital lock. Your printer cartridge has a chip that does a cryptographic handshake to prove it came from HP. Ink is now $10,000 a gallon. Your audiobooks on Audible are wrapped in DRM so you&apos;d forfeit everything if you left the platform. Your tractor, your car, your insulin pump -- all locked down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Worker power&lt;/strong&gt; collapsed. A quarter million tech layoffs in a couple of years destroyed the leverage that tech workers once had to push back internally when their bosses wanted to do something harmful to users.&lt;/p&gt;
&lt;h2&gt;It&apos;s Not Inevitable&lt;/h2&gt;
&lt;p&gt;Doctorow is insistent that this didn&apos;t have to happen and doesn&apos;t have to continue. The platforms were genuinely good once -- that wasn&apos;t our imagination. The same people running them then are running them now. What changed was the environment, everything that used to keep them in check.&lt;/p&gt;
&lt;p&gt;The way out is restoring those four constraints. Of particular interest right now is interoperability. Every country adopted laws like the DMCA because the US trade representative made tariff-free access conditional on it. Those laws primarily benefit American tech giants. Other countries could repeal them, allowing domestic companies to build tools that jailbreak locked-down devices, export data from walled gardens, and create competitive alternatives. As Doctorow puts it: the first country that does it gets a durable advantage, and there&apos;s going to be a race to the top.&lt;/p&gt;
&lt;h2&gt;The AI Wave&lt;/h2&gt;
&lt;p&gt;This brings us to right now. AI companies are burning through cash at staggering rates, and the enshittification playbook is already in motion. Perplexity&apos;s CEO announced their browser will &lt;a href=&quot;https://techcrunch.com/2025/04/24/perplexity-ceo-says-its-browser-will-track-everything-users-do-online-to-sell-hyper-personalized-ads/&quot;&gt;track everything users do online&lt;/a&gt; to sell hyper-personalized ads. Google is &lt;a href=&quot;https://searchengineland.com/google-ads-ai-overviews-spotted-455889&quot;&gt;stuffing ads into AI Overviews&lt;/a&gt;. And OpenAI, the company that positioned itself as a mission-driven AI safety lab, just started testing ads in ChatGPT.&lt;/p&gt;
&lt;p&gt;Zoe Hitzig, who spent two years as a researcher at OpenAI working on AI models, pricing, and safety, &lt;a href=&quot;https://www.nytimes.com/2026/02/11/opinion/openai-ads-chatgpt.html&quot;&gt;resigned and wrote in the New York Times&lt;/a&gt; that OpenAI has the most detailed record of private human thought ever assembled, and is about to monetize it with advertising. People share their medical symptoms, relationship problems, financial anxieties, career fears -- things they might not tell another human. The surveillance advertising model applied to that data is a different beast entirely from what we&apos;ve seen with social media.&lt;/p&gt;
&lt;p&gt;The pattern is clear. Stage one is already over -- AI tools attracted hundreds of millions of users by being genuinely useful. We&apos;re entering stage two now, where the platforms start selling out users to business customers. If history is any guide, stage three won&apos;t be far behind.&lt;/p&gt;
&lt;p&gt;As Doctorow says, the real culprits aren&apos;t the ketamine-addled billionaires running these companies. They&apos;re just filling a void created by policy. The policymakers who created the enshittogenic environment that guarantees people who do the worst things in the worst way will make the most money -- those are the people who need to change course.&lt;/p&gt;
&lt;p&gt;If you want to hear Doctorow explain it himself, here&apos;s a great clip from The Daily Show, and I&apos;d also recommend the full &lt;a href=&quot;/blog/enshitification-podcast/&quot;&gt;Organized Money podcast episode&lt;/a&gt; where he goes deep on all of this.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://pluralistic.net/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://pluralistic.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.eff.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.eff.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.nytimes.com/2026/02/11/opinion/openai-ads-chatgpt.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.nytimes.com/2026/02/11/opinion/openai-ads-chatgpt.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2025/04/24/perplexity-ceo-says-its-browser-will-track-everything-users-do-online-to-sell-hyper-personalized-ads/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://techcrunch.com/2025/04/24/perplexity-ceo-says-its-browser-will-track-everything-users-do-online-to-sell-hyper-personalized-ads/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://searchengineland.com/google-ads-ai-overviews-spotted-455889&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://searchengineland.com/google-ads-ai-overviews-spotted-455889&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/enshitification-podcast/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>internet</category><category>monopoly</category><category>big-tech</category></item><item><title>How I Use Claude Code Every Day</title><link>https://barnes.tech/blog/how-i-use-claude-code-every-day</link><guid isPermaLink="true">https://barnes.tech/blog/how-i-use-claude-code-every-day</guid><description>How Claude Code has become my go-to tool for development, research, writing, and just about everything else.</description><pubDate>Sun, 08 Feb 2026 22:30:29 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/claude-code-wordmark-light-mode.svg&quot; alt=&quot;Claude Code logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;ve written about AI tools a few times on this blog, but I haven&apos;t really talked about the one that has most fundamentally changed how I work. &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot;&gt;Claude Code&lt;/a&gt; is Anthropic&apos;s CLI tool that gives Claude direct access to your terminal, filesystem, and development environment. At this point it&apos;s involved in essentially every project I touch, whether that&apos;s a web app, a native macOS app, Python scripts, workflow automations, or infrastructure configs.&lt;/p&gt;
&lt;h2&gt;CLAUDE.md&lt;/h2&gt;
&lt;p&gt;CLAUDE.md is a markdown file you put in the root of a project that gives Claude Code context about your codebase: architecture, commands, conventions, gotchas. Claude reads it automatically when you open a project.&lt;/p&gt;
&lt;p&gt;This is the single most important feature. It&apos;s what turns Claude Code from a generic AI assistant into something that actually understands your project. It knows your build commands, your deployment pipeline, your file structure, and the decisions you&apos;ve made along the way. Without it, you&apos;re re-explaining basics every session. With it, Claude starts every conversation already up to speed.&lt;/p&gt;
&lt;h2&gt;Memory&lt;/h2&gt;
&lt;p&gt;Claude Code also maintains a memory directory where it stores things it learns across sessions. API quirks, patterns that work well in a codebase, bugs that were painful to track down. The kinds of things that are easy to forget between sessions. This means Claude gets better at working in each project over time, and you don&apos;t repeat the same mistakes.&lt;/p&gt;
&lt;h2&gt;Skills&lt;/h2&gt;
&lt;p&gt;Skills are predefined workflows triggered with slash commands. The ones I use most:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/commit&lt;/code&gt;&lt;/strong&gt;: Analyzes staged changes, generates a good commit message, and commits. &lt;code&gt;/commit-push-pr&lt;/code&gt; goes further and handles the full commit, push, and PR creation flow. I actually get better commit history from this than when I was writing messages manually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/code-review&lt;/code&gt;&lt;/strong&gt;: Reviews a PR for bugs, security issues, and whether changes follow the patterns in your project. Because it has the CLAUDE.md context, it understands your conventions rather than just applying generic rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/feature-dev&lt;/code&gt;&lt;/strong&gt;: A guided workflow for building features. It reads the existing code, identifies patterns, and proposes an implementation that fits naturally into what&apos;s already there. Useful for larger features where you want to think through the approach first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/frontend-design&lt;/code&gt;&lt;/strong&gt;: Builds production-quality UI components with Tailwind and shadcn/ui. It&apos;s opinionated about avoiding generic-looking AI output, which is a common problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Plugins&lt;/h2&gt;
&lt;h3&gt;Firecrawl&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.firecrawl.dev/&quot;&gt;Firecrawl&lt;/a&gt; gives Claude the ability to search the web, scrape pages, and do research without leaving the terminal. Need to check API docs, look up how a library handles an edge case, or research a topic? Firecrawl handles it. This blog post used it for research.&lt;/p&gt;
&lt;h3&gt;Sentry&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt; integration lets Claude pull up recent issues, dig into errors, and trace them back to the code. &lt;code&gt;/sentry&lt;/code&gt; looks for open issues and helps resolve them. The Seer feature lets you ask natural language questions about your Sentry environment. The part I find most useful is the PR code review integration: if Sentry flags something on a PR, Claude can analyze it and fix the root cause.&lt;/p&gt;
&lt;h2&gt;Why a Terminal Tool?&lt;/h2&gt;
&lt;p&gt;I know a terminal-based AI tool is not for everyone. Most people reaching for AI help with code are pasting snippets into ChatGPT or the Claude app, and that works fine for one-off questions. But the difference with Claude Code is that it&apos;s already inside your project. It can read every file, understand the full directory structure, reference the CLAUDE.md and memory files, run your build commands, execute tests, and commit code, all without you copy-pasting anything.&lt;/p&gt;
&lt;p&gt;That context is the whole game. When I ask Claude Code to fix a bug, it doesn&apos;t just see the snippet I pasted. It can trace through the actual imports, check the actual database schema, and run the actual tests to verify the fix. When I ask it to build a feature, it reads the existing patterns and matches them. That&apos;s fundamentally different from explaining your codebase in a chat window and hoping the AI infers the rest.&lt;/p&gt;
&lt;p&gt;The agentic workflow is the other big difference. Claude Code doesn&apos;t just suggest code, it writes files, runs commands, creates commits, and opens PRs. It&apos;s doing the work, not just advising on it. Once you get comfortable with that, going back to copy-pasting between a browser and your editor feels slow.&lt;/p&gt;
&lt;h2&gt;What Makes It Work&lt;/h2&gt;
&lt;p&gt;The CLAUDE.md gives it project knowledge. Memory gives it learning across sessions. Skills automate repetitive workflows. Plugins connect it to external services. Each piece is useful on its own, but together they make something that feels like a real development environment rather than a chat window.&lt;/p&gt;
&lt;p&gt;It still makes mistakes, sometimes confidently. But the baseline quality with good context is remarkably high, and the speed at which I move through projects is genuinely different than it was a year ago. If you&apos;re not using Claude Code, it&apos;s worth trying.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/memory&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/memory&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/skills&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/skills&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.firecrawl.dev/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.firecrawl.dev/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://sentry.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://sentry.io/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>development</category><category>productivity</category><category>automation</category></item><item><title>Raycast Hotkey Guide</title><link>https://barnes.tech/blog/raycast-hotkey-guide</link><guid isPermaLink="true">https://barnes.tech/blog/raycast-hotkey-guide</guid><description>A guide of a few examples of using Raycast Hotkeys effectively</description><pubDate>Thu, 15 Jan 2026 17:57:11 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Raycast Logo.svg&quot; alt=&quot;Raycast Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Raycast has been doing a series of videos about how to effectively use hotkeys with Raycast. The one that came out today is really good - https://www.youtube.com/watch?v=N4eiUgRYoL4&lt;/p&gt;
&lt;p&gt;The specific ideas in this include -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clipboard History&lt;/strong&gt; → Shift+Cmd+V or similar (pairs naturally with paste)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Window Management&lt;/strong&gt; → Ctrl+Opt+Cmd+Arrow keys for left/right half, center, fullscreen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Chat&lt;/strong&gt; → Hyper+A for quick access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emoji Picker&lt;/strong&gt; → Ctrl+Cmd+Space to replace the native macOS picker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequently Used Apps&lt;/strong&gt; → Option+letter (e.g., Option+S for Safari)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Links&lt;/strong&gt; → Treat them like apps with similar modifier patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Folder Access&lt;/strong&gt; → Ctrl+Cmd+letter for Downloads, Desktop, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Display Presets&lt;/strong&gt; → Option+Shift+Plus/Minus for screen recording resolution changes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Definitely worth watching this series from Raycast if you&apos;re a Raycast user. If you&apos;re not, you should be!&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=N4eiUgRYoL4&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=N4eiUgRYoL4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/raycast-opengraph-previews/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/raycast-opengraph-previews/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/raycast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/raycast/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://raycast.com/?via=robby&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://raycast.com/?via=robby&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>productivity</category><category>automation</category><category>development</category></item><item><title>AI and the Human Condition - Stratechery</title><link>https://barnes.tech/blog/ai-and-the-human-condition-stratechery</link><guid isPermaLink="true">https://barnes.tech/blog/ai-and-the-human-condition-stratechery</guid><description>Ben Thompson&apos;s optimistic analysis of AI&apos;s impact on humanity, with commentary on wealth inequality concerns in the AI era.</description><pubDate>Tue, 06 Jan 2026 00:12:36 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/stratechery.svg&quot; alt=&quot;Stratechery by Ben Thompson&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I think Ben Thompson is an excellent writer and analyst. I think this is worth reading as I think a somewhat optimistic take on AI at the moment - https://stratechery.com/2026/ai-and-the-human-condition/&lt;/p&gt;
&lt;p&gt;On the one hand, it&apos;s hard to argue that so much of the world is better than it&apos;s ever been, and it&apos;s logical that that would continue to some degree.&lt;/p&gt;
&lt;p&gt;My main concern with his optimism in the space is with the acceleration of the wealth gap of the hyper wealthy and the &quot;rest of us&quot;. It&apos;s hard to fathom the wealth that billionairs have, and that&apos;s only accelerating. One of my main concerns with AI, honestly similar to the current tech monopolies, is that it will be a way for the hyper rich to even further accelerate their wealth. Sure, things have gotten better for everyone as a whole over history, but the inequity between the hyper wealthy and everyone else is historically a pretty recent phenomenon and I don&apos;t see it getting any better any time soon without some serious systemic corrections, and AI will be another way for the rich to get richer and push all of the negative consequences that inevitably will come along with it to the rest of us.&lt;/p&gt;
&lt;p&gt;One of my favorite illustrations of just how much wealth the ultra rich have is this site - https://eattherichtextformat.github.io/1-pixel-wealth/. I&apos;m not even sure the last time it was updated but whenever it was, it&apos;s only gotten worse since then.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://stratechery.com/2026/ai-and-the-human-condition/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://stratechery.com/2026/ai-and-the-human-condition/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://eattherichtextformat.github.io/1-pixel-wealth/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://eattherichtextformat.github.io/1-pixel-wealth/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category></item><item><title>AI Water Use</title><link>https://barnes.tech/blog/ai-water-use</link><guid isPermaLink="true">https://barnes.tech/blog/ai-water-use</guid><description>Hank Green breaks down why AI water use discourse is so confusing and why power consumption matters more.</description><pubDate>Sat, 27 Dec 2025 20:57:55 GMT</pubDate><content:encoded>&lt;p&gt;Hank Green put together a really good breakdown of the AI water use discourse, and it&apos;s one of those videos where both sides of the argument come out looking a little dishonest.&lt;/p&gt;
&lt;h2&gt;The numbers game&lt;/h2&gt;
&lt;p&gt;Sam Altman claims the average ChatGPT query uses about a fifteenth of a teaspoon of water. Morgan Stanley projects AI data center water use could hit a trillion liters per year by 2028, an 11x increase from 2024. Both numbers can technically be true, and that&apos;s the problem. Resource analysis for any industry is a legitimate field of science, but packaging it into neat, shareable numbers inevitably involves fudging. This complexity makes it really easy to mislead in either direction.&lt;/p&gt;
&lt;h2&gt;Why Altman&apos;s number is misleading&lt;/h2&gt;
&lt;p&gt;Hank calls Altman&apos;s figure &quot;a lie,&quot; and I think that&apos;s fair. It only counts water used at the moment of answering your query, conveniently ignoring some pretty important stuff. Reasoning models often trigger multiple behind-the-scenes queries for a single user question, potentially 15x or more the stated water use. And training costs are completely excluded. Building these models takes weeks or months of GPU-intensive computing that burns through electricity and water. The University of California estimates training accounts for roughly half of total AI resource use. Altman&apos;s number pretends none of that exists, and OpenAI doesn&apos;t share the data needed to fairly allocate those costs across queries, so outsiders can&apos;t do accurate accounting even if they wanted to.&lt;/p&gt;
&lt;h2&gt;How the other side inflates numbers too&lt;/h2&gt;
&lt;p&gt;The biggest source of the inflated AI water numbers comes from thermoelectric power plants. Natural gas, coal, and nuclear plants use massive amounts of water to condense steam after it drives turbines. Electricity generation accounts for 40% of all U.S. freshwater withdrawals. But most of that water is returned to rivers and lakes, with only about 2-3% actually evaporating. It&apos;s also not municipal water: it&apos;s pulled directly from natural water bodies, not treated drinking water. Including this flow-through water in AI&apos;s footprint makes the numbers look enormous but is pretty misleading.&lt;/p&gt;
&lt;p&gt;That said, even the returned water is a concern. The waste heat dumped into waterways is a real form of pollution. Even a 1-2 degree temperature change in a river can damage ecosystems. It&apos;s a legitimate issue that needs regulation, just not the same thing as &quot;consuming&quot; water.&lt;/p&gt;
&lt;h2&gt;Context matters more than totals&lt;/h2&gt;
&lt;p&gt;Every region has a finite water budget. A data center in the Pacific Northwest is a completely different situation from one in Tucson. The key question isn&apos;t just &quot;how much water?&quot; but &quot;does this place have water to spare?&quot; Building a water-cooled data center in the desert is, as Hank puts it, &quot;just very dumb.&quot; Most data centers use evaporative cooling with fresh municipal water (the same treated, drinkable water delivered to homes) so where you build these things really matters.&lt;/p&gt;
&lt;p&gt;There&apos;s also the chip manufacturing side that most people don&apos;t think about. Making Nvidia GPUs requires ultra-pure water far more refined than drinking water. The volume is small compared to cooling, but producing it is energy-intensive. Another hidden layer.&lt;/p&gt;
&lt;h2&gt;The corn comparison&lt;/h2&gt;
&lt;p&gt;Hank&apos;s most striking comparison is one that puts the whole debate in perspective. U.S. corn production uses roughly 20 trillion gallons of water per year, nearly 80 times more than the entire global AI data center footprint of around 260 billion gallons. And 40% of that corn is turned into ethanol burned in cars and trucks, with each gallon of ethanol carrying an irrigation footprint of about 1,500 gallons of water. Lawn irrigation also uses trillions of gallons of municipal water annually. None of this excuses waste, but it does make you wonder why AI gets the outrage while corn ethanol quietly remains one of the most absurdly wasteful things we do.&lt;/p&gt;
&lt;h2&gt;Power is the real concern&lt;/h2&gt;
&lt;p&gt;Hank argues that AI&apos;s electricity demand, not water, is the more serious problem, and I think he&apos;s right. The projected increase in power demand is an order of magnitude larger as a percentage of existing infrastructure than the water increase. This is going to hit carbon budgets and consumer electricity bills a lot harder than water ever will.&lt;/p&gt;
&lt;h2&gt;The bigger picture&lt;/h2&gt;
&lt;p&gt;Hank&apos;s biggest worry isn&apos;t actually water or power: it&apos;s that the massive data center buildout happening right now might be based on an overly optimistic vision of AI&apos;s future. Microsoft, Google, and Amazon are each spending over $100 billion a year on this. If more compute doesn&apos;t improve AI systems as advertised, or if political and environmental constraints slow things down, the economic fallout could be severe. A significant chunk of S&amp;#x26;P 500 value is riding on a future that nobody can predict with confidence.&lt;/p&gt;
&lt;p&gt;Both sides of this debate cherry-pick numbers to make their case. The real answer, as usual, is more complicated than either side wants to admit. Expertise matters, public discourse is bad at handling nuance, and corn ethanol remains absurdly wasteful.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H_c6MWk7PQc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=H_c6MWk7PQc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>environment</category></item><item><title>Music 2025</title><link>https://barnes.tech/blog/music-2025</link><guid isPermaLink="true">https://barnes.tech/blog/music-2025</guid><description>Some of the music I listened to the most in 2025</description><pubDate>Sat, 27 Dec 2025 19:29:43 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/apple-music-icon.svg&quot; alt=&quot;Apple Music Icon&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;As 2025 comes to a close (finally...) I wanted to mention some of my favorite music from the year. These are not necessarily all new music from 2025, just my most listened to music.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chevelle - Bright as Blasphemy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We finally got a new Chevelle album. Hard hitting as usual, and politically poignant, I really enjoy this album. The first 2 singles released, “Rabbit Hole (Cowards, Pt. 1)” and “Jim Jones (Cowards, Pt. 2),” both hit really hard and deliver blistering critiques of the cowardice and cult-like following that is poisoning the country. Pale Horse is another one of my favorites from the album.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linkin Park - From Zero&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This came out in 2024, but is still one of my top albums. Linkin Park has been one of my favorite bands since their very first album, and it was really hard for me when Chester Bennington passed away. For a few years it was difficult for me to listen to Linkin Park, and I had very mixed feelings when they announced they were coming out with a new album with a new singer, but it&apos;s a fantastic album.&lt;/p&gt;
&lt;p&gt;The Emptiness Machine was the first single and is still one of my favorites from the album. I feel like it was a great one to start with as it seems to me to directly address some of the hesitation about making new music and some of the struggle with fame. Heavy is the Crown is probably my favorite of the whole album.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;One of the songs that has always been one of my favorites, and was one of the top songs of 2025 for me by Linkin Park is &quot;Given Up&quot;. It remains one of the most raw emotional songs of all time. If you haven&apos;t seen it yet, watch the live performance. Chester&apos;s performance is absolutely unbelievable. Incredible performance physically, but also one of the most incredible displays of raw emotion in a performance I&apos;ve ever seen.&lt;/p&gt;
&lt;p&gt;I was extremely excited for TRON: Ares this year. I have always been a fan of Tron, and when they announced that Nine Inch Nails was doing the soundtrack, one of my favorite bands, I was losing my mind. The movie wasn&apos;t as good as I hoped it would be, but was still fun and enjoyable, but I really enjoyed several of the songs from the soundtrack. My favorite is the single from it -&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nine Inch Nails - As Alive as you Need me to be&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;On the other end of things, I really enjoyed Mumford &amp;#x26; Sons &quot;Rushmere&quot; album as well. Very Mumford and Sons sounding, but I enjoy that. I&apos;m glad they are making music again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mumford &amp;#x26; Sons - Rushmere&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Their album &quot;Prizefighter&quot; is set to come out in 2026, but the single &quot;Rubber Band Man&quot; just came out recently, and I really like that song as well. Hopefully this is a good sign for the album.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I totally get that Coldplay is not everyone&apos;s favorite, but they are one of those bands I would say is on the sound track of my life. While Moon Music came out in 2024, I still listen to it quite a bit. It&apos;s comforting to me, and many of the songs are just beautiful. There has been a lot of hopelessness in 2025, and the message of this album helps me feel a little bit of hope.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coldplay - Moon Music&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Of course I listened to a lot of music from bands I will always listen to, such as Tool, Nine Inch Nails, and older albums from some of the bands I have mentioned. I&apos;m not much of an EDM fan in general, but Deadmau5 is uniquely talented in my mind, and I listen to a lot of his stuff as well, particularly as background music while working.&lt;/p&gt;</content:encoded><category>music</category><category>2025</category></item><item><title>Google Dark Web Monitoring Goes to the Google Graveyard</title><link>https://barnes.tech/blog/google-dark-web-monitoring</link><guid isPermaLink="true">https://barnes.tech/blog/google-dark-web-monitoring</guid><description>Google shuts down Dark Web Reports, adding another product to the Google graveyard.</description><pubDate>Tue, 16 Dec 2025 16:26:46 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/google-logo.svg&quot; alt=&quot;Google Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Yet another Google product killed off.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arstechnica.com/gadgets/2025/12/google-is-shutting-down-dark-web-reports-in-january-because-they-werent-helpful/&quot;&gt;Ars Technica - Google will end dark web reports that alerted users to leaked data&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://arstechnica.com/gadgets/2025/12/google-is-shutting-down-dark-web-reports-in-january-because-they-werent-helpful/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://arstechnica.com/gadgets/2025/12/google-is-shutting-down-dark-web-reports-in-january-because-they-werent-helpful/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://killedbygoogle.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://killedbygoogle.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>security</category><category>review</category></item><item><title>Enshittification - The Daily Show</title><link>https://barnes.tech/blog/enshittification-the-daily-show</link><guid isPermaLink="true">https://barnes.tech/blog/enshittification-the-daily-show</guid><description>Cory Doctorow explains “enshittification” on The Daily Show, with a YouTube clip and related links for more context.</description><pubDate>Mon, 15 Dec 2025 01:29:15 GMT</pubDate><content:encoded>&lt;p&gt;Cory Doctorow on The Daily Show recently describing &lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot;&gt;enshittification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Excellent elevator pitch version of what it means and why it happens.&lt;/p&gt;
&lt;p&gt;Enshittification describes the predictable lifecycle of digital platforms: they start by delivering strong value to users to drive adoption, then shift to prioritizing business customers and advertisers at the users’ expense, and ultimately optimize for extraction and profit for the platform itself, degrading the experience for everyone else. The result is a hollowed-out product where usability, trust, and long-term value are sacrificed in favor of short-term financial gains, often leaving users and partners locked in with few viable alternatives.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/d2e-c9SF5nE&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://youtu.be/d2e-c9SF5nE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/enshitification-podcast/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded></item><item><title>Google DNSSEC MX Records Disappear</title><link>https://barnes.tech/blog/google-dnssec-mx-records-disappear</link><guid isPermaLink="true">https://barnes.tech/blog/google-dnssec-mx-records-disappear</guid><description>Explore the mystery behind Google&apos;s removal of DNSSSEC MX Record options and its implications for domain management.</description><pubDate>Tue, 25 Nov 2025 23:10:28 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/google-logo.svg&quot; alt=&quot;Google Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I previously wrote about how &lt;a href=&quot;https://barnes.tech/blog/google-dnssec-mx-records/&quot;&gt;Google added DNSSSEC MX Record options&lt;/a&gt;, just back in September.&lt;/p&gt;
&lt;p&gt;I went to get more information about them, and write a similar blog post for work on our site, but for some reason, Google has removed any reference to this in their support documents, and removed the blog post about the update. Very strange.&lt;/p&gt;
&lt;p&gt;I reached out to Google Support for information about this and they basically wouldn&apos;t say anything about it (somewhat unsurprisingly). We manage a domain that we moved to these records and they seem to still be working fine, but now I guess they are unsupported?&lt;/p&gt;
&lt;p&gt;Does this count as going to the &lt;a href=&quot;https://killedbygoogle.com/&quot;&gt;Google Graveyard&lt;/a&gt;? So bizarre.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/google-dnssec-mx-records/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/google-dnssec-mx-records/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://killedbygoogle.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://killedbygoogle.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category></item><item><title>The Power of Vulnerability</title><link>https://barnes.tech/blog/the-power-of-vulnerability</link><guid isPermaLink="true">https://barnes.tech/blog/the-power-of-vulnerability</guid><description>Brené Brown shares a deep insight from her research on human connection, empathy, and belonging in this influential TEDxHouston talk.</description><pubDate>Mon, 17 Nov 2025 03:44:19 GMT</pubDate><content:encoded>&lt;p&gt;Similar to &lt;a href=&quot;https://barnes.tech/blog/this-is-water/&quot;&gt;&quot;This is Water&quot;&lt;/a&gt;, this is one of the most influential talks I&apos;ve seen in my life. In the off chance you somehow have missed this, I highly recommend it.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.ted.com/talks/brene_brown_the_power_of_vulnerability&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.ted.com/talks/brene_brown_the_power_of_vulnerability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/this-is-water/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/this-is-water/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>inspiration</category></item><item><title>Raycast OpenGraph Previews</title><link>https://barnes.tech/blog/raycast-opengraph-previews</link><guid isPermaLink="true">https://barnes.tech/blog/raycast-opengraph-previews</guid><description>Explore tips and tools for enhancing productivity with AI and automation in your workflow.</description><pubDate>Wed, 12 Nov 2025 19:12:00 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Raycast Logo.svg&quot; alt=&quot;Raycast Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Another useful feature of Raycast is when you use the clipboard manager, if you have a URL in the clipboard history, it will show you the opengraph image used for that site. I’ve been working on completely rebuilding our website at work, and doing different opengraph images based on specific criteria on different pages, and this has been extremely helpful in testing them out as I deploy new ones.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.raycast.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.raycast.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Affiliate link&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://raycast.com/?via=robby&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://raycast.com/?via=robby&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>productivity</category><category>tips</category></item><item><title>CarPlay&apos;s Longevity</title><link>https://barnes.tech/blog/carplays-longevity</link><guid isPermaLink="true">https://barnes.tech/blog/carplays-longevity</guid><description>Exploring the future of CarPlay amid rising subscription models and data privacy concerns in the automotive industry.</description><pubDate>Wed, 12 Nov 2025 01:51:09 GMT</pubDate><content:encoded>&lt;p&gt;John Gruber, writing on Daring Fireball - &lt;a href=&quot;https://daringfireball.net/linked/2025/11/11/george-carplay-atlantic&quot;&gt;Patrick George Thinks CarPlay’s Days Are Numbered; I Doubt It&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don’t doubt that most carmakers are looking at ways to charge subscriptions. I do doubt, however, that they’re going to follow GM’s lead in abandoning CarPlay support.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think Gruber is a little overly optimistic about how much most people care about CarPlay, but I think the main reason CarPlay may struggle in the future would be because these companies will cram tracking and ads on any screen they can, rather than strictly subscriptions.&lt;/p&gt;
&lt;p&gt;Google, Facebook, and increasingly Amazon make obscene amounts of money just from tracking everything you do and cramming garbage in your face any chance they get. Car companies are &lt;a href=&quot;https://barnes.tech/blog/cars-and-data-privacy/&quot;&gt;already doing this&lt;/a&gt; as &lt;a href=&quot;https://barnes.tech/blog/cars-and-data-privacy-follow-up/&quot;&gt;much as they can get away with,&lt;/a&gt; and they will continue to push the boundary as far as people let them.&lt;/p&gt;
&lt;p&gt;I&apos;m not a CarPlay extremist like many Apple fans. There are a couple of cars I think do a better job at UI / UX than CarPlay, but it&apos;s extremely rare, and I definitely get the arguments for wanting to use your own apps like Apple Maps or your favorite podcast player, but for me I really only prefer it in cars that are absolutely awful at software UI / UX / everything (the vast vast majority of cars).&lt;/p&gt;
&lt;p&gt;Gruber argues that customers wanting CarPlay may keep competition strong enough that car markers need to support it to compete. That&apos;s a real possibility and I hope it&apos;s true, but if advertising is the goal, then you are no longer the customer. You&apos;re the product.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://daringfireball.net/linked/2025/11/11/george-carplay-atlantic&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://daringfireball.net/linked/2025/11/11/george-carplay-atlantic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/cars-and-data-privacy/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/cars-and-data-privacy/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/cars-and-data-privacy-follow-up/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/cars-and-data-privacy-follow-up/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>tutorial</category><category>tips</category></item><item><title>Meta Made $16 Billion From Scam Ads in 2024</title><link>https://barnes.tech/blog/facebook-scam-ads</link><guid isPermaLink="true">https://barnes.tech/blog/facebook-scam-ads</guid><description>How Meta profited from billions of daily scam ads while funding AI development, and why &apos;penalty bids&apos; made the problem worse.</description><pubDate>Mon, 10 Nov 2025 02:23:20 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/facebook-logo.svg&quot; alt=&quot;Facebook Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.reuters.com/investigations/meta-is-earning-fortune-deluge-fraudulent-ads-documents-show-2025-11-06/&quot;&gt;Reuters investigation&lt;/a&gt; revealed that Meta made &lt;strong&gt;$16 billion from scam ads in 2024&lt;/strong&gt;, 10% of total revenue. Internal documents show the company knowingly profited from fraud to fund AI development.&lt;/p&gt;
&lt;p&gt;Users encounter about &lt;strong&gt;15 billion &quot;high risk&quot; scam ads daily&lt;/strong&gt;, plus &lt;strong&gt;22 billion organic scam attempts&lt;/strong&gt;. Meta platforms are involved in roughly &lt;strong&gt;one-third of all successful scams in the United States&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Meta&apos;s System Makes It Worse&lt;/h2&gt;
&lt;p&gt;Meta only bans advertisers when it&apos;s 95% certain they&apos;re fraudulent. Everyone else flagged as suspicious gets charged &lt;strong&gt;higher ad rates as a &quot;penalty.&quot;&lt;/strong&gt; So Meta profits more from suspected scammers than legitimate advertisers.&lt;/p&gt;
&lt;p&gt;Thanks to &quot;ad personalization&quot;, users who click one scam ad get shown more scam ads. It&apos;s a feedback loop that maximizes revenue while exposing vulnerable users to escalating fraud.&lt;/p&gt;
&lt;p&gt;Some accounts accumulated &lt;strong&gt;over 500 strikes&lt;/strong&gt; before being shut down. Four campaigns alone generated &lt;strong&gt;$67 million monthly&lt;/strong&gt; before removal. Meta&apos;s enforcement teams operated under &quot;revenue guardrails&quot;: they couldn&apos;t take actions costing more than $135 million per quarter.&lt;/p&gt;
&lt;p&gt;The math: Meta estimated $1 billion in potential fines while earning $3.5 billion from risky scam ads every six months. &lt;strong&gt;Three-to-one profit margin on fraud&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Real-World Impact&lt;/h2&gt;
&lt;p&gt;In October 2024, scammers hijacked a Royal Canadian Air Force recruiter&apos;s account and ran crypto fraud ads using her identity. Despite &lt;strong&gt;over 100 reports&lt;/strong&gt;, Meta took weeks to act. Five people were defrauded. One victim lost &lt;strong&gt;C$40,000 ($28,000 USD)&lt;/strong&gt; believing he was talking to his trusted friend.&lt;/p&gt;
&lt;p&gt;Meta&apos;s own safety staff found &lt;strong&gt;96% of valid fraud reports were ignored&lt;/strong&gt;. Santa Clara County prosecutor Erin West: &quot;I don&apos;t know I&apos;ve ever seen something taken down as the result of a single user report.&quot;&lt;/p&gt;
&lt;p&gt;Meta claims they reduced scam ad reports by 58% and removed 134 million scam posts in 2025.&lt;/p&gt;
&lt;p&gt;Maybe people just gave up reporting because Meta doesn&apos;t do anything about it.&lt;/p&gt;
&lt;p&gt;Why would they try to fix it? They make tons of money from it, and they dictate the entire process from start to finish. They could make it go away very quickly if they cared to, but they don&apos;t. They clearly spent all their time covering it up, instead of trying to fix the problem, because they do not agree on what the problem is. Even with this kind of reporting, my guess is that exactly nothing will change.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.reuters.com/investigations/meta-is-earning-fortune-deluge-fraudulent-ads-documents-show-2025-11-06/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.reuters.com/investigations/meta-is-earning-fortune-deluge-fraudulent-ads-documents-show-2025-11-06/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://arstechnica.com/tech-policy/2025/11/bombshell-report-exposes-how-meta-relied-on-scam-ad-profits-to-fund-ai/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://arstechnica.com/tech-policy/2025/11/bombshell-report-exposes-how-meta-relied-on-scam-ad-profits-to-fund-ai/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>meta</category><category>facebook</category><category>fraud</category></item><item><title>Apple Maps Enshitification</title><link>https://barnes.tech/blog/apple-maps-enshitification</link><guid isPermaLink="true">https://barnes.tech/blog/apple-maps-enshitification</guid><description>Apple Maps may soon feature ads, raising concerns over user experience and monetization strategies.</description><pubDate>Sun, 26 Oct 2025 22:12:17 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/apple.svg&quot; alt=&quot;Apple logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Apple Maps users could start seeing ads in the app as soon as next year&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bloomberg.com/news/newsletters/2025-10-26/what-s-next-for-the-ipad-pro-iphone-17-pro-like-vapor-chamber-apple-maps-ads-mh7nq39h&quot;&gt;According to Mark Gurman.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These companies just can&apos;t help themselves but enshitify everything they possibly can. It&apos;s legal, and basically free money. A lot of free money.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot;&gt;The Enshitification of Big Tech: A Conversation with Cory Doctorow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nothing is free, and when you use online services that say they are free, you are actually the product, not the customer. Facebook? Google? Increasingly Amazon...? You are a source of data that they own, and they sell. You effectively have no choice in the matter. One of the main reasons I have always been fine paying (a lot) for Apple products is that it&apos;s very clear what you&apos;re paying for, where the company makes their money (you know... from us paying for it), and the customer / product relationship is very clear. That line seems to be blurring.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The big risk Apple faces here is a potential consumer backlash. Some customers are already unhappy that the iPhone has been turned into a digital billboard for services like AppleCare+, Apple Music, Apple TV and Fitness+. The company also pushes web-like ad slots within Apple News. When you consider that an iPhone can cost up to $2,000, some see this as an unseemly money grab.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You don&apos;t say!&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.bloomberg.com/news/newsletters/2025-10-26/what-s-next-for-the-ipad-pro-iphone-17-pro-like-vapor-chamber-apple-maps-ads-mh7nq39h&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.bloomberg.com/news/newsletters/2025-10-26/what-s-next-for-the-ipad-pro-iphone-17-pro-like-vapor-chamber-apple-maps-ads-mh7nq39h&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/enshitification-podcast/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2025/10/26/ads-might-be-coming-to-apple-maps-next-year/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://techcrunch.com/2025/10/26/ads-might-be-coming-to-apple-maps-next-year/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>development</category><category>tips</category></item><item><title>This is Water</title><link>https://barnes.tech/blog/this-is-water</link><guid isPermaLink="true">https://barnes.tech/blog/this-is-water</guid><description>Explore the inspiring message of David Foster Wallace&apos;s &apos;This Is Water&apos;.</description><pubDate>Sun, 19 Oct 2025 23:19:23 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/this-is-water.png&quot; alt=&quot;This is water book cover&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;m sure most people have seen this by now, but I find it really inspiring. I try to rewatch it every couple of years.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/eC7xzavzEKY&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://youtu.be/eC7xzavzEKY&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://fs.blog/david-foster-wallace-this-is-water/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://fs.blog/david-foster-wallace-this-is-water/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>inspiration</category></item><item><title>Peter Thiel’s Dangerous Ideology</title><link>https://barnes.tech/blog/the-real-stakes-and-real-story-of-peter-thiels-antichrist-obsession</link><guid isPermaLink="true">https://barnes.tech/blog/the-real-stakes-and-real-story-of-peter-thiels-antichrist-obsession</guid><description>A critical look at Peter Thiel&apos;s dangerous influence on technology and politics, exploring his obsession with the Antichrist.</description><pubDate>Wed, 15 Oct 2025 02:07:31 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I recently read &lt;a href=&quot;https://www.wired.com/story/the-real-stakes-real-story-peter-thiels-antichrist-obsession/&quot;&gt;The Real Stakes, and Real Story, of Peter Thiel’s Antichrist Obsession&lt;/a&gt;, recently written by &lt;a href=&quot;https://www.wired.com/author/laura-bullard/&quot;&gt;Laura Bullard&lt;/a&gt; on Wired about Peter Thiel’s obsession with the antichrist, and it’s terrifying. I’ve known Peter Thiel was a jackass for a long time, and his involvement in Facebook and Palantir were problematic, but I did not fully grasp the depth of how awful he is, and how much he has influenced so much of all of the terrible things going on currently in the world.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By Thiel’s telling, the modern world is scared, way too scared, of its own technology. Our “listless” and “zombie” age, he said, is marked by a growing hostility to innovation, plummeting fertility rates, too much yoga, and a culture mired in the “endless Groundhog Day of the worldwide web.” But in its neurotic desperation to avoid technological Armageddon—the real threats of nuclear war, environmental catastrophe, runaway AI—modern civilization has become susceptible to something even more dangerous: the Antichrist.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;First, rather convenient that someone who has so much money invested in tech is going around telling people that trying to put safety in place, or slow down things like “AI” in the name of safety are somehow &lt;em&gt;literally&lt;/em&gt; the anti-christ feels laughable, until you realize how dead serious he is.&lt;/p&gt;
&lt;p&gt;But you don’t become a billionaire without believing in making money at the expense of literally everyone, right? So the inappropriately over the top sell of his own technologies seems par for the course so far, but that’s just the beginning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For Thiel and the Nazi theorist Carl Schmitt, the Antichrist’s evil is pretty much synonymous with any attempt to unify the world.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah… Turns out he’s a big fan of Carl Schmitt, the Nazi sympathizer, and Thiel preaches many of the exact same arguments Carl Schmitt made when defending Nazi’s and Hitler, but conveniently doesn’t mention Nazi’s or Hitler directly.&lt;/p&gt;
&lt;p&gt;Thiel is also single handedly responsible for JD Vance’s rise in political power, and seemingly much of JD’s racist extremist views as well.&lt;/p&gt;
&lt;p&gt;It’s a long article, but it’s worth reading. Thiel is an incredibly powerful, and incredibly dangerous individual.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.wired.com/story/the-real-stakes-real-story-peter-thiels-antichrist-obsession/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.wired.com/story/the-real-stakes-real-story-peter-thiels-antichrist-obsession/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.wired.com/author/laura-bullard/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.wired.com/author/laura-bullard/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded></item><item><title>Notion 3.0 / Notion AI Follow Up</title><link>https://barnes.tech/blog/notion-30-notion-ai-follow-up</link><guid isPermaLink="true">https://barnes.tech/blog/notion-30-notion-ai-follow-up</guid><description>A review of Notion AI&apos;s capabilities, highlighting both its strengths and weaknesses in project proposal drafting.</description><pubDate>Tue, 14 Oct 2025 23:23:06 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Notion.svg&quot; alt=&quot;Notion Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Not too long ago, I wrote about Notion’s announcement of Notion 3.0 (even though the current app version is 4.x… But whatever)- https://barnes.tech/blog/notion-30/. I was optimistic about what they announced. In a nutshell, they added “agents” and significantly updated the AI that powers Notion AI. Notion AI can work with Notion pages or databases but can also connect to all of the other data connectors that you have connected to Notion. Sounds great, and the demos looked good. After testing it out for a day or so I was fairly impressed.&lt;/p&gt;
&lt;p&gt;Since then I’ve been using it a fair amount more, and it has been a pretty mixed bag for me. Sometimes it seems to do exactly what they demoed. I can reference a bunch of data, briefly explain what we are planning to do for a project, give it a good example of a well designed project proposal, and it can do an excellent job filling out at least a rough draft of a project proposal based on all that data. It has legitimately saved me several hours of busy work already.&lt;/p&gt;
&lt;p&gt;But sometimes it completely shits the bed. It’s very weird. I know AI hallucination pretty well, but as long as you know how to craft prompts, give examples, and are really explicit with what you’re looking for, Claude and OpenAI are pretty good at sticking to the parameters you give it. Notion seems to occasionally just completely lose it’s mind. I’ve now twice had it completely ignore instructions I’ve given it, specifically about content on a page I want left as-is, or formatting I want to remain the same, and completely messes up a page. I’ve now twice had it delete embedded files that I specifically told it in the prompt to leave exactly as-is. Honestly, using a Notion MCP server and just having Claude Code or OpenAI Codex interact with Notion has been much more successful so far, which is strange to me since Notion is using both models under “Notion AI”.&lt;/p&gt;
&lt;p&gt;The idea they have here I think is solid, and Notion seems like a great place to use AI when a lot of time I’m just trying to consolidate data, summarize something, or do a bunch of busy repetitive work, but in it’s current state, you better be careful. It feels like this needs to bake in the oven for a while longer before they push it too far.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/notion-30/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/notion-30/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>productivity</category><category>review</category></item><item><title>On the Other Hand...</title><link>https://barnes.tech/blog/on-the-other-hand</link><guid isPermaLink="true">https://barnes.tech/blog/on-the-other-hand</guid><description>Exploring Apple&apos;s challenges and the balance between security and privacy in a complex landscape.</description><pubDate>Wed, 08 Oct 2025 04:22:58 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/apple.svg&quot; alt=&quot;Apple logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I recently wrote about how &lt;a href=&quot;https://barnes.tech/blog/apple-between-a-tough-spot-and-a-tough-spot/&quot;&gt;Apple and Tim Cook have been between a tough spot and a tough spot&lt;/a&gt;, and that it is more complicated than it might seem on the surface given the state of things. &lt;a href=&quot;https://substack.com/inbox/post/175351960&quot;&gt;This post by 22 year Apple veteran articulates a potent counter point.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;...there is a symmetry to how the larger world equates values and actions; just as one stand against an invasive and unlawful request could help people see that Apple was genuinely committed to security and privacy, the removal of the ICEBlock app represents an act that squanders that same good faith.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Giving the bully your lunch money never stops the bully, it makes them take your lunch money more. There has to be a point where you draw a line in the sand and stand up. The comparison to the FBI wanting a back door after the San Bernadine case is stark and apt.&lt;/p&gt;
&lt;p&gt;Where is that line? How long will a wannabe dictator bully around a nearly $4 Trillion company?&lt;/p&gt;
&lt;p&gt;I am still really glad I’m not in charge of Apple right now.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://substack.com/inbox/post/175351960&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://substack.com/inbox/post/175351960&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/apple-between-a-tough-spot-and-a-tough-spot/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/apple-between-a-tough-spot-and-a-tough-spot/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category></item><item><title>Good CISOs / Bad CISOs</title><link>https://barnes.tech/blog/good-cisos-and-bad-cisos</link><guid isPermaLink="true">https://barnes.tech/blog/good-cisos-and-bad-cisos</guid><description>Explore key insights on effective CISO leadership and the difference between good and bad practices in IT security.</description><pubDate>Sun, 05 Oct 2025 18:08:44 GMT</pubDate><content:encoded>&lt;p&gt;I came across this recently, and thought it was a really good read - &lt;a href=&quot;https://www.philvenables.com/post/good-ciso---bad-ciso&quot;&gt;Good CISO / Bad CISO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Key points ￼&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Strategy vs. projects&lt;/strong&gt;: Good CISOs craft a clear, generative strategy; bad CISOs confuse tool lists and project plans for strategy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flywheels vs. firefighting&lt;/strong&gt;: Good CISOs build scalable, self-reinforcing systems; bad CISOs chase incidents and ticket counts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business communication&lt;/strong&gt;: Good CISOs speak in risk, capital, opportunity with quantified positions; bad CISOs use techno-jargon and FUD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ownership and culture&lt;/strong&gt;: Good CISOs own vendor risk, empower teams, surface bad news fast, and partner with the board; bad CISOs abdicate, bottleneck, and are last to know.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Excellent insights and definitely something I&apos;ve observed over the years. This applies to all IT leadership, not just CISOs.&lt;/p&gt;
&lt;p&gt;IT and Security are so often seen only as a cost center by businesses, but IT and Security leadership can change that if they approach this the right way.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.philvenables.com/post/good-ciso---bad-ciso&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.philvenables.com/post/good-ciso---bad-ciso&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>security</category><category>development</category><category>tips</category></item><item><title>Apple - Between a Tough Spot and a Tough Spot</title><link>https://barnes.tech/blog/apple-between-a-tough-spot-and-a-tough-spot</link><guid isPermaLink="true">https://barnes.tech/blog/apple-between-a-tough-spot-and-a-tough-spot</guid><description>A critical look at Tim Cook&apos;s leadership at Apple compared to Steve Jobs, exploring moral dilemmas and corporate challenges.</description><pubDate>Sat, 04 Oct 2025 23:51:14 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/apple.svg&quot; alt=&quot;Apple logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I recently posted Anil Dash’s article, &lt;a href=&quot;https://www.anildash.com/2025/09/09/how-tim-cook-sold-out-steve-jobs/&quot;&gt;How Tim Cook sold out Steve Jobs&lt;/a&gt;. I think it’s an interesting article, and I completely understand all of the sentiment of it. In many regards I feel the same way. The golden statue stunt really grosses me out. The weird dystopian dinner at the White House with tech leaders being forced to compliment the President makes me sick to my stomach. Extorting people for inauguration donations feels blatantly illegal. If it’s not it should be. All of this is not only disturbing, terrifying, gross, etc. but also just feels like this is a bad mafia movie, one with such a bad plot line that would feel way too on the nose to be any good. And I completely agree, this is not how Steve Jobs would have handled this situation, and I miss his presence and leadership at Apple.&lt;/p&gt;
&lt;p&gt;But Tim Cook is not Steve Jobs, no one is. This is an awful time in our history, and I think it’s naive to think that Apple, and Tim Cook personally, is necessarily just “wrong” and he should have done the “right” thing. Life is not that simple. There was and is no “right” solution to this mess of a situation.&lt;/p&gt;
&lt;p&gt;What would be different if Tim had dug in based on principal? It’s hard to know for sure, but it doesn’t seem to me like things would be any better. It seems reasonable that punitive tariffs would be impacting the price of all Apple products, which would either raise the price of all of them or Apple would have to eat billions of dollars of margin, which surely would impact the stock price significantly. It’s easy to feel like the stock price shouldn’t matter, and I agree it shouldn’t be the only thing, but it does matter. A lot of people’s investments both within Apple and outside of Apple are tied up in there and it’s not just a simple decision to tank that due to moral reasons.&lt;/p&gt;
&lt;p&gt;It’s also possible that Apple would be punished in to removing their diversity efforts to one degree or another. I’m not sure how but the administration has been far more effective than they should be able to be at destroying significant progress in those regards across the country. I may be wrong, but it doesn’t &lt;em&gt;seem&lt;/em&gt; like Apple has capitulated on that aspect of their internal culture.&lt;/p&gt;
&lt;p&gt;I don’t mean any of this as an excuse. This all feels gross. Apple has never been a perfect company, and Steve Jobs was never a perfect person, yet for much of my life it has been a company that I’ve really admired. I’ve worked for Apple or Apple Partners for nearly all of my professional life, and I feel passionate about the products, company, and culture of Apple. This has soured that to some degree. At the same time, I’m not sure that there is any way it could have been handled better to date. I can’t see any good choices, they’re all bad. I also have a pretty strong feeling that Tim hates this too.&lt;/p&gt;
&lt;p&gt;One thing is for sure, I am really glad I’m not in charge of Apple right now.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.anildash.com/2025/09/09/how-tim-cook-sold-out-steve-jobs/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.anildash.com/2025/09/09/how-tim-cook-sold-out-steve-jobs/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>review</category><category>tips</category><category>development</category></item><item><title>Google Home Plus Gemini</title><link>https://barnes.tech/blog/google-home</link><guid isPermaLink="true">https://barnes.tech/blog/google-home</guid><description>Exploring Google&apos;s renewed focus on smart home tech with Gemini and the challenges faced by Nest products.</description><pubDate>Sun, 21 Sep 2025 20:39:57 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/gemini.svg&quot; alt=&quot;Google Gemini Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Google is talking like they are going to take smart home seriously again with their new &quot;&lt;a href=&quot;https://blog.google/products/google-nest/gemini-for-home/&quot;&gt;Gemini infused Google Home&lt;/a&gt;&quot;. I&apos;ve written several times about how frustrating it has been to be a user of Google products, or rather former products, but The Verge summed it up really well -&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The last five years have been trying ones for anyone committed to the Google Home ecosystem and Nest hardware. From &lt;a href=&quot;https://www.theverge.com/news/638171/google-discontinuing-nest-protect-smoke-alarm-nest-x-yale-smart-lock&quot;&gt;discontinued products&lt;/a&gt; and &lt;a href=&quot;https://www.theverge.com/news/708538/google-nest-aware-plus-price-increase-subscription&quot;&gt;increased subscription prices&lt;/a&gt; to the &lt;a href=&quot;https://www.theverge.com/2024/1/11/24034262/google-assistant-removes-17-features-layoffs-pixel-voice-commands&quot;&gt;removal of features&lt;/a&gt; and &lt;a href=&quot;https://gizmodo.com/google-assistant-is-basically-on-life-support-and-things-just-got-worse-2000635521&quot;&gt;declining performance of Google Assistant&lt;/a&gt; on Nest smart speakers, there hasn’t been a lot to be happy about, as also evidenced by the Google Home &lt;a href=&quot;https://www.reddit.com/r/googlehome/comments/1n5msm9/monthly_complaints_and_rants_megathread_september/&quot;&gt;“rant and complaints” megathread&lt;/a&gt; on Reddit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What a completely unnecessary mess. I was a huge Nest fan from the very first thermostat they launched, and it has been incredibly frustrating to watch Google completely squander the company that essentially kickstarted the whole smart home concept, and just grind it in to mediocrity. If you dig in to the details of Nest pre-Google it&apos;s kind of nuts how many technologies they pioneered, including the early work on Thread and what has become Matter. If Google had been able to keep their foot on the gas and actually improved Nest, it&apos;s crazy to think how far of a lead they would have today.&lt;/p&gt;
&lt;p&gt;Needless to say, I&apos;m skeptical. Honestly though, even if whatever they are coming out with is absolutely incredible, do any of us trust them to stick with it this time?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.theverge.com/report/781221/the-end-of-nest-google-home-smart-home&quot;&gt;Google Dismantled Nest - Can Gemini Save What&apos;s Left?&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/report/781221/the-end-of-nest-google-home-smart-home&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/report/781221/the-end-of-nest-google-home-smart-home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://blog.google/products/google-nest/gemini-for-home/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.google/products/google-nest/gemini-for-home/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/news/638171/google-discontinuing-nest-protect-smoke-alarm-nest-x-yale-smart-lock&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/news/638171/google-discontinuing-nest-protect-smoke-alarm-nest-x-yale-smart-lock&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/news/708538/google-nest-aware-plus-price-increase-subscription&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/news/708538/google-nest-aware-plus-price-increase-subscription&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/2024/1/11/24034262/google-assistant-removes-17-features-layoffs-pixel-voice-commands&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/2024/1/11/24034262/google-assistant-removes-17-features-layoffs-pixel-voice-commands&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://gizmodo.com/google-assistant-is-basically-on-life-support-and-things-just-got-worse-2000635521&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://gizmodo.com/google-assistant-is-basically-on-life-support-and-things-just-got-worse-2000635521&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/googlehome/comments/1n5msm9/monthly_complaints_and_rants_megathread_september/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.reddit.com/r/googlehome/comments/1n5msm9/monthly_complaints_and_rants_megathread_september/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>development</category><category>review</category></item><item><title>Notion 3.0</title><link>https://barnes.tech/blog/notion-30</link><guid isPermaLink="true">https://barnes.tech/blog/notion-30</guid><description>Notion&apos;s latest update enhances AI capabilities, database permissions, and customization options for improved productivity.</description><pubDate>Fri, 19 Sep 2025 22:50:39 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Notion.svg&quot; alt=&quot;Notion Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Speaking of Notion, they announced several new features yesterday that are pretty substantial. AI got a big upgrade, allowing it to act more &quot;agentic&quot; on your behalf. I tested this and while it&apos;s not perfect, it&apos;s pretty good! It has already helped me clean up several databases and pages that were disorganized but not quite worth the time of manually cleaning up for me.&lt;/p&gt;
&lt;p&gt;You can also customize the agent with memory and custom instructions now. Seems to work relatively well, and is a very welcome change. It&apos;s also not perfect but it&apos;s excellent progress. It seems like soon you&apos;ll be able to create completely custom agents as well, which I&apos;m very interested in seeing and exploring.&lt;/p&gt;
&lt;p&gt;Finally, they also added much more granular database permissions which is one of the biggest missing features, and extremely welcome. Add this to the offline mode they launched last month and it has been a very good run so far for Notion this year in my book.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.notion.com/blog/introducing-notion-3-0&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.notion.com/blog/introducing-notion-3-0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.notion.com/releases/2025-08-19&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.notion.com/releases/2025-08-19&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>productivity</category><category>tips</category><category>tutorial</category></item><item><title>Notion Hex Color Swatches</title><link>https://barnes.tech/blog/notion-hex-color-swatches</link><guid isPermaLink="true">https://barnes.tech/blog/notion-hex-color-swatches</guid><description>Learn how to preview hex colors in Notion using a clever inline equation workaround.</description><pubDate>Fri, 19 Sep 2025 22:19:05 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Notion.svg&quot; alt=&quot;Notion Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;One thing I&apos;ve wanted to be able to do in Notion for a while is to have some way of showing a hex color when you put it somewhere in a block, similar to how Slack gives you a little preview, or in &lt;a href=&quot;https://barnes.tech/blog/raycast/&quot;&gt;Raycast&lt;/a&gt; you get a preview as well.&lt;/p&gt;
&lt;p&gt;You still can&apos;t technically do it, but I found a work around that&apos;s better than nothing.&lt;/p&gt;
&lt;p&gt;If you use an inline equation block you can put (obviously with whatever color you are looking for. Adding space in there just allows it to be a longer line) -&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\colorbox{#3a3a3a}{            }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and it will give you a little preview of that color. Not perfect, but a nice little way to add a little preview of colors right on the page.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/raycast&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/raycast&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>tutorial</category><category>tips</category><category>productivity</category></item><item><title>Google DNSSEC MX Records</title><link>https://barnes.tech/blog/google-dnssec-mx-records</link><guid isPermaLink="true">https://barnes.tech/blog/google-dnssec-mx-records</guid><description>Learn how to enhance email security in Google Workspace using DNSSEC-signed MX records to prevent tampering and unauthorized access.</description><pubDate>Fri, 05 Sep 2025 23:30:13 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/google-logo.svg&quot; alt=&quot;Google Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I&apos;m not sure how long this has been available, but it was news to me today.  Apparently Google gives you the option to use DNSSEC secured MX records now for Google Workspace accounts -&lt;/p&gt;
&lt;p&gt;https://support.google.com/a/answer/16528693?hl=en&lt;/p&gt;
&lt;h2&gt;Enhancing Email Security with DNSSEC-Signed MX Records in Google Workspace&lt;/h2&gt;
&lt;p&gt;Google Workspace administrators can improve domain email security by using DNS Security Extensions (DNSSEC)-signed MX hosts instead of the standard &lt;strong&gt;smtp.google.com&lt;/strong&gt; MX value. DNSSEC adds digital signatures to DNS records, including MX records, which verifies authenticity and prevents tampering or redirection to unauthorized servers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Follow the standard &lt;a href=&quot;url://1&quot;&gt;Google Workspace MX record setup&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Step 4, for the &lt;strong&gt;Value / Answer / Destination&lt;/strong&gt; field, enter the DNSSEC-signed MX records below instead of &lt;strong&gt;smtp.google.com&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;| Priority | Server           |
|----------|------------------|
| 10       | MX1.SMTP.GOOG    |
| 20       | MX2.SMTP.GOOG    |
| 30       | MX3.SMTP.GOOG    |
| 40       | MX4.SMTP.GOOG    |&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By implementing DNSSEC-signed MX records, you strengthen email authentication and reduce risk from DNS-based attacks.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://support.google.com/a/answer/16528693?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://support.google.com/a/answer/16528693?hl=en&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>tutorial</category><category>tips</category><category>security</category></item><item><title>The Browser Company - More Fallout</title><link>https://barnes.tech/blog/the-browser-company-more-fallout</link><guid isPermaLink="true">https://barnes.tech/blog/the-browser-company-more-fallout</guid><description>Exploring the implications of Atlassian&apos;s acquisition of The Browser Company and its potential impact on future browser development.</description><pubDate>Fri, 05 Sep 2025 17:31:21 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/RIP The Browser Company.png&quot; alt=&quot;The logo of the browser company with a skull and crossbones on it&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Here&apos;s a video deep dive about The Browser Company&apos;s announcement that they are being acquired by Atlassian, including diving in to why The Browser Company was looking to be acquired, and why Atlassian may have wanted to buy them.&lt;/p&gt;
&lt;p&gt;No one online seems to think this is a good acquisition for The Browser Company. It&apos;s almost certainly going to make Dia (or any other browsers they are working on) much worse.&lt;/p&gt;
&lt;p&gt;There are some really interesting and compelling points.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=45fbNFMd_vc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=45fbNFMd_vc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>tutorial</category><category>review</category><category>development</category></item><item><title>The Browser Company is being acquired</title><link>https://barnes.tech/blog/the-browser-company-is-being-acquired</link><guid isPermaLink="true">https://barnes.tech/blog/the-browser-company-is-being-acquired</guid><description>The Browser Company, known for Arc and Dia, is being acquired by Atlassian, raising concerns among users.</description><pubDate>Thu, 04 Sep 2025 15:42:50 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/RIP The Browser Company.png&quot; alt=&quot;The logo of the browser company with a skull and crossbones on it&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;From the Verge - &lt;a href=&quot;https://www.theverge.com/web/770947/browser-company-arc-dia-acquired-atlassian&quot;&gt;The Browser Company, maker of Arc and Dia, is being acquired&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As they say in the amazing documentary &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=W7JyjZI3LUM&amp;#x26;t=6s&quot;&gt;Rejected&lt;/a&gt;&quot; -&lt;/p&gt;
&lt;p&gt;I honestly hate using any Atlassian software so much. Real bummer. Hopefully some of these other browsers popping up will be something I can switch to in the near future.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/web/770947/browser-company-arc-dia-acquired-atlassian&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/web/770947/browser-company-arc-dia-acquired-atlassian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=W7JyjZI3LUM&amp;t=6s&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=W7JyjZI3LUM&amp;t=6s&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>cloud</category><category>development</category><category>review</category><category>tips</category></item><item><title>AI Laundering</title><link>https://barnes.tech/blog/ai-laundering</link><guid isPermaLink="true">https://barnes.tech/blog/ai-laundering</guid><description>Explore how &apos;Context Rot&apos; affects LLM performance and the benefits of using multiple AI models for better results.</description><pubDate>Sat, 30 Aug 2025 19:36:09 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/ai-light-mode.svg&quot; alt=&quot;AI Sparkle Icon&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;h2&gt;Context Rot&lt;/h2&gt;
&lt;p&gt;If you&apos;ve been using LLMs for long tasks like Coding, you probably notice the longer you have an individual chat session, the results start to get worse over time. This is particularly evident when you switch tasks entirely after working on something specific for a while. Some are calling this &quot;Context Rot&quot; &lt;a href=&quot;https://research.trychroma.com/context-rot&quot;&gt;Context Rot: How Increasing Input Tokens Impacts LLM Performance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I find this whole idea pretty interesting. For a while now I&apos;ve found that if you have one model try a bunch of tasks, then have another model check that work and make suggestions about how to improve it (ideally from another provider, since the training and data from another company seems to add a different perspective). This seems to make much higher quality results. I will often have one LLM be more of the master planner, and another be doing the individual tasks.&lt;/p&gt;
&lt;p&gt;To some degree, certain products already do this. Claude code for instance (with the right plan at least) will use the Opus model for planning tasks, then hand it to Sonnet to handle individual tasks laid out by Opus. You can go even further by setting up subagents with individual tasks and even individual instructions / context, however I still find I get better results by handing it back and forth from more than one provider. This isn&apos;t only applicable to code either, I often find doing this with text, or documentation, or any number of other things is also quite beneficial.&lt;/p&gt;
&lt;p&gt;I&apos;ve been calling this &quot;AI Laundering&quot;. Yes, I do amuse myself.&lt;/p&gt;
&lt;p&gt;This has taken a huge leap with OpenAI&apos;s recent updates to Codex CLI which has gotten &lt;em&gt;dramatically&lt;/em&gt; better in the last week. I try to not mention specific products too much because they are changing so much so rapidly, anything specific about products seems to age like milk, but it&apos;s worth noting in this case. Having Claude Code write code, then having Codex check the work and critique it, then go back to Claude Code with the recommendations seems to make a huge difference. &lt;a href=&quot;https://www.youtube.com/watch?v=GJzfNWK4iHg&quot;&gt;I&apos;m not alone either, several others are noting this as well.&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://research.trychroma.com/context-rot&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://research.trychroma.com/context-rot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TUjQuC4ugak&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=TUjQuC4ugak&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=GJzfNWK4iHg&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=GJzfNWK4iHg&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>development</category><category>tips</category><category>productivity</category></item><item><title>Cloudflare vs Perplexity and the Future of the Internet</title><link>https://barnes.tech/blog/cloudflare-vs-perplexity-and-the-future-of-the-internet</link><guid isPermaLink="true">https://barnes.tech/blog/cloudflare-vs-perplexity-and-the-future-of-the-internet</guid><description>Explore the conflict between Cloudflare and Perplexity over web crawling and AI access rights.</description><pubDate>Sat, 09 Aug 2025 20:01:30 GMT</pubDate><content:encoded>&lt;p&gt;Cloudflare posted a technically grounded exposé titled &lt;strong&gt;“Perplexity is using stealth, undeclared crawlers to evade website no-crawl directives.”&lt;/strong&gt; They documented a controlled experiment: domains blocked via &lt;code&gt;robots.txt&lt;/code&gt; and WAF rules, yet Perplexity reportedly bypassed the protections by rotating IPs, spoofing user-agents (e.g., impersonating Chrome on macOS), and shifting ASNs. The conclusion: Perplexity was removed from Cloudflare’s Verified Bots program and targeted with new heuristics. CEO Matthew Prince went so far as to liken this to “North Korean hackers,” calling it “time to name, shame, and hard block them.”&lt;/p&gt;
&lt;p&gt;Perplexity’s reply, &lt;strong&gt;“Agents or Bots? Making Sense of AI on the Open Web,”&lt;/strong&gt; framed their behavior not as crawling but user-driven fetching, aligning it with how a human user navigates a site. They dismissed Cloudflare’s piece as a “sales pitch” and hinted at a third-party being responsible for some of the behavior.&lt;/p&gt;
&lt;p&gt;I feel like both articles go too hard after the other. Also, you never know what went on behind the scenes, but from the outside it seems like this was just thrown online in a blog with pretty harsh rhetoric. Seems overly petty to me on both articles, and I&apos;m not sure what it accomplishes other than both companies seemingly trying to get some headline attention.&lt;/p&gt;
&lt;p&gt;Still, this isn&apos;t a simple problem. Website owners should be able to choose what kind of traffic accesses their sites, and services like Cloudflare are one of the few ways they can enforce things like that. That said, if you&apos;re using an &quot;agentic&quot; (still don&apos;t love that term) AI platform where you are asking AI to go find something or do something on your behalf, I can see the argument that it should be able to do so with the same access a user would have.&lt;/p&gt;
&lt;p&gt;It&apos;s not an easy problem.&lt;/p&gt;
&lt;p&gt;While I do believe website owners should have control over those things as strictly as they want, Cloudflare feels like they are throwing their weight around too much for my comfort recently. It feels like they have been pushing the line about how much they, as essentially an infrastructure provider, should be editorializing on this kind of thing.&lt;/p&gt;
&lt;p&gt;Their &lt;strong&gt;“Content Independence Day — No AI Crawl Without Compensation”&lt;/strong&gt; post further deepens my concern. This feels like it is right on the border between fighting for the rights of content creators, and simply platform fiat. To me, the fact that this is only shown directly to users as enabled on new accounts, and the fact that it can be turned off just barely keeps it from crossing the line to me, it still makes me uncomfortable.&lt;/p&gt;
&lt;p&gt;Many people are fretting that AI will be &quot;the end of the open web&quot;. I would argue that effectively happened several years ago, but there&apos;s no question AI is upending everything left on whatever the web is any more.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/content-independence-day-no-ai-crawl-without-compensation/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.cloudflare.com/content-independence-day-no-ai-crawl-without-compensation/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/perplexity-is-using-stealth-undeclared-crawlers-to-evade-website-no-crawl-directives/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.cloudflare.com/perplexity-is-using-stealth-undeclared-crawlers-to-evade-website-no-crawl-directives/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.perplexity.ai/hub/blog/agents-or-bots-making-sense-of-ai-on-the-open-web&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.perplexity.ai/hub/blog/agents-or-bots-making-sense-of-ai-on-the-open-web&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2025/08/05/some-people-are-defending-perplexity-after-cloudflare-named-and-shamed-it/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://techcrunch.com/2025/08/05/some-people-are-defending-perplexity-after-cloudflare-named-and-shamed-it/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>cloud</category><category>tutorial</category><category>review</category><category>security</category></item><item><title>Google Backtracks on URL Shortener</title><link>https://barnes.tech/blog/google-backtracks</link><guid isPermaLink="true">https://barnes.tech/blog/google-backtracks</guid><description>Google updates goo.gl link plans, preserving active URLs while discontinuing inactive ones. Learn more about the changes.</description><pubDate>Sun, 03 Aug 2025 18:21:32 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/google-logo.svg&quot; alt=&quot;Google Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;From Google&apos;s keyword blog -&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’re updating our plans for goo.gl links.&lt;/p&gt;
&lt;p&gt;While we previously announced discontinuing support for all goo.gl URLs after August 25, 2025, we&apos;ve adjusted our approach in order to preserve actively used links.&lt;/p&gt;
&lt;p&gt;We understand these links are embedded in countless documents, videos, posts and more, and we appreciate the input received.&lt;/p&gt;
&lt;p&gt;Nine months ago, we redirected URLs that showed no activity in late 2024 to a message specifying that the link would be deactivated in August, and these are the only links targeted to be deactivated. If you get a message that states, “This link will no longer work in the near future”, the link won&apos;t work after August 25 and we recommend transitioning to another URL shortener if you haven’t already.&lt;/p&gt;
&lt;p&gt;All other goo.gl links will be preserved and will continue to function as normal. To check if your link will be retained, visit the link today. If your link redirects you without a message, it will continue to work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is much more reasonable, though I&apos;m not sure why they wouldn&apos;t have just done this from the beginning. I can&apos;t imagine all of this costs Google that much to just keep running. Still, this illustrates a fairly big issue with one company having so much power over the internet.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://blog.google/technology/developers/googl-link-shortening-update/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.google/technology/developers/googl-link-shortening-update/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>development</category><category>tips</category><category>security</category></item><item><title>Dropbox Password Manager</title><link>https://barnes.tech/blog/dropbox-password-manager</link><guid isPermaLink="true">https://barnes.tech/blog/dropbox-password-manager</guid><description>Dropbox discontinues its password manager service, raising concerns for users. Find out more about the timeline and implications.</description><pubDate>Fri, 01 Aug 2025 03:27:06 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/dropbox.png&quot; alt=&quot;Dropbox Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;This week &lt;a href=&quot;https://help.dropbox.com/installs/dropbox-passwords-discontinuation&quot;&gt;Dropbox announced that they are discontinuing their password manager&lt;/a&gt;. I don’t know anyone that actually uses their password manager, so it’s probably not many people impacted… still, this is a super tight timeline.&lt;/p&gt;
&lt;p&gt;I’m not sure exactly what would happen if you don’t do anything and they kill it, but if my parents or in laws were using this it would be potentially disastrous.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://help.dropbox.com/installs/dropbox-passwords-discontinuation&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://help.dropbox.com/installs/dropbox-passwords-discontinuation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>security</category><category>productivity</category><category>review</category><category>tips</category></item><item><title>TRMNL X</title><link>https://barnes.tech/blog/trmnl-x</link><guid isPermaLink="true">https://barnes.tech/blog/trmnl-x</guid><description>TRMNL X announced: a larger, waterproof, and more powerful version of the original TRMNL device. Pre-order details inside!</description><pubDate>Wed, 30 Jul 2025 22:47:27 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/trmnl-logo.svg&quot; alt=&quot;TRMNL Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Announced today, TRMNL is making a new version they are calling TRMNL X. The TRMNL X is interactive, larger, higher resolution, waterproof, and more powerful than the original (Now called the OG) TRMNL. I wrote about how much I like my TRMNL previously - &lt;a href=&quot;https://barnes.tech/blog/trmnl/&quot;&gt;TRMNL&lt;/a&gt;. I love it, but there are times I wish there was a bigger one. Now there will be!&lt;/p&gt;
&lt;p&gt;I&apos;m really excited about this new version, and have placed a pre-order. Here is my affiliate link again if you would like to place a pre-order as well - https://usetrmnl.com/?ref=robby10&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://usetrmnl.com/?ref=robby10&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://usetrmnl.com/?ref=robby10&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=D0wQ8gCxCvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=D0wQ8gCxCvw&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>apple</category><category>productivity</category><category>review</category><category>tips</category></item><item><title>Google URL Shortener</title><link>https://barnes.tech/blog/google-url-shortener</link><guid isPermaLink="true">https://barnes.tech/blog/google-url-shortener</guid><description>Google is shutting down its URL shortener, leading to link rot and the need for alternatives like Dub.co.</description><pubDate>Wed, 30 Jul 2025 22:30:01 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/google-url-shortener.png&quot; alt=&quot;Error message shown when using a URL that Google will not support any more.&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Although this was announced a fair amount of time ago, the time is nearly here. Google is killing off all shortened URLs that were using the &lt;a href=&quot;https://goo.gl&quot;&gt;&lt;code&gt;https://goo.gl&lt;/code&gt;&lt;/a&gt; short link.&lt;/p&gt;
&lt;p&gt;Google doing what Google does best - Killing off products. There will be an enormous amount of link rot because of this.&lt;/p&gt;
&lt;p&gt;It’s a big problem how much of the internet Google controls or heavily influences. It’s not Google per se that is the problem, it’s a problem with any one company controlling that much of the internet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://Dub.co&quot;&gt;Dub.co&lt;/a&gt; is my favorite alternative for dynamic links. Really great platform that is easy to use, and does exactly what it’s supposed to. They are also launching a new partner platform affiliate / referral platform that we have been in early testing for, and it’s built with the same standard of quality as the rest of the platform.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://dub.co/blog/firebase-alternative&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dub.co/blog/firebase-alternative&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://refer.dub.co/robby-barnes-ovjp&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://refer.dub.co/robby-barnes-ovjp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/en/google-url-shortener-links-will-no-longer-be-available/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://developers.googleblog.com/en/google-url-shortener-links-will-no-longer-be-available/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.theverge.com/news/713125/google-url-shortener-links-shutdown-deadline&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theverge.com/news/713125/google-url-shortener-links-shutdown-deadline&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>google</category><category>tutorial</category><category>tips</category><category>automation</category></item><item><title>Apple&apos;s Cloud</title><link>https://barnes.tech/blog/apples-cloud</link><guid isPermaLink="true">https://barnes.tech/blog/apples-cloud</guid><description>Exploring Apple&apos;s potential cloud service offerings to compete with AWS and Google Cloud, focusing on business tools and productivity.</description><pubDate>Mon, 07 Jul 2025 22:38:26 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/apple.svg&quot; alt=&quot;Apple logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;According to some &lt;a href=&quot;https://www.theinformation.com/articles/apple-explored-launching-cloud-service-developers&quot;&gt;recent reporting&lt;/a&gt;, Apple considered launching a cloud service to compete more with public cloud providers like AWS, Azure, and Google Cloud. Many people are commenting recently on Apple being late to AI, or potentially even too late to it, but I have long believed that the real boat they missed was with Cloud in general. I would argue that them missing out on Cloud is exactly why they are in such a tough position with AI now.&lt;/p&gt;
&lt;p&gt;First, when I talk about Cloud, I’m referring more to AWS, Google Cloud, etc. not really what iCloud is. I don’t think it would be that helpful to completely copy what the other providers are broadly doing. There are plenty of good options, and to some degree it’s just a race to the bottom cost wise, but there are plenty of developer and business focused tools that should be available in an Apple cloud.&lt;/p&gt;
&lt;p&gt;Some ideas, off the top of my head -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Business grade storage for businesses to use. You should be able to pay for whatever you need, not have weird “buckets” of storage like iCloud has for business customers. You should also be able to manage these &lt;em&gt;like a business&lt;/em&gt;. You should have shared spaces for storage that multiple people can access, you should have rich ACL’s, you should be able to transfer data from one user to another as an admin if someone is terminated. This needs to be far more like Box, Dropbox, Google Drive, etc.
&lt;ul&gt;
&lt;li&gt;Bonus - If you had the ability to host static files on an Apple cloud with an S3 compatible endpoint, that would be fantastic.&lt;/li&gt;
&lt;li&gt;Bonus bonus - Why do we &lt;em&gt;still&lt;/em&gt; not have time machine in the cloud?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Identity manager - Apple should take on the identity providers like Google, Microsoft, Okta, etc. by offering a more capable and business oriented “Sign-in with Apple” infrastructure. At the same time, they need to integrate with the market leaders &lt;em&gt;far&lt;/em&gt; more than they currently do. You should have granular access controls, you should be able to federate these identities elsewhere, support SAML and OAuth, allow groups for access controls, much richer HRIS integrations, etc. there is a long list they could do here. It can’t be half-assed, they need to create an alternative that people would want to use because it’s a good product.
&lt;ul&gt;
&lt;li&gt;They should extend this to the EDU market too, for free.&lt;/li&gt;
&lt;li&gt;You should (optionally) be able to sync essentially your whole Mac through the cloud. You should be able to walk up to a computer, sign in to it, and have everything laid out and installed the way you like it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Productivity software - They should push iWork much further than it has ever gone. Make this a real competitor to Office and Google Workspace. They are very nice tools to use, but they seem utterly unaware of how nearly every business uses these tools. They need to be much more interoperable, significantly improve collaboration, and really push the boundaries of what you can do with these apps.&lt;/li&gt;
&lt;li&gt;Mail - Email isn’t going anywhere, particularly in business. Apple should make a real, enterprise-grade email service that is designed for businesses. You need to be able to have WAY more control over email than iCloud allows, and add functionality for groups, access control lists, etc. You also need to make it easy to use business email security tools and backup tools. Take e-discovery seriously and provide a way to do that, and allow 3rd party solutions as well. Importantly - Don’t make it restricted to only Apple devices either.&lt;/li&gt;
&lt;li&gt;Contacts / Calendars, etc. - To finish out the productivity tools they need to make contacts and calendars business ready too. Shared contacts, integrations with CRM’s, directory syncing, &lt;em&gt;functional&lt;/em&gt; deduplication, far more flexible calendar options, scheduling, conference call integrations, etc. There is a long list of what they could do here.&lt;/li&gt;
&lt;li&gt;Gaming - If Apple wants to be taken more seriously in gaming (which, honestly I can’t tell if they do or don’t), they should build a similar application to Xbox Live.&lt;/li&gt;
&lt;li&gt;iMessage for businesses - They should make something like Slack but not too much like Slack. Make a business version of iMessage that can be used for those kinds of things.&lt;/li&gt;
&lt;li&gt;Business photo sharing - We work with a lot of businesses who rely heavily on taking photos for the business and then making sure everyone has access to them. This is surprisingly difficult to do in 2025 without a bunch of manual instructions that no one wants to follow. This might not make sense for every business, but I know several who would pay a ton to have this work seamlessly, and have a repository shared with everyone who needs access to it (same thing with ACLs, etc.)&lt;/li&gt;
&lt;li&gt;Remote Desktop - Make this require a cloud subscription. Make it only work for devices in Apple Business Manager. I’d even be fine if it was built in but still required an approval dialogue for the end users before you join to completely share the screen, or maybe a big warning that comes up so you can’t do it without the end user knowing, but this is such a royal pain to deal with on Mac with 3rd party tools, it makes it extremely difficult to support &lt;em&gt;business owned&lt;/em&gt; devices.
&lt;ul&gt;
&lt;li&gt;This should extend to iOS too. A lot of the plumbing is in place, just need to make it work for businesses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FaceTime for business - Compete with Zoom, Google Meet, MS Teams, etc.!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of these things they have been making glacial progress in with Apple Business Manager over the last few years, but honestly in many ways, it seems like Apple is just oblivious to how all of this stuff works everywhere else. Most of their services are pretty solid for personal use, but when you try to apply them to businesses, they’re just… Weirdly disconnected from how every other service works.&lt;/p&gt;
&lt;p&gt;Some of this is in the name of “privacy”, though over the years I am unfortunately starting to think that some of the reason Apple leans on that so much is to be anticompetitive. Privacy should mean a choice of how to use the device and it’s services, not just lock you out of things that Apple doesn’t want you to use. This should apply to business-owned devices too, and the businesses should be able to do what they need to do.&lt;/p&gt;
&lt;p&gt;A large cloud infrastructure to support all of this would lead to several things that are critically important to Apple right now. One - How long have they been beating the “Services revenue” drum? Guess who spends an enormous amount of money - Businesses / Enterprise. Second - I truly believe one of the main reasons Apple is struggling with AI, and frankly why Siri has been so bad for so long is that they don’t take cloud seriously. They need to be able to run large models in a cloud, and it should be controlled and operated by them. The cloud-based responses need to be incredibly fast, which means infrastructure needs to be close to people. Cloud would also mean that Apple would need to deploy updates continuously, and move faster than they ever have in this space. They also need to vastly improve their web apps to support functionality.&lt;/p&gt;
&lt;p&gt;I could think of a dozen more examples that to me make a ton of sense, but I’m not convinced Apple could do this, even if they decided to. This would cost a ludicrous amount of money, and they would be trying to catch up to some pretty enormous leads. They have a ludicrous amount of money, but I think culturally Apple is just not prepared for this. Hopefully they can at least be more flexible to integrations, and partner with some cloud services providers in the short term to more rapidly improve the areas they desperately need.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.theinformation.com/articles/apple-explored-launching-cloud-service-developers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.theinformation.com/articles/apple-explored-launching-cloud-service-developers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.techradar.com/pro/apple-reportedly-considered-launching-its-own-public-cloud&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.techradar.com/pro/apple-reportedly-considered-launching-its-own-public-cloud&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>cloud</category><category>development</category><category>tips</category><category>productivity</category></item><item><title>Gemini CLI</title><link>https://barnes.tech/blog/gemini-cli</link><guid isPermaLink="true">https://barnes.tech/blog/gemini-cli</guid><description>Explore Google&apos;s Gemini CLI, a powerful open-source AI agent with an impressive context window and free usage options.</description><pubDate>Wed, 25 Jun 2025 19:22:14 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Gemini CLI.png&quot; alt=&quot;Google Gemini Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;It is certainly interesting to see the level of competition in the AI space right now. I&apos;ve become a huge fan of Claude Code (and will likely continue to use it) but Google is coming in strong with Gemini CLI announced today - &lt;a href=&quot;https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/&quot;&gt;Gemini CLI: your open-source AI agent&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gemini has a couple of advantages -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The context window is enormous compared to all of the other models. This is using 2.5 Pro, which has a 1,000,000 token context window, which is kind of mind boggling.&lt;/li&gt;
&lt;li&gt;They are offering a pretty significant amount of usage for free. Claude Code and Codex from OpenAI are both pretty good but will rack up the cost pretty quickly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&apos;ve only had the chance to use it for a couple of minutes, but it seems like a nice experience. I&apos;ve run in to a couple of hiccups though. First, you can&apos;t use a Google Workspace account yet. Second, because of that I tried setting up a Gemini API key instead, but for some reason it wouldn&apos;t recognize it and kept trying to do the oauth authentication anyway. I switched to a gmail account though and it worked fine.&lt;/p&gt;
&lt;p&gt;My favorite terminal app, &lt;a href=&quot;https://app.warp.dev/referral/ZL9WG&quot;&gt;Warp&lt;/a&gt; also announced what they are calling &lt;a href=&quot;https://www.youtube.com/watch?v=k9BRhSbVSpI&quot;&gt;&quot;Warp 2.0&quot;&lt;/a&gt; which is essentially adding more &quot;agentic&quot; capabilities to their AI tools as well. I think they might have a hard time keeping up with all these other CLI tools that are taking off right now, but I hope they are able to stick around!&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://github.com/google-gemini/gemini-cli&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://app.warp.dev/referral/ZL9WG&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://app.warp.dev/referral/ZL9WG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=k9BRhSbVSpI&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.youtube.com/watch?v=k9BRhSbVSpI&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>development</category><category>tips</category><category>google</category></item><item><title>Wispr Flow</title><link>https://barnes.tech/blog/wispr-flow</link><guid isPermaLink="true">https://barnes.tech/blog/wispr-flow</guid><description>Discover Wispr Flow, an AI dictation app for Mac and iPhone that enhances productivity with smart transcription and formatting.</description><pubDate>Mon, 23 Jun 2025 03:05:02 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/Flow Logo.svg&quot; alt=&quot;Wispr Flow logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;I recently came across an app called &lt;a href=&quot;https://wisprflow.ai/&quot;&gt;Wispr Flow&lt;/a&gt;. Wispr Flow is an AI powered dictation that works anywhere on the Mac. They have an iPhone app too, which I&apos;ll get to in a second.&lt;/p&gt;
&lt;p&gt;The platform uses AI to transcribe, auto-edit, and format your speech into polished text, and adapts its tone to different apps. I had 2 thoughts before using it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sounds over hyped on their website. I&apos;m always skeptical of software that claims to be a game changer for productivity, but I also tend to not be able to help but test them out.&lt;/li&gt;
&lt;li&gt;I don&apos;t think I would ever just dictate to my computer. After all, macOS has this built in, and it&apos;s decent, and that has never stuck for me.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Like I said, I can&apos;t help myself though. I downloaded it and forced my self to really give it a try. After about a day, I was sold. It honestly feels like a game changer for me. I definitely still feel very weird talking to my computer, and I don&apos;t use it in all cases, but I find that there are a ton of cases that it&apos;s extremely helpful. The auto correction clearly powered by AI is fantastic. You can correct yourself, and it&apos;s remarkably good at writing what you meant to say, rather than a mistake you may have said. You can also add a dictionary of specific words / spellings that you use frequently that may be difficult to spell. It will also suggest items for the dictionary if you say something, then go back and correct it.&lt;/p&gt;
&lt;p&gt;It also gets some amount of context of where your cursor is, and uses that to help format the text given that context. If you&apos;re writing an email, it will format it like an email. If you&apos;re using the command line, it will format it like the command line.&lt;/p&gt;
&lt;p&gt;There is an iOS app, which also works pretty well, but the limitations of iOS make it fairly clunky. It shows up as a keyboard, but then you have to flip over to the app, turn on dictation, and then flip back. Once you do that, it works well, but that is a pain to do.&lt;/p&gt;
&lt;p&gt;Definitely give it a shot if this kind of thing sounds interesting.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://wisprflow.ai/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://wisprflow.ai/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>productivity</category><category>review</category><category>apple</category></item><item><title>Zendesk Voice Summary Tool</title><link>https://barnes.tech/blog/zendesk-voice-summary-tool</link><guid isPermaLink="true">https://barnes.tech/blog/zendesk-voice-summary-tool</guid><description>Learn how to build a voice transcription tool for Zendesk using AI for automation and efficiency.</description><pubDate>Sat, 14 Jun 2025 19:52:26 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/zendesk.svg&quot; alt=&quot;Zendesk Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;h2&gt;How I Built a Voice Transcription Tool for Zendesk (and Made It a CLI)&lt;/h2&gt;
&lt;p&gt;At work we&apos;ve used Zendesk for several years for our ticketing. In the last few years we&apos;ve also used the Zendesk Talk voice for the phone (and SMS) as well. It&apos;s not perfect, but it helps keep information about tickets that are phone calls in the same system as everything else. It records each call, and makes it available via API as well. This was a great use case for AI, both in helping me build this tool, and using AI endpoints for transcription and summarization.&lt;/p&gt;
&lt;p&gt;Listening to each call and trying to summarize what the issue was and what was done to resolve the issue is tedious. If the person who received the call can immediately summarize it right after the call that can work, but it&apos;s easy to forget something, and if we are busy, it&apos;s hard to make the time for it. Knowing what the issue was and what was done to resolve it is valuable information though, and helps us remain proactive in support instead of always reactive.&lt;/p&gt;
&lt;p&gt;So I built a tool to automate the whole process. It downloads voice recordings from Zendesk tickets, transcribes them with OpenAI&apos;s Whisper, generates summaries with GPT-4o, and posts everything back to the ticket.&lt;/p&gt;
&lt;p&gt;Here&apos;s how it works and how I packaged it up as a command-line tool.&lt;/p&gt;
&lt;h2&gt;The Basic Architecture&lt;/h2&gt;
&lt;p&gt;The tool works in three phases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Download and Transcribe&lt;/strong&gt; - Grabs all voice recordings from a ticket and runs them through Whisper&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summarize&lt;/strong&gt; - Takes all the transcripts and creates a structured summary with GPT-4o-mini&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post Back&lt;/strong&gt; - Adds the summary as a private comment on the ticket.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;File Management&lt;/h2&gt;
&lt;p&gt;One thing I learned early on - you need a consistent naming scheme or you&apos;ll lose track of files fast:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;file_basename = f&quot;ticket{ticket_id}_call{call_id}&quot;
audio_file = file_basename + &quot;.mp3&quot;
transcript_file = file_basename + &quot;.txt&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This naming convention means I can easily find all files for a ticket, and more importantly, the tool can check if it&apos;s already processed something:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if not os.path.exists(transcript_file):
    print(&quot;   Transcribing audio with Whisper...&quot;)
    transcript = transcribe_audio(audio_file)
    with open(transcript_file, &quot;w&quot;, encoding=&quot;utf-8&quot;) as tf:
        tf.write(transcript)
else:
    if skip_existing:
        print(&quot;   Skipping - transcript already exists&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This saves a ton of time (and API costs) when reprocessing tickets.&lt;/p&gt;
&lt;h2&gt;Handling API Failures&lt;/h2&gt;
&lt;p&gt;In order to handle potential failures, I built in a simple retry decorator that handles transient failures:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def retry_on_failure(func):
    &quot;&quot;&quot;Decorator to retry a function on failure.&quot;&quot;&quot;
    def wrapper(*args, **kwargs):
        for attempt in range(MAX_RETRIES):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                if attempt &amp;#x3C; MAX_RETRIES - 1:
                    print(f&quot;  Warning: Attempt {attempt + 1} failed: {str(e)}&quot;)
                    print(f&quot;  Retrying in {RETRY_DELAY} seconds...&quot;)
                    time.sleep(RETRY_DELAY)
                else:
                    print(f&quot;  Error: All {MAX_RETRIES} attempts failed.&quot;)
                    raise
        return None
    return wrapper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can add &lt;code&gt;@retry_on_failure&lt;/code&gt; on any function that makes API calls and you&apos;re good to go.&lt;/p&gt;
&lt;h2&gt;The Multi-Call Problem&lt;/h2&gt;
&lt;p&gt;Tickets often have multiple voice recordings - maybe the customer called back, or there were multiple conversations. I needed to handle this scenario, ideally without creating a bunch of individual private comments, making it hard to digest and adding a lot of noise.&lt;/p&gt;
&lt;p&gt;For single calls, it&apos;s simple - just add a timestamp header:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def summarize_multiple_transcripts(transcripts_data: List[Dict], context: Dict) -&gt; str:
    &quot;&quot;&quot;Summarize multiple call transcripts into a single comprehensive summary.&quot;&quot;&quot;
    if len(transcripts_data) == 1:
        # Single call - just add timestamp header
        data = transcripts_data[0]
        timestamp = format_timestamp(data[&apos;started_at&apos;])
        summary = summarize_transcript(data[&apos;transcript&apos;], context)
        return f&quot;**Call on {timestamp}**\n\n{summary}&quot;

    # Multiple calls - create sections for each
    # ... (builds detailed prompt for GPT-4)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The output looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;## Call 1 - March 15, 2024 at 10:30 AM MDT

_Duration: 15m 23s | From: +1-555-0123 -&gt; To: +1-555-0456_

### Description of the Call

Customer called about internet connectivity issues...

### Troubleshooting

- Verified modem lights status
- Performed speed test (5 Mbps down, 1 Mbps up)
- Reset modem and router

### Next Steps

- Schedule technician visit for tomorrow
- Follow up email with ticket number

---

## Call 2 - March 15, 2024 at 2:45 PM MDT

_Duration: 8m 12s | From: +1-555-0123 -&gt; To: +1-555-0456_

### Description of the Call

Customer called back to confirm technician appointment...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Making It User-Friendly&lt;/h2&gt;
&lt;p&gt;I wanted this tool to work both interactively and from the command line. So when you run it without arguments, you get a nice interactive mode:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ python voice_summary.py

Zendesk Voice Recording Processor - Interactive Mode
============================================================

Enter ticket numbers or URLs (comma-separated or one per line)
Press Enter twice when done:
12345
12346
https://company.zendesk.com/agent/tickets/12347

Found 3 valid ticket(s): 12345, 12346, 12347

Post summaries to Zendesk? (y/n) [default: y]: y
Skip recordings with existing transcripts? (y/n) [default: n]: y

Processing 3 ticket(s)
   Post to Zendesk: Yes
   Skip existing: Yes

Press Enter to continue or Ctrl+C to cancel...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But it also works great for automation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;parser = argparse.ArgumentParser(
    description=&apos;Process voice recordings from Zendesk tickets&apos;,
    formatter_class=argparse.RawDescriptionHelpFormatter,
    epilog=&apos;&apos;&apos;
Examples:
  %(prog)s 12345                    # Process single ticket
  %(prog)s 12345 12346 12347        # Process multiple tickets
  %(prog)s --no-zendesk 12345       # Process without posting to Zendesk
  %(prog)s --skip-existing 12345    # Skip tickets with existing transcripts
  %(prog)s https://company.zendesk.com/agent/tickets/12345  # Process from URL
    &apos;&apos;&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The Progress Display&lt;/h2&gt;
&lt;p&gt;Here&apos;s how it handles progress indicators, which help with longer operations to know that it&apos;s still running:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Processing Ticket #12345
============================================================
Fetching ticket details...
   Subject: Internet Connection Issues
   Customer: John Smith
   Agent: Support Team
   Status: OPEN

Searching for voice recordings...
   Found 2 voice recording(s)

Phase 1: Downloading and transcribing 2 recording(s)...

Processing recording 1/2 (Call ID: abc123)
   Duration: 15m 23s
   From: +1-555-0123 -&gt; To: +1-555-0456
   Downloading audio...
    Downloaded: ticket12345_callabc123.mp3
   Transcribing audio with Whisper...
   Saved transcript: ticket12345_callabc123.txt

Phase 2: Summarizing 2 transcript(s) with GPT-4o-mini...
   Saved combined summary: ticket12345_combined_summary.txt

Phase 3: Posting combined summary to Zendesk...
   Added private comment to ticket 12345

Ticket #12345 Complete!
   Processed: 2/2 recordings
   Time: 45.2s
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Turning It Into a Real Command-Line Tool&lt;/h2&gt;
&lt;p&gt;Rather than running this directly with python every time, I decided to make it in to a command line tool to make it easier to run from anywhere.&lt;/p&gt;
&lt;h3&gt;The Wrapper Script&lt;/h3&gt;
&lt;p&gt;First, I created a bash wrapper that handles all the environment setup:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# Wrapper script for voice_summary.py

# Configuration
PROJECT_DIR=&quot;$(cd &quot;$(dirname &quot;${BASH_SOURCE[0]}&quot;)/..&quot; &amp;#x26;&amp;#x26; pwd)&quot;
VENV_DIR=&quot;$PROJECT_DIR/venv&quot;
SCRIPT_PATH=&quot;$PROJECT_DIR/voice_summary.py&quot;
TRANSCRIPT_DIR=&quot;$HOME/zendesk-transcripts&quot;

# Create transcript directory if it doesn&apos;t exist
if [ ! -d &quot;$TRANSCRIPT_DIR&quot; ]; then
    echo &quot;Creating transcript directory at $TRANSCRIPT_DIR...&quot;
    mkdir -p &quot;$TRANSCRIPT_DIR&quot;
fi

# Change to transcript directory
cd &quot;$TRANSCRIPT_DIR&quot; || exit 1

# Activate virtual environment if it exists
if [ -d &quot;$VENV_DIR&quot; ]; then
    source &quot;$VENV_DIR/bin/activate&quot;
fi

# Execute the Python script with all arguments
python &quot;$SCRIPT_PATH&quot; &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This wrapper does a few nice things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates a dedicated directory for transcripts (&lt;code&gt;~/zendesk-transcripts&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Activates the virtual environment automatically&lt;/li&gt;
&lt;li&gt;Passes all arguments through to the Python script&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Installing It System-Wide&lt;/h3&gt;
&lt;p&gt;Then I wrote an installation script that sets everything up:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# Installation script for voice_summary command line tool

SCRIPT_DIR=&quot;$(cd &quot;$(dirname &quot;${BASH_SOURCE[0]}&quot;)&quot; &amp;#x26;&amp;#x26; pwd)&quot;
WRAPPER_SCRIPT=&quot;$SCRIPT_DIR/voice_summary&quot;

# Create ~/bin directory if it doesn&apos;t exist
if [ ! -d &quot;$HOME/bin&quot; ]; then
    echo &quot;Creating ~/bin directory...&quot;
    mkdir -p &quot;$HOME/bin&quot;
fi

# Create symlink
echo &quot;Installing voice_summary to ~/bin...&quot;
rm -f &quot;$HOME/bin/voice_summary&quot; 2&gt;/dev/null
ln -s &quot;$WRAPPER_SCRIPT&quot; &quot;$HOME/bin/voice_summary&quot;

# Check if ~/bin is in PATH
if [[ &quot;:$PATH:&quot; != *&quot;:$HOME/bin:&quot;* ]]; then
    echo &quot;WARNING: ~/bin is not in your PATH&quot;
    echo &quot;To add it, add this line to your ~/.zshrc:&quot;
    echo &quot;    export PATH=\&quot;\$HOME/bin:\$PATH\&quot;&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After running this, you can use the tool from anywhere:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ voice_summary 12345
$ voice_summary  # Interactive mode
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Building a Standalone Executable&lt;/h3&gt;
&lt;p&gt;For distribution, I also created a PyInstaller build script:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# PyInstaller spec file configuration
a = Analysis(
    [&apos;voice_summary.py&apos;],
    hiddenimports=[&apos;openai&apos;, &apos;requests&apos;],
    # ... other configuration
)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name=&apos;voice_summary&apos;,
    console=True,
    # ... other configuration
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The build script handles everything:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# Build a standalone executable using PyInstaller

# Install dependencies
pip install -q requests openai pyinstaller

# Build the executable
pyinstaller voice_summary.spec

if [ -f &quot;dist/voice_summary&quot; ]; then
    echo &quot;Build successful!&quot;
    echo &quot;To install system-wide:&quot;
    echo &quot;    sudo cp dist/voice_summary /usr/local/bin/&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Instead of hardcoding credentials, the tool uses environment variables:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Configuration from environment
ZENDESK_DOMAIN = os.getenv(&apos;ZENDESK_DOMAIN&apos;, &apos;yourcompany.zendesk.com&apos;)
ZENDESK_EMAIL = os.getenv(&apos;ZENDESK_EMAIL&apos;, &apos;&apos;)
ZENDESK_PASSWORD = os.getenv(&apos;ZENDESK_PASSWORD&apos;, &apos;&apos;)
OPENAI_API_KEY = os.getenv(&apos;OPENAI_API_KEY&apos;, &apos;&apos;)

# Validate configuration
if not all([ZENDESK_EMAIL, ZENDESK_PASSWORD, OPENAI_API_KEY]):
    print(&quot;Error: Missing required configuration&quot;)
    print(&quot;Please set the following environment variables:&quot;)
    print(&quot;  - ZENDESK_EMAIL: Your Zendesk email&quot;)
    print(&quot;  - ZENDESK_PASSWORD: Your Zendesk password&quot;)
    print(&quot;  - OPENAI_API_KEY: Your OpenAI API key&quot;)
    sys.exit(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This makes it easy to use across different environments without touching the code.&lt;/p&gt;
&lt;h2&gt;Edge Cases I try to Handle&lt;/h2&gt;
&lt;h3&gt;Closed Tickets&lt;/h3&gt;
&lt;p&gt;You can&apos;t update closed tickets in Zendesk. Instead of just failing, the tool asks what you want to do:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def confirm_closed_ticket_processing() -&gt; bool:
    &quot;&quot;&quot;Ask user if they want to proceed with processing a closed ticket.&quot;&quot;&quot;
    print(&quot;\nWARNING: This ticket is CLOSED.&quot;)
    print(&quot;   Closed tickets cannot be updated in Zendesk.&quot;)
    while True:
        response = input(&quot;\n   Do you still want to process? (y/n): &quot;)
        if response.lower() in [&apos;y&apos;, &apos;yes&apos;]:
            return True
        elif response.lower() in [&apos;n&apos;, &apos;no&apos;]:
            return False
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If they proceed, it shows the summary in the console instead of trying to post it.&lt;/p&gt;
&lt;h3&gt;Timezone Conversion&lt;/h3&gt;
&lt;p&gt;The API defaults to using UTC, so I convert everything to Mountain Time:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def format_timestamp(timestamp_str: str) -&gt; str:
    &quot;&quot;&quot;Convert ISO timestamp to human-readable format in Mountain Time.&quot;&quot;&quot;
    try:
        from zoneinfo import ZoneInfo  # Python 3.9+
    except ImportError:
        from pytz import timezone as ZoneInfo  # Fallback

    dt = datetime.fromisoformat(timestamp_str.replace(&apos;Z&apos;, &apos;+00:00&apos;))
    mountain_tz = ZoneInfo(&apos;America/Denver&apos;)
    dt_mountain = dt.astimezone(mountain_tz)
    return dt_mountain.strftime(&quot;%B %d, %Y at %I:%M %p %Z&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Batch Processing Stats&lt;/h3&gt;
&lt;p&gt;When processing multiple tickets, you want to know what happened:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;============================================================
FINAL SUMMARY
============================================================
Tickets processed: 45/50
Recordings processed: 127
Total errors: 5
Total time: 425.3s

Failed tickets:
   - Ticket #12399: 403 Forbidden
   - Ticket #12412: No recordings found
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;Building this tool taught me a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Phase your processing&lt;/strong&gt; - Breaking it into download, transcribe, summarize, and post phases made debugging way easier&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache aggressively&lt;/strong&gt; - Saving transcripts locally saves API calls, and makes it easier to process in general&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make it interactive AND scriptable&lt;/strong&gt; - Different use cases need different interfaces&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handle failures gracefully&lt;/strong&gt; - APIs will fail, tickets will be closed, permissions will be wrong&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear progress indicators matter&lt;/strong&gt; - Make it easier to know it&apos;s still running on longer operations.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Results&lt;/h2&gt;
&lt;p&gt;This tool has been extremely helpful in automating summaries of tickets that were phone calls, making it much easier to determine what was talked about and what resolution was reached, helping us determine where to spend time proactively solving problems, and informing our customers the types of items we have been working on with their employees.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/robbybarnes/zendesk-voice-summary&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://github.com/robbybarnes/zendesk-voice-summary&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>development</category><category>automation</category><category>tutorial</category></item><item><title>Dia Browser</title><link>https://barnes.tech/blog/dia-browser</link><guid isPermaLink="true">https://barnes.tech/blog/dia-browser</guid><description>Explore Dia Browser, its AI features, and the transition from Arc, highlighting usability and skepticism about its future.</description><pubDate>Sat, 14 Jun 2025 17:32:19 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/dia-browser.png&quot; alt=&quot;Dia Browser Logo&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;Recently &lt;a href=&quot;https://thebrowser.company/&quot;&gt;The Browser Company&lt;/a&gt; talked about how &lt;a href=&quot;https://browsercompany.substack.com/p/letter-to-arc-members-2025&quot;&gt;they are discontinuing Arc&lt;/a&gt;, which is still my favorite browser to use. In that article they talked about &lt;a href=&quot;https://www.diabrowser.com/&quot;&gt;Dia&lt;/a&gt;, their new version of the browser built with AI as the focus. &lt;a href=&quot;https://barnes.tech/blog/the-demise-of-arc/&quot;&gt;I wrote about this&lt;/a&gt;, and how I’m skeptical of it, and frankly irritated that the browser I love is getting killed off.&lt;/p&gt;
&lt;p&gt;I remain skeptical, but they have opened up the beta of Dia now to Arc users. I’m a sucker for trying out new software, so naturally I downloaded it, and… I kind of love it.&lt;/p&gt;
&lt;p&gt;It’s not quite what I liked about Arc. I miss the side tab bars (Dia puts them back up top where Chrome does), and it’s missing a lot of the settings and developer features that Arc had that I liked, but it does have the best feature of all, which is the one I use dozens of times a day and honestly feels like a feature I can’t live without - &lt;strong&gt;⌘ + Shift + C&lt;/strong&gt; to copy the current URL. It’s just incredibly useful. I’ve tried some Chrome extensions since writing about all this that are supposed to do this, but they just don’t work well.&lt;/p&gt;
&lt;p&gt;The AI features I’m not 100% sold on yet, but I have to admit it is helpful to have a little chat you can open right on any page and ask questions about it, summarize it, have it help you do research, etc. I find myself using it more than I thought I might.&lt;/p&gt;
&lt;p&gt;It feels like a bad idea to really start heavily using and relying on another browser from the company that just took away my favorite one. They have yet to make any money as a business, this is all venture backed and at this point, essentially a proof of concept. It’s only a matter of time before they start charging for it or &lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot;&gt;enshittifying it&lt;/a&gt;, or just run out of money and go away. I hope they figure out a model that works this time.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://thebrowser.company/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://thebrowser.company/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://browsercompany.substack.com/p/letter-to-arc-members-2025&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://browsercompany.substack.com/p/letter-to-arc-members-2025&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.diabrowser.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.diabrowser.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/the-demise-of-arc/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/the-demise-of-arc/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://barnes.tech/blog/enshitification-podcast/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://barnes.tech/blog/enshitification-podcast/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>ai</category><category>development</category><category>review</category><category>tips</category></item><item><title>Meta and Yandex are de-anonymizing Android users’ web browsing identifiers</title><link>https://barnes.tech/blog/meta-and-yandex-are-de-anonymizing-android-users-web-browsing-identifiers</link><guid isPermaLink="true">https://barnes.tech/blog/meta-and-yandex-are-de-anonymizing-android-users-web-browsing-identifiers</guid><description>Meta and Yandex track Android users, compromising privacy through de-anonymization and embedded scripts.</description><pubDate>Wed, 04 Jun 2025 03:27:07 GMT</pubDate><content:encoded>&lt;div style=&quot;text-align: center; margin: 1rem 0;&quot;&gt;
      &lt;img src=&quot;https://barnes.tech/facebook-surveilance.png&quot; alt=&quot;Facebook logo as a surveilance camera&quot; style=&quot;max-width: 480px; width: 100%; height: auto; border-radius: 8px;&quot; /&gt;
    &lt;/div&gt;
&lt;p&gt;From &lt;a href=&quot;https://arstechnica.com/security/2025/06/meta-and-yandex-are-de-anonymizing-android-users-web-browsing-identifiers/&quot;&gt;Ars Technica&lt;/a&gt; - Meta and Yandex were found to be using embedded tracking scripts to link Android users’ web browsing activity with their app identities, effectively de-anonymizing them, bypassing typical privacy protections like browser sandboxing and incognito mode.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Surveillance_capitalism&quot;&gt;surveylance economy&lt;/a&gt; makes these companies go to some crazy lengths to track everything that you do, just to cram more ads wherever they can. Unfortunately, at least in the U.S., you don&apos;t have any recourse.&lt;/p&gt;
&lt;p&gt;It&apos;s important to note - these trackers will track you and your activity regardless of whether you have an account with them.&lt;/p&gt;
&lt;div style=&quot;margin: 1.5rem 0; padding: 1rem; border-left: 4px solid #ccc; background: #f6f8fa; border-radius: 12px;&quot;&gt;
          &lt;div style=&quot;margin-bottom: .25rem; color: #333;&quot;&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/div&gt;
          &lt;ul style=&quot;margin: .25rem 0 0 1rem;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://arstechnica.com/security/2025/06/meta-and-yandex-are-de-anonymizing-android-users-web-browsing-identifiers/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://arstechnica.com/security/2025/06/meta-and-yandex-are-de-anonymizing-android-users-web-browsing-identifiers/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Surveillance_capitalism&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://en.wikipedia.org/wiki/Surveillance_capitalism&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;/div&gt;</content:encoded><category>security</category><category>tutorial</category><category>tips</category><category>google</category></item></channel></rss>