{"version":"https://jsonfeed.org/version/1","title":"Jim Nielsen’s Blog","home_page_url":"https://blog.jim-nielsen.com","feed_url":"https://blog.jim-nielsen.com/feed.json","author":{"name":"Jim Nielsen","url":"https://jim-nielsen.com/"},"items":[{"id":"/2026/mac-assed-family-feud/","date_published":"2026-07-08T19:00:00Z","title":"Family Feud: Mac-assed Mac App Edition","url":"https://blog.jim-nielsen.com/2026/mac-assed-family-feud/","tags":[],"content_html":"<p>“We asked 100 people: What are the top three companies on earth best positioned to make a world-class <a href=\"https://daringfireball.net/linked/2020/03/20/mac-assed-mac-apps\" >Mac-assed Mac app</a>?”</p>\n<p>Buzz!</p>\n<p>“Apple!”</p>\n<p>Survey says:</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-apple.jpg\" width=\"494\" height=\"315\" alt=\"Screenshot of the Family Fued leaderboard with three spots on the board. The top spot is revealed as “Apple”.\" data-og-image />\n\n</p><p>Yes! Apple at the number one spot.</p>\n<p>Makes sense. Who better to make the very definition of a great Mac app than the people who make the Mac? No brainer, I suppose. </p>\n<p>Granted, they’ve had <a href=\"https://daringfireball.net/2026/06/swiftui_only_makes_it_easy_to_develop_bad_apps\" >some misses</a>, but nobody bats 1000.</p>\n<p>Ok, let’s keep going. </p>\n<p>“We asked 100 people: What are the top three companies on earth best positioned to make a world-class Mac-assed Mac app?”</p>\n<p>Buzz!</p>\n<p>“Anthropic!”</p>\n<p>Survey says:</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-anthropic.jpg\" width=\"494\" height=\"315\" alt=\"Screenshot of the Family Fued leaderboard with three spots on the board. The top spot is revealed as “Apple” but a big giant “X” overlays the board indicating an incorrect answer.\" />\n\n</p><p>Wow, that’s odd huh? You’d think Anthropic would be right there at number two. Not only do they have billions of dollars, but they also develop, maintain, and control the super intelligence we’ll all soon be subservient too, right?</p>\n<p>Surely if anyone (besides Apple) is well positioned to make a world-class Mac app, it would have to be Anthropic — <a href=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-star-wars.jpg\" >right?</a></p>\n<p>And yet, here we are with <a href=\"https://daringfireball.net/2026/07/claudes_criminally_bad_mac_app_is_an_inside_job\" >Claude Desktop as an Electron app</a>.</p>\n<p>Ok, let’s keep going.</p>\n<p>“We asked 100 people: What are the top three companies on earth best positioned to make a world-class Mac-assed Mac app?”</p>\n<p>Buzz!</p>\n<p>“Adobe!”</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-dos-equis.jpg\" width=\"494\" height=\"315\" alt=\"Screenshot of the Family Fued leaderboard with three spots on the board. The top spot is revealed as “Apple” but two giant “X” markers overlay the board indicating an incorrect answer.\" />\n\n</p><p><a href=\"https://pxlnv.com/linklog/adobe-modern-user-interface/\" >Maybe not</a>.</p>\n<p>Buzz!</p>\n<p>“Google!”</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-tres-equis.jpg\" width=\"494\" height=\"315\" alt=\"Screenshot of the Family Fued leaderboard with three spots on the board. The top spot is revealed as “Apple” but three giant “X” markers overlay the board indicating an incorrect answer.\" />\n\n</p><p><a href=\"https://daringfireball.net/linked/2026/06/04/google-gemini-mac\" >Not so much</a>.</p>\n<p>I’m sorry, but that’s three strikes.</p>\n<p>Apparently it’s a mistake to assume that a big company with piles of cash is well poised to make a great Mac app  — even if they are enabled by hyper-super-intelligence.</p>\n<p>“Well who cares? It just goes to show you don’t have to make a good Mac app to be obscenely successful in terms of revenue!”</p>\n<p>Well, maybe that’s true.</p>\n<p>Actually, come to think of it, it kinda does seem like the bigger you get and the more money you make, the more likely it is you’re making an Electron app.</p>\n<p>There seems to be a correlation between “Mac-assed Mac app-edness” and “Company size/revenue”.</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/family-feud-mac-app-chart.png\" width=\"600\" height=\"400\" alt=\"A line chart. On the y-axis is the label “Mac-assed Mac app-ness” and on the x-axis is the label “Company size & revenue”. The line on the chart is trending down.\" />\n\n</p><p>Why is that?</p>\n<p>I’ll leave that as an exercise for the reader (though my mind is leaning towards something to do with <a href=\"https://blog.jim-nielsen.com/2026/observations-on-care/\" >care</a>).</p>\n<p>Thank you for <del>playing</del> reading this game of family feud.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/mac-assed-family-feud/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/notes-shuffle/","date_published":"2026-07-05T19:00:00Z","title":"Making a Shuffle Button","url":"https://blog.jim-nielsen.com/2026/notes-shuffle/","tags":["myNotesSite"],"content_html":"<p>I made some updates to <a href=\"https://notes.jim-nielsen.com\" >my notes blog</a>, including a change to how my “Shuffle” feature worked.</p>\n<p>Figured I’d blog about it.</p>\n<h2 id=\"shuffle-on-a-blog\">Shuffle? On a Blog?</h2>\n<p>At the time of this writing, I have 974 “notes” that I’ve published. </p>\n<p>For fun, I have a “shuffle” button that digs up a random note from the past. I like to press it from time to time and re-encounter some insight from the past.</p>\n<p>It’s like going through an old album, pulling out a random photo, and thinking, “Oh yeah, I remember this! Good times.”</p>\n<p>Like old photos, there’s also the occasional “that didn’t age so well”. </p>\n<p>But I find it fun to randomly dig up old insights from others and continue to be inspired.</p>\n<h2 id=\"how-did-it-work-before\">How Did It Work Before?</h2>\n<p>Since my site is built and hosted as static files without a runtime server, this feature required JavaScript to work.</p>\n<p>Every page had a snippet like this:</p>\n<pre><code class=\"language language-html\"><span class=\"hljs-comment\">&lt;!-- In the site navigation --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;js-shuffle&quot;</span>&gt;</span>Shuffle<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Way down at the end of the HTML --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span>\n  // All 974 note IDs injected by my SSG\n  const noteIds = [&#x27;id-1&#x27;, &#x27;id-2&#x27;, id-3&#x27;, &#x27;id-4&#x27;, &#x27;...&#x27;];\n  document.querySelector(&quot;#js-shuffle&quot;)\n    .addEventListener(&#x27;click&#x27;, () =&gt; {\n      // randomly grab an item in `noteIds`\n      const randomId = &#x27;...&#x27;;\n      window.location.href = `/n/${randomId}/`\n    })\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<p>Essentially: inject every note ID into every HTML page and, when the shuffle button is clicked, randomly grab one and navigate the user to it.</p>\n<p>Not the most elegant thing, but it worked.</p>\n<p>The problem was that every time I published a new post, every single page had to be re-uploaded to Netlify because every file’s hash would change and its etag/cache was invalidated.</p>\n<p>This made my builds slow. It also made it difficult, from a development perspective, to ensure refactors didn’t result in unexpected changes to output (using <a href=\"https://weborigami.org/builtins/dev/changes\" ><code>Dev.changes</code> from my SSG web origami</a>).</p>\n<p>So I decided to make a change.</p>\n<h3 id=\"what-about-a-no-js-approach\">What About a No-JS Approach?</h3>\n<p>Because I love to see if I can make things work without JavaScript, I had the thought to randomly write the <code>href</code> at build time using my SSG, which would result in output like this:</p>\n<pre><code class=\"language language-html\"><span class=\"hljs-comment\">&lt;!-- /notes/1 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;/notes/3&quot;</span>&gt;</span>Shuffle<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- /notes/2 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;/notes/1&quot;</span>&gt;</span>Shuffle<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- /notes/3 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;/notes/2&quot;</span>&gt;</span>Shuffle<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">a</span>&gt;</span>\n</code></pre>\n<p>And every time I re-build my site, just have this logic run on the static site generator so that it’s different <code>href</code> for every page, every time.</p>\n<p>Pros:</p>\n<ul>\n<li>Doesn’t require JavaScript</li>\n<li>Doesn’t require a server (request-time logic)</li>\n</ul>\n<p>Cons:</p>\n<ul>\n<li>File hashes change across builds (even if there’s no new content or template changes, every HTML page now has a different <code>href</code> for the shuffle link <em>for every build</em>). This makes deployments <em>way</em> slower because Netlify has to redeploy <em>every</em> file on <em>every</em> build. Plus Etags change so caching is basically ineffectual.</li>\n</ul>\n<p>I decided I didn’t want to do this, so on to JavaScript!</p>\n<h2 id=\"how-does-it-work-now\">How Does It Work Now?</h2>\n<p>My first thought was to create a single JSON file that contained all my note IDs. Then when the “Shuffle” button gets clicked, I fetch that, grab a random ID, and navigate the user, e.g.</p>\n<pre><code class=\"language language-html\"><span class=\"hljs-comment\">&lt;!-- In the site navigation --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">&quot;js-shuffle&quot;</span>&gt;</span>Shuffle<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">button</span>&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Way down at the end of the HTML --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&quot;module&quot;</span>&gt;</span><span class=\"language-javascript\">\n  <span class=\"hljs-keyword\">const</span> noteIds = <span class=\"hljs-keyword\">await</span> <span class=\"hljs-title function_\">fetch</span>(<span class=\"hljs-string\">&quot;/notes.json&quot;</span>).<span class=\"hljs-title function_\">then</span>(...);\n  <span class=\"hljs-comment\">// Handler code for when button is clicked</span>\n  <span class=\"hljs-comment\">// grab a note ID &amp; navigate to that location</span>\n</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<p>This would work. It localizes the caching issue to a single file, so only one file has to be invalidated/re-uploaded across builds.</p>\n<p>But in playing with it a little more, I decided to try something a little more...unconventional.</p>\n<p>I’ve written before about having <a href=\"https://blog.jim-nielsen.com/2025/lots-of-little-html-pages/\" >lots of little HTML pages</a> and I thought, “Can I put this functionality in a single HTML page rather than a JSON file?”</p>\n<p>And what I ended up with was a link, e.g.</p>\n<p><code>&lt;a href=&quot;/shuffle/&quot;&gt;Shuffle&lt;/a&gt;</code></p>\n<p>That when clicked navigates the user to a new page. That page has all the JS logic embedded in it, e.g.</p>\n<pre><code class=\"language language-html\"><span class=\"hljs-comment\">&lt;!-- In the site navigation --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span</span>&gt;</span>Shuffling...<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">span</span>&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- In the body of the page --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">noscript</span>&gt;</span>JS is required to use the Shuffle functionality<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">nocript</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script</span>&gt;</span>\n  // All 974 note IDs injected by my SSG\n  const noteIds = [&#x27;id-1&#x27;, &#x27;id-2&#x27;, id-3&#x27;, &#x27;id-4&#x27;, &#x27;...&#x27;];\\\n\n  // A slight delay so user sees &quot;Shuffling...&quot; effect\n  setTimeout(() =&gt; {\n    // randomly grab an item in `noteIds`\n    const randomId = &#x27;...&#x27;;\n    window.location.href = `/n/${randomId}/`\n  }, 300);\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">script</span>&gt;</span>\n</code></pre>\n<p>There are a few things I like about the experience this implementation provides.</p>\n<p>First: shuffle is a <em>route</em>, so I can navigate to it directly without using the GUI, e.g. <a href=\"https://notes.jim-nielsen.com/shuffle/\" >notes.jim-nielsen.com/shuffle</a></p>\n<p>Second: I handle the UI/X with a slight delay to make it appear like something is happening when you click the button. If you click the button and it immediately jumps to the next, randomized page, it almost seems to happen too fast. Like you’re left with this feeling of “What just happened?”</p>\n<p>But in this scenario, it navigates you to the “Shuffle” page, the button you just clicked turns into a spinner + text indicating something is happening, and there’s a slight (intentional) delay before the JS executes and sends you to a randomized note.</p>\n<p>I know it’s a bit weird. “Introduce artificial slowness? Are you crazy?” But I like it. It feels like the shuffle feature on an old music player.</p>\n<p>I remember one of my CD players had a “Shuffle” feature. When I’d click the button, it would display “Shuffling…” on the little black and white screen and you’d encounter this brief state where (I presume) the lens inside the hardware would move along the physical track to the spot where it would start reading a new, random song from the CD.</p>\n<p>The hardware constraints necessitated this kind of an experience, but I always liked it because it felt like the CD player was “thinking” about what track to pick next. This state clearly conveyed to me that my intent to shuffle was received and being followed. I liked that feedback, and it’s exactly what I wanted to do on my notes site (even though it was completely unnecessary).</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/shuffle-routes.png\" width=\"1146\" height=\"892\" alt=\"Screenshot of three routes side-by-side indicating a shuffle-like navigation between them.\" data-og-image />\n\n</p><p>I like having that brief moment of feedback where it’s very clear that your intention was received and being followed, vs. having it happen so fast you can’t even perceive precisely what happened.</p>\n<p>Here’s a video to show it in action:</p>\n<p><video controls src=\"https://cdn.jim-nielsen.com/blog/2026/shuffle-recording.mp4\" width=\"301\" height=\"655\"></video></p>\n<h2 id=\"why\">Why?</h2>\n<p>I know that’s a lot of information for something so small — and, arguably, unnecessary.</p>\n<p>But I still enjoy writing about how I make decisions when I build things for myself.</p>\n<p>Hence this post.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/notes-shuffle/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/intentionally-blank/","date_published":"2026-07-02T19:00:00Z","title":"This Page Left Intentionally Blank","url":"https://blog.jim-nielsen.com/2026/intentionally-blank/","tags":[],"content_html":"<p>I was <a href=\"https://mastodon.social/@jimniels/116850947778348241\" >popping off</a> about negation being an act of creativity, when <a href=\"https://blakewatson.com/blank/\" >Blake Watson introduce me</a> to the idea of the “This Page Intentionally Left Blank”-Project  <a href=\"https://web.archive.org/web/20180224043144/http://www.this-page-intentionally-left-blank.org/whythat.html\" >(Internet Archive)</a>:</p>\n<blockquote>\n<p>In former times printed manuals had some blank pages, usually with the remark “this page intentionally left blank”. In most cases there had been technical reasons for that. Today almost all blank pages disappeared […]</p>\n<p>[this project] tries to introduce these blank pages to the Web again […] to offer internet wanderers a place of quietness and simplicity on the overcrowded World Wide Web</p>\n</blockquote>\n<p>Ahead of its time.</p>\n<p>In our age of generative AI, a blank page is a deliberate act!</p>\n<p>So I went ahead <a href=\"https://www.jim-nielsen.com/blank/\" >made my own</a>.</p>\n<p>Go ahead and crawl that bots. <a href=\"https://blog.jim-nielsen.com/2023/robots-txt/\" >I don’t use <code>robots.txt</code></a>, but I’m thinking of making one specifically to say “Make sure you don’t miss this page Botty Bot.”</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/intentionally-blank/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/intelligence-isnt-enough/","date_published":"2026-06-28T19:00:00Z","title":"Notes from Bryan Cantrill’s “Intelligence is not Enough”","url":"https://blog.jim-nielsen.com/2026/intelligence-isnt-enough/","tags":["talkNotes"],"content_html":"<p>I quite enjoyed <a href=\"https://www.youtube.com/watch?v=bQfJi7rjuEk\" >this talk</a> from Bryan Cantrill where he discusses the difficult engineering problems they overcame while working on their company <a href=\"https://oxide.computer\" >Oxide</a>.</p>\n<p>Some of the problems they ran into were bugs. But these weren’t any ordinary bugs, they were company-destroying bugs: bugs that, if they couldn’t be fixed, would sink the entire company.</p>\n<p>And the difficulty in solving these bugs was that they had no precedent. Any documentation or knowledge they could find around the symptoms of the problem was actively incorrect.</p>\n<p>In fact, Bryan says that the team’s breakthroughs on these bugs were solutions that an artificial super intelligence would’ve never suggested because they ran <em>against</em>  all known and available reasoning, documentation, and knowledge.</p>\n<p>His point being: intelligence isn’t everything. Human values are still incredibly important.</p>\n<blockquote>\n<p>Intelligence alone does not solve problems like [the ones we encountered]. Our ability to solve these problems had nothing to do with our collective intelligence as a team. We’ve got a terrific team, but it’s a lot more than just intelligence. And in particular for these [kinds of] problems, and many like them, we had to summon the elements of our character not our intelligence. Our resilience. Our teamwork. Our rigor. Our optimism. […]</p>\n<p>We talk about super intelligence, but is anyone talking about super collaboration or super teamwork? We absolutely needed teamwork [at Oxide].</p>\n</blockquote>\n<p>If human values like curiosity are what led to breakthroughs — <em>not</em> the application of synthetic intelligence — why is there so much emphasis on intelligence these days? Bryan has a curt analysis:</p>\n<blockquote>\n<p>This infatuation with intelligence comes from people who just don’t get outside enough.</p>\n</blockquote>\n<p>He notes how intelligence isn’t everything in a job interview. Like, you don’t hire people by giving out an exam and taking whoever scores highest. You try to suss out other aptitudes. Nobody looks at applicants who lack values like teamwork or optimism and says, “Well, they can’t work with anyone and they’re incredibly unpleasant to be around, but their intelligence is great — let’s hire them!”</p>\n<p>Intelligence is great, but it’s not everything.</p>\n<blockquote>\n<p>We do a disservice to our own humanity when we pretend that [AI] can engineer autonomously.</p>\n</blockquote>\n<p>A cogent case for the values of our humanity.</p>\n<p>More like this please.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/intelligence-isnt-enough/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/tribute-to-om/","date_published":"2026-06-25T19:00:00Z","title":"My Om Malik Story","url":"https://blog.jim-nielsen.com/2026/tribute-to-om/","tags":[],"content_html":"<p>If you have’t heard, <a href=\"https://om.co/2026/06/24/1966-2026/\" >Om Malik passed away</a>.</p>\n<p>People are sharing <a href=\"https://news.ycombinator.com/user?id=cobbzilla\" >stories</a> of their <a href=\"https://news.ycombinator.com/item?id=48679995\" >graceful encounters</a> with him.</p>\n<p>This one is mine.</p>\n<hr>\n<p>Back at the beginning of 2021, <a href=\"https://blog.jim-nielsen.com/2021/writing-in-2020-and-2021/\" >I set a goal to write 72 blog posts</a>.</p>\n<p>I was puttering along, publishing whatever came to mind, mostly figuring that nobody was reading any of it.</p>\n<p>But that was ok. The process was therapeutic and it helped clarify my professional thinking, so I kept going.</p>\n<p>One day on Twitter I got a DM from someone with the handle <a href=\"https://x.com/om\" ><code>@om</code></a>.</p>\n<p>“I don’t know who this is,” I thought, “but damn that is a <em>great</em> handle!”</p>\n<p>Then I peaked at the follower count: over 1 million!</p>\n<p>“WTF? Who is this???” I thought.</p>\n<p>I’d never — then or since — been contacted by someone with such a high profile online.</p>\n<p>How was I even on this person’s radar?</p>\n<p>I continued on to his message:</p>\n<blockquote>\n<p>Jim I wanted to thank you for your blog. I am neither a developer or a designer but appreciate the web, the open web and in general normal, common sense writing from experts. </p>\n<p>I have quietly enjoyed your work — and hope you hit the target of 72 posts in 2021. My highly selfish ask, as I know it will feed my brain good important stuff. </p>\n<p>Have a wonderful weekend and a great writing year</p>\n</blockquote>\n<p>I was flabbergasted. Who was this person with such a high follower count saying such kind words and I’d never heard of him?</p>\n<p>I quickly went to Google. He had <a href=\"https://en.wikipedia.org/wiki/Om_Malik\" >his own Wikipedia</a>.</p>\n<p>“Om Malik…tech writer…founded Gigaom!” Ah-ha! I knew <a href=\"https://web.archive.org/web/20080607112840/http://gigaom.com/\" >Gigaom the company/blog</a>. It shaped a lot of my early exposure to the tech beat. I devoured it. I can still picture <a href=\"https://cdn.jim-nielsen.com/blog/2026/gigaom-logo.png\" >the logo</a> in my head!</p>\n<p>Now I knew the man behind it. Knowledge unlocked!</p>\n<p>I thanked him graciously for taking the time to send a message whose importance seemed incredibly lopsided in my favor.</p>\n<p>I quote his message here because I still think about it on occasion. His words then (as well as <a href=\"https://om.co/2022/02/01/the-daily-om-02-01-2022/\" >later</a> <a href=\"https://om.co/2023/02/13/streams-are-not-dead0yet/\" >ones</a>) continue to lift me up on days when I feel like an imposter. They remind me of the power of a small act of kindness, even within such a vast world wide web.</p>\n<p>I still think about his words.</p>\n<p>I still think about <em>him</em>.</p>\n<p>I’m sure many will for some time.</p>\n<p>And <em>that</em> is a legacy.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/tribute-to-om/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/blogging-stating-the-obvious/","date_published":"2026-06-24T19:00:00Z","title":"Blogging Can Just Be Stating The Obvious","url":"https://blog.jim-nielsen.com/2026/blogging-stating-the-obvious/","tags":[],"content_html":"<p><a href=\"https://daringfireball.net/2026/05/what_is_a_dickover\" >John Gruber writes about those annoying popups</a> every website seems to have now and while he does a great job tearing into these ubiquitous, user-hostile patterns, one of the things that stood out to me about his piece was this meta commentary on blogging. Here’s John:</p>\n<blockquote>\n<p>If you visit a website you should ... <em>see the website</em>. See its content. Be able to read the article whose page you are attempting to visit. Showing a “subscribe to our newsletter” or “accept our fucking cookies” dickover to someone trying to read an article on the web makes no more sense than sending out an email newsletter that only contains a link to read the newsletter on a webpage. A webpage should show the webpage. An email should show the email. I should not have to explain this.</p>\n</blockquote>\n<p>It’s funny how often blogging feels like being the little child in the story of <a href=\"https://en.wikipedia.org/wiki/The_Emperor%27s_New_Clothes\" >The Emperor’s New Clothes</a>. You’re just stating what seems obvious to you.</p>\n<p>I often look at my own posts and think, “There’s nothing novel, or important, or deep in here at all — is this even worth saying?”</p>\n<p>A post’s point can seem so glaringly obvious to me (and thus, I presume, others) it feels like a waste of time to even say it. As John says:</p>\n<blockquote>\n<p>A webpage should show the webpage. An email should show the email. I should not have to explain this.</p>\n</blockquote>\n<p>But then real-world examples of annoyance pile up around you and nobody talks about it, so you finally just have to <a href=\"https://blog.jim-nielsen.com/2025/icons-in-menus/\" >say it in a post</a> and <a href=\"https://blog.jim-nielsen.com/2025/mac-app-flea-market/\" >bring receipts</a>.</p>\n<p>You feel like someone gone mad: “Is <em>anyone</em> else seeing the same thing I’m seeing? And we’re just ok with this?”</p>\n<p>Very often, those are the <em>best</em> posts I read from others.</p>\n<p>So it must be that a key ingredient to blogging is simple: have a willingness to state something that seems obvious to you but nobody else is saying it.</p>\n<p>Or if someone else is saying it, just link to them and say, “Yes!!! This!!!”</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/blogging-stating-the-obvious/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/a-consistency-of-excellence/","date_published":"2026-06-22T19:00:00Z","title":"Consistency, But in Excellence Not Appearance","url":"https://blog.jim-nielsen.com/2026/a-consistency-of-excellence/","tags":[],"content_html":"<p>Consistency serves a purpose in visual design, but it seems to have become <em>the</em> purpose of a lot of visual design.</p>\n<p>Look no further than these evolutions of macOS icons (<a href=\"https://mastodon.social/@BasicAppleGuy/115888906340881425\" >image courtesy of BasicAppleGuy</a>):</p>\n<p class=\"image-container\"><img src=\"https://cdn.jim-nielsen.com/blog/2026/app-icon-consistency.png\" width=\"1440\" height=\"1440\" alt=\"Comparison of Apple app icon designs across three eras, arranged in a grid. The “Original” (skeuomorphic) column shows detailed 3D-style icons for apps like Final Cut Pro, Logic Pro, Pages, Motion, Compressor, MainStage, Keynote, Numbers, etc. The “Current” column shows the modern flat/gradient icon style for these apps. And the 'Creator Studio' column shows a unified, dark-background icon set with simplified glyphs in purple, blue, red, green, orange, etc., all for the same set of apps.\" data-og-image />\n\n</p><p>The Creator Studio icons are undeniably consistent visually: rounded rectangles, controlled gradients, simplified forms, restrained depth, etc.</p>\n<p>In contrast (and by modern standards) the originals seem heretically inconsistent. They lack coherence in visual details like shape, material, and lighting.</p>\n<p>But what they lack in visual consistency between one another, they make up for in excellence individually. </p>\n<p>In fact, their aversion to familial visual consistency almost seems like an intentional choice — a deliberate augmentation of individual purpose.</p>\n<p>What purpose? To be singularly representative and deeply iconic. </p>\n<p>Icons that are <em>iconic</em>.</p>\n<p>To be iconic, by definition, is to be famously distinctive.</p>\n<p>None of the Creator Studio icons, especially when held up as a suite, are iconic. None are atypical, they’re merely typical. </p>\n<p>All in pursuit of what, consistency — amongst each other and across platforms — as the overriding goal?</p>\n<p>This over-emphasis on “systems” design seems endemic to modern software.</p>\n<p>Systems prescribe rules because they are the easiest attributes to document, enforce, and automate — “All icons must use this shape, this lighting, this stroke.”</p>\n<p>Excellence, by contrast, is harder to systematize. It requires judgment, taste, care, experience, and a sensitivity to context — all in service of meaning and purpose, not superficial similarity.</p>\n<p>When you strive for consistency across a suite, individual elements lose their ability to be exceptional and iconic on their own terms. Consistency for the group becomes a ceiling on individual excellence.</p>\n<p>But if you flip that, if you make excellence the goal for each individual element, something interesting can happen: excellence becomes your motif of consistency. It’s no longer a consistency of shapes and gradients, but one of quality and intention that serves a deeper meaning and purpose than superficial visuals.</p>\n<p>Give me a consistency of excellence any day over a consistency of appearance.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/a-consistency-of-excellence/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/full-page-paralysis/","date_published":"2026-06-19T19:00:00Z","title":"Full Page Paralysis","url":"https://blog.jim-nielsen.com/2026/full-page-paralysis/","tags":[],"content_html":"<p>You’ve probably heard the term.</p>\n<p>It’s meant to convey how difficult it can be to <em>start</em> something.</p>\n<p>“Blank page paralysis”.</p>\n<p>But for my money, beginning is easy. <em>Finishing</em> is the hard part.</p>\n<p>In software, they call it “the last 90%”.</p>\n<p>In logistics, they call it “the last mile”.</p>\n<p>It’s that final stretch that’s disproportionately hard.</p>\n<p>Finishing makes something real and finite, subject to judgment.</p>\n<p>As I near completion, there’s a little voice in my head that says, “As long as it’s unfinished, there’s nothing wrong with it. It’s still potentially perfect!”</p>\n<p>I don’t struggle with blank page paralysis.</p>\n<p>But I am paralyzed in the face of a full page ready for publishing. </p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/full-page-paralysis/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/good-at-things/","date_published":"2026-06-10T19:00:00Z","title":"Being “Good” at Things","url":"https://blog.jim-nielsen.com/2026/good-at-things/","tags":[],"content_html":"<p>Golf content on social media is <a href=\"https://blog.jim-nielsen.com/2024/just-build-websites/\" >my online junk food</a> and the other day I came across <a href=\"https://www.reddit.com/r/golf/comments/1tdv00k/what_does_an_amateur_golfer_have_to_shoot_to_be/\" >a video</a> interviewing professional golfers that asks: “What does an amateur golfer have to shoot to be considered good?”</p>\n<p>It’s a leading question because the phrasing implicitly frames a number as the answer for <a href=\"https://blog.jim-nielsen.com/2025/measurement-and-numbers/\" >a qualitative measurement</a>, but I digress.</p>\n<p>All the pros give their answers. Some say you gotta shoot a number in 90’s. Others say the 80’s. Some even say the 70’s. Then along comes Collin Morikawa:</p>\n<blockquote>\n<p>I don’t think there’s a number, but I think you have to be able to finish out every hole without, like, picking up a two-footer.</p>\n</blockquote>\n<p>Love it! I don’t want to go too deep on a social media golf interview clip, but…</p>\n<p>I love how he breaks out of the question’s implicit framing and really strikes at the heart of the qualitative question: “What does it mean to be good at golf?”</p>\n<p>Being “good”, in his eyes, is not shooting a specific number. Numbers are standardized proxies for measurement across a wide variety of players, skill levels, and — to be quite frank — degrees of honesty. Anyone who has played golf knows that scores can be easily manipulated. On a casual outing amongst friends, my “82” may be very different than the “82” of the players in front of me — or even the players in my own group. It all depends on how you play the game.</p>\n<p>So saying “if you can shoot number ___” is a very lossy picture of what it means to be “good” at golf — at least for amateurs.</p>\n<p>That’s why I love Morikawa’s answer: if you finish every hole and don’t get a double bogey, you’re “good” at golf.</p>\n<p>Because guess what? Finishing is the hard part. The consistency. Showing up to every hole, finishing out based on the actual rules of the game, not taking mulligans, not picking up a two-footer and saying “That’s good.” (Or even missing a two-footer and re-putting and giving yourself the make.)</p>\n<p>Relieving yourself of the exacting burden of the reality of the game is the easy way to play, but it doesn’t make you a better golfer.</p>\n<p>I think that’s true of so many things we do as humans: programming, design, writing, etc. If you want to be “good” at what you do, do the hard, little things that others gloss over. Do them consistently and well, with discipline and perseverance.</p>\n<p>If you do, then I’d say you’re “good” at what you do because “good” isn’t a number. It’s quality. A disposition. A way of being.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/good-at-things/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "},{"id":"/2026/code-is-design/","date_published":"2026-06-07T19:00:00Z","title":"Coding Is Designing","url":"https://blog.jim-nielsen.com/2026/code-is-design/","tags":[],"content_html":"<p>Code isn’t just a way to implement a design, it’s a way to find one.</p>\n<p>With an interface, you have to <em>use</em> it, feel it, interact with it, and poke at it to see <a href=\"https://blog.jim-nielsen.com/2021/designing-between-the-lines/\" >the relationships between things</a>.</p>\n<p>Change X, see Y react.</p>\n<p>If it doesn’t feel right, tweak it.</p>\n<p>Change X again, now Y reacts differently.</p>\n<p>Better.</p>\n<p>Keep tweaking — this here, that there, until the relationships of all the disparate elements fall into place as a single whole. </p>\n<p>Balanced.</p>\n<p>Design is “how it works” and code is the tool to specify how it works.</p>\n\n    <hr />\n    \n\n    <p>\n      Reply via:\n      \n\n      <a\n        href=\"mailto:jimniels%2Bblog@gmail.com?subject=Re:%20blog.jim-nielsen.com/2026/code-is-design/\"\n        >Email</a\n      >\n      · <a href=\"https://mastodon.social/@jimniels\">Mastodon</a> ·\n\n      <a href=\"https://bsky.app/profile/jim-nielsen.com\">Bluesky</a>\n    </p>\n\n    \n  "}]}