<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Carter's Blog</title>
        <link>https://carter.works/blog/</link>
        <description>A software engineer's blog? How original.</description>
        <lastBuildDate>Wed, 29 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-us</language>
        <copyright>©️ Carter McBride 2026</copyright>
        <atom:link href="https://carter.works/blog/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[April blogging challenge wrap-up]]></title>
            <link>https://carter.works/blog/2026-04-29-april-blogging-challenge-wrap-up/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-29-april-blogging-challenge-wrap-up/</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>My friends and I decided to do a weekly blog challenge for the month of April 2026! Each week, one of us chose a prompt and we all wrote posts.</p>
<p>For the bonus wrap-up, Sam chose the prompt:
<strong>"One thing you like about each other's blogs--content, design, etc"</strong></p>
<ul>
<li><a href="https://samwarnick.com/blog/april-blogging-challenge-wrap-up/">Sam: "April Blogging Challenge Wrap-Up"</a></li>
<li><a href="https://jaredezz.tech/posts/april-blogging-challenge-wrap-up">Jared: "April Blogging Challenge Wrap-Up"</a></li>
<li><a href="https://catskull.net/april-blogging-challenge-wrapup.html">Dave: "April Blogging Challenge Wrap-Up"</a></li>
</ul>
<hr />
<p>All of these wonderful people has RSS feeds. There is no excuse for not following each of them in your RSS reader.</p>
<h2>Sam</h2>
<p>Blog: <a href="https://samwarnick.com">samwarnick.com</a> (<a href="https://samwarnick.com/rss.xml">RSS</a>)</p>
<p>Sam has a beautiful consistency between his speaking voice and his writing voice. Every time I read one of his posts, it feels like talking to him in person. I miss that; he moved away, and the posts preserve some of the rhythm of being around him. They are casual and cozy. You can tell he is doing it for the love of the game. The overall effect is personal and refreshing in Anno Domini 2026, when the slopidemic is not just concerning, it's very concerning.</p>
<h2>Dave</h2>
<p>Blog: <a href="https://catskull.net">catskull.net</a> (<a href="https://catskull.net/feed.xml">RSS</a>)</p>
<p>Dave has the strongest sense of style and taste of anyone I know. Just look at this OG image for a blog post he wrote earlier in the series called <a href="https://catskull.net/nintendo-announces-3ds-successor-3ds-plus.html">"Nintendo Announces 3DS successor: '3DS Plus'"</a>.</p>
<img src="https://carter.works/assets/catskull-3ds-plus-og-1000.avif" srcset="https://carter.works/assets/catskull-3ds-plus-og-600.avif 600w, https://carter.works/assets/catskull-3ds-plus-og-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="A preview image for a blog post titled 'Nintendo announces 3DS successor: 3DS Plus'" width="1000" height="525" loading="lazy" decoding="async" />
<p>Look at the texture, the fuzz, the colors, the font. He isn't chasing trends or trying to emulate some awwwards-winning designer. He is just authentically expressing his love for vintage technology. Even the topic of his blog post is another expression of his love and taste.</p>
<h2>Jared</h2>
<p>Blog: <a href="https://jaredezz.tech">jaredezz.tech</a> (<a href="https://jaredezz.tech/rss.xml">RSS</a>)</p>
<p>My favorite of his pieces is <a href="https://jaredezz.tech/posts/fantastic-computers-and-where-to-find-them/">"Fantastic Computers and Where to Find Them"</a>, where he goes through his device history. It stokes the fires of nostalgia in my heart as I think fondly of my old LG G6 and the specters of the other phones, long forgotten. However, I'm still waiting for the blog post that explains how, in his Twitch streamer days, he would deterministically rig the raid system in Pokémon Sword/Shield using a hacked-together USB controller. It is a fascinating use of hardware, and it gives you a glimpse into just how smart Jared is. He would never tell you because he's very modest.</p>
<hr />
<h2>The Whole Challenge</h2>
<h3>Week 1—"What's something cool I'm caring about or into recently?"</h3>
<ul>
<li><a href="https://carter.works/blog/2026-04-07-im-enjoying-having-opinions/">Carter: "I'm enjoying having opinions"</a></li>
<li><a href="https://samwarnick.com/blog/four-keys-book-arts-and-project-hail-andy/">Sam: "Four Keys, Book Arts, and Project Hail Andy"</a></li>
<li><a href="https://jaredezz.tech/posts/the-nature-of-prototyping">Jared: "The Nature of Prototyping"</a></li>
<li><a href="https://catskull.net/nintendo-announces-3ds-successor-3ds-plus.html">Dave: "Nintendo announces 3DS successor '3DS Plus'"</a></li>
</ul>
<h3>Week 2—"What are your favorite places on the internet or favorite things about the internet and why? How do they differ from the parts of the internet that you dislike?"</h3>
<ul>
<li><a href="https://carter.works/blog/2026-04-14-my-favorite-places-on-the-internet/">Carter: "My favorite places on the internet"</a></li>
<li><a href="https://samwarnick.com/blog/internet-driven-memories/">Sam: "Internet-Driven Memories"</a></li>
<li><a href="https://jaredezz.tech/posts/preferred-corners-of-the-internet/">Jared: "Preferred Corners of the Internet"</a></li>
<li><a href="https://catskull.net/the-internet-is-a-vast-place.html">Dave: "The Internet is a vast place."</a></li>
</ul>
<h3>Week 3—"How do you compute?"</h3>
<ul>
<li><a href="https://carter.works/blog/2026-04-21-a-totally-objective-ranking-of-configuration-languages/">Carter: "A totally objective ranking of configuration languages"</a></li>
<li><a href="https://samwarnick.com/blog/how-do-i-computer/">Sam: "How Do I Computer"</a></li>
<li><a href="https://jaredezz.tech/posts/fantastic-computers-and-where-to-find-them/">Jared: "Fantastic Computers &amp; Where to Find Them"</a></li>
<li><a href="https://catskull.net/how-i-compute-2026.html">Dave: "How I Compute (2026)"</a></li>
</ul>
<h3>Week 4—"You have been given one month away from your obligations to use your talents to enact societal good. What do you go do?"</h3>
<ul>
<li><a href="https://carter.works/blog/2026-04-28-get-small-muchachos/">Carter: "Get small, muchachos"</a></li>
<li><a href="https://samwarnick.com/blog/talents-for-good/">Sam: "Talents for Good"</a></li>
<li><a href="https://catskull.net/doing-the-most-good.html">Dave: "Doing the most good"</a></li>
</ul>
<h3>Bonus—"One thing you like about each other's blogs--content, design, etc"</h3>
<ul>
<li><a href="https://carter.works/blog/2026-04-29-april-blogging-challenge-wrap-up/">Carter: "April blogging challenge wrap-up"</a></li>
<li><a href="https://samwarnick.com/blog/april-blogging-challenge-wrap-up/">Sam: "April Blogging Challenge Wrap-Up"</a></li>
<li><a href="https://jaredezz.tech/posts/april-blogging-challenge-wrap-up">Jared: "April Blogging Challenge Wrap-Up"</a></li>
<li><a href="https://catskull.net/april-blogging-challenge-wrapup.html">Dave: "April Blogging Challenge Wrap-Up"</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Get small, muchachos]]></title>
            <link>https://carter.works/blog/2026-04-28-get-small-muchachos/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-28-get-small-muchachos/</guid>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>My friends and I decided to do a weekly blog challenge for the month of April, 2026! Each week, one of us chooses a prompt and we all write posts.</p>
<p>For week 4, I chose the prompt:
<strong>"You have been given one month away from your obligations to use your talents to enact societal good. What do you go do?"</strong></p>
<ul>
<li><a href="https://samwarnick.com/blog/talents-for-good/">Sam: "Talents for Good"</a></li>
<li><a href="https://jaredezz.tech">Jared: ""</a></li>
<li><a href="https://catskull.net/doing-the-most-good.html">Dave: "Doing the most good"</a></li>
</ul>
<hr />
<p></p>
<p>The best charity is local. My reason is unclear–it just clicks better for me. Maybe it is selfishness; if I can't see it or change it, I can't affect it and it can't affect me. Or maybe the sleeper agent Boy Scout training encouraging me to leave a place better than I found it. A family member needs something? My dollars and I are there in an instant. Someone at church needs something? Blank check. The local food bank is doing a drive? Not a blank check, but they still get something. A dollar goes furthest when you can deploy it yourself. Parenting is the most local charity I have: the daily work of becoming safer, kinder, and more useful to the people closest to me.</p>
<p>That's why I think that the best thing a person can do to enact societal good is <strong>be a good parent</strong>. Of course, this is not a panacea–everyone has a parent, everyone thinks they are good (even if they believe that good people believe they are bad people and self-flagellate accordingly), and every parent already thinks they are <em>the</em> good parent. Therefore, I will step right into <a href="https://en.wikipedia.org/wiki/No_true_Scotsman">the no true Scotsman fallacy</a>, avoid discovering the secret third thing that sets Good Parents™ apart, and discuss my experience.</p>
<p>Noticing my faults while parenting is what really motivated me to get into some therapy. Being in a loving and committed relationship already made me want to be better, but parenting really adds the nitrous oxide. Children are so malleable and sensitive–only with age do we learn to adapt and ignore the rough edges of people around us. They have little of that armor (or callus), so the evidence of your faults and flaws is right in front of you, kicking and screaming and flailing.</p>
<p>I want to be better for my partner. I want to be better for my children. Not only because they are all human beings who deserve as much love and care as I can give them, but because raising children who will be good human beings is the highest-impact thing I can think of. Being a better "me" makes the life of everyone I interact with better. Setting them up to be good "them" improves the lives of everyone they may interact with. It becomes a compounding effect–me to my environment to my kids and their environments to their kids and their environments. So if my obligations were all taken care of (looking at you, corporate job and car and home maintenance), I want to enact societal good by being the best parent to my kids I can be.</p>
<p>I recognize that, at some subconscious level, this is calculated to make me feel good in what I am already doing. But I want to be able to rediscover this blogpost in the future at random points to ensure my priority remains where I, an average middle-class white guy, can make the most impact. It is extremely unlikely that I will ever direct the actions of hundreds or thousands of people. Real change is built in small, repeated pieces, and with my children I have the chance to create and help them create the highest number of small pieces in many lives.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A totally objective ranking of configuration languages]]></title>
            <link>https://carter.works/blog/2026-04-21-a-totally-objective-ranking-of-configuration-languages/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-21-a-totally-objective-ranking-of-configuration-languages/</guid>
            <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>My friends and I decided to do a weekly blog challenge for the month of April 2026! Each week, one of us chooses a prompt and we all write posts.</p>
<p>For week 3, Dave chose the prompt:
<strong>“How do you compute? (Explain what computers you use, ones you used to use, software you use, just whatever you think answers the question)”</strong></p>
<ul>
<li><a href="https://samwarnick.com/blog/how-do-i-computer/">Sam: “How Do I Computer”</a></li>
<li><a href="https://jaredezz.tech/posts//">Jared: “”</a></li>
<li><a href="https://catskull.net/how-i-compute-2026.html">Dave: “How I Compute (2026)”</a></li>
</ul>
<hr />
<p>My general philosophy for computation is rather boring:</p>
<ol>
<li><a href="https://stephango.com/file-over-app">File over app</a>. I am a minimalist. I get frustrated by cruft. I frequently burn it all down and start from scratch (it has been just two months since I wiped the drive on my PC to install NixOS. I use <s>Arch</s> nix btw). There needs to be an easily auditable way of getting back up to speed with ease. This philosophy has aged pretty well in the era of agentic programming. (BTW check out <a href="https://github.com/carterworks/dotfiles">my dotfiles</a>).</li>
<li><a href="https://sensible.com/dont-make-me-think/">Don't make me think</a>. When I want to do something, I want to spend my time doing that thing, not <a href="https://en.wikipedia.org/wiki/Law_of_triviality">bike shedding</a>. I don't want to update my app, remember my password, figure out where I stored the document, or spend the first four hours sharpening the axe. Why should I have to three-finger tap to show the copy-paste-select menubar on iOS (there is no discoverability on that feature other than word of mouth). All this is why people still buy video game consoles rather than the ROG Strix Peerless Assassins, featuring the Cachy Kernel with the OpenKANG CPU scheduler. Maybe the levers should be there for those who care, but that's a kind of activity for 1% of people.</li>
</ol>
<hr />
<p>But other people have already expressed all these ideas so very well. Instead, I will objectively end all discussions on "what file format should I configure my applications in" by ranking them.</p>
<p>I haven't looked at the documentation for most of these. Instead, it is a vibes-based ranking based on how much intuitive sense they make to me, the Emperor of Configuration. Most of my programming experience is in JavaScript. Therefore, the "how easily can I convert this to JSON" vibe weighs heavily on the ranking.</p>
<p>There is a trivial example configuration for each language, centered around a hypothetical music player. However, that example often fails to show the horrors.
<img src="https://carter.works/assets/configuration-tier-list-1000.avif" srcset="https://carter.works/assets/configuration-tier-list-600.avif 600w, https://carter.works/assets/configuration-tier-list-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="A vertical ranking list of the configuration languages. Where each language falls can be discovered in the rest of the article" width="1000" height="404" loading="lazy" decoding="async" /></p>
<h2>Tom's Obvious Minimal Language (TOML)</h2>
<pre><code>music_library = "/srv/music"
startup_playlist = "morning mix"

[playback]
volume_step = 5
crossfade_seconds = 3
replaygain = "album"
</code></pre>
<p>Character count: 132
Perfect. No notes. Tippy top of S tier. The indentation is flat, strings are quoted, it supports multiline strings.</p>
<h2>YAML Ain't Markup Language</h2>
<pre><code>music_library: /srv/music
startup_playlist: morning mix
playback:
  volume_step: 5
  crossfade_seconds: 3
  replaygain: album
</code></pre>
<p>Character count: 125
yaml is the svelte cousin of JSON. Entire careers have been built on configuring yaml: GitHub Actions, Kubernetes, and others. But I can never shake the feeling that I'm yamling incorrectly. I default to a tab size of 2 spaces so it always unnerves me that the array indicator <code>-</code> and the properties of the object in the array line up.</p>
<pre><code>- title: Don\'t Stop Believing
  artist: Journey
- title: Faithfully
  artist: Journey
</code></pre>
<p>Another blight on yaml is the ambiguity. <a href="https://stackoverflow.com/questions/53648244/specifying-the-string-value-yes-in-yaml">StackOverflow</a> (remember that place?) tells me that yaml 1.1 defines a boolean as:</p>
<pre><code>y|Y|yes|Yes|YES|n|N|no|No|NO|
true|True|TRUE|false|False|FALSE|
on|On|ON|off|Off|OFF
</code></pre>
<p>Too much, darling. Later versions of yaml narrow the boolean regex, but it takes a long time to rebuild trust.
Later versions of the specification got rid of that, but it feels like a spooky ghost that follows me.
However, the trimming of the quotation marks earns it a place above JSON at the very top of A tier.</p>
<h2>JavaScript Object Notation (JSON)</h2>
<pre><code>{
  "music_library": "/srv/music",
  "startup_playlist": "morning mix",
  "playback": {
    "volume_step": 5,
    "crossfade_seconds": 3,
    "replaygain": "album"
  }
}
</code></pre>
<p>Character count: 169
In 2026, it is almost at the point where JSON is to the internet as electricity is to the nervous system. It is the message format that most of the web works on (go away, protobuf. I can't read you with my eyes.) But, I still can't add a comment anywhere. JSON5 and JSONC are fake. It's been 14 years and I still can't <code>JSON.parse('{ "foo": "bar", })</code>. It's annoying to have to write the quotes and the commas every single time. It's hard to balance the ubiquitousness and the quirks, so I will put it in A tier.</p>
<h2>Lua</h2>
<pre><code>return {
  music_library = "/srv/music",
  startup_playlist = "morning mix",
  playback = {
    volume_step = 5,
    crossfade_seconds = 3,
    replaygain = "album",
  },
}
</code></pre>
<p>Character count: 172
Lua gets a special mention because, although it is a programming language and not a static description of a data object, it is often used to configure programs. Most famously in Roblox, Pico8, and Neovim, but also in the next version of Hyprland. That's because the runtime of Lua is teeny and therefore easily embedded inside other applications. I don't hate it. I also don't love it. The similarities between objects and arrays are a little strange, but not absurd. A tier for the versatility.</p>
<h2>Rusty Object Notation (RON)</h2>
<pre><code>(
  music_library: "/srv/music",
  startup_playlist: "morning mix",
  playback: (
    volume_step: 5,
    crossfade_seconds: 3,
    replaygain: "album",
  ),
)
</code></pre>
<p>Character count: 159</p>
<p>I first learned of RON yesterday while installing System76's Cosmic Desktop. This contrived example looks simple enough, but the way that Cosmic does it is... odd.</p>
<pre><code>{
    (
        modifiers: [
            Alt,
            Shift,
        ],
        key: "Tab",
    ): Disable,
    (
        modifiers: [
            Ctrl,
        ],
        key: "space",
    ): Spawn("vicinae toggle"),
}
</code></pre>
<p>Why does it start with a nested object‽ Why do we need an extra level of indentation? What does <code>()</code> represent? At first glance, it looks backwards compared to JSON. What does <code>Disable</code> even represent? I, genuinely, have no idea how to translate this into any of the other formats.
For these sins, I give it B tier.</p>
<h2>Ini</h2>
<pre><code>[player]
music_library=/srv/music
startup_playlist=morning mix

[player.playback]
volume_step=5
crossfade_seconds=3
replaygain=album
</code></pre>
<p>Character count: 132
I haven't used ini a lot in the past 15 years, but I have fond memories of modifying video game settings with Notepad. It looks pretty similar to toml. B tier.</p>
<h2>Hypr</h2>
<pre><code>$library = /srv/music

player {
  startup_playlist = morning mix

  playback {
    volume_step = 5
    crossfade_seconds = 3
    replaygain = album
  }
}
</code></pre>
<p>Character count: 153
I think the creator of Hyprland has a history of getting into petty internet squabbles and then forking projects. I'm not going to look up why it was created. I also will not learn why <code>yes, please :)</code> is an alias for <code>true</code>. I am generally against domain-specific languages (sorry, <a href="https://beautifulracket.com/appendix/why-lop-why-racket.html">Matthew Butterick</a>). However, Mr. Hyprland Creator is <a href="https://github.com/hyprwm/Hyprland/pull/13817">currently migrating away from Hyprland to Lua</a> so even he has seen the light against it.
C tier.</p>
<h2>XML</h2>
<pre><code>&lt;config&gt;
  &lt;musicLibrary&gt;/srv/music&lt;/musicLibrary&gt;
  &lt;startupPlaylist&gt;morning mix&lt;/startupPlaylist&gt;
  &lt;playback&gt;
    &lt;volumeStep&gt;5&lt;/volumeStep&gt;
    &lt;crossfadeSeconds&gt;3&lt;/crossfadeSeconds&gt;
    &lt;replaygain&gt;album&lt;/replaygain&gt;
  &lt;/playback&gt;
&lt;/config&gt;
</code></pre>
<p>Character count: 245
By far, the most verbose of all of these. The only saving grace is that it is easy to type and that <a href="https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#structure-prompts-with-xml-tags">LLMs seem to interpret it more confidently</a>. I often include pseudo-xml in my prompts, like wrapping documentation from a webpage in <code>&lt;docs&gt;</code>. Its crimes are many: XSLT, rigidity (i.e. no fault tolerance), and of course the verbosity. C tier.</p>
<h2>Nix</h2>
<pre><code>{
  musicLibrary = "/srv/music";
  startupPlaylist = "morning mix";
  playback = {
    volumeStep = 5;
    crossfadeSeconds = 3;
    replaygain = "album";
  };
}
</code></pre>
<p>Character count: 161
Deceitful little Nix. It's actually... a programming language! One that I have used a lot and still don't understand! The following is an example from my dotfiles. See if you can translate this into JavaScript:</p>
<pre><code>outputs =
    inputs@{ self, nixpkgs, ... }:
    let
      mkSystem = import ./nix/lib/mksystem.nix {
        inherit inputs nixpkgs self;
      };
    in
    {
      packages = nixpkgs.lib.genAttrs [ "aarch64-darwin" "x86_64-linux" ] (
        system:
        let
          pkgs = import nixpkgs { inherit system; };
        in
        {
          dotbot = pkgs.dotbot;
        }
      );

      nixosConfigurations.scylla = mkSystem "scylla" {
        system = "x86_64-linux";
        profile = "carter";
        extraModules = [ inputs.disko.nixosModules.disko ];
      };

      darwinConfigurations."Carters-MacBook-Pro" = mkSystem "carters-macbook-pro" {
        system = "aarch64-darwin";
        profile = "carter";
        systemUsername = "cmcbride";
        darwin = true;
      };

      formatter.aarch64-darwin = nixpkgs.legacyPackages.aarch64-darwin.nixfmt-tree;
      formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixfmt-tree;
    };
</code></pre>
<p>Tricky, right? I can never remember what <code>@</code> means.</p>
<pre><code>const outputs = (inputs) =&gt; {
  const { self, nixpkgs } = inputs;
  const mkSystem = importMkSystem({
    inputs,
    nixpkgs,
    self,
  });

  return {
    packages: Object.fromEntries(
      ["aarch64-darwin", "x86_64-linux"].map((system) =&gt; {
        const pkgs = importNixpkgs({ system });
        return [system, { dotbot: pkgs.dotbot }];
      }),
    ),

    nixosConfigurations: {
      scylla: mkSystem("scylla", {
        system: "x86_64-linux",
        profile: "carter",
        extraModules: [inputs.disko.nixosModules.disko],
      }),
    },

    darwinConfigurations: {
      "Carters-MacBook-Pro": mkSystem("carters-macbook-pro", {
        system: "aarch64-darwin",
        profile: "carter",
        systemUsername: "cmcbride",
        darwin: true,
      }),
    },

    formatter: {
      "aarch64-darwin": nixpkgs.legacyPackages["aarch64-darwin"]["nixfmt-tree"],
      "x86_64-linux": nixpkgs.legacyPackages["x86_64-linux"]["nixfmt-tree"],
    },
  };
};
</code></pre>
<p>I couldn't figure it out, despite having used nix for 2+ years. That snippet right there is AI-generated.
I am not completely sold on the argument that they needed to create a deterministic, functional programming language without side effects just to be able to create build scripts that always evaluate to the same lock file. But I just write JavaScript, what do I know.</p>
<h2>Vimscript</h2>
<pre><code>let g:player = {
\ 'music_library': '/srv/music',
\ 'startup_playlist': 'morning mix',
\ 'playback': {
\   'volume_step': 5,
\   'crossfade_seconds': 3,
\   'replaygain': 'album',
\ },
\ }
</code></pre>
<p>Character count: 188
Vimscript is on the list just so I can tell you that I like Lua more than vim. D tier.</p>
<h2>Programming language as configuration</h2>
<pre><code>export default {
  musicLibrary: "/srv/music",
  startupPlaylist: "morning mix",
  playback: {
    volumeStep: 5,
    crossfadeSeconds: 3,
    replaygain: "album",
  },
};
</code></pre>
<p>Character count: 171
I don't want to have to write tests for my configuration files! 2 branches is one too many! D tier.</p>
<h2>Markdown files</h2>
<pre><code># Music player config

- Music library: /srv/music
- Startup playlist: morning mix
- Playback
  - Volume step: 5
  - Crossfade seconds: 3
  - Replaygain: album
</code></pre>
<p>Character count: 159
aka an <code>AGENTS.md</code> or <code>CLAUDE.md</code> or <code>SKILL.md</code> file. The worst kind of configuration because the output is always different! F tier.</p>
<hr />
<p>Thank you for coming to my TED Talk. Don't forget to like and subscribe.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My favorite places on the internet]]></title>
            <link>https://carter.works/blog/2026-04-14-my-favorite-places-on-the-internet/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-14-my-favorite-places-on-the-internet/</guid>
            <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>My friends and I decided to do a weekly blog challenge for the month of April, 2026! Each week, one of us chooses a prompt and we all write posts.</p>
<p>For week 2, Jared chose the prompt:<br />
<strong>“What are your favorite places on the internet or favorite things about the internet and why? How do they differ from the parts of the internet that you dislike”</strong></p>
<ul>
<li><a href="https://samwarnick.com/blog/internet-driven-memories/">Sam: “Internet Driven Memories”</a></li>
<li><a href="https://jaredezz.tech/posts/preferred-corners-of-the-internet/">Jared: “My Preferred Corners of the Internet, and Why I Spend My Time There”</a></li>
<li><a href="https://catskull.net/the-internet-is-a-vast-place.html">Dave: “The Internet is a vast place”</a></li>
</ul>
<hr />
<p>The way I see it, there are three parts to this question: where can I spend my internet time that makes me the happiest, where do I <em>actually</em> spend my time, and where do I dislike? It's a "stated preference vs. revealed preference" kind of thing.</p>
<p>My screentime[^1] says that I spend my time:</p>
<ul>
<li>On Xitter, reading the stream of consciousness of AI bros, design engineers, and Japanese people who put peanuts in their Coca-Cola and make cake in their rice cookers.</li>
<li>On Instagram, fawning over pictures of menswear bros in herringbone tweed sportcoats with the cool ticket pocket.</li>
<li>On Hacker News, <s>avoiding work</s> keeping up to date in the latest technologies and software practices.</li>
<li>On YouTube, watching Linus Sebastian drop motherboards.</li>
</ul>
<p>But I wouldn't say that any of these "spark joy". They entertain[^2]. They fill time. The reels are probably the highest return of any of these because of the nightly "sharing of the videos" ritual that my wife and I engage in, yet they feel mostly hollow.</p>
<p>What are places with a higher joy-spark-to-noise ratio? My favorite thing of all time is to see someone speak <em>deeply</em> and <em>excitedly</em> about a niche topic. Not like a TED talk[^3] just something casual. To me, blogs are the most approachable format for consumption. A good niche blogger produces content for the love of the game, not for clout. Other ad-supported platforms lack that organic and authentic appeal, for the most part. Some of my favorite niche blogs are:</p>
<ul>
<li><a href="https://dieworkwear.com">Derek Guy's <em>Die, Workwear</em></a>—Cheating, since Derek Guy is the Twitter menswear guy and is very prolific and annoying on that platform, plus he is a full-time menswear writer and journalist, but he started out blogging. I really like his long-form pieces that tell the history of certain pieces of clothing or the way that subcultures have dressed themselves. I recommend reading <a href="https://dieworkwear.com/2024/05/03/american-space-cowboys/">"American Space Cowboys"</a> about the outfits the astronauts wore to their training expedition to Iceland, leading up to the famous Apollo 11 mission in 1969.</li>
<li>The <a href="https://www.lttlabs.com/articles">LTTLabs blog</a>—Again, cheating a little bit because LTTLabs is obviously connected to the "Linus Tech Tips" YouTube channel, but the blog for their laboratory is a separate thing that aren't trying nearly as hard to draw eyeballs. Instead, they are a collection of random investigations into topics that the laboratory engineers deem interesting. The articles are all niche, quantitative deep dives on technical topics that are still casual and approachable. I recommend <a href="https://www.lttlabs.com/articles/2026/04/04/how-close-is-too-close-applying-fundamental-fluid-dynamics-research-methods-to-pc-cooling">their guest post on the fluid dynamics of computer case fans</a> as well as their analysis on <a href="https://www.lttlabs.com/articles/2025/08/30/nintendo-switch-2-dock-usb-c-compatibility">the USB communication habits of the Nintendo Switch 2</a>.</li>
<li><a href="https://daverupert.com/">Dave Rupert's personal blog</a>—Dave is an engineer at Microsoft on their Fluent Design system as well as a cohost of the fun-and-casual web development podcast <a href="https://shoptalkshow.com">Shop Talk Show</a>. His blog posts are always personal and interesting and often focus around small things he's learnt about CSS or the business of software. My minimalistic heart loves his post <a href="https://daverupert.com/2026/02/smaller-and-dumber/">"Smaller and dumber"</a>.</li>
<li><a href="https://jenniferdaniel.substack.com/archive">Jennifer Daniel's "Did Someone Say Emoji?" newsletter</a>—Jennifer is Unicode Emoji Subcommittee-Chair, meaning if there is a new emoji, she was the Caesar, giving the 👍 or 👎. She is also a nerd who loves language and these weird new linguistic artifacts that are now part of daily life. Who else could ever write such a bizarre sentence as this</li>
</ul>
<blockquote>
<p>To whisper “I love you” in the age of skibidi, one must move past the “Frequently Used” tab and into the pantry that is our emoji picker. The Egg (🥚), the Broccoli (🥦), and the Pizza (🍕) can all say “<a href="https://research.gold.ac.uk/id/eprint/22850/">I care about you,</a>” in a way that may be indecipherable to most everyone on the planet but can mean everything to just you and someone you love.</p>
</blockquote>
<p>I recommend her article <a href="https://jenniferdaniel.substack.com/p/a-field-guide-to-semantic-obfuscation">on the many emojis of love</a> and <a href="https://jenniferdaniel.substack.com/p/what-do-emoji-and-typing-like-sponge">WhY wE MiGhT tAlK lIkE tHiS</a>.</p>
<ul>
<li><a href="https://simonwillison.net/">Simon Willison's Weblog</a>—Simon is the creator of datasette and a cocreator of the Python web framework Django. Now it is he fills his time as a data journalist, creating tools to help people write about and analyze data. He has also become a prominent voice in the large language model space. I really enjoy his analysis of new models, including how well they create SVGs of pelicans.</li>
<li><a href="https://www.youtube.com/@ChrisYoungCooks">Chris Young's Youtube channel</a>—look at me, cheating again. Chris Young was a co-author on the cookbook <em>Modernist Cuisine</em> (IFYKYK) and founder of sous-vide company ChefSteps and now, Combustion Inc. His videos are all ads for his company's product, a wireless thermometer, BUT Chris is a deep fountain on food science and its applications into real-life cooking that make his videos a source of information you are unlikely to find anywhere else. Plus, since there is a company behind it, the production value is very high. I recommend his videos on <a href="https://www.youtube.com/watch?v=6ZdIqhzwgFw">slurpees at home</a> and <a href="https://www.youtube.com/watch?v=NnzADfbBBFo">homemade baked ribs</a> (because the video goes off the rails in the middle in a way that I, having just finished watching Breaking Bad, really enjoyed.)</li>
<li>I haven't read much of her other stuff, but Alexis King is clearly very passionate about Haskell (because you have to be, in order to program in it) and her <a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/">"Parse, don't validate" blog post</a> (<a href="https://web.archive.org/web/20191107094112/https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/">Internet Archive</a>) change how I feel about types, taking them from "annoying semantics that Java requires" to "early warning systems for logic errors".</li>
</ul>
<p>Another way that niche interests shine is in the good ol' fashion narrative or rant. instead of whipping out the slop cannon when you sit down with your snack, read one of these informative pieces:</p>
<ul>
<li><a href="http://yazzy.fly.dev/https://web.archive.org/web/20160308023403/https://www.theawl.com/2016/03/the-vast-bay-leaf-conspiracy/">Kelly Conaboy's "The Vast Bay Leaf Conspiracy"</a> (<a href="https://web.archive.org/web/20160308023403/https://www.theawl.com/2016/03/the-vast-bay-leaf-conspiracy/">Internet Archive</a> link, since the original home, The Awl, is now defunct), in which a food journalist talks to famous and accomplished chefs and grills them on the <em>real</em> purpose of bay leaves.</li>
<li><a href="https://www.everywhereist.com/2021/12/bros-restaurant-lecce-we-eat-at-the-worst-michelin-starred-restaurant-ever/">Geraldine DeRuiters's review of Bros. in Lecce</a> (<a href="https://web.archive.org/web/20211208185917/https://www.everywhereist.com/2021/12/bros-restaurant-lecce-we-eat-at-the-worst-michelin-starred-restaurant-ever/">Internet Archive</a>) which they call "the worst Michelin star restaurant".</li>
<li><a href="https://www.seriouseats.com/what-makes-a-good-bagel-bad-bagel-kenji-opinion-untoasted">J. Kenji Lopez-Alt's bagel <s>rant</s> manifesto</a> (<a href="https://web.archive.org/web/20210506185329/https://www.seriouseats.com/what-makes-a-good-bagel-bad-bagel-kenji-opinion-untoasted">Internet Archive</a>) has ruined bagels for me.</li>
</ul>
<p>Other than content consumption, I want to use well designed and enjoyable tools. One of them is <a href="https://npmx.dev">npmx.dev</a>. It's a very well designed tool that has a high information density and a quick interface with useful, quick animations. As a developer of a JavaScript SDK, I spend a lot of time thinking about and evaluating npm packages and this tool is very valuable.</p>
<p>Overall, my favorite places on the internet are those that demonstrate passion, effort, and knowledge. <a href="mailto:favorites@carter.works?subject=My%20favorite%20place%20on%20the%20internet%20is%E2%80%A6">Tell me about your favorite places on the internet</a>.</p>
<p>[^1]: Can I just say how useless iOS screen time limits are because they offer "Ignore for today" and an indefinite "15 minutes more"? This is a widely held opinion; why else would products like <a href="https://getbrick.com/">Brick</a> , a $50 piece of plastic with a $0.01 NFC tag, exist.</p>
<p>[^2]: What shows up in your feed vs who you follow might be the largest, most apparent example of "stated preference" vs "revealed preference" to ever exist.</p>
<p>[^3]: Lingua de 2026 will say that these are all "performative".</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Experiment: Gamebook Viewer]]></title>
            <link>https://carter.works/blog/2026-04-13-gamebook-viewer/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-13-gamebook-viewer/</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>The theme for my book club this month is "choose your own adventure" books. Turns out, Choose Your Own Adventure™ is a trademark of Random House. The generic name for the is gamebooks. It's a larger genre than I thought it might be. We're reading <a href="https://fable.co/book/neil-patrick-harris-choose-your-own-autobiography-by-neil-patrick-harris-Rrnh6Z6qpY"><em>Neil Patrick Harris: Choose Your Own Autobiography</em></a> (<a href="https://www.goodreads.com/book/show/20170296-neil-patrick-harris">Goodreads</a>).</p>
<p>Someone in the group said that it might be fun to have everyone record their path and then we can compare and see how many people ended up where so I vibe coded a little web app to enable that. I am calling it the <a href="https://tools.carter.works/gamebook-viewer/">Gamebook Viewer</a>.</p>
<p>The most fun part was coming up with the domain specific language to describe the branching paths of a game book. It's pretty simple, but I did come up with a whole Backus-Naur form grammer to harken back to my college days.</p>
<pre><code>&lt;file&gt; ::= &lt;event&gt; | &lt;event&gt; &lt;newline&gt; &lt;file&gt;
&lt;event&gt; ::= &lt;eventid&gt; &lt;divider&gt; &lt;description&gt; &lt;newline&gt; &lt;choice-list&gt;
&lt;choice-list&gt; ::= &lt;choice&gt; | &lt;choice&gt; &lt;newline&gt; &lt;choice-list&gt;
&lt;choice&gt; ::= &lt;choiceid&gt; &lt;divider&gt; &lt;description&gt;
&lt;choiceid&gt; ::= &lt;choicemarker&gt; "(" &lt;eventid&gt; ")"
&lt;eventid&gt; ::= &lt;positive-integer&gt;
&lt;positive-integer&gt; ::= &lt;nonzero-digit&gt; | &lt;nonzero-digit&gt; &lt;digits&gt;
&lt;digits&gt; ::= &lt;digit&gt; | &lt;digit&gt; &lt;digits&gt;
&lt;digit&gt; ::= "0" | &lt;nonzero-digit&gt;
&lt;nonzero-digit&gt; ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
&lt;choicemarker&gt; ::= &lt;uppercase-letter&gt;
&lt;uppercase-letter&gt; ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M"
                   | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
&lt;divider&gt; ::= ". "
&lt;description&gt; ::= &lt;text&gt;
&lt;text&gt; ::= "" | &lt;character&gt; &lt;text&gt;
&lt;character&gt; ::= any character except newline
&lt;newline&gt; ::= "\n"
</code></pre>
<p>In practice, it looks like this:</p>
<pre><code>1. You, Neil Patrick Harris, are born in Albuquerque, New Mexico, on June 15, 1973, at what you're pretty sure is St. Joseph's Hospital, although it's har...
A(3). If you would like to experience a happy childhood, go HERE .
B(2). If you would prefer to experience a miserable childhood that later in life you can claim to have heroically overcome, go HERE .

2. You, Neil Patrick Harris, are born in Albuquerque, New Mexico, on June 15, 1973. You're pretty sure it's in the backseat of a taxicab, but you can't be...
A(3). If you would like to experience a more wholesome childhood, go HERE .
B(94). If you are eager to meet your own children, skip ahead thirty years and go HERE .
</code></pre>
<p>With a setup like that, you can just write down your choices like <code>ABAACAB</code> to record your path. And then the webapp will just show them on the map. It'll even let you input multiple paths and you can see how many people made the same choices and ended up with the same ending.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I'm enjoying having opinions]]></title>
            <link>https://carter.works/blog/2026-04-07-im-enjoying-having-opinions/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-04-07-im-enjoying-having-opinions/</guid>
            <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>My friends and I decided to do a weekly blog challenge for the month of April, 2026! Each week, one of us chooses a prompt and we all write posts.</p>
<p>For week 1, Sam chose the prompt:<br />
<strong>"What's something cool I'm caring about or into recently?"</strong></p>
<ul>
<li><a href="https://samwarnick.com/blog/four-keys-book-arts-and-project-hail-andy/">Sam: "Four Key Book Arts and Project Hail Andy"</a></li>
<li><a href="https://jaredezz.tech/posts/the-nature-of-prototyping">Jared: "The Nature of Prototyping in Professional Development"</a></li>
<li><a href="https://catskull.net/nintendo-announces-3ds-successor-3ds-plus.html">Dave: "Nintendo announces 3DS successor ‘3DS Plus’"</a></li>
</ul>
<hr />
<p>The first draft was a diatribe about how guilt and low self-confidence eat away at my sense of self. But... four minutes before my scheduled "finish the draft" time, I heard <a href="https://open.spotify.com/track/0yin14PPCxLBorpVqlON8V?si=f49c797d4f914fae">"Disco Snail" by Vulfmon</a>. So consider listening to my current favorite song while reading me complain about myself.</p>
<hr />
<blockquote>
<p>“I used to do drugs. I still do, but I used to, too.”</p>
</blockquote>
<p>Mitch Hedberg</p>
<p>In that same vein, I used to be a person of low self-confidence. I still am, but I used to, too. This manifests itself in a lot of non-obvious ways. Every sentence requires hedging or well-researched primary sources and hard data. Every evening spent in leisure is accompanied by a side of guilt because the time could be better spent on others or fixing the three holes I made in the drywall during Christmas 2024. Guilt eats away to the point where I don't know what my real interests are.
The antidote is doing the opposite: having opinions, avoiding hedging, and being "unapologetically myself". That doesn't mean being a jerk, it just means accepting what I like without apologizing. This resolution to abandon self-apologetics has been going on for a few weeks. I like it! It feels good! I still feel embarrassed saying "<em>Mission: Impossible - Fallout</em> is my current favorite movie. No I can't intelligently articulate why. But Henry Cavill is very cool. Yeah, it is silly <a href="https://youtu.be/obpzIPd6RSg">when he cocks his arms and grows a pocket and a beard before punching</a>." It's hard to say "I know Elden Ring received wide critical acclaim. Brandon Sanderson called it his favorite game. But I don't like it. I don't have the time to walk back to the Fallingstar Beast again. I don't want to watch another YouTube video on how to optimize my build." Just because everyone else likes it doesn't mean I have to like it. Just because everyone else dislikes it doesn't mean that I have to like it, and I don't like Elden Ring.</p>
<hr />
<blockquote>
<p>In a world of scarcity, we treasure <em>tools</em>.<br />
In a world of abundance, we treasure <em>taste</em>.</p>
</blockquote>
<p><a href="https://www.workingtheorys.com/p/taste-is-eating-silicon-valley">Anu Atluru, <em>Taste is Eating Silicon Valley</em></a></p>
<p>"The importance of taste" is a current topic in Silicon Valley. "The age of SaaS is over; now is the day of personal software through vibecoding," they say. I don't know if that is right, and I certainly have no control over the answer. But one way to think about what happened to software is to think about what happened to clothing. Machines came to textile manufacturing and then clothing went from being a long and laborious process to a quick one. Before, only the wealthy could afford more than a few outfits. Now, the world is flooded by cheap and shoddy clothing. For example, <a href="https://www.per-spex.com/articles/2023/9/12/shein">one article counted 369,264 separate products available for sale</a> through Chinese clothing retailer Shein on a random day in October 2021. They also report that the parent company, Zoetop, produces 1.2 million articles of clothing <em>a day</em>.</p>
<p>Maybe the world will fill with slop. Maybe the world is already full of slop. Whenever that happens, you should focus on the things that bring <em>you</em> joy. I'm starting to do that now. I'm playing through <em>Assassin's Creed Origins</em> again, even though it only has a 7.3 user score on Metacritic. I've decided I don't want to finish reading <em>The Day of the Jackal</em> even though I told myself I needed to read the book before watching the TV show. My wife thinks Eddie Redmayne is cute and watching it will bring <em>her</em> joy, which brings me joy.</p>
<p>I'm enjoying having opinions.</p>
<img src="https://carter.works/assets/belethor-1000.avif" srcset="https://carter.works/assets/belethor-600.avif 600w, https://carter.works/assets/belethor-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="&quot;Some may call this junk. Me, I call them treasures&quot; Belethor, Skyrim" width="1000" height="750" loading="lazy" decoding="async" />
<p>Wise words, Belethor</p>
<hr />
<p>Oh and also I'm enjoying these <a href="https://meermin.com/products/101381-brown-suede-e">suede loafers from Meermin</a>. They slap.</p>
<img src="https://carter.works/assets/loafers-1000.avif" srcset="https://carter.works/assets/loafers-600.avif 600w, https://carter.works/assets/loafers-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="A pair of tassel loafers" width="1000" height="1333" loading="lazy" decoding="async" />]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Experiment: Claude Code Buddy Creator]]></title>
            <link>https://carter.works/blog/2026-03-31-claude-code-buddies-experiement/</link>
            <guid isPermaLink="false">https://carter.works/blog/2026-03-31-claude-code-buddies-experiement/</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Correctly packaging an <code>npm</code> package is hard. It's certainly something that I've struggled with at work and spent many hours on. So it's understandable that even Anthropic and Claude could do it wrong. Xitter user @fried_rice <a href="https://x.com/Fried_rice/status/2038894956459290963">noticed that Anthropic accidentally distributed the source map.</a>. Revealed in the source code were lots of interesting things, including leaks to upcoming model with fun animal-themed code names and the full list of verbs that Claude Code may show when "reticulating".</p>
<p>But m my favorite is Anthropic's upcoming April Fool's Day project: buddies. You run <code>/buddy</code> in Claude Code and a little ASCII friend is generated for you. He has a name, a personality, some stats, a species, a hat, some eyes, and a rarity. they can even be shiny, just like Pokémon.</p>
<p>I wanted to see all the permutations, so I copied the source code and vibed a new little experiment. It uses <a href="https://github.com/chenglou/pretext">Cheng Lou's incredible <code>pretext</code> library</a> for some rendering.</p>
<p><a href="https://tools.carter.works/claude-code-buddy-creator/">Go make a buddy!</a> I will probably update this a little bit. once the buddy feature is officially released. But for now you can share your buddy as a URL or copy it as ASCII text. Or you can just screenshot it.</p>
<img src="https://carter.works/assets/ddr-rams-600.avif" alt="DDRRAMS character card" width="600" height="665" loading="lazy" decoding="async" />
<p>DDRRAMS–a certified lil' guy.</p>
<p>Update 2026-04-01: the official <code>/buddy</code> cards are out now, so I refreshed this experiment to match the new card contents as close as possible</p>
<p>My buddy:</p>
<pre><code>╭──────────────────────────────────────╮
│                                      │
│  ★ COMMON                       OWL  │
│                                      │
│     /\  /\                           │
│    ((×)(×))                          │
│    (  &gt;&lt;  )                          │
│     `----´                           │
│                                      │
│  Cobblewick                          │
│                                      │
│  "A methodical night-shifter with a  │
│   steel-wool tongue, quick to point  │
│   out logical gaps but patient       │
│  enough to sit through your entire   │
│  rubber-duck session without flying  │
│   off."                              │
│                                      │
│  DEBUGGING  █░░░░░░░░░   8           │
│  PATIENCE   ███████░░░  67           │
│  CHAOS      ███░░░░░░░  33           │
│  WISDOM     ██░░░░░░░░  22           │
│  SNARK      ████░░░░░░  36           │
│                                      │
╰──────────────────────────────────────╯
</code></pre>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[24-ish hours with an iPhone]]></title>
            <link>https://carter.works/blog/2025-10-29-24-ish-hours-with-an-iphone/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-10-29-24-ish-hours-with-an-iphone/</guid>
            <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I've always loved Android and Google. Even before I had a smartphone, I downloaded Android Studio onto the family computer just so I could run the emulator. I thought <a href="https://blog.xkcd.com/2010/02/08/android-bug-reports-songs-rovers/">Randall Monroe's random 2010 blog post about Android bugs he encountered</a> was bizarre—how could the company that is not evil produce anything less than perfect? For the past 10 years and from the first smartphone, they have all been Android. A few budget Samsungs, a Nexus 5, and an LG G6 (the 2:1 aspect ratio was fantastic) were all important and beloved parts of my life. I enjoyed flexing my script kiddie muscles and downloading custom ROMs and tweaking everything to be the most efficient and most custom.</p>
<p>But my first iPhone arrived yesterday-a blue iPhone 17 Pro Max. I've migrated everything over and my Samsung S20 FE has been boxed up to be courtesy-recycled. It's been 24 hours and I've enjoyed setting things up and diving deep into the iOS ecosystem.</p>
<img src="https://carter.works/assets/old-android-and-new-iphone-600.avif" alt="An Android phone and an iPhone, side-by-side on my desk." width="600" height="800" loading="lazy" decoding="async" />
<h2>Reasons for wanting to switch</h2>
<p>I first started thinking about switching after watching the 2024 WWDC keynote. You know, the one that told you that Apple was going to collect all the context of your life from messages and mail and calendar then give you the ability to ask longitudinal questions about it through ✨Apple Intelligence✨? And the whole thing would be run privately by Apple, the privacy company? Amazing!</p>
<p>...</p>
<p>Anyways, as I thought more about it over the past year, the Apple ecosystem seemed more and more attractive. I'm a little older now and, while I am still a script kiddie who with a computer science degree and a software job, I also have a wife and kids. My hobby time is much diminished and I need my phone to act as a phone. A phone needed to be a phone (and camera, and note pad, and conduit of information) when it was needed.</p>
<p>Additionally, my wife has an iPhone and an iPad. A unified family platform would be nice, for managing screen time for kids (in the future) and for Airtags. I know that Google also has a Find My network, but <a href="https://www.theverge.com/google/655319/google-find-my-device-smart-tag-network-one-year-later">it is <em>opt. in.</em></a> (kinda). The utility of Find My requires a proliferation of participant devices, and Google just didn't have the quality network as of right now.</p>
<p>And I gotta say, for all its haters, liquid glass can be beautiful.</p>
<img src="https://carter.works/assets/liquid-glass-1000.avif" srcset="https://carter.works/assets/liquid-glass-600.avif 600w, https://carter.works/assets/liquid-glass-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="An iPhone screenshot, showcasing the " width="1000" height="2164" loading="lazy" decoding="async" />
<p>Look at the chromatic aberration on the edges of the notification shade! The edge distortion! And have you seen the airdrop animation?</p>
<p>Meanwhile, Google made some different shapes, like a sawtooth clock. How funky of them.</p>
<p></p>
<p>Now the day is finally here. To be fair, this is not an apples-to-apples comparison. This is comparing a 5-year old <a href="https://www.gsmarena.com/samsung_galaxy_s20_fe_5g-10377.php">Samsung Galaxy S20 FE</a> to the iPhone 17 Pro Max, <a href="https://www.gsmarena.com/apple_iphone_17_pro_max-13964.php">a device with literally triple the Geekbench score, twice the RAM, and a screen that isn't cracked.</a></p>
<h2>Things I like about iOS</h2>
<p>I think my favorite thing so far about iOS is the quality of first party apps. Maps, Mail, Podcasts, Facetime, Messages, Wallet, and Safari have all be incredible.</p>
<ul>
<li>Bottom navigation does not exist on Chrome for Android. Gmail (yes, the first party mail app on Android is tied to a specific service) doesn't support non-Gmail accounts.</li>
<li>RCS support on Google Messages was flaky and I would regularly have to fallback to SMS/MMS, and I'm not talking green bubble vs. blue bubble. Just green bubble SMS and vanilla RCS have worked great and reliably on iOS.</li>
<li>The reliability of Samsung Wallet was... not great. Part of this was that the NFC sensor was in the middle of the phone vs on the top on the iPhone. Another part was that the S20 FE was one of the last phones with magnetic stripe transmitting and the decisions between which to use took time. Apple Wallet, on the other hand, is instant.</li>
</ul>
<p>And the best first party app is <strong>SHORTCUTS</strong>. Android hasn't had an equivalent since the heyday of <a href="https://tasker.joaoapps.com/">Tasker</a>, and it's integrated into the iOS. No-code automation of almost anything in OS works really, really well. I've written a few so far for little things, like toggling auto-rotation when opening media apps or turning off the always-on display when I start working from home.</p>
<p>FaceID works very smoothly. Phones are so tall (yes, I realize that I opted into a large phone) but shifting my thumb from the middle of the screen down to the bottom to scan a fingerprint to open my password manager again took some gymnastics.</p>
<p>Camera Control is very cool. Swiping my finger left and right as well as the half-press to lock AE/AF is very intuitive and reminds me of classic point-and-shoot</p>
<h2>Things I do not miss about Android</h2>
<p>This is more of a diss on Samsung than on Android as a whole, but wow does the Samsung app ecosystem disappoint. People gripe about how the Microsoft Store on Windows is full of shovelware and scams, but those people have never visited the Samsung App Store. Please, never purchase a third-party app from this place.</p>
<p>Samsung third party apps are disappointing and filled with advertisements for other Samsung services and "Samsung selected partners". For example, Wallet has an a persistent ad for Samsung Money by SoFi. If you dismiss it, it will come back in a few days. It will give you push notifications for special offers. People who already own Samsung devices were not surprised when the company announced that <a href="https://www.theverge.com/news/780757/samsung-brings-ads-to-us-fridges.">the company would bring ads to the giant screens on expensive their moderately-priced fridges</a></p>
<p>The overall user interface presented by One UI 5.1 on Android 13 was fairly inconsistent in presentation and in performance. Again, this may be a factor of comparing a 5-year old budget phone to a brand new flagship, but the iPhone has not dropped a frame yet. Animations stutter not, no matter how much I futz with them. Meanwhile, it was <em>impossible</em> to quick-switch (aka a "slide to the right" on the app bar) between apps. It would flash on the screen, then disappear.</p>
<h2>Things I miss about Android</h2>
<p>Honestly, not as much as I thought I was going to! I thought I was going to miss Syncthing as a way of syncing my Obsidian vault around, but <a href="https://mobiussync.com/">Möbius Sync</a> works really well.</p>
<p></p>
<p><a href="https://niagaralauncher.com/">Niagara Launcher</a> will be greatly missed. The scrollable alphabet feature that moved out of the way of your thumb is so fast. I'm surprised that Apple still keeps around the old alphabet quick list for the App Library.</p>
<p>Gboard on Android is great. The number row on top makes it really quick to... type numbers. And why is the emoji keyboard on iOS still a completely separate input language? If I want to 👏talk👏 👏like👏an👏AI,👏 it shouldn't take me five minutes.</p>
<p>Why are iOS emoji so ugly? They haven't been updated since they were first introduced in iOS 2.2! The gradient and outline look very dated, compared to Noto Color Emoji.</p>
<img src="https://carter.works/assets/ios-vs-android-emoji-189.avif" alt="Comparison of iOS and Android emoji designs" width="189" height="492" loading="lazy" decoding="async" />
<p><a href="https://f-droid.org/en/packages/">F-Droid</a>, an app marketplace for open-source applications, was nice. I would often use it for little apps because I knew that, when I downloaded an app via F-Droid, it would not be displaying advertisements or slurping up my data and sending it to Facebook or the Chinese Communist Party.</p>
<h2>TL;DR</h2>
<p>Man discovers that:</p>
<ol>
<li>a new phone that costs $1,274.39 today has better battery life and software performance than a phone he bought for $643.49 five years ago,</li>
<li>after completing <a href="https://animations.dev">a course on animations</a> he really like pretty animations, and</li>
<li>Changing a decade of habits has a few bumps.</li>
</ol>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[To create is to riff]]></title>
            <link>https://carter.works/blog/2025-09-23-to-create-is-to-recreate/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-09-23-to-create-is-to-recreate/</guid>
            <pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>To create is to recreate.</p>
<blockquote>
<p>Immature poets imitate; mature poets steal; bad poets deface what they take, and good poets make it into something better, or at least something different. The good poet welds his theft into a whole of feeling which is unique, utterly different from that from which it was torn; the bad poet throws it into something which has no cohesion.</p>
</blockquote>
<p>T. S. Eliot, <em>The Sacred Wood</em> (1920)</p>
<blockquote>
<p>If you wish to make an apple pie from scratch, you must first invent the universe.</p>
</blockquote>
<p>Carl Sagan, <em>Cosmos: A Personal Voyage</em>, Episode 9 (1980)</p>
<blockquote>
<p>No man is an island, entire of itself; every man is a piece of the continent, a part of the main.</p>
</blockquote>
<p>John Donne, "Devotions upon Emergent Occasions", <em>Meditation XVII</em> (1624)</p>
<blockquote>
<p><a href="https://ui.land/interviews/paco-coursey#do-you-have-any-advice-for-ambitious-designers-or-engineers?">Do you have any advice for ambitious designers or engineers?</a></p>
<p>Design and build your own apps. You’ll never understand the challenges, tricks, and edge-cases of a note-taking app until you build a note-taking app.</p>
<p>Copy and re-implement work you admire until you can proudly create for yourself. Work where you can grow.</p>
<p>Play <a href="http://the-witness.net/">The Witness</a>.</p>
</blockquote>
<p><a href="https://ui.land/interviews/paco-coursey#do-you-have-any-advice-for-ambitious-designers-or-engineers?">Paco Coursey (design engineer @ Linear), Interview with ui.land (2024)</a></p>
<blockquote>
<p>You need to surround yourself with great work.</p>
<p>If you are a designer, look at great designs. If you are a writer, read great books. Expose yourself to great work, this way you’ll learn how greatness looks and feels like.</p>
<p>[…] Designers should copy great designs, writers should copy great books.</p>
<p><a href="https://ui.land/interviews/paco-coursey#do-you-have-any-advice-for-ambitious-designers-or-engineers?">Copy and re-implement work you admire until you can proudly create for yourself</a>.</p>
<p>Heavy exposure to great things shapes output.</p>
</blockquote>
<p>Emil Kowalski (design engineer @ Linear), "Taste", animations.dev course (2024)</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Experiments and halftone]]></title>
            <link>https://carter.works/blog/2025-08-14-experiments-and-halftone/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-08-14-experiments-and-halftone/</guid>
            <pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I am devoting a section of my site to "experiments"—little "what if's" and prototypes of ideas. They aren't big enough to turn into apps or tools, nor do I want to spend the time to fully integrate them into my main site. They are independent, atomic, and fun. The point is to be non-committal and give me a chance to try out new things then throw them away. You can see them all <a href="https://tools.carter.works/">on my tools page</a>.</p>
<hr />
<p>Back in February, <a href="https://youtu.be/kIhb5pEo_j0?si=ExVY5auwqqLK2Lze">OpenAI used a halftone image as part of their Super Bowl ad for ChatGPT</a>.</p>
<img src="https://carter.works/assets/openai-halftone-internet-dots-600.avif" alt="A retro image of a globe, connected via dotted line, to an old computer, evoking feelings of the internet and retro computing" width="600" height="356" loading="lazy" decoding="async" />
<p>Ever since then, I've kind of been obsessed with the visual style. I love things that start as something that are deeply constrained, become beautiful, then continue to hold onto those constraints even though the reasons for them have long since been left behind. Caesar salad was created "by Caesar Cardini at Caesar's in Tijuana, Mexico, when the kitchen was overwhelmed and short on ingredients" (<cite><a href="https://en.wikipedia.org/wiki/Caesar_salad">Wikipedia</a></cite>). Italian peasants starting putting toppings on flat breads while they baked because they would puff up too much in the oven. Halftone and dot matrix printing practices were developed to put words and images on paper in a world before modern bitmaps.</p>
<p>Some of my other favorite examples:</p>
<img src="https://carter.works/assets/perplexity-358.avif" alt="A halftone image of a hand, holding the Perplexity logo into the air" width="358" height="372" loading="lazy" decoding="async" />
<p>From the Private mode new tab page of Perplexity's Comet</p>
<img src="https://carter.works/assets/samdape-the-creation-of-projects-1000.avif" srcset="https://carter.works/assets/samdape-the-creation-of-projects-600.avif 600w, https://carter.works/assets/samdape-the-creation-of-projects-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="A halftone image of two hands, reaching towards each other. A blue folder labelled &quot;projects&quot; lies between them. It is modeled after Michelangelo's &quot;Creation of Adam&quot; painting from the Sistine Chapel ceiling." width="1000" height="457" loading="lazy" decoding="async" />
<p><a href="https://x.com/samdape/status/1859945404806451494/photo/1">From designer Sam Peitz</a></p>
<img src="https://carter.works/assets/heart-in-a-box-halftone-1000.avif" srcset="https://carter.works/assets/heart-in-a-box-halftone-600.avif 600w, https://carter.works/assets/heart-in-a-box-halftone-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="a heart in a box" width="1000" height="889" loading="lazy" decoding="async" />
<p>A bad heart in a box, by me.</p>
<p>In that vein, <a href="https://tools.carter.works/halftone-painting/">I built a little tool to create them</a>. I might refine it later. I'm not an artist, so I don't have any examples of my own creations. You can save them as pngs. Send them to me with the <code>@carter.works</code> halftone address! Make sure to mark it "fit to print"!</p>
<p><a href="https://tools.carter.works/halftone-painting/"><img src="https://carter.works/assets/halftone-painting-app-1000.avif" srcset="https://carter.works/assets/halftone-painting-app-600.avif 600w, https://carter.works/assets/halftone-painting-app-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="A screenshot of a webpage for creating halftone images" width="1000" height="758" loading="lazy" decoding="async" /></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Inside of me there are two wolves]]></title>
            <link>https://carter.works/blog/2025-08-06-inside-of-me-there-are-two-wolves/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-08-06-inside-of-me-there-are-two-wolves/</guid>
            <pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Inside of me there are two wolves. One of them is named DIY, who says "build everything from scratch. Only you know what you need. You will learn the most this way." The other wolf is the do-work wolf, who says "use what's already been built. It's easier and you can focus on the important stuff. 'You're not a beautiful and unique snowflake'... By giving up vain individuality, you can leapfrog the toils of mundane decisions, and make faster progress in areas that really matter" (from <a href="https://rubyonrails.org/doctrine#convention-over-configuration">The Ruby on Rails Doctrine</a>).</p>
<h2>Linux</h2>
<p><strong>July 17</strong>: I wipe my Windows 11 PC and install <a href="https://bazzite.gg">Bazzite</a>, a version of Fedora Silverblue optimized for gaming. I pick it because it has excellent out-of-the-box support for Nvidia GPUs and Fedora Silverblue's immutable nature ensures that everything will probably never be broken.</p>
<p><strong>Today</strong>: I wipe my Bazzite PC and install <a href="https://omarchy.org">Omarchy</a>, "an opinionated Arch + Hyprland Setup by DHH". I picked it because of the pre-setup tiling window manager and all the little utilities.</p>
<p><strong>Today+3 hours</strong>: Should I wipe my Omarchy PC and install <a href="https://nixos.org">NixOS</a> and recreate Omarchy from the ground up, because I don't like that Omarchy/Arch was missing Flatpaks, how it used Chromium instead of <a href="https://zen-browser.app">Zen Browser</a>, and Arch still feels like a scary mountain of technical debt the second I think about it. Example: the first time I rebooted, it went to the rootfs safety console because... no one knows.</p>
<h2>Personal site</h2>
<p><strong>2019-08-18</strong>: I restart my personal site and use vanilla HTML and CSS.</p>
<p><strong>2019-11-11</strong>: I restart my personal site and use Svelte.</p>
<p><strong>2020-06-07</strong>: I restart my personal site and use vanilla HTML and CSS.</p>
<p><strong>2020-06-23</strong>: I restart my personal site and use <a href="https://parceljs.org">Parcel</a> and Tailwind.</p>
<p><strong>2020-09-22</strong>: I restart my personal site and use <a href="https://www.snowpack.dev">Snowpack</a>.</p>
<p><strong>2021-07-07</strong>: I restart my personal site and use a custom build system.</p>
<p><strong>2022-03-11</strong>: I restart my personal site and use <a href="https://vitejs.dev">Vite</a> and <a href="https://windicss.org">Windi CSS</a>.</p>
<p><strong>2022-04-27</strong>: I restart my personal site and use <a href="https://astro.build">Astro</a>.</p>
<p><strong>2022-08-17</strong>: I restart my personal site and use Astro with a new theme.</p>
<p><strong>2023-01-25</strong>: I restart my personal site and use vanilla HTML and CSS with <a href="https://picocss.com">Pico CSS</a>.</p>
<p><strong>2023-07-13</strong>: I restart my personal site and use vanilla HTML and CSS with color and motion.</p>
<p><strong>2024-03-27</strong>: I restart my personal site and use Astro (again) with a game-and-watch-but-beige design.</p>
<p><strong>2024-09-05</strong>: I restart my personal site and use Tailwind CSS.</p>
<p><strong>2025-01-26</strong>: I restart my personal site and use Astro 5.1 and Tailwind 4.0.</p>
<h2>Yazzy</h2>
<p><strong>2024-06-22</strong>: I start Yazzy with Bun, Elysia, Readability, and vanilla HTML.</p>
<p><strong>2024-07-03</strong>: I use Tailwind and SQLite via raw SQL.</p>
<p><strong>2024-08-02</strong>: I restart Yazzy and use Astro.</p>
<p><strong>2025-01-15</strong>: I restart Yazzy and use <a href="https://samwarnick.com/blog/the-perfect-stack/">The Perfect Stack</a>, which is Bun, Hono, Drizzle, and HTMX.</p>
<p><strong>Today</strong>: Should I restart Yazzy and use Astro again?</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CARTER_RULES.md]]></title>
            <link>https://carter.works/blog/2025-08-04-carter_rulesmd/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-08-04-carter_rulesmd/</guid>
            <pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Last updated: 2025-08-04.</em></p>
<p><em>Like a <code>.cursor/rules.md</code> or <code>CLAUDE.md</code> file, but for me.</em></p>
<p><em>I thought it might an interesting meditation to try and figure out what rules I personally follow when writing code. This is a _strong opinions, loosely held</em> approach to things—I'll do what I think is best, but I'm pretty easily convinced to pick something else, especially if you seem like you care. I don't know—Convince me there's a better approach 😜._</p>
<h2>Coding style related.</h2>
<ul>
<li>Use <a href="https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl"><code>oklch</code></a> for colors. It is easier to adjust the colors than <code>rgb</code>.</li>
<li>Tabs vs. spaces? Doesn't matter. Use whatever the convention on the project/language is.</li>
<li>Pure functions are ideal. (Are pure functions+closures just classes?)</li>
<li>Return early to avoid indentation</li>
</ul>
<pre><code>// ❌ bad
function foo(bar) {
  if (bar) {
    // blah blah blah
    // blah blah blah
    // blah blah blah
  }
  return true;
}

// ✅ good
function foo(bar) {
  if (!bar) return true;
  // blah blah blah
  // blah blah blah
}
</code></pre>
<ul>
<li>Documentation and code should live as close as possible to what they are documenting/describing.</li>
<li>Tailwind is a good base for design tokens.</li>
<li>Tailwind is not a design system.</li>
<li>Prefer many simple functions that <a href="https://www.infoq.com/presentations/Simple-Made-Easy/">complect together</a> over a few complex functions.</li>
<li>Microservices are a solution to a people-organization problem, not a technical one.</li>
<li>Start with a simple, bad solution and keep it until the shortcomings are obvious.</li>
<li>DRY is overrated. It's okay to repeat yourself, maybe four or five times even.
<ul>
<li><a href="https://overreacted.io/the-wet-codebase/">Dan Abramov, "The WET Codebase"</a> aka sometimes the subtle differences between branches are worth the duplication.</li>
<li><a href="https://ui.shadcn.com/docs">shadcn/ui</a> has a principle of "open code" because of "full transparency and easy customization".</li>
</ul>
</li>
<li><a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/">Make bad states impossible</a> as much as possible.</li>
</ul>
<h2>Coding architecture and ecosystem related.</h2>
<ul>
<li>Unit tests are mostly useless. They provide quick feedback, sure, but the also tightly couple your code to the test framework and to whatever your current implementation is. Prefer integration and end-to-end tests, mocking as little as possible and only at the boundaries of your codebase.</li>
<li>Rules are useless unless enforced. Enforcement should be automated.</li>
<li><a href="https://boringtechnology.club/">Choose boring technology</a>.
<ul>
<li>If your goal is to build a cool app, spend your time building the cool app, not inventing a new design system or coming up with the perfect build system paradigm.</li>
<li>Said differently, "do what makes you money." aka do what differentiates you from your competitors.</li>
<li>Said tangentially, if you find yourself <a href="https://en.wikipedia.org/wiki/Law_of_triviality">bikeshedding</a>, you're just avoiding real work. Go find real work that motivates you. But also if coming up with new design systems is your favorite thing, have fun and don't worry about having a place to put it yet.</li>
</ul>
</li>
<li>Carter's rules of project naming:
<ul>
<li>Names set the vibe/tone for the project.</li>
<li>A name should be:
<ul>
<li>Easily pronouncable in your main language (so you can talk about it out loud).</li>
<li>Easily internet-searchable (so users can find it).</li>
</ul>
</li>
<li>Uniqueness does not matter, but proximity does matter. It's okay if you want to write a new programming language and call it "frosted-flakes" because no one will confuse the programming language with the cereal. It's not okay if you want to call your new programming language "gopherlang" because that's too close to "golang". Use the American standard of "would this confuse the reasonable consumer?"</li>
<li>Apollo is a bad name. So are most Greek mythology names. (Guilty.)</li>
</ul>
</li>
<li>"Ease of use" (including "ease of maintenance") is a very high priority.</li>
<li>Convention over configuration. Most people don't want to read, they want to get things done. Not to say that "<a href="https://www.reddit.com/r/unixporn">ricing</a>" (term used broadly) is a bad hobby (it's a good hobby!) but configuration can get in the way.</li>
<li>In our age of LLMs, if you are going to use one to write a message to send to me, just send me what you told the LLM.</li>
<li>Constraints are what give us definition. Make sure the constraints are well-defined.</li>
</ul>
<h2>Not coding related.</h2>
<ul>
<li>Be honest, even with yourself, about what your goals are.</li>
<li>If you have an expectation, make it explicit and communicate it as early as possible.</li>
<li><a href="https://en.wikipedia.org/wiki/No_Silver_Bullet">There is no silver bullet.</a>.</li>
<li>Do what helps you sleep best at night.</li>
<li>Waiting for consenus sucks. Document your decisions and reasoning and move forward as best you can, then be flexible. This does not mean you should be a cowboy/rockstar coder and be insensitive to the needs of others. It means that it's okay to have confidence in your decision and move forward.</li>
<li>Humility and confidence are not mutually exclusive.</li>
<li>"It's about finding the right balance." is always true, but is only the start of something useful.</li>
<li>Instead of saying "sorry", say "thank you".</li>
<li>Ask "what do you need right now?" often.</li>
<li>Don't let perfect be the enemy of good enough.</li>
<li><a href="https://catskull.net/its-cool-to-be-nice.html">It's cool to be nice</a>. Root for everyone (except for the overconfident).</li>
<li><a href="https://en.wikipedia.org/wiki/Pareto_principle">The 80/20 rule</a> is often useful (80% of the time?). Pick something that will get you 80% of the way there quickly.</li>
<li>Em-dashes are cool.</li>
<li>Know when to stop selling. Stop talking after you've already won.</li>
<li>“We suffer more often in imagination than in reality.”—Seneca, <em>Letter 13, On groundless fears</em></li>
<li>"A ship in harbor is safe, but that is not what ships are built for."—John A. Shedd, <em>Salt from My Attic</em></li>
<li>Metaphors are cool.</li>
<li>Resist the urge to read the comments. At least, resist the urge to read the comments first.</li>
<li>"God, grant me the serenity to accept the things I cannot change, the courage to change the things I can, and the wisdom to know the difference."—<a href="https://en.wikipedia.org/wiki/Serenity_Prayer">Reinhold Niebuhr</a>
<ul>
<li>aka spend your time on the things you have the power to change.</li>
</ul>
</li>
<li>Focus on what is done, either well or poorly, rather than what is not done.</li>
<li>Put on your own oxygen mask first.</li>
<li>You can't be everything to everyone. Instead, be more to few.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tailwind's back, alright!]]></title>
            <link>https://carter.works/blog/2025-08-01-tailwinds-back-alright/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-08-01-tailwinds-back-alright/</guid>
            <pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>It happened again. The desire to change up the design of my site hit me. But...</p>
<p>The ad-hoc CSS model that I had created made everything so fragile. Turns out, if you have no system in mind, then everything is very fragile. Who knew! The only formal CSS model I have experience with is Tailwind (atomic?), so I stuck with that. Sorry BEM and BOM and and all those other three-letter acronyms. The desire it to spend my time <em>using</em> the design system, not creating one.</p>
<p>Really, though, I still love the CSS Zen Garden approach. It's possible with Tailwind—just set up some CSS variables. <a href="https://chriskirknielsen.com/">Christopher Kirk Nielsen's personal site</a> is beautiful and shows that you can still have <a href="https://bradfrost.com/blog/post/creating-themeable-design-systems/">a CSS Zen Garden-style themeable design system</a> in 2025. Great job Chris.</p>
<p>I think the next order of business is to create myself a design system. I have kind of been orbiting a paper-inspired design on my three main sites (this one, <a href="https://yazzy.carter.works">Yazzy, my reader-mode website</a>, and <a href="https://carterworks.github.io/rss-reader">my RSS reader</a>). It would be great to unify all those into a single CSS file full of Tailwind themes that I can import into each site. Unify, you know. <a href="https://atomicdesign.bradfrost.com/">Brad Frost's book, <em>Atomic Design</em></a> looks like it is a good place to start formalizing the "carterworks" theme. Then when I decide I don't like sepia-toned pages, I can just change up a few "design tokens" and be on my way, just like Chris.</p>
<p>Until next time, plebs.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Context isn't just for LLMs]]></title>
            <link>https://carter.works/blog/2025-07-07-context-engineering/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-07-07-context-engineering/</guid>
            <pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><a href="https://x.com/mattpocockuk/status/1941907646161777072">Matt Pocock shares "one weird git thing for local development"</a></p>
<blockquote>
<p>The one weird thing I always put in my .gitignore:</p>
<p>*.local.*</p>
<p>Makes it super simple to create temporary local scripts (fix-names.local.js)</p>
<p>Or save outputs as json (output.local.json)</p>
<p>Started doing this so many years ago but I guess I only just remembered no-one else does it.</p>
</blockquote>
<p>At work, I recently attended a training on Cursor background agents hosted by Anysphere employees. In the demonstration, <a href="https://x.com/nickwm?lang=en">Nick Miller</a> created a local directory and filled it with context—mockups, an implementation plan, a TODO list—anything relevant to the implementation of some features in his example repo. Of course, this context was fed into an LLM that started implementing features, but this model of development doesn't need to be restricted to LLM usage.</p>
<p>I've recently tried out this pattern for some tasks at work. I'll create a <code>.local</code> folder in the repo which is ignored in my global <code>.gitignore</code> file, create a file for a Jira ticket, copy in the text, screenshots, and comments into the file, then start annotating my work plan. I'll paste in API calls, TODOs, attempts—anything that might be relevant to the issue. It has really helped me feel more organized in these issues. It also makes the handoff to an LLM easier if I wanted to go that route, but I haven't tried it out yet.</p>
<p>This fits into the larger, recent trend of <a href="https://simonwillison.net/2025/Jun/27/context-engineering/">context engineering</a>. We need to define and shape the area that we are working in. Make the implicit things explicit. If you jump between many issues and projects, that context of implicit definitions and paths and ideas is much more difficult to reenter. These local context files have really helped me jump back into these issues. I also predict that this context sharing will be more and more important as a LLMs become a more common and more capable tool in the repertoire of the modern human.</p>
<p><strong>Short version:</strong> I like to take notes on my tasks and fill them with as much context as I can. It's helpful for me but also can benefit LLMs if you chose to use them.</p>
<p><strong>Closing thought:</strong></p>
<blockquote>
<p>Context is everything, its like feeding cookies to the cookie monster. It’s a way of bootstrapping LLM memory but actually targeted so it works well.</p>
</blockquote>
<p>from <a href="https://www.latent.space/p/o3-pro">"God is hungry for Context: First thoughts on o3 pro" by Alexis Gauba and Ben Hylak of latent.space and raindrop.io</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Simon Willison, "My approach to running a link blog", 2024-12-22]]></title>
            <link>https://carter.works/blog/2025-06-27-simon-willison-link-blog/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-06-27-simon-willison-link-blog/</guid>
            <pubDate>Fri, 27 Jun 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><a href="https://simonwillison.net/2024/Dec/22/link-blog/">Simon Willison, "My approach to running a link blog", 2024-12-22</a></p>
<p>Going to try this out.</p>
<blockquote>
<p>The point of that article was to emphasize that blogging doesn’t have to be about unique insights. The value is in writing frequently and having something to show for it over time—worthwhile even if you don’t attract much of an audience (or any audience at all).</p>
<p>In that article I proposed two categories of content that are low stakes and high value: <strong>things I learned</strong> and <strong>descriptions of my projects</strong>.</p>
<p>I realize now that link blogging deserves to be included a third category of low stakes, high value writing. We could think of that category as <strong>things I’ve found</strong>.</p>
<p>That’s the purpose of my link blog: it’s an ongoing log of things I’ve found—effectively a combination of public bookmarks and my own thoughts and commentary on why those things are interesting.</p>
</blockquote>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The 2025 theme]]></title>
            <link>https://carter.works/blog/2025-06-26-the-2025-theme/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-06-26-the-2025-theme/</guid>
            <pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I find that the urge to change the design of my site happens pretty frequently. That's probably a good thing—sense and fashion change. The biggest issue (maybe) is infrastructure. The 2024 version of this site was built on <a href="https://tailwindcss.com/">Tailwind</a>. However, I've always been enamored with the <a href="https://www.csszengarden.com/">CSS Zen Garden</a>—it has the ability to change the design of a site without changing the HTML.</p>
<img src="https://carter.works/assets/2024-site-theme-1000.avif" srcset="https://carter.works/assets/2024-site-theme-600.avif 600w, https://carter.works/assets/2024-site-theme-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="The 2024 theme of my site" width="1000" height="1507" loading="lazy" decoding="async" />
<p>But Tailwind doesn't make it easy to rip the CSS out of the HTML. It's all "component separation" and "utility classes" instead of the "styling" vs "content" separation of the Zen Garden.</p>
<p>I still like the sepia tones of <a href="https://ethanschoonover.com/solarized/">Ethan Schoonover's Solarized</a> and <a href="https://stephango.com/flexoki">Kepano's Flexoki</a>. Most of the changes this year came from "how do I rip out Tailwind and keep semantic HTML?"</p>
<p>Here's the result, as of writing-time:</p>
<img src="https://carter.works/assets/2025-site-theme-1000.avif" srcset="https://carter.works/assets/2025-site-theme-600.avif 600w, https://carter.works/assets/2025-site-theme-1000.avif 1000w" sizes="(max-width: 1000px) 100vw, 1000px" alt="The 2025 theme of my site" width="1000" height="1525" loading="lazy" decoding="async" />
<p>It's mostly the same. Same noise from Arc, same sepia tones. It uses <a href="https://github.com/Richard9394/MingCute">Richard9394's MingCute icons</a> I like the spacing of 2024, but I couldn't figure out how to do it while minimizing the separation between styling and content. I was inspired by <a href="https://gomakethings.com/hug-css-how-i-approach-css-architecture/">the HUG CSS approach</a> and <a href="https://simonwillison.net/">Simon Willison's long-running weblog</a>. It also makes heavy use of <a href="https://piccalil.li/blog/my-favourite-3-lines-of-css/">Andy Bell's "favorite 3 lines of CSS"</a></p>
<p>If you have any suggestions, either <a href="https://github.com/carterworks/site/issues">leave a Github issue</a> or email me. Make sure to mark it "OK to print."</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2024 in reviews]]></title>
            <link>https://carter.works/blog/2025-01-10-2024-in-reviews/</link>
            <guid isPermaLink="false">https://carter.works/blog/2025-01-10-2024-in-reviews/</guid>
            <pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h1>In and Out</h1>
<ul>
<li>📤 Out
<ul>
<li>Polyester</li>
<li>Viewing myself as a burden.</li>
<li>Doing things out of a sense of obligation instead of utility and joy</li>
<li>Cupcakes. They just aren't good. Brownies are better.</li>
<li>Trying to smoke meat on a charcoal grill</li>
</ul>
</li>
<li>📥 In
<ul>
<li>Things made of wool, wood, and leather</li>
<li>Viewing myself as a benefit</li>
<li>Writing</li>
<li>Fit pics 📸</li>
<li>Hats</li>
<li>Books outside of sci-fi and fantasy</li>
<li>Caspar David Friedrich. His works satisfy my desire for "little guy next to big things", landscapes, and fog.</li>
</ul>
</li>
<li>Never left
<ul>
<li>Quality over quantity</li>
<li>Elevated essentials</li>
<li>Big jackets</li>
<li>Tasty food</li>
<li>Dark chocolate</li>
<li>Being a dad</li>
<li>Following Jesus intentionally</li>
</ul>
</li>
</ul>
<h1>Recommendations</h1>
<img src="https://carter.works/assets/god-of-war-ragnarok-250.avif" alt="Game box image for God of War Ragnarök, featuring the burly warrior-god Kratos with his axe and furs standing in a winter wasteland with his archer son Atreus" width="250" height="375" loading="lazy" decoding="async" />
<p><em>God of War Ragnarök</em> is a big, cinematic game about punching things and being a father. What's not to like? I really enjoyed the beautiful visuals, the weightiness of the combat, and the wide variety of enemies (which was an issue I had with the first game).</p>
<img src="https://carter.works/assets/the-sword-of-kaigen-250.avif" alt="Book cover for &quot;The Sword of Kaigen&quot;, featuring a lone samurai warrior standing on a cliff, sword drawn, in front of a stormy sea" width="250" height="369" loading="lazy" decoding="async" />
<p>In <em>The Sword of Kaigen</em> by M.L. Wang, a society of elite warriors navigate generational trauma, misinformation, isolation, and duty. It was a kind of story (about family relationships from the multiple simultaneous view points) and I enjoyed how the fantastical fictional aspects created something that we all can related to even though we can't control individual water molecules and air pressure.</p>
<img src="https://carter.works/assets/gathering-moss-250.avif" alt="Book cover for Gathering Moss" width="250" height="383" loading="lazy" decoding="async" />
<p><em>Gathering Moss</em> by Robin Wall Kimmerer is about… moss. It's about moss, but in a cozy and sometimes-philosophical way.</p>
<img src="https://carter.works/assets/astropilot-400.avif" alt="Astropilot album artwork" width="400" height="267" loading="lazy" decoding="async" />
<p><a href="https://astropilot.bandcamp.com/">Astropilot</a> is an electronic ambient artist. I listen to his stuff while working and it pairs perfectly with rain sounds. His music makes me feel futuristic and peaceful.</p>
<h1>By the numbers</h1>
<ul>
<li><a href="https://www.goodreads.com/user/year_in_books/2024/50581556">58 and 26,855 pages read</a></li>
<li><a href="https://open.spotify.com/wrapped/share/share-0b61bb94b62a4a64b6127bf2dea3c349?si=AXa5zKLWS6WfDWsYdXGdNg&amp;feature=wrapped&amp;destination=datastories&amp;lang=en">39,776 minutes of (personal) music listened to</a></li>
<li>Video games: 21,624 minutes played
<ul>
<li><a href="https://s.team/y24/frvjmwn?l=english">Steam: 13,104 minutes</a></li>
<li><a href="https://wrapup.playstation.com/api/share-card/?id=8f21dc00a79baefe547a349961b81325e54817ac126d3f57bc56390aa7ccdb76&amp;locale=en-us&amp;handle=LiterallyACar&amp;avatar=https%3A%2F%2Fimage.api.np.km.playstation.net%2Fimages%2F%3Fformat%3Dpng%26w%3D160%26h%3D160%26image%3Dhttps%253A%252F%252Fimage.api.playstation.com%252Fprofile%252Fimages%252Ffilestore%252Fb5b41197%252F5515738883976572657%252F1704081055660.png%26sign%3D9f1b9a2a44441350ad05f66158c426b7ea43e937">Playstation: 6,360 minutes</a></li>
<li>Nintendo: 2,160 minutes</li>
</ul>
</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cash and I are taking a break.]]></title>
            <link>https://carter.works/blog/2024-08-30-cash-and-i-are-taking-a-break/</link>
            <guid isPermaLink="false">https://carter.works/blog/2024-08-30-cash-and-i-are-taking-a-break/</guid>
            <pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Recently, I've been working on moving my family's banking strategy from traditional checking and savings account to money market funds in a (Fidelity) cash management account. The migration has started, but I'm pretty happy with what I think will be the result.</p>
<p><strong>Please note:</strong> I am not a financial advisor. I am not a finance professional. I should not be in charge of your money. I don't even want to be in charge of my own money, but I'm the most inexpensive guy I know. This is not advice—just a record of a decision I have made and some background on why I did it.</p>
<h2>A quick primer for neophytes</h2>
<p>A bank account keeps track of your deposits. If you put $20 in, you can later ask for $20 back. The bank will invest most of that $20 (see: <a href="https://en.wikipedia.org/wiki/Fractional-reserve_banking">fractional reserve banking</a>) and pay you interest for the privilege. The bank decides how much they will pay you.</p>
<p>An investment account holds financial securities and assets, like stocks, bonds, and exchange traded funds (ETFs). One kind of ETF is a money market fund. They invest not in stocks, but in "highly liquid near-term instruments [including] cash, cash equivalent securities, and high-credit-rating, debt-based securities with a short-term maturity (such as U.S. Treasuries)" (<a href="https://www.investopedia.com/terms/m/money-marketfund.asp">from Investopedia</a>). For example,
<a href="https://fundresearch.fidelity.com/mutual-funds/summary/31617H102">SPAXX, the Fidelity Government Money Market Fund and the default position for new cash management accounts</a>, invests in 48.40% U.S. government repurchase agreements (are these bonds?), 29.47% U.S. Treasury bills, 21.00% "Agency floating-rate securities" (whatever those are), 3.45% agency fixed-rate securities, and 1.32% U.S. Treasury coupons. Bills, bonds, and coupons issued by the U.S. government are considered to be nearly as risk-free as the dollars that they also issue. ETFs are generally valued by "net asset value" (NAV), which is the classic assets minus liabilities. Money market ETFs target a NAV of $1.00 and pay dividends.</p>
<p>You may have heard of a money market account, which is a bank account, offered by a bank, that invests in money market-type securities for you. It is FDIC insured because it is a bank account that holds deposits, not an investment account that holds securities.</p>
<h2>A cash-management account</h2>
<p>Brokerages like <a href="https://www.fidelity.com/spend-save/fidelity-cash-management-account/overview">Fidelity</a> and <a href="https://investor.vanguard.com/accounts-plans/vanguard-cash-plus-account">Vanguard</a> offer investment accounts that can act like bank accounts. That means that they have an account number and routing number for ACH transactions like a normal checking account. Fidelity's offering goes the extra mile by offering a debit card, checks, and bill pay to make it near identical to a checking account. The difference is that, instead of taking dollar deposits and holding onto them, you purchase money market fund ETFs like SPAXX or VUSXX. Instead of paying a monthly interest payment, they return a dividend that is paid on a monthly basis. They're effectively the same thing.</p>
<h2>Pros of the all-money market fund strategy</h2>
<ul>
<li>SPAXX has a current annual return of 5.10% and seven-day yield of 4.98%. In comparison, Ally has an APY of 0.10% on the checking account and 4.20% on the savings account.</li>
<li>Instead of paying for things with my checking account except for large balances or worrying if there is too much or too little in the checking account, I can have all money flow in and out of a single account.</li>
<li>Currently, most payments come out of my checking account, except for big things like the credit card payment which come directly out the savings account. I try to have enough money in the checking account for all expected payments while also minimizing the balance in order to use the saving account's higher interest rate. This sometimes leads to overdrafts or excess transactions on the savings account, which has a monthly limit of 10 withdraws. With a single cash management account, all those worries go away. No moving money between accounts to get higher interest rates or avoid overdrafts.</li>
</ul>
<h2>Cons</h2>
<ul>
<li>An investment account with money market funds is not insured by the FDIC.
<ul>
<li>However, I believe the risk of losing my money is only slightly higher than the risk of losing the funds in a regular bank account, so I am not worried about it. An article from The Finance Buff that is linked at the end goes into more detail, but the short version is that, even though it is not an FDIC insured bank account, it is an SIPC insured investment account which ensures that I will still get my ETFs if Fidelity goes belly up and that the risk of the fund breaking the buck and the NAV dropping below $1 is pretty miniscule. It's larger than the risk of teeny risk of losing my dollar bills, larger than the itsy-bitsy risk of my bank doing something (what exactly, I don't know) where I can't get back my deposit, and larger than the not-impossible-but-as-close-to-impossible-as-I-can-imagine-zero-risk of $1 not being worth $1. I can live with that.</li>
</ul>
</li>
<li>The yield of a money market fund may drop beneath that of a savings account. However, if that happens and the difference is drastic enough to make a material difference, I can just move back to cash in a savings and checking accounts.</li>
<li>You can't deposit physical cash into a cash-management account. However, you can't deposit cash into an account at Ally either, so I already live in that reality.</li>
</ul>
<h2>Future plans</h2>
<p>Mr. The Finance Buff, in an article linked below, mentions that the equivalent of a savings account and certificates of deposit in this strategy is a ladder of short-term treasury bills and bonds. I haven't ever done CDs because I fear the illiquidity, but the future is about growth and getting better, right? It's an opportunity to learn.</p>
<h2>Further reading</h2>
<h3>On money market funds vs. classic bank accounts</h3>
<ul>
<li><a href="https://thefinancebuff.com/goodbye-banks-credit-unions.html">The Finance Buff, <em>Ditch Banks—Go With Money Market Funds and Treasuries</em></a></li>
<li><a href="https://thefinancebuff.com/brokerage-account-safe-no-fdic.html">The Finance Buff, <em>No FDIC Insurance—Why a Brokerage Account Is Safe</em></a></li>
<li><a href="https://www.investopedia.com/terms/b/breaking-the-buck.asp">Investopedia, <em>Breaking the Buck: When Money Market Shares Go Under $1</em></a></li>
</ul>
<h3>On one way to implement this strategy</h3>
<ul>
<li><a href="https://www.bogleheads.org/wiki/Fidelity:_one_stop_shop">Bogleheads Wiki, <em>Fidelity: one stop shop</em></a></li>
<li><a href="https://www.bogleheads.org/forum/viewtopic.php?t=266538">Bogleheads Forum, <em>Fidelity as a one stop shop</em></a></li>
<li><a href="https://thefinancebuff.com/fidelity-cash-management-checking-savings.html">The Finance Buff, <em>2 Ways to Use Fidelity as a Bank Account</em></a></li>
</ul>
<h3>On other, fun things about money and banks</h3>
<ul>
<li><a href="https://www.bitsaboutmoney.com/archive/the-alchemy-of-deposits/">Patrick McKenzie's Bits about Money, <em>The alchemy of deposits</em></a>, a.k.a. how your bank doesn't just take your twenty dollar bill and keep it safe, but rather how deposits are a financial product.</li>
</ul>
]]></content:encoded>
        </item>
    </channel>
</rss>