<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>JOODALOOP</title>
    <link>https://joodaloop.com/</link>
    <atom:link href="https://joodaloop.com/index.xml" rel="self" type="application/rss&#43;xml" />
    <description>JOODALOOP JOODALOOP JOODALOOP JOODALOOP</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    
    <lastBuildDate>Wed, 22 Apr 2026 00:00:00 &#43;0000</lastBuildDate>
    
    <item>
      <title>My site has a Makefile now, also offline browsing</title>
      <link>https://joodaloop.com/riffs/makefile/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/makefile/</guid>
      <description>For the longest time, I lived in a terrific awe at the magic of the build step. Parsing, compiling, transpiling, and everything else that goes into the process of bundling web stuff was an arcane ritual that I crossed my fingers, closed my eyes, and hoped to never see a failure from. As a result, I have never written a build script, nor configured Webpack.&#xA;</description>
      <content:encoded><![CDATA[<p>For the longest time, I lived in a terrific awe at the magic of the build step. Parsing, compiling, transpiling, and everything else that goes into the process of bundling web stuff was an arcane ritual that I crossed my fingers, closed my eyes, and hoped to never see a failure from. As a result, I have never written a build script, nor configured Webpack.</p>
<p>When I finally opened my eyes to the truth of how these things work (spoiler: it&rsquo;s just moving strings around from one set of files to another), the fear abated. But I still held on to a sense of &ldquo;purity&rdquo; — I would get by with as little fiddling as possible.</p>
<p>But this week, I wanted my site to use a <a href="https://web.dev/articles/service-worker-caching-and-http-caching" target="_blank" rel="noopener">Service Worker</a> to provide an instant navigation experience across pages, <strong>even in the absence of a network connection</strong>. As per first instinct, I went looking for the Hugo-blessed way to do this and&hellip;didn&rsquo;t find one. It turns out, I&rsquo;d need a <strong>post-build script.</strong> The horror! (if I was still a coward)</p>
<p>But I&rsquo;m not anymore, and I have the LLMs to write the script and Makefile so I don&rsquo;t need to learn the syntax. Nor do I have to live with a sense of <em>&ldquo;dear Netlify, please build my site from my Git push, thank you so much&rdquo;</em>, because I can build the site myself and upload it directly with the <a href="https://cli.netlify.com/commands/deploy/" target="_blank" rel="noopener">Netlify CLI</a>. As a bonus, it&rsquo;s around 50% faster than the old Git commit → Github → Netlify → CDN workflow I had earlier.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>An ontology of microblogging</title>
      <link>https://joodaloop.com/riffs/microblog-ontology/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/microblog-ontology/</guid>
      <description>I’ve added a new top-level page to this site. It’s called ~~~ and can be found at joodaloop.com/~ or in the nav bar. The name is a big quirky, I admit, but format is simple:&#xA;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve added a new top-level page to this site. It&rsquo;s called <strong>~~~</strong> and can be found at <a href="/~">joodaloop.com/~</a> or in the nav bar. The name is a big quirky, I admit, but format is simple:</p>
<p><strong>One Big Markdown File where new entries are appended to the top.</strong></p>
<p>The hope is that I practice writing things down more often, in a place where it doesn&rsquo;t feel like I&rsquo;m &ldquo;notifying&rdquo; people, or writing to an audience at all. There is no effortless way to link to entries, there is no RSS feed, and there is no organisation other than the chronological. It as an attempt to move things that look like personal notes into a public-facing page. Inspired, in no small part, by Nadia&rsquo;s (recently taken down!) <a href="https://archive.ph/lqh2i#selection-69.1-85.140" target="_blank" rel="noopener">Notes</a> pages.</p>
<p>While designing this new publishing location, I was forced into thinking about all the existing formats on my website; now grown from 2 items to 3&hellip;</p>
<ul>
<li>Evergreen <a href="/writing">writing</a> (lists, notebooks, or essays) that require real investment into polish and maintenance.</li>
<li><a href="/riffs">Riffs</a>, which are temporal publications, used primarily to wonder aloud in brief or send out announcements.</li>
<li><a href="/~">~~~</a>, which I almost named &ldquo;Stream&rdquo;, &ldquo;Flow&rdquo;, and &ldquo;Flux&rdquo;, but ultimately decided I had enough named sections on my website. Used for thoughtdumps.</li>
</ul>
<p>One might well ask &ldquo;why aren&rsquo;t you using <a href="https://streams.place" target="_blank" rel="noopener">Streams</a> for this?&rdquo;, seeing as I made and maintain a service for microblogging. As all good questions, it leads to a fruitful line of enquiry — culminating in the taxonomy below, which I think covers all the things one can achieve with a  microblog.</p>
<ol>
<li>Quick capture</li>
<li>Glib phrases &amp; jokes</li>
<li>Journalling</li>
<li>Commentary</li>
<li>Shower thoughts</li>
<li>Thread-length extempore posts</li>
<li>Personal/project updates</li>
<li>Conversation</li>
<li>Signal boosting/curation/recommendations</li>
<li>In-group signalling!</li>
</ol>
<p>I will continue to use Streams for #1 (which makes sense, given that&rsquo;s what it was built for), but I don&rsquo;t think the other uses are suited to it. For example, I prefer to write Riffs in a proper text editor and over a period of many minutes. Not as a hurried message into a Telegram channel. Conversation, jokes, updates and recommendations are similarly all best done in places that have the capability for interaction.</p>
<p>The medium and the message and me have yet to exhaust all possible combinations of formats and workflows — with <strong>~~~</strong> as the latest addition to the set. My guess is that it&rsquo;s primary roles will be journal, commentary, and thought-posting, which are currently underserved by existing outlets (believe it or not, I try to restrict my commentary on Twitter out of respect to my followers).</p>
<p>And I think it&rsquo;s particular combination of features (self-ownership, low effort bar, personal/limited audience) is sufficiently novel that <em>you</em> should try adding one to your site!</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Bad Tech</title>
      <link>https://joodaloop.com/riffs/bad-tech/</link>
      <pubDate>Tue, 03 Mar 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/bad-tech/</guid>
      <description>In the before times (pre-enslopification of Twitter, and pre-LLMs (some would say they’re the same thing)), I had an exchange with Imp that produced the list you see below.&#xA;</description>
      <content:encoded><![CDATA[<p>In the before times (pre-enslopification of Twitter, and pre-LLMs (some would say they&rsquo;re the same thing)), I had an exchange with <a href="https://bsky.app/profile/imperialauditor.bsky.social" target="_blank" rel="noopener">Imp</a> that produced the list you see below.</p>
<p>I no longer remember which of us began the discussion, but the question at hand was about <strong>technology that is often looked upon as a mistake in hindsight, or has dystopic vibes.</strong></p>
<ul>
<li>DDT</li>
<li>Thalidomide</li>
<li>Microplastics</li>
<li>Leaded gas/pipes</li>
<li>Asbestos</li>
<li>CFCs/HCFs</li>
<li>Lobotomy</li>
<li>Biological weapons</li>
<li>Nuclear weapons</li>
<li>Cloning</li>
</ul>
<p>There are two reasons for me resurfacing this old list. The first is that I happened to be cleaning up my drafts and scattered notes (as part of a focusing exercise re. my career, but that&rsquo;s another story). The second is because I find <a href="https://www.robinsloan.com/lab/greenfield/" target="_blank" rel="noopener">Robin Sloan&rsquo;s</a> &ldquo;this is the best it will ever be&rdquo; sentiment to be brutally real-headed.</p>
<blockquote>
<p>It’s interesting and useful to imagine — really visualize — the chatbots and agents in ten years or twenty … barnacled with gunk … locked in a permanent cat-and-mouse game with their adversaries … just as a platform like Google is today. In 2036, you send your AI agent out into the internet, and it returns battered, bedraggled, inexplicably enthusiastic about a bargain flight to Bermuda.</p></blockquote>
<p>Felt like a congruent enough set of things to make a small post about. It&rsquo;s easy to miss the bad for the good when it comes to technological &ldquo;progress&rdquo;, and sometimes we&rsquo;re not lucky enough to be able to walk back things that could be reassessed (see: smartphones).</p>
<p>So, cheers to all the times we&rsquo;ve been wise enough to take the one step back. And pour one out for the things we lose when we&rsquo;ve decided not to. I fear this is one of those times.</p>
<p><strong>P.S:</strong> Since it is now 2026, I can of course ask the bots to expand on Imp&rsquo;s excellent list. Here&rsquo;s <a href="https://claude.ai/public/artifacts/0561dedc-8aef-4650-8e77-9c21d75d4c53" target="_blank" rel="noopener">Claude&rsquo;s attempt</a> at doing so.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>The Great Realtime Collaboration Misdirection</title>
      <link>https://joodaloop.com/riffs/collaboration-misdirection/</link>
      <pubDate>Tue, 10 Feb 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/collaboration-misdirection/</guid>
      <description>If I had stats and figures to back this up, I’d turn it into a proper post. As it stands, I only have anecdotes and gossip to speak from:&#xA;</description>
      <content:encoded><![CDATA[<p>If I had stats and figures to back this up, I&rsquo;d turn it into a proper post. As it stands, I only have anecdotes and gossip to speak from:</p>
<blockquote>
<p>You would assume that people do live collaborative work on the same document. In practice, they get on a video call and one of them edits, the rest watch.</p>
<p><cite> My memory of something <a href="https://sunilpai.dev/" target="_blank" rel="noopener">Sunil Pai</a> once said </cite></p></blockquote>
<p>I <em>really</em> like stateless systems with few moving parts. Static sites are so simple, I can host hundreds of them for free. I adore <a href="https://www.robinsloan.com/lab/cloud-study/" target="_blank" rel="noopener">edge functions</a> of all kinds (especially Cloudflare Workers) – being able to spin up microseconds of cloud compute on demand is lovely. Object storage like S3 is so cheap, people choose to <a href="https://blog.cloudflare.com/sqlite-in-durable-objects/#the-mismatch-in-functionality-between-local-disk-and-object-storage" target="_blank" rel="noopener">build</a> <a href="https://youtu.be/4n-2AXhbZPw?si=4iKg1rLBHDzgtqpj" target="_blank" rel="noopener">entire</a> <a href="https://www.youtube.com/watch?v=_yb6Nw21QxA" target="_blank" rel="noopener">databases</a> atop it. We now have <a href="https://s2.dev/" target="_blank" rel="noopener">serverless streams</a> that I expect to be similarly amazing.</p>
<p>Realtime sync is often more complicated. I won&rsquo;t deny that it&rsquo;s <em>cool</em> to make a change in one tab, and watch the app update in a different tab/window/device, but recently I&rsquo;ve been asking &ldquo;is that really necessary?&rdquo;. Do you really need to provision stateful servers and always on sync systems just to make people&rsquo;s cursors move around a screen in realtime?</p>
<p>Figma is the poster child of realtime syncing, they spent ~3 years designing the <a href="https://www.figma.com/blog/how-figmas-multiplayer-technology-works/" target="_blank" rel="noopener">whole thing</a>. You&rsquo;ll hear some people say that this let them beat Adobe and Sketch in the design tool arena. I don&rsquo;t buy this narrative. The decisive feature was &ldquo;share your design files with a URL&rdquo;, not the ability for two people to move rectangles around together.</p>
<p>To me, the need for realtime editing in applications is greatly exaggerated. Think about how rare it is to:</p>
<ul>
<li>get two people to be in the same place at the same time</li>
<li>have a task where more than one person makes changes at a time</li>
<li>want other people <a href="https://www.inkandswitch.com/upwelling/#the-fishbowl-effect-of-real-time-collaboration" target="_blank" rel="noopener">peering over their shoulder</a> while they work</li>
</ul>
<p>And that&rsquo;s if your synced app is multiplayer at all. For many apps, the only person I&rsquo;m collaborating with is myself. I&rsquo;m certainly not holding my phone and laptop open at the same time, frantically typing into each, expecting edits to sync across as I do so. If we have a future where more people make apps for themselves, it would be nice if they used cheap, simple systems to move data around. Sync is good, it doesn&rsquo;t always have to be live.</p>
<p><strong>But with agents, things might change.</strong> They are unrelenting daemons, ready to join in at a moment&rsquo;s notice, and stay working for as long as you pay them to. I can imagine applications where having them keeping up with realtime changes is a big deal. Especially if there&rsquo;s multiple agents all working really fast. They might just be <a href="https://sunilpai.dev/posts/local-first-ai-agents/" target="_blank" rel="noopener">the killer app</a> for sync engines.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Databases</title>
      <link>https://joodaloop.com/databases/</link>
      <pubDate>Fri, 06 Feb 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/databases/</guid>
      <description>Talks“Transactions: myths, surprises and opportunities”: The best explanation of the various consistency and isolation levels in database I’ve ever seen.&#xA;</description>
      <content:encoded><![CDATA[<h2 id="talks" class="prose-heading">Talks<button type="button" class="copy-heading" data-link="https://joodaloop.com/databases/#talks" aria-label="Copy link to section: Talks" onclick="copyHeadingLink(this, event)"></button></h2><p><strong><a href="https://www.youtube.com/watch?v=5ZjhNTM8XU8" target="_blank" rel="noopener">&ldquo;Transactions: myths, surprises and opportunities&rdquo;</a>:</strong> The best explanation of the various consistency and isolation levels in database I&rsquo;ve ever seen.</p>
<p><strong><a href="https://www.youtube.com/watch?v=v2RJQELoM6Y" target="_blank" rel="noopener">Is Kafka a Database?</a>:</strong> I was already bought into single-threaded event streams (<a href="https://www.hytradboi.com/2025/2016d6c4-b08d-40b3-af2f-67926ca8521f-enough-with-all-the-raft" target="_blank" rel="noopener">as opposed to Raft</a>, etc) as a way to do writes in an application, this talk just confirmed I was right to do so.</p>
<p><strong><a href="https://www.hytradboi.com/2025/943c54af-ea5f-4d3e-b3e3-7767b5a1bfc5-good-thing-were-not-writing-a-database" target="_blank" rel="noopener">Good thing we&rsquo;re not writing a database</a>:</strong> A useful perspective on what <a href="https://automerge.org/" target="_blank" rel="noopener">Automerge</a> is, and what it&rsquo;s not trying to be.</p>
<p><strong><a href="https://www.hytradboi.com/2025/f2cc03cb-14fc-42f4-ad38-b4b15a15815f-serverless-primitives-for-the-shared-log-architecture" target="_blank" rel="noopener">Serverless primitives for the shared log architecture</a>:</strong> Re. S2.</p>
<h2 id="writing" class="prose-heading">Writing<button type="button" class="copy-heading" data-link="https://joodaloop.com/databases/#writing" aria-label="Copy link to section: Writing" onclick="copyHeadingLink(this, event)"></button></h2><p><strong><a href="https://tom.preston-werner.com/2009/05/19/the-git-parable.html" target="_blank" rel="noopener">The Git Parable</a>:</strong> Most of the interesting ideas in databases can be found in Git — hashes, immutable data structures, branching, distributed state, etc.</p>
<p><strong><a href="https://jzhao.xyz/posts/bft-json-crdt" target="_blank" rel="noopener">Building a BFT JSON CRDT</a></strong></p>
<p><strong><a href="https://www.datasyncbook.com/" target="_blank" rel="noopener">Data Synchronization: Patterns, Tools, &amp; Techniques</a></strong></p>
<p><strong><a href="https://www.brianstorti.com/replication/" target="_blank" rel="noopener">A Primer on Database Replication</a></strong></p>
<p><strong><a href="https://www.benstopford.com/2015/02/14/log-structured-merge-trees/" target="_blank" rel="noopener">Log Structured Merge Trees</a></strong></p>
<p><strong><a href="https://www.somethingsimilar.com/2013/01/14/notes-on-distributed-systems-for-young-bloods/#robustdist" target="_blank" rel="noopener">Notes on Distributed Systems for Young Bloods</a></strong></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Clocks as progress bars, please</title>
      <link>https://joodaloop.com/riffs/clock-as-progress-bar/</link>
      <pubDate>Sat, 31 Jan 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/clock-as-progress-bar/</guid>
      <description>From an information design standpoint, the analog 3-handed clock is pretty terrible, needing a glance at three disparate points and multiple spatial calculations to arrive at a few numbers. But we forgive this inefficiency because they look rather nice.&#xA;</description>
      <content:encoded><![CDATA[<p>From an information design standpoint, the analog 3-handed clock is pretty terrible, needing a glance at three disparate points and multiple spatial calculations to arrive at a few numbers. But we forgive this inefficiency because they look rather nice.</p>
<p>What is less forgivable however, is the concept of displaying time as an isolated, static pair of numbers. As a general rule, I avoid numbers when visualizing <em>quantities</em>. I prefer a graphic that can convey the scale of the quantity instead (like the impact bars I added to items of the <a href="https://frontier.renaissancephilanthropy.org/" target="_blank" rel="noopener">Frontier 2025 site</a>). Symbols are indirection, and it&rsquo;s hard to <em>feel</em> quantities by looking at their numerical representation.</p>
<p>I prefer my numbers to be placed within a narrative; the steady climb of a progress graph, a series of comparable lines, as squares of varying brightness. Especially when dealing with time, a quantity so linked to change that <a href="https://www.google.com/search?q=is&#43;time&#43;a&#43;measure&#43;of&#43;change&amp;sca_esv=d0ce05c189b2c34f&amp;sxsrf=ANbL-n7rDReGeqGuyaTRHfIz8PXcmY4r1Q:1769860056972&amp;ei=2Ot9acyIO8LG4-EPpMenqAc&amp;start=10&amp;sa=N&amp;sstk=Af77f_c23ux13Dqp_fOMQ_WPKxUBkMQzsH7OmeNwGUrSZD--UrUh_VBTywEFwlat9tqs_GJEj73X_-hRIQQnIxgdPia3AtDZwqejHA&amp;ved=2ahUKEwjM1P2_2rWSAxVC4zgGHaTjCXUQ8tMDegQIDRAE&amp;biw=1900&amp;bih=1035&amp;dpr=2&amp;aic=0" target="_blank" rel="noopener">some people</a> like to define it as a measure of such. It feels silly that I have to compare 4:00 PM and 8:00 PM through mental arithmetic instead of being able to simply <strong>see the difference</strong>.</p>
<p>And the subtractions are numerous and happening all the time. How much time until bed? When is the next meal? How much time has passed since I last picked up my phone? Somehow doing the subtraction in my head and arriving at an abstract number (2 hours on Twitter&hellip;) doesn&rsquo;t feel as visceral as a physical representation.</p>
<p>I&rsquo;ll admit I also hope that a 24-hour bar will add firmer bounds to a &ldquo;day&rdquo;&hellip;</p>
<article class='chat start-them'>
<blockquote>
<p>why do you want a progress bar</p>
<p>that implies deadline</p></blockquote>
<blockquote>
<p>because my day ends!</p>
<p>one reason i ruin sleep is i refuse to let the day end</p></blockquote>
</article>
<p>We have a few <a href="https://twitter.com/YearsProgress" target="_blank" rel="noopener">famous</a> <a href="https://twitter.com/ProgressBar202_" target="_blank" rel="noopener">bars</a> and <a href="https://apps.apple.com/us/app/one-year-daily-journal/id6740510762" target="_blank" rel="noopener">grids</a> for tracking progress through the year, a Japanese <a href="https://kingjim.com/products/vbt10" target="_blank" rel="noopener">timer progress bar</a>, and a ridiculous abuse of the <a href="https://en.wikipedia.org/wiki/Doomsday_Clock" target="_blank" rel="noopener">clock metaphor for existential risk</a>. But nobody wants to give me a 24 hour progress bar that I can pay money for and have delivered to my house. The best I could find were:</p>
<ul>
<li>this mock image (from a seemingly adulterous husband?) at #14 on, uh&hellip;the <a href="https://archive.today/2026.01.31-112731/https://walyou.com/blog/2010/11/22/24-geekiest-clocks-ever-made/" target="_blank" rel="noopener">24 Geekiest Clocks Ever Made</a>.</li>
<li>an <a href="https://www.instructables.com/Reversed-Time-Progress-Bar-Wall-Clock/" target="_blank" rel="noopener">Instructables page</a> for a DIY progress bar clock made form 3D-printed parts and LEDs.</li>
<li>a <a href="https://www.reddit.com/r/kustom/comments/3b4pm3/using_a_progressbar_as_a_clock/" target="_blank" rel="noopener">single Reddit post</a> from 2015 asking for the same thing as me</li>
<li>an overpriced <a href="https://cwandt.com/products/superlocal?variant=41099183128732" target="_blank" rel="noopener">circular clock</a> that is <em>kinda</em> a progress bar</li>
</ul>
<p><strong>P.S:</strong> I do have a particular design in mind (see my <a href="/workbench">Workbench</a> page), but the more variety the better.</p>
<p><strong>P.P.S:</strong> It&rsquo;s slightly sad how most of the popular time-related progress bars are about scarcity (years <em>left</em> in an 80-year lifespan, days <em>left</em> in a year), because those clocks run out <strong>once</strong> and then it&rsquo;s all over. A daily clock is much less cruel because it will refresh again the next morning! You get to see the hours fill up today, but with the knowledge that there will be new ones soon.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Software Design Ideas I Dislike</title>
      <link>https://joodaloop.com/design-dislikes/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/design-dislikes/</guid>
      <description>Obviously, many of these opinions are more personal than objective. But that’s true for all the software we use everyday. Most design decisions can be traced back to one man’s (yeah, usually a man) strong preference. We live with their consequences decades later.&#xA;</description>
      <content:encoded><![CDATA[<p>Obviously, many of these opinions are more personal than objective. But that&rsquo;s true for all the software we use everyday. Most design decisions can be traced back to <a href="https://archive.ph/9dLYg" target="_blank" rel="noopener">one man</a>&rsquo;s (yeah, usually a man) strong preference. We live with their consequences decades later.</p>
<p>So I hope you read these as just another <a href="/riffs/design-calibration">calibrative data point</a>, not as dictums. Also, I hope you give me credit for turning this into one long list instead of milking it for multiple short riffs.</p>
<h2 id="indirection" class="prose-heading">Indirection<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#indirection" aria-label="Copy link to section: Indirection" onclick="copyHeadingLink(this, event)"></button></h2><p>Recently, my personal design work has coalesced around the prevention of <a href="/interface-anxiety">interface anxiety</a>. An extra click, a different screen, and the expectance of latency between them are all experiences that add up to a fragile-feeling environment.</p>
<p>But there&rsquo;s a more subtle version, that of abstraction and spooky action at a distance. Tying things together (i.e. <a href="https://www.youtube.com/watch?v=SxdOUGdseq4" target="_blank" rel="noopener">complexity</a>) in vague and shadowy ways is the surest way to build a confusing system.</p>
<blockquote>
<p>Back in 1984, explanations of the original Mac interface to users who had never seen a GUI before inevitable included an explanation of icons that went something like this: &ldquo;This icon represents your file on disk.&rdquo; But to the surprise of many, users very quickly discarded any semblance of indirection. This icon is my file. My file is this icon. One is not a &ldquo;representation of&rdquo; or an &ldquo;interface to&rdquo; the other. Such relationships were foreign to most people, and constituted unnecessary mental baggage when there was a much more simple and direct connection to what they knew of reality.</p>
<p><em>[many sentences later]</em> Even the smallest disconnection shatters the illusion, turning what was once an utterly convincing and understandable world of files and folders into an arbitrary heap of windows, full of icons and widgets, signifying nothing.</p>
<p><cite><a href="https://archive.arstechnica.com/paedia/f/finder/finder-3.htm" target="_blank" rel="noopener">John Siracusa</a>, &ldquo;About the Finder&hellip;&quot;</cite></p></blockquote>
<h3 id="hyperlinks" class="prose-heading">Hyperlinks<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#hyperlinks" aria-label="Copy link to section: Hyperlinks" onclick="copyHeadingLink(this, event)"></button></h3><p>I love them enough to use them all over my site, but i do <em>not</em> love:</p>
<ol>
<li>&hellip;how they jump to a completely different context with no hint re. where you came from or intended to do.</li>
<li>&hellip;how most browsers don&rsquo;t provide even a <em>hint</em> of where a link you intend to click will lead to. I&rsquo;m not asking for <a href="https://uiw.tf/link-preview" target="_blank" rel="noopener">speculative interfaces</a> or a completely <a href="https://browser.horse" target="_blank" rel="noopener">new browser</a> – a simple link preview showing up on hover is enough to prevent every navigation from being a blind leap. My browser of choice, Arc, does this really nicely:
<video src="https://media.joodaloop.com/link-hover-previews.mp4" controls>
Your browser does not support the video tag.
</video></li>
</ol>
<p>For similar reasons, I (and <a href="https://jakearchibald.com/2025/give-footnotes-the-boot/" target="_blank" rel="noopener">Jake Archibald</a>) dislike footnotes on the web. But I do think that popup and <a href="https://gwern.net/sidenote" target="_blank" rel="noopener">margin notes</a> are a fine substitute – anything that doesn&rsquo;t jump you away from the text you were reading.</p>
<h3 id="transclusion" class="prose-heading">Transclusion<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#transclusion" aria-label="Copy link to section: Transclusion" onclick="copyHeadingLink(this, event)"></button></h3><p>There are valid uses for &ldquo;pulling content from a source file into a destination file without copying it, so changes to the source automatically update all instances&rdquo; out there, like documentation or embedding a view of a live feed. But for everything else, I&rsquo;m not a fan.</p>
<p>My main objection is philosophical: <strong><a href="https://youtu.be/Cym4TZwTCNU?si=lNBae29HpkgJ_On7&amp;t=1259" target="_blank" rel="noopener">Facts are temporal</a>.</strong></p>
<p>A document is a thing that reflects information as it existed at the time. Inserting it elsewhere now ties together two things that probably have different update schedules. You now have something that&rsquo;s <em>alive</em> in two different places. Each interaction requires you to keep track of those two contexts. How does changing this thing in front of me affect every other place that it&rsquo;s present?</p>
<p>My preferred solution is just copying and pasting the necessary content to its new location. Redundant, but robust. This is similar to the <a href="https://twitter.com/rsnous/status/1113174717030998016" target="_blank" rel="noopener">folk practice</a> of posting screenshots of tweets instead of quoting them, making them immune to editing, deletion, or privacy settings. This is also what Gwern does for his popups, creating a <a href="https://gwern.net/design#:~:text=which%20are%20manually%20written%20%26%20automatically%20populated%20from%20many%20sources" target="_blank" rel="noopener">manual copy</a> of Wikipedia pages or other documents.</p>
<p>Even the usage patterns for transclusions are often rather finicky:</p>
<blockquote>
<p>In Obsidian, when users create a block link, a hexadecimal identifier is inserted into the referenced block. This identifier creates a more stable link than our snippet references. But many of our test users mentioned that they don’t use Obsidian’s block references because they find these identifiers messy, and because they worry about accidentally &ldquo;losing&rdquo; the identifier when editing the file.</p>
<p><cite><a href="https://www.matthewsiu.com/Latticework" target="_blank" rel="noopener">Latticework</a></cite></p></blockquote>
<p>(I recommend reading the whole thing, it&rsquo;s one of the few examples of a design case study that&rsquo;s actually good.)</p>
<h2 id="ideological-mistakes" class="prose-heading">Ideological mistakes<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#ideological-mistakes" aria-label="Copy link to section: Ideological mistakes" onclick="copyHeadingLink(this, event)"></button></h2><p>The unfortunate consequence of holding notions of &ldquo;purity&rdquo; or <a href="https://twitter.com/joodalooped/status/1999510110058737917?s=20." target="_blank" rel="noopener">&ldquo;simplicity&rdquo;</a> above goals that are real and present. Clinging to the initial version of a vision, refusing to accept the lessons of <a href="https://dreamsongs.com/WorseIsBetter.html" target="_blank" rel="noopener">Worse is Better</a>. Letting your decisions be guided by raw ideas instead of the gentle pushback of reality.</p>
<h3 id="liquid-glass" class="prose-heading">Liquid glass<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#liquid-glass" aria-label="Copy link to section: Liquid glass" onclick="copyHeadingLink(this, event)"></button></h3><p>I don&rsquo;t have much of a problem with &ldquo;liquid&rdquo; materials on smartphones, provided they animate quickly and smoothly. I <em>do</em> have a problem with heavily padded floating buttons, sidebars and other UI elements stealing valuable screen real estate on my Serious Computer, the Macbook.</p>
<p>And I&rsquo;m not a fan of background content showing through overlays either, I really wish the &ldquo;glass&rdquo; part of the aesthetic was something more robust (like metal perhaps, ferrofluid is cool).</p>
<p>I wish more apps took a strong stance against it. There is nothing <em>forcing</em> developers to deviate what they think best suits their brand and functionality. Third-party software for serious work (Blender, Musescore) will have nothing to do with the trend, and I&rsquo;m hoping Apple&rsquo;s own power tools (Logic Pro, Final Cut) <a href="https://forums.macrumors.com/threads/apple-apps-that-are-not-yet-liquid-glassed.2475144/" target="_blank" rel="noopener">continue to stick</a> with what&rsquo;s best.</p>
<p><strong>P.S:</strong> I would put $50 on Apple walking back most of this design direction by 2028. Unless they ship a touchscreen Macbook, which would be the beginning of the end for fine-grained pointing devices.</p>
<h3 id="poor-data-ink-ratios" class="prose-heading">Poor data ink ratios<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#poor-data-ink-ratios" aria-label="Copy link to section: Poor data ink ratios" onclick="copyHeadingLink(this, event)"></button></h3><p>I am an unapologetic Tufte graphics and <a href="https://worrydream.com/MagicInk/" target="_blank" rel="noopener">Magic Ink</a> shill. If software must manifest as pixels, let us make them useful pixels. I dislike attempts to go against this principle for no good reason:</p>
<ul>
<li>A forced &ldquo;technical&rdquo; aesthetic: Excessive skeuomorphism, borders, visual noise, etc. are real problems, no matter what the <a href="https://twitter.com/joodalooped/status/1954577413427335229" target="_blank" rel="noopener">nostalgia heads</a> will tell you.</li>
<li>Plaintext supremacy: Never send a bunch of words to do the job that one well-made graphic could do. Typography is very pretty, but that doesn&rsquo;t absolve one from trying to do better.</li>
</ul>
<p>Even choice of words can make a difference here, a subtitle here or long heading there might make for a more &ldquo;balanced&rdquo; layout, but it&rsquo;s often better to just <a href="https://robinrendle.com/notes/ditch-those-words/" target="_blank" rel="noopener">ditch those words</a> completely.</p>
<h3 id="xanadu" class="prose-heading">Xanadu<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#xanadu" aria-label="Copy link to section: Xanadu" onclick="copyHeadingLink(this, event)"></button></h3><p><a href="https://gwern.net/xanadu" target="_blank" rel="noopener">Gwern&rsquo;s critique</a> exists and is thorough. My own comment is simply that Nelson &amp; Co. were just not very good designers. They were ideologically married to particular features and means of achieving a goal. They talked a big game about &ldquo;new forms&rdquo; of media but Xanadu was just a literature nerd&rsquo;s stubborn ideal for interconnected computers.</p>
<h3 id="personal-software" class="prose-heading">Personal software<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#personal-software" aria-label="Copy link to section: Personal software" onclick="copyHeadingLink(this, event)"></button></h3><p>Yes, the future will have many more <a href="https://maggieappleton.com/home-cooked-software" target="_blank" rel="noopener">barefoot developers with home-cooked apps</a> than we&rsquo;ve had before. Yes, more internal tools will <a href="https://twitter.com/steveruizok/status/2006395548949942663" target="_blank" rel="noopener">replace</a> some SaaS products. And yes, there will be more <a href="https://news.ycombinator.com/item?id=40878765" target="_blank" rel="noopener">truly personal</a> software.</p>
<p>All of this is not something I&rsquo;m very excited about. I&rsquo;d even say I detest this attitude of software as an insular pleasure. The Memex is one of these ideas that has refused to go away, especially now, with the idea of combining AI with a personal knowledge store.</p>
<blockquote>
<p>McConaughey gets at something that seems obvious to me but few say. I don&rsquo;t want a mind aligned to some gestalt of the collective psyche to steer me towards median ideas. I just want to talk to a smarter and better informed version of me who can tell me what i, specifically, would think if i were cleverer and better read.</p>
<p><cite> <a href="https://twitter.com/loquitur_ponte/status/1969201907206853105" target="_blank" rel="noopener">@loquitur_ponte</a></cite></p></blockquote>
<p>I can think of few things less interesting or antisocial. To quote @zetalyrae&rsquo;s post <em><a href="https://borretti.me/article/i-wish-people-were-more-public" target="_blank" rel="noopener">I Wish People Were More Public</a></em>, which in turn quotes Dante:</p>
<blockquote>
<p>You may say reading in public is performative. I say reading in private is solipsistic. Dante, in De Monarchia, writes:</p>
<blockquote>
<p>All men on whom the Higher Nature has stamped the love of truth should especially concern themselves in laboring for posterity, in order that future generations may be enriched by their efforts, as they themselves were made rich by the efforts of generations past. For that man who is imbued with public teachings, but cares not to contribute something to the public good, is far in arrears of his duty, let him be assured; he is, indeed, not &ldquo;a tree planted by the rivers of water that bringeth forth his fruit in his season,&rdquo; [Psalms 1:3] but rather a destructive whirlpool, always engulfing, and never giving back what it has devoured.</p></blockquote></blockquote>
<p>Make things for groups! For the web! For strangers and enemies! And make these things as open and cross-compatible and publicly as possible.</p>
<p>See also: <a href="https://bmannconsulting.com/notes/self-hosting-is-selfish/" target="_blank" rel="noopener">Self Hosting is selfish</a></p>
<h3 id="concierge-attitudes" class="prose-heading">Concierge attitudes<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#concierge-attitudes" aria-label="Copy link to section: Concierge attitudes" onclick="copyHeadingLink(this, event)"></button></h3><p>Software that uses words like &ldquo;automagically&rdquo; or &ldquo;in the background&rdquo; rarely makes for a reliable tool. It is a mistake to start from &ldquo;users shouldn&rsquo;t have to do X&rdquo;, instead of &ldquo;let&rsquo;s observe usage and see where the real bottlenecks are&rdquo;. Tasks can be made easier, batched, before resorting to removing them completely.</p>
<p>One of the best ways to raise the background anxiety level of a system is to have it do things the user can&rsquo;t see, and present the (oft-broken) final results with no explanation.</p>
<!--### "everything is everything" and infinite nesting

Everything is already bytes + a file type, that's as far as we need to go down that direction. There are very few things that are truly true (physical facts). 

> It *makes no goddamn sense! Compels me though*.

Don't be the guy compelled by infinite nonsense.

Twitter's tweet is perhaps the only truly successful model of this working out. Everything is "just a tweet"
 – a timestamped block of text or media, with very simple relations to each other. You can quotetweet just by adding a link to another tweet within your tweet.-->
<h2 id="lazy-patterns" class="prose-heading">Lazy patterns<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#lazy-patterns" aria-label="Copy link to section: Lazy patterns" onclick="copyHeadingLink(this, event)"></button></h2><p>Things where the decision is made simply by asking &ldquo;what does everyone else do?&rdquo; with no concern for differentiating factors. The opposite of design, really. The person on the other end of your software suffers to save you a little extra thinking.</p>
<h3 id="the-above-the-fold-holy-grail" class="prose-heading">The &ldquo;above the fold&rdquo; holy grail<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#the-above-the-fold-holy-grail" aria-label="Copy link to section: The “above the fold” holy grail" onclick="copyHeadingLink(this, event)"></button></h3><p>This is part of a general complaint against the landing page cargo cult of &ldquo;single sentence value proposition&rdquo;. People can read more than 6 words, they can even read multiple paragraphs if you write them well enough. If you actually know what you&rsquo;re trying to do, just say that, in as many words as are necessary.</p>
<p>When it comes to CTAs though, there <em>is</em> lots of sense in making sure the main action is easy to take. Put your signup button in the navigation bar, and make it easy to see. But stop expecting people&rsquo;s first action on opening your site to be &ldquo;get started&rdquo;. If that <em>was</em> true, you didn&rsquo;t need a website in the first place.</p>
<h3 id="infinite-canvases" class="prose-heading">Infinite canvases<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#infinite-canvases" aria-label="Copy link to section: Infinite canvases" onclick="copyHeadingLink(this, event)"></button></h3><p>I have a <a href="/canvas-ui">longer critique</a> of this pattern, but it can be summarized as&hellip;</p>
<p>Freeform placement is <em>very</em> useful (nodes &amp; wires, Indesign, moodboards, Powerpoint) but it doesn&rsquo;t have to be <em>infinite</em> to do so. The freedom to do anything comes at the cost of <em>having</em> to do everything (arranging, cleaning up, sorting) and the infinite expanse makes for an uncertain navigational experience (everyone has their own way of arranging things).</p>
<h3 id="modals" class="prose-heading">Modals<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#modals" aria-label="Copy link to section: Modals" onclick="copyHeadingLink(this, event)"></button></h3><p>Don&rsquo;t steal focus unless completely necessary. I have never felt myself thinking &ldquo;yes, please block my view of the screen, preventing me from clicking anything else behind your stupid popup confirmation box&rdquo;.</p>
<p>Don&rsquo;t ask me to move my mouse <em>away from where it currently is</em>, just to have to move back once I close the popup. Toasts are similarly annoying, and often implemented to be even more so (they disappear after a while so it&rsquo;s possible for users to miss important messages completely if they happen to look away). But at least the industry has started to <a href="https://primer.style/accessibility/patterns/accessible-notifications-and-messages/#toasts" target="_blank" rel="noopener">realize</a> that.</p>
<h3 id="bento-boxes" class="prose-heading">Bento boxes<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#bento-boxes" aria-label="Copy link to section: Bento boxes" onclick="copyHeadingLink(this, event)"></button></h3><p>I call it &ldquo;the layout for when you have nothing important to say&rdquo;.</p>
<p>The lovely thing about linear text is that you&rsquo;re force to prioritize things for the reader; it&rsquo;s a marvelous focusing exercise. The neat thing about two columns is how you can play <em>related</em> things off of each other; a dichotomy can have more narrative than just a list, and allows for the evergreen framings of &ldquo;vs.&rdquo; and &ldquo;yes, and&hellip;&rdquo;.</p>
<p>But a box of randomly positioned squares? It has neither narrative nor a history of usage. It is <em>new</em> and bad – the worst kind of bad. It&rsquo;s not entirely coincidental that Apple was the one to bring them into popular usage, right around the time their marketing became &ldquo;hey! here&rsquo;s one big list of small features&rdquo;. Lazy designers love <a href="https://www.youtube.com/watch?v=V3eLYxVYjV4" target="_blank" rel="noopener">anti-design</a>, anti-design loves <a href="https://bentogrids.com/" target="_blank" rel="noopener">bento boxes</a>.</p>
<h3 id="sidebars" class="prose-heading">Sidebars<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#sidebars" aria-label="Copy link to section: Sidebars" onclick="copyHeadingLink(this, event)"></button></h3><p>I understand the temptation to add them, trust me I do. They do a few really useful things:</p>
<ul>
<li>They make apps feels like Apps</li>
<li>Provide a stable visual anchoring point across every page in the app</li>
<li>They can fit more navigational links</li>
</ul>
<p>But you can provide other stable reference points, like a floating menu button. Or a <a href="https://en.wikipedia.org/wiki/Breadcrumb_navigation" target="_blank" rel="noopener">breadcrumb trail</a>, which is more useful and explicit.</p>
<p>As for navigation, what percentage of a user&rsquo;s time is spent in the act of navigating from one page to another? What percentage of that percentage is spent navigating to a place they already know the name of, and could jump to directly using a search?</p>
<p>To quote my friend <a href="https://ponnekanti.net/" target="_blank" rel="noopener">Manav</a>, &ldquo;No one uses their computer like this anymore because minimum window sizes are too large&rdquo;:</p>
<p><img src="https://media.joodaloop.com/macos-desktop-old.jpg" alt="Screengrab of old MacOS desktop with overlapping windows"></p>
<p>Notice how none of those apps have sidebars, leaving more space for content, and as a result they remain usable at small window sizes.</p>
<blockquote>
<p>i wish to expand on the &ldquo;data-ink ratio&rdquo; idea with the &ldquo;live pixels ratio&rdquo;</p>
<p>measured by how much an interactive item on a screen achieves (frequency x power)  relative to how much vital space it takes up</p>
<p><cite><a href="https://twitter.com/joodalooped/status/1965842929899196438" target="_blank" rel="noopener">@joodalooped</a></cite></p></blockquote>
<p>If you think about it, you&rsquo;ll realize sidebars have a pretty terrible live pixels ratio.</p>
<h3 id="fuzzysemantic-search" class="prose-heading">Fuzzy/semantic search<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#fuzzysemantic-search" aria-label="Copy link to section: Fuzzy/semantic search" onclick="copyHeadingLink(this, event)"></button></h3><p>Please pick/tune good fuzzy find algorithms. If I&rsquo;m looking for &ldquo;head&rdquo;, there&rsquo;s no reason that I should see &ldquo;padding&rdquo; in the list of results. It just doesn&rsquo;t feel right, even if your code says they&rsquo;re basically the same thing.</p>
<p>Semantic search based on embeddings, done well, can make for powerful retrieval/classification engines. But when dealing with person-sized data, regular search is usually all you need:</p>
<blockquote>
<p>And more importantly, the hybrid results sometimes failed the &ldquo;why on earth did this result show up?&rdquo; test. For example:</p>
<p>Looking for a recipe I typed &ldquo;bread&rdquo; and I got an AI paper with nothing highlighted… oh wait, I see&hellip; there’s a paragraph in this AI paper that mentions <em>croissants</em>. Are <em>croissants</em> semantically related to <em>bread</em>?</p>
<p>Opaque semantic matches can sabotage user trust in search results. In a keyword search, if I search a keyword, I either get results that contain those words or I don’t. It’s clear. With semantic search, you sometimes get results that are <em>&ldquo;kind of&rdquo;</em> related to your query, but without any obvious indication why. That can be frustrating.</p>
<p><cite> <a href="https://paoramen.fika.bar/local-first-search-01K1B0WM1X4P5SV5QAES0Z5N75" target="_blank" rel="noopener">Pao Ramen</a>, Local-first Search</cite></p></blockquote>
<h3 id="digital-gardens" class="prose-heading">Digital gardens<button type="button" class="copy-heading" data-link="https://joodaloop.com/design-dislikes/#digital-gardens" aria-label="Copy link to section: Digital gardens" onclick="copyHeadingLink(this, event)"></button></h3><p>I have seen very, very few of them that didn&rsquo;t make for a painful experience, one of them is <a href="https://szymonkaliski.com/" target="_blank" rel="noopener">Szymon Kaliski&rsquo;s</a> notes. Notice that it contains a complete index of every note, ordered by time, and with descriptive titles. He has also taken some care to only publish notes that are worth reading.</p>
<p>The &ldquo;digital garden&rdquo; as a design pattern usually does the opposite. They exist to provide authors with a dumping ground for unorganized information. Which is all well and good if you&rsquo;re said lazy author, but the lack of grounding, order, ranking or quality control makes for a fatiguing reading experience. <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11852912/" target="_blank" rel="noopener">Studies</a> <a href="https://www.sciencedirect.com/science/article/abs/pii/0010028577900056" target="_blank" rel="noopener">have</a> <a href="https://psycnet.apa.org/record/1964-02036-001" target="_blank" rel="noopener">consistently</a> <a href="https://link.springer.com/article/10.3758/s13423-020-01853-1" target="_blank" rel="noopener">found</a> that people are much better at memorizing information when it’s presented in narrative form. &ldquo;Atomic notes&rdquo; encourage putting tiny bits of content at each URL, forcing clunky jumps through half-completed personal notes.</p>
<p>Now, the lovely thing about the web is that you&rsquo;re free to do as you like, my demands are mere suggestions in practice. But if the <a href="https://robinrendle.com/newsletter/the-browser-is-a-printing-press/" target="_blank" rel="noopener">browser is a printing press</a>, I think it deserves a healthy publishing mindset.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Interface Anxiety</title>
      <link>https://joodaloop.com/interface-anxiety/</link>
      <pubDate>Mon, 22 Dec 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/interface-anxiety/</guid>
      <description> A sense of chronic unease or acute worry experienced while interacting with a software system.&#xA;</description>
      <content:encoded><![CDATA[<blockquote>
<p>A sense of chronic unease or acute worry experienced while interacting with a software system.</p></blockquote>
<p>This post exists because I&rsquo;ve recently realized that a good 70% of my application development work is based around minimizing this feeling (a rather quaint concern in a world of &ldquo;agent-first software&rdquo;, I admit). If I have to use something I&rsquo;ve made, I can&rsquo;t live with it being subtly painful.</p>
<p>While a good test of a system&rsquo;s value proposition is how much anxiety people will deal with to continue using the service, I would much prefer to never be the subject of such a test.</p>
<p>It&rsquo;s possible that my sensitivity is a unique personal symptom of screen-induced ADHD. But it feels more true that I am just defining and describing a feeling that most people share. In any case, I believe that noticing and focusing on this emotion does contribute to better design.</p>
<p>The definition itself, being quite simple (tautological, even), doesn&rsquo;t convey anything useful. That&rsquo;s what the rest of this page is for; an attempt to describe it&rsquo;s facets through example:</p>
<h3 id="notifications" class="prose-heading">Notifications<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#notifications" aria-label="Copy link to section: Notifications" onclick="copyHeadingLink(this, event)"></button></h3><p>The little red dot has the most ridiculous size-to-effect ratio of any element we&rsquo;ve ever come up with. This should have led to careful usage, instead it has meant alerts everywhere, for everything.</p>
<p>The dots don&rsquo;t even mean anything specific! Users have primitive levels of control over what becomes a notification, they&rsquo;re freely abused for marketing nonsense (or worse), unread badges don&rsquo;t ensure you&rsquo;ve actually dealt with the message, etc. Every dot looks the same, and could mean a dozen different things.</p>
<p>Within apps, the least we could have done is a <a href="https://borretti.me/article/inboxes-are-underrated" target="_blank" rel="noopener">single inbox</a> for better triage, but most apps just show multiple dots all over their interface instead.</p>
<h3 id="heaviness" class="prose-heading">Heaviness<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#heaviness" aria-label="Copy link to section: Heaviness" onclick="copyHeadingLink(this, event)"></button></h3><p>It comes in two forms:</p>
<ol>
<li><strong>Latency:</strong> Loading spinners, a perceptible gap between a click and the resulting action, a frozen interface  – all of these are an unsettling game of &ldquo;guess what happens next?&rdquo; If a page scrolls slower than your mouse wheel does, it feels like being stuck in molasses.</li>
</ol>
<p>One underrated aspect of network-based latency is that the delay could be anywhere between imperceptible and&hellip;forever. Each click is a painful roulette game.</p>
<p>It is harder to trust the system as a whole when parts of it will randomly let you down. The trust that follows from consistent speed is why the best software is fast, and <a href="https://craigmod.com/essays/fast_software/" target="_blank" rel="noopener">vice versa</a>.</p>
<ol start="2">
<li><strong>Visual noise:</strong> To the degree that <a href="https://worrydream.com/MagicInk/" target="_blank" rel="noopener">software is about information design</a>, it ought to guide the eye, and thus make it easy to skim each screen. Dividers, colors, <a href="/riffs/new-macos-menus">icons</a>, and <a href="https://mattstromawn.com/writing/ui-density/" target="_blank" rel="noopener">density</a> are all tools to make this easier, but are easily overused to achieve the opposite effect. And a poor data ink-ratio is almost as bad as&hellip;</li>
</ol>
<h3 id="uncertainty" class="prose-heading">Uncertainty<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#uncertainty" aria-label="Copy link to section: Uncertainty" onclick="copyHeadingLink(this, event)"></button></h3><p>Visual heaviness cannot be solved by naive minimalism. Look at this coffee machine panel (<a href="https://jenson.org/free/" target="_blank" rel="noopener">source</a>, worth reading) for example: it is minimal but it hides information from you.</p>
<p><img src="https://media.joodaloop.com/coffee-panel.png" alt="Coffee machine panel with just numbers and icons"></p>
<p>An absence of information asks <em>you</em> to fill in the gaps, to memorize things. Ambiguity leads to hesitance, by way of anxiety.</p>
<p>In many apps, it makes for a series of nervous back-and-forth jumps between multiple screens. This is what makes hyperlinks dangerous, because they are a tool for <a href="/design-dislikes#hyperlinks">indirection</a>. <a href="/design-dislikes#transclusion">Transclusion</a> is another offender, requiring users to think about <em>everything</em> that might be affected by a change to a source document.</p>
<h3 id="non-standard-behaviour" class="prose-heading">Non-standard behaviour<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#non-standard-behaviour" aria-label="Copy link to section: Non-standard behaviour" onclick="copyHeadingLink(this, event)"></button></h3><p>Interfaces deserve to be innovated on. But only when existing patterns fall short, and only while respecting the standards of the operating system/browser.</p>
<p>Don&rsquo;t break URL navigation, tabbing through items, common shortcut =&gt; action mappings, CMD + F, etc. just because you can. Your novel patterns will not do <em>that</em> much better than the most tried and true defaults. (Unfortunately, so many applications break those rules that even <a href="https://twitter.com/joodalooped/status/1954109983022277096" target="_blank" rel="noopener">relying on the defaults</a> starts to feel anxious)</p>
<p>Even when adding them, a naive way would be to use them for infrequent or otherwise unpopular sections of the interface. But this is doubly bad. When users finally decide to do an action they don&rsquo;t normally do, they will be confronted by a more-alien-than-usual interface. They have had no time to practice, and just want to get it over with.</p>
<p>Instead, use novel patterns for more common actions, for two reasons:</p>
<ol>
<li>A core action is used often, giving it the chance to graduate to the comfortable familiarity of muscle memory.</li>
<li>It forces you and your users to use the action often enough to receive feedback about it&rsquo;s effectiveness. Too many bad ideas are left alive through hiding.</li>
</ol>
<h3 id="powerlessness" class="prose-heading">Powerlessness<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#powerlessness" aria-label="Copy link to section: Powerlessness" onclick="copyHeadingLink(this, event)"></button></h3><p>For the longest time, algorithms have taken (deserved) flak for this, but it doesn&rsquo;t stop at there. Most systems have things that they will just <em>do</em>, whether you approve or not.</p>
<ul>
<li>Crash, and lose your work</li>
<li>Stop working in the absence of perfect internet connectivity</li>
<li>Auto-magically &ldquo;fix&rdquo; problems through a misguided <a href="/design-dislikes#concierge-attitudes">concierge attitude</a></li>
<li>Silently restart in the background, losing your context</li>
</ul>
<p>When it happens, it might look like a specific moment of frustration. But from the first time onwards it sets in motion a permanent background discomfort. Users will spend as little time as they can in this environment of anxiety, but be unable to point out why. They will use your software defensively — writing drafts outside the app and only pasting in when ready, spam-clicking &ldquo;Save&rdquo; before leaving a page.</p>
<p>I pay Bear $15/year to give me Markdown notes with sane conflict resolution (choose between the two conflicting version) instead of Apple Notes&rsquo; terrible approach (brutally overwrite). Once bitten, willing to pay to never be bitten again.</p>
<h3 id="change" class="prose-heading">Change<button type="button" class="copy-heading" data-link="https://joodaloop.com/interface-anxiety/#change" aria-label="Copy link to section: Change" onclick="copyHeadingLink(this, event)"></button></h3><p>Memorization, once achieved, is a form of lightness. It frees you from looking. It enables fluency, which is the opposite of anxious usage.</p>
<p>So when things are rearranged, lost, or otherwise modified, the pain is felt most by the power users. They are deprived of their shortcuts, their buttons are moved out of familiar tap territory. Back to square one, this time with their trust burned. Once bitten, forever shy.</p>
<p>Furthermore, veteran users of software can smell the desperation in every rebrand. They can sense the upcoming product pivot that finally casts their specific needs aside.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Better design through calibration</title>
      <link>https://joodaloop.com/riffs/design-calibration/</link>
      <pubDate>Mon, 22 Dec 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/design-calibration/</guid>
      <description>If you haven’t heard of calibration cases, you should read Commoncog’s introduction to them. A brief definition:&#xA;</description>
      <content:encoded><![CDATA[<p>If you haven&rsquo;t heard of calibration cases, you should read <a href="https://commoncog.com/calibration-case-method/" target="_blank" rel="noopener">Commoncog&rsquo;s introduction</a> to them. A brief definition:</p>
<blockquote>
<p>Calibration cases are business narratives that teach you to see. A calibration case is simple: it is merely a narrative of a specific business situation. What makes calibration cases special is how they are meant to be consumed: they are organised in sequence according to concept, so you are able to do rapid case comparisons across the same concept. This exercise helps you calibrate your expectations of the business concept in question.</p></blockquote>
<p>If you haven&rsquo;t heard me rant about how much of interface design is done by people saying insightful/<a href="https://verbnounenter.net/monotony" target="_blank" rel="noopener">stupid</a>-sounding shibboleths, you can follow my Twitter.</p>
<p>Maybe they have <a href="https://anthonyhobday.com/blog/20221221.html" target="_blank" rel="noopener">their reasons</a> to be so non-specific, but it means that most advice is scarcely better than personal opinion. &ldquo;Form follows function. Make apps fun again! Make apps look old again!&rdquo; I can&rsquo;t recommend that to <em>learn</em> from.</p>
<p>Instead, I used to say something like &ldquo;just look at lots of good designs and use many apps&rdquo; to people who asked me for a how-to guide or direction of study. Because reading <a href="https://www.refactoringui.com/" target="_blank" rel="noopener">Refactoring UI</a> can only give you a few simple rules, that can nearly always be <a href="https://anthonyhobday.com/sideprojects/saferules/" target="_blank" rel="noopener">safely applied</a>. How do you become good enough to learn/break those rules?</p>
<p>I now think the I wasn&rsquo;t far off with my original answer, you have to gather a corpus of cases in your head. Luckily there is more than one way to do this for design:</p>
<ul>
<li>Make something and watch someone use it</li>
<li>Find good design writeups (like <a href="https://www.matthewsiu.com/Latticework" target="_blank" rel="noopener">this one</a>), but those are very rare</li>
<li>Spend time using apps that are considered to be good</li>
<li>Read someone else&rsquo;s <a href="https://nerdymomocat.github.io/posts/my-annoyances-with-notion/" target="_blank" rel="noopener">experience</a> with <a href="https://brianlovin.com/app-dissection" target="_blank" rel="noopener">specific software</a></li>
</ul>
<p>I believe that the &ldquo;organised in sequence according to concept&rdquo; part of the process can be done without, because design doesn&rsquo;t really have <em>that</em> many distinct concepts. [<a href="https://ia.net/topics/webdesign-is-95-typography-partii" target="_blank" rel="noopener">Typography</a>], spacing, hierarchy, and content is the majority of what I do.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Better Blog Design</title>
      <link>https://joodaloop.com/better-blog-design/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/better-blog-design/</guid>
      <description>It’s been over two decades since Wordpress first launched. As it grew to power a majority of the internet, it set certain patterns of usage and design that have remain mostly unchanged in the years since.&#xA;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s been over two decades since Wordpress first launched. As it grew to power a majority of the internet, it set certain patterns of usage and design that have remain mostly unchanged in the years since.</p>
<p>The chronological weblog won, and every site twists to fit it&rsquo;s structure, with information architecture and reader experience suffering for it. Things don&rsquo;t have to be this way.</p>
<p>As a push in the right direction, here are my <del>demands</del> suggestions:</p>
<h3 id="dont-paginate" class="prose-heading">Don&rsquo;t paginate<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#dont-paginate" aria-label="Copy link to section: Don’t paginate" onclick="copyHeadingLink(this, event)"></button></h3><p>Moving information out of view creates more <a href="/interface-anxiety">interface anxiety</a> than it&rsquo;s worth. Unless you have a few hundred posts, there&rsquo;s no reason to not list them all in one page. (And even if you do, a long list works fine anyway). It allows the browser&rsquo;s <kbd>CMD + F</kbd> search to work as a full-site search.</p>
<p>One of my favourite examples of laying out a small collection of essays:</p>
<p><img src="https://media.joodaloop.com/manav-blog.jpg" alt="Screenshot of ponnekanti.net blog home page, with a vertical list of essay titles"></p>
<p>Having your page be a long list of post titles and descriptions has the useful effect of forcing you to pick good titles, for your reader&rsquo;s sake. Make it easier for them to decide which links to click on.</p>
<h3 id="prefer-one-level-of-navigation" class="prose-heading">Prefer one level of navigation<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#prefer-one-level-of-navigation" aria-label="Copy link to section: Prefer one level of navigation" onclick="copyHeadingLink(this, event)"></button></h3><p>Navigation levels <em>mean</em> something. One level means &ldquo;you can see everything by opening these 5 links&rdquo;, and two levels means &ldquo;you might need to visit 5 * N links to see everything&rdquo; where N is an unknown number – asking the user to do much more work to truly browse a whole site. Don&rsquo;t do that, choose to have a single <code>/blog</code> list page instead of multiple <code>/blog/year</code> pages.</p>
<p>The only thing worse than two or more levels of navigation is no navigation. You can find that particular horror in the recent trend of &ldquo;<a href="https://maggieappleton.com/garden-history" target="_blank" rel="noopener">digital gardens</a>&rdquo;, where the user crawls their way through a site clicking on obfuscated links in incomplete pages and placeholder posts. Thanks a lot, Obsidian Publish  &amp; Co. 😒</p>
<h3 id="avoid-thumbnail-images" class="prose-heading">Avoid thumbnail images<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#avoid-thumbnail-images" aria-label="Copy link to section: Avoid thumbnail images" onclick="copyHeadingLink(this, event)"></button></h3><p>A relic of the nonsense SEO recommendations of the 2010s. Think back to the last great essay/post/stack you read and realise that you didn&rsquo;t care about the thumbnail or cover image at all.  AI-generated ones look especially terrible unless you take great care to make them consistent and styled to match your publication.</p>
<p>Even for social media cards I recommend just having one image that represents your site, and let it show up for all your posts, it&rsquo;s perfectly alright. If you really want something different for each post, add a nicer view of your post title, like so:</p>
<p><img src="https://media.joodaloop.com/sunil-og-image.png" alt="Example of a Open Graph image containing the title of the post"></p>
<p><strong>Note:</strong> I must confess that I do like blogs where the thumbnail images are photos taken by the <a href="https://www.contraption.co/" target="_blank" rel="noopener">author</a> <a href="https://brandur.org/articles" target="_blank" rel="noopener">themselves</a>. They look really nice, even if they&rsquo;re not particularly relevant to the content of the post.</p>
<h3 id="make-categorisation-useful" class="prose-heading">Make categorisation useful<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#make-categorisation-useful" aria-label="Copy link to section: Make categorisation useful" onclick="copyHeadingLink(this, event)"></button></h3><p>The traditional blog is ordered by time, which is a decent way to do things when the content consists of <a href="https://piperhaywood.com/archive/" target="_blank" rel="noopener">personal updates</a>, but a poor experience if you&rsquo;re writing more evergreen and/or domain-specific content. Instead, prefer organisation that complements your content and prolificacy (or lack thereof).</p>
<h4 id="topic" class="prose-heading">Topic<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#topic" aria-label="Copy link to section: Topic" onclick="copyHeadingLink(this, event)"></button></h4><p>Don&rsquo;t make topics too granular to start with (a simple &ldquo;culture&rdquo; section is better than a handful of sub-categorical tags). Only add them once you find that there are in fact multiple posts that fall under a tag. Few things are more disappointing for a reader than clicking on a tag and seeing a grand total of 2 posts.</p>
<h4 id="quality" class="prose-heading">Quality<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#quality" aria-label="Copy link to section: Quality" onclick="copyHeadingLink(this, event)"></button></h4><p>There are two measures of this that I like:</p>
<ul>
<li>Most popular: The greatest hits and most shared posts. What was well-liked will probably still be worth reading.</li>
<li>Personal favourites: A space to surface content you think is somewhat underrated or worth checking out (perhaps due to how different they are from your regular fare).</li>
</ul>
<h4 id="length" class="prose-heading">Length<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#length" aria-label="Copy link to section: Length" onclick="copyHeadingLink(this, event)"></button></h4><p>It&rsquo;s somewhat useful to give readers an expectation of how long a particular piece is, so that they can adjust their actions accordingly. Depending on length of individual posts and the site-wide average, they might:</p>
<ul>
<li>Save things to a read-it-later service</li>
<li>Browse the whole site in one sitting</li>
<li>Open certain posts in new tabs</li>
<li>Decide to subscribe to your RSS feed</li>
</ul>
<h3 id="use-more-content-formats" class="prose-heading">Use more content formats<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#use-more-content-formats" aria-label="Copy link to section: Use more content formats" onclick="copyHeadingLink(this, event)"></button></h3><p>My site has 3 main ones, which is what I recommend for most people.</p>
<ul>
<li><strong>Lists:</strong> Evergreen collections that I update over time.</li>
<li><strong>Guides:</strong> Pieces of some heft, where I speak with some authority.</li>
<li><strong>Riffs:</strong> Short temporal posts, closest to the classic blog.</li>
</ul>
<p>There are also Notebooks, but those are closer to &ldquo;basket of links and excerpts that might lead to proper posts&rdquo;, and not considered real publications.</p>
<p>But you can also have special sections for a <a href="https://nihalsahu.net/bookshelf/" target="_blank" rel="noopener">bookshelf</a> (with <a href="https://nicochilla.com/books-on-the-shelf/" target="_blank" rel="noopener">reviews</a>?), media <a href="https://macwright.com/photos/" target="_blank" rel="noopener">galleries</a>, blogchains, etc. etc.</p>
<h3 id="use-short-urls-if-you-can-afford-to" class="prose-heading">Use short URLs, if you can afford to<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#use-short-urls-if-you-can-afford-to" aria-label="Copy link to section: Use short URLs, if you can afford to" onclick="copyHeadingLink(this, event)"></button></h3><p>There&rsquo;s nothing <em>wrong</em> with having your posts live at domain.com/posts/2025-12-25/post-url but there&rsquo;s something really nice about being able to share URLs that look as neat as domain.com/post-url by quickly typing them out.</p>
<h3 id="let-things-feel-like-paper" class="prose-heading">Let things feel like paper<button type="button" class="copy-heading" data-link="https://joodaloop.com/better-blog-design/#let-things-feel-like-paper" aria-label="Copy link to section: Let things feel like paper" onclick="copyHeadingLink(this, event)"></button></h3><p>Don&rsquo;t scrolljack, don&rsquo;t animate too much, don&rsquo;t use <a href="https://macwright.com/2021/03/16/return-of-fancy-tools" target="_blank" rel="noopener">WYSIWYG slop</a> (if you can help it). Try to avoid Javascript-based nonsense (every time I see Next.js being used for a personal site, I say a silent prayer for the author&rsquo;s soul), let webpages load like webpages.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>The new MacOS menus could be better</title>
      <link>https://joodaloop.com/riffs/new-macos-menus/</link>
      <pubDate>Fri, 12 Dec 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/new-macos-menus/</guid>
      <description>This is not an uncommon sentiment – you may have seen this graphic floating around the internet as a dunk on the Apple design team. Their own Human Interface Principles used to warn against overuse of icons next to menu items.&#xA;</description>
      <content:encoded><![CDATA[<p>This is not an uncommon sentiment – you may have seen this graphic floating around the internet as a dunk on the Apple design team. Their own Human Interface Principles used to warn against overuse of icons next to menu items.</p>
<p><img src="https://media.joodaloop.com/hig-icons.jpg" alt="Screenshot from HIG warning against the use of icons in menus, to prevent interface clutter"></p>
<p>But if they <em>are</em> going to do it, I have a humble suggestion: <strong>lighten the icons so that the text is emphasized instead.</strong></p>
<p><img src="https://media.joodaloop.com/macos-menus.jpg" alt="Screenshot comparing MacOS menus with original vs. lightened icons"></p>
<p>When lightened, the visual stating point shifts to the text itself, with the icon being demoted to an ornament instead of content. Which is what they always were – providing very little information compared to just reading the text. Especially when there are multiple densely packed icons <em>that all look the same!</em>.</p>
<p><img src="https://media.joodaloop.com/align-line.jpg" alt="Screenshot with a red line to mark the shift of attention to the text instead of icons"></p>
<p>Which leads me into some grumpy commentary re. Apple&rsquo;s design failings of late. They have gone too far down the path of &ldquo;ornament&rdquo;, which is terrible way to approach something as fundamental as a desktop OS.</p>
<blockquote>
<p>Dye had no background in user interface design — he came from a brand and print advertising background. Before joining Apple, he was design director for the fashion brand Kate Spade, and before that worked on branding for the ad agency Ogilvy.</p>
<p><cite> <a href="https://daringfireball.net/2025/12/bad_dye_job" target="_blank" rel="noopener">A Bad Dye Job</a> </cite></p></blockquote>
<p>Print is not a <em>terrible</em> attitude to bring to software (especially websites!), but it needs to be a tool applied in the latter stages of the process, not the starting point for &ldquo;this is our new look&rdquo;. Screens <a href="https://frankchimero.com/blog/2013/what-screens-want/" target="_blank" rel="noopener">have flux</a>, they&rsquo;re more than paper.</p>
<p>The guidelines could have been &ldquo;only add icons that have an unambiguous meaning, to items that would benefit from standing out in a list of actions&rdquo;. Not that you need icons to do this, bold text would work just as well, but we&rsquo;re being generous here.</p>
<p>But that&rsquo;s not what they did. The idea is clearly just &ldquo;ADD PRETTY PICTURES NEXT TO WORDS, THANK YOU!&rdquo;. A case of <a href="https://twitter.com/joodalooped/status/1968771688243298615" target="_blank" rel="noopener">graphic designer envy</a> if I&rsquo;ve ever seen one.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Canvas UIs: A Critical Review</title>
      <link>https://joodaloop.com/canvas-ui/</link>
      <pubDate>Wed, 12 Nov 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/canvas-ui/</guid>
      <description>The easiest way to write this post is to re-trace the steps I took myself to get here. Where “here” is my fairly critical attitude towards apps that use the infinite canvas as their primary (or worse — only!) interface pattern. But before I dive into a few hundred words on what they get wrong and a few suggested fixes, here are some things that canvases are quite good at doing:&#xA;</description>
      <content:encoded><![CDATA[<p>The easiest way to write this post is to re-trace the steps I took myself to get here. Where &ldquo;here&rdquo; is my fairly critical attitude towards apps that use the infinite canvas as their primary (or worse — only!) interface pattern. But before I dive into a few hundred words on what they get wrong and a few suggested fixes, here are some things that canvases are quite good at doing:</p>
<ol>
<li>
<p><strong>Being the simplest ZUI</strong>: They used to be all the rage, these <a href="https://news.ycombinator.com/item?id=40039143" target="_blank" rel="noopener">zoomable user interfaces</a>, back when larger screens were the more popular device size. They let you fit large things into the viewport (provided that the smallest meaningful unit does actually fit into the viewport), they let you <strong>see everything at once</strong>, from far away. Every modern map app is a ZUI, and the interface is a perfect fit for them.</p>
</li>
<li>
<p><strong>Workflows with lightweight branches:</strong> You&rsquo;ll hear people refer to this kind of usage as &ldquo;non-linear&rdquo;, and make claims about semantic spaces and linking. I&rsquo;m not a huge fan of those ideas, and instead believe that the main value comes from providing <strong>intuitive branching</strong>, and the speed of <a href="https://twitter.com/steveruizok/status/1878386874806399361?s=20" target="_blank" rel="noopener">iteration</a> that comes from exploring options through quick duplicating and parallel editing. In some canvases, this lets you see the history of the work in a satisfying way. But if you get into <em>serious</em> branching usage it often devolves into visual chaos. More on that later.</p>
</li>
<li>
<p><strong>Freeform element placement:</strong> One could argue that this is nothing special, since diagram tools have been around forever (the streets will never forget MS Paint, and consultants will never escape Powerpoint). But being able to place things where you want them is a hard problem in the world of multiple screen sizes, so the canvas is one of the few places that offers that capability anymore.</p>
</li>
</ol>
<h2 id="infinite-canvases-and-me" class="prose-heading">Infinite canvases and me<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#infinite-canvases-and-me" aria-label="Copy link to section: Infinite canvases and me" onclick="copyHeadingLink(this, event)"></button></h2><p>I first encountered serious usage in <a href="https://excalidraw.com/" target="_blank" rel="noopener">Excalidraw</a>, followed by <a href="https://museapp.com/" target="_blank" rel="noopener">Muse</a>, Figma, then <a href="https://www.tldraw.com/" target="_blank" rel="noopener">tldraw</a>. The popular usage pattern for all of them is &ldquo;design tool&rdquo;, and ranges between rough sketches to exact mockups. When I started work on my own app, the goal was quite different.</p>
<p>My initial desire was fairly straightforward: I wanted a <a href="https://bradfrost.com/blog/post/the-workshop-and-the-storefront/" target="_blank" rel="noopener">digital workbench</a> to keep track of multiple projects/artifacts that was better than a simple list (where most items would be pushed below the fold) and with a better interface than a spreadsheet. At the time, I used <a href="https://www.literatureandlatte.com/scapple/overview" target="_blank" rel="noopener">Scapple</a>, which was near-perfect apart from the fact that it didn&rsquo;t have a web app.</p>
<p><img src="https://media.joodaloop.com/scapple.jpeg" alt="Screenshot of the Scapple app"></p>
<p>So I decided to re-make Scapple, but in the browser. Even going so far as to name my project Scrapple to make the lineage obvious. Doing so would require building an offline-first canvas with rich text elements, visual customization of said elements, arrows, and simple media handling.</p>
<p>As I prototyped and used the thing, I started to see that many of those features were not really in service of the initial goal of 2D organiser, and what I was making was closer to a publishing tool. Soon enough, I realised that I actually cared more about the publishing part (this is now part of my general attitude towards design: <strong>encouraging more public-facing things</strong>).</p>
<p>But the majority of infinite canvas apps are built with a single user in mind; usually <a href="https://infinitecanvas.tools/gallery/" target="_blank" rel="noopener">yet another</a> insular notes app. Good publishing tools ought to enforce norms that readers can learn easily, and provide constraints that the author must work within. The canvas&hellip;does not do that.</p>
<p><a href="https://twitter.com/steveruizok/status/1878386874806399361" target="_blank" rel="noopener">&ldquo;fast creative iteration&hellip;.the generated work is never the final product&rdquo;</a> is almost the opposite of a publishing tool.</p>
<p>All of which is to say, I realised that the canvas was the wrong medium for my goals, which is why I switched to making a multi-column rich text editor instead. It satisfies both my &ldquo;have multiple lists on the screen&rdquo; and &ldquo;make a webpage builder&rdquo; desires, while being much more amenable to power user patterns like keyboard-first usage. Thus, <a href="https://scatterpad.com" target="_blank" rel="noopener">Scatterpad</a> was born.</p>
<p>Also, had I stuck with the canvas, most of my effort would have ended up equal to &ldquo;tldraw but with rich text&rdquo;, a feature which they added less than two years later.</p>
<p>But the outcome of all this wandering in canvas land is that I have a bunch of thoughts about them, not as many as <a href="https://twitter.com/search?q=from:johnnulls%20canvas&amp;src=typed_query" target="_blank" rel="noopener">Mr. Nulls</a> or <a href="https://youtu.be/EigynPfpre4?si=RLpQIKX32q6VrzKC&amp;t=3624" target="_blank" rel="noopener">Jess</a>, but a fair number nonetheless.</p>
<h2 id="the-problems-and-a-few-speculative-suggestions" class="prose-heading">The problems, and a few speculative suggestions<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#the-problems-and-a-few-speculative-suggestions" aria-label="Copy link to section: The problems, and a few speculative suggestions" onclick="copyHeadingLink(this, event)"></button></h2><p>Fair warning, almost any solution that is merely suggested instead of actually being implemented somewhere will likely suffer from &ldquo;too clever by half syndrome&rdquo;. Aspirational concepts which only show their flaws in implementation.</p>
<h3 id="they-invite-messes" class="prose-heading">They invite messes<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#they-invite-messes" aria-label="Copy link to section: They invite messes" onclick="copyHeadingLink(this, event)"></button></h3><p>One of the few design questions I care about, especially w.r.t software, is &ldquo;what behaviour does this thing encourage?&rdquo;. With canvases, it seems to be: messiness and no cleaning up until its too late.</p>
<p>Because they&rsquo;re such a singular medium, almost nothing can go in or out in a meaningful way, so you&rsquo;re encouraged to put <em>everything</em> into a single board. And the resulting mess forces you to hold the system <a href="https://twitter.com/gifts4ghosts/status/1836153517469503677" target="_blank" rel="noopener">in your head</a> while you&rsquo;re using it. Which isn&rsquo;t something I like my interfaces to do.</p>
<p>One of the solutions I&rsquo;d like to see tried is a windowing system to have multiple canvases open at the same time, being able to drag and drop to transfer things across them. Or secondary spaces like <a href="https://twitter.com/johnnulls/status/1864026661332943115?s=20" target="_blank" rel="noopener">sidebars</a>, <a href="https://news.ycombinator.com/item?id=40039143" target="_blank" rel="noopener">panes</a>, and <a href="https://www.inkandswitch.com/muse/#shelf" target="_blank" rel="noopener">shelves</a>, so less is done on the canvas. If you must have everything in one place, at least provide <a href="https://twitter.com/johnnulls/status/1988794762347139453" target="_blank" rel="noopener">focusing patterns</a>, like hiding and showing non-essential elements as appropriate.</p>
<p>To be even more prescriptive, perhaps a max item count per page to encourage using pages for a single, specific artifact. Like <a href="https://twitter.com/KinopioClub/status/1939691591431590296?s=20" target="_blank" rel="noopener">birthday cards</a>.</p>
<p>Side note: I&rsquo;ve always found it funny how Figma&rsquo;s engineering team works on <a href="https://www.figma.com/blog/supporting-faster-file-load-times-with-memory-optimizations-in-rust/" target="_blank" rel="noopener">incredible</a> <a href="https://www.figma.com/blog/speeding-up-file-load-times-one-page-at-a-time/" target="_blank" rel="noopener">technical</a> <a href="https://www.figma.com/blog/incremental-frame-loading/" target="_blank" rel="noopener">solutions</a> to make really large pages work, and each improvement just encourages users to make pages even larger.</p>
<h3 id="the-hell-of-eternal-adjustments" class="prose-heading">The hell of eternal adjustments<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#the-hell-of-eternal-adjustments" aria-label="Copy link to section: The hell of eternal adjustments" onclick="copyHeadingLink(this, event)"></button></h3><p>Being able to place things where you want them includes paying the price of having to do all the placing yourself. Including, but not limited to:</p>
<ul>
<li>Making space for new items</li>
<li>Creating and maintaining groups</li>
<li>Aligning items relative to each other</li>
<li>Spacing things out equally (especially when nested)</li>
</ul>
<p>Some of these problems have half-decent solutions. Like auto-distribute to space things equidistantly, or showing alignment lines while dragging. But these are ways to make the positioning work easier, not actually getting rid of the work itself.</p>
<p>Muse, for one, has a neat solution for the text editing experience, they call them &ldquo;<a href="https://museapp.com/memos/2021-08-text-blocks/" target="_blank" rel="noopener">text blocks</a>&rdquo; and they work by putting each paragraph into it&rsquo;s own block within a vertical list. So you can drag items out and slot them into other places, while ensuring alignment isn&rsquo;t a manual process.</p>
<video controls="">
<source src="https://media.joodaloop.com/muse-text-blocks.mp4" type="video/mp4">
</video>
<p>Oh, tldraw&rsquo;s arrows are amazing though. We need more stuff like them. Amelia Wattenberger has a <a href="https://wattenberger.com/thoughts/evolving-the-infinite-canvas" target="_blank" rel="noopener">few ideas</a> that might be worth trying.</p>
<h3 id="mobile-unfriendliness" class="prose-heading">Mobile-unfriendliness<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#mobile-unfriendliness" aria-label="Copy link to section: Mobile-unfriendliness" onclick="copyHeadingLink(this, event)"></button></h3><p>On narrow screens, there are only two choices for UI: become a list, or become unusable. It&rsquo;s a tragic constraint, but a strict one. Canvases definitely do not fit into lists. On the very devices built for pinching, swiping, and tapping, the canvas is decidedly a second-class citizen.</p>
<p>We can try to tame them, but any rule (e.g. list items in order from top-left to bottom-right) breaks due to the variety of idiosyncratic usage patterns. It defeats the point, really.</p>
<h3 id="they-do-not-situate" class="prose-heading">They do not situate<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#they-do-not-situate" aria-label="Copy link to section: They do not situate" onclick="copyHeadingLink(this, event)"></button></h3><p>Again, they&rsquo;re made to be non-linear, which means there&rsquo;s no real start and end points standardised by the format. If you don&rsquo;t do a ton of organisational work, it turns into a mess that makes sense to nobody but yourself from <a href="https://twitter.com/steveruizok/status/1836461303600234946" target="_blank" rel="noopener">&lt;10 minutes ago</a>.</p>
<p>Even if you do organise, it&rsquo;s fairly arbitrary. Because an infinite canvas has no borders, it&rsquo;s not like your desk anymore. There is no <strong>&ldquo;spatial memory&rdquo;</strong> to be leaned on because there is no enforced <a href="https://twitter.com/gifts4ghosts/status/1836518918556614806" target="_blank" rel="noopener">permanence</a> at all. Things can be in a completely different location the next time you look for them, nothing&rsquo;s going to stop you from shifting things around.</p>
<p>Yes, you can carve out named zones, or hope your tool provides a grouping primitive (like <a href="https://twitter.com/KinopioClub/status/1988653434996682936" target="_blank" rel="noopener">line dividers</a>, or <a href="https://twitter.com/tbsrnstrm/status/1959601780649832562" target="_blank" rel="noopener">stacks</a>), that&rsquo;s a good start. You could even be able to create deep links to said zones on your canvas to share specific things with people without asking them to navigate the chaos. <strong>But the chaos <a href="https://twitter.com/gifts4ghosts/status/1836153517469503677" target="_blank" rel="noopener">still exists</a>.</strong></p>
<p>Again, Muse has some <a href="https://museapp.com/memos/2020-12-infinite-canvas/" target="_blank" rel="noopener">good ideas</a> here:</p>
<ul>
<li>Boards are anchored in the upper-left</li>
<li>The board is always the size of its content</li>
<li>Prevent scrolling to completely empty space</li>
<li>They don&rsquo;t allow zooming, to maintain a single scale level</li>
</ul>
<h3 id="the-interaction-mechanics-are-meh" class="prose-heading">The interaction mechanics are meh<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#the-interaction-mechanics-are-meh" aria-label="Copy link to section: The interaction mechanics are meh" onclick="copyHeadingLink(this, event)"></button></h3><p>Panning is natural on a touchscreen, bearable with a trackpad, painful with a mouse. Zooming follows a similar order, but the scroll wheel is perhaps better than the trackpad. But in any case, the order of those lists shows how the most productivity-focused devices have the least affordances for canvas navigation.</p>
<p>Which is funny, because the fine-grained pointers of those devices are more suited to item manipulation than clumsy fingers (where dragging and scrolling are the same gesture) on touch devices.</p>
<p>Point being, there just isn&rsquo;t an interaction paradigm that is optimised for both parts of the canvas&rsquo; demands. Compared to our regular grid and list-based interfaces, <a href="https://twitter.com/steveruizok/status/1878386887208968699" target="_blank" rel="noopener">&ldquo;it’s not as good for drunk users&rdquo;</a>.</p>
<h2 id="but-if-youre-going-to-make-one-anyway" class="prose-heading">But if you&rsquo;re going to make one anyway&hellip;<button type="button" class="copy-heading" data-link="https://joodaloop.com/canvas-ui/#but-if-youre-going-to-make-one-anyway" aria-label="Copy link to section: But if you’re going to make one anyway…" onclick="copyHeadingLink(this, event)"></button></h2><p>Think about if something else would serve your needs better than a literal canvas. For me it was multi-columns, I&rsquo;d encourage you to find something like that too.</p>
<p>If you still want to do a canvas, think again. Are you absolutely <em>sure</em> you can&rsquo;t come up with a different thing? No? Alright then.</p>
<p>Use <a href="https://tldraw.dev" target="_blank" rel="noopener">tldraw</a>.</p>
<p>Despite their recent license change for tldraw v4.0 onwards, they&rsquo;re as good as it gets. I plan to stick with using v3 myself when I eventually add a diagram tool to Scatterpad.</p>
<p>And if you <em>really</em> want to make one from scratch, here&rsquo;s some stuff that I wished I&rsquo;d read before I started doing things in a &ldquo;I&rsquo;ll figure it out&rdquo; way. Oh, also, if your canvas doesn&rsquo;t need <a href="https://twitter.com/search?q=from:steveruizok%20rotation&amp;src=typed_query" target="_blank" rel="noopener">rotation</a>, that simplifies <em>many</em> of the interactions.</p>
<ul>
<li><a href="https://www.steveruiz.me/posts/zoom-ui" target="_blank" rel="noopener">Creating a Zoom UI</a>, and every other post on Steve&rsquo;s blog</li>
<li><a href="https://felt.com/blog/dynamic-cursor-rotation-css" target="_blank" rel="noopener">Dynamically rotating mouse cursors</a>, because why not?</li>
<li><a href="https://www.redblobgames.com/making-of/draggable/" target="_blank" rel="noopener">Pointer</a> <a href="https://writing.grantcuster.com/posts/2021-09-15-towards-more-manageable-pointer-events/" target="_blank" rel="noopener">handling</a></li>
<li>The tldraw <a href="https://github.com/tldraw/tldraw/blob/main/packages/editor/src/lib/editor/Editor.ts" target="_blank" rel="noopener">source code</a> and docs</li>
<li>Linear algebra/trigonometry (same thing)</li>
</ul>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Things I Do To Procrastinate</title>
      <link>https://joodaloop.com/procrastinate/</link>
      <pubDate>Mon, 03 Nov 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/procrastinate/</guid>
      <description>We all have our own suboptimal behaviours, which are usually as instructive as they are load-bearing. These are some of mine, in no particular order.&#xA;</description>
      <content:encoded><![CDATA[<p>We all have our own suboptimal behaviours, which are usually as instructive as they are load-bearing. These are some of mine, in no particular order.</p>
<ul>
<li>
<p>Sketch new interface ideas in tldraw</p>
</li>
<li>
<p>Prune my unused notes in Bear/Craft, or even the draft posts for this site.</p>
</li>
<li>
<p>Binge-read the classic DC comic series on <a href="https://readcomiconline.li/" target="_blank" rel="noopener">Read Comics Online</a>.</p>
</li>
<li>
<p>Go lounge around at a friend&rsquo;s place.</p>
</li>
<li>
<p>Talk to Gemini 3.1 Pro about sync engine architectures.</p>
</li>
<li>
<p>Go through the designs on <a href="https://deadsimplesites.com/" target="_blank" rel="noopener">Dead Simple Sites</a> to see what simple ways of laying out text I can make possible in the Scatterpad editor.</p>
</li>
<li>
<p>Rewrite my todo lists to clean up/reprioritise them.</p>
</li>
<li>
<p>Go through the tabs in my reading backlog (which is a personal Telegram channel).</p>
</li>
<li>
<p>Emptying my Twitter bookmarks. Which means either making use of the information in those tweets, quotetweeting them, and/or adding them <a href="/twitter-bookmarks">here</a>, before unbookmarking them in the app.</p>
</li>
<li>
<p>Tweak the CSS or do a minor refactor for one of my apps. Lately, that app has been Scatterpad.</p>
</li>
<li>
<p>Put on a random episode from a podcast/channel, based purely on the title and person being interviewed. Usual suspects: <a href="https://localfirst.fm/" target="_blank" rel="noopener">localfirst.fm</a>, <a href="https://jacksondahl.com/dialectic" target="_blank" rel="noopener">Dialectic</a>, <a href="https://www.manifold1.com/" target="_blank" rel="noopener">Manifold</a>, <a href="https://www.youtube.com/@ryansolid/videos" target="_blank" rel="noopener">Ryan Carniato&rsquo;s streams</a></p>
</li>
<li>
<p>Doomscroll Twitter, sometimes Bluesky.</p>
</li>
<li>
<p>Draw up plans for a new microsite, or think about ways to improve an existing one.</p>
</li>
<li>
<p>Browse the <a href="https://forum.commoncog.com/" target="_blank" rel="noopener">Commoncog Forum</a>.</p>
</li>
</ul>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Versioning joodaloop.com redesigns</title>
      <link>https://joodaloop.com/riffs/versioning-joodaloop/</link>
      <pubDate>Thu, 02 Oct 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/versioning-joodaloop/</guid>
      <description>I spent a couple hours yesterday cleaning up my Github repos for all the versions of this site I’ve created over time. You can go to v1.joodaloop.com to see the first version, and change the version number to go all the way up to v6. My personal favorite was v2, which honestly deserves to be resurrected in some way.&#xA;</description>
      <content:encoded><![CDATA[<p>I spent a couple hours yesterday cleaning up my Github repos for all the versions of this site I&rsquo;ve created over time. You can go to <a href="https://v1.joodaloop.com" target="_blank" rel="noopener">v1.joodaloop.com</a> to see the first version, and change the version number to go all the way up to v6. My personal favorite was v2, which honestly deserves to be resurrected in some way.</p>
<p><img src="/media/photos/v2.png" alt="Screenshot of joodaloop.com v2"></p>
<p>Wait a minute&hellip; did I say v6?</p>
<p>Yes, there were two versions <em>after</em> the site you&rsquo;re looking at now, that I built but never started using because I realised I liked what I already had. Which is why all I did was launch <a href="/riffs/joodaloop-v4.5">version 4.5</a> of the current design. But you can see those failed redesigns at <a href="https://v5.joodaloop.com" target="_blank" rel="noopener">v5</a> and <a href="https://v6.joodaloop.com" target="_blank" rel="noopener">v6</a> if you like. They&rsquo;re not terrible.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Hugoloop, a super-minimal starter site</title>
      <link>https://joodaloop.com/riffs/hugoloop/</link>
      <pubDate>Tue, 30 Sep 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/hugoloop/</guid>
      <description>I make at least 2 sites a month, most of them are static and written in plain HTML and CSS as much as possible. In fact, a few of my minisites (like map.joodaloop.com) are just a single HTML file written by hand. I really like keeping things as simple as they can be.&#xA;</description>
      <content:encoded><![CDATA[<p>I make at least 2 sites a month, most of them are static and written in plain HTML and CSS as much as possible. In fact, a few of my minisites (like <a href="https://map.joodaloop.com" target="_blank" rel="noopener">map.joodaloop.com</a>) are just a single HTML file written by hand. I really like keeping things as simple as they can be.</p>
<p>But I always run into the following annoyances as soon as more than one page is involved:</p>
<ul>
<li>Any shared components (like navigation bars and footers) need to be manually duplicated across pages manually.</li>
<li>I would often forget to update the <code>&lt;meta&gt;</code> tags (page title, social media cards) for each page to the correct values.</li>
<li>How does one add an RSS feed? By hand??</li>
<li>After one too many <code>&lt;p&gt;</code> tags I would start to miss the ability to write in Markdown.</li>
<li>I&rsquo;d have to go find a CSS reset and typography stylesheet from one of my previous projects.</li>
</ul>
<p>I&rsquo;ve been told this is the moment when people turn to the dark side, and write their own static site generator — one that finally has the perfect, simple feature set and intuitive syntax. Luckily for all of us, I decided to double down on the site generator I already use: <strong>Hugo</strong></p>
<p>So I put together <a href="https://hugo.joodaloop.com" target="_blank" rel="noopener">Hugoloop</a>, a starter that uses the simplest possible site structure for a Hugo site, and contains all the things mentioned in the list above. And everything that one <em>might</em> need is linked to in the <a href="https://github.com/joodaloop/hugoloop" target="_blank" rel="noopener">README</a>. To quote it&rsquo;s introduction:</p>
<blockquote>
<p>&hellip;the amount of Hugo-specific detail you need to understand is kept to a minimum. Your experience should feel as close to &ldquo;edit some HTML, write some Markdown&rdquo; as possible.</p></blockquote>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Useful Programming Ideas</title>
      <link>https://joodaloop.com/useful-programming/</link>
      <pubDate>Sat, 27 Sep 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/useful-programming/</guid>
      <description>The majority of these come from my dabbling in the local-first ecosystem for the past 2–3 years. I would like this page to act both as a useful resource and a personal history through these ideas, so I point to the sources of these ideas in the order that I found them instead of attempting any long explanation of my own.&#xA;</description>
      <content:encoded><![CDATA[<p>The majority of these come from my dabbling in the local-first ecosystem for the past 2–3 years. I would like this page to act both as a useful resource and a personal history through these ideas, so I point to the sources of these ideas in the order that I found them instead of attempting any long explanation of my own.</p>
<p><a href="https://twitter.com/aboodman/status/1768778601804202157" target="_blank" rel="noopener">Good list here</a>.</p>
<h3 id="fractional-indexing" class="prose-heading">Fractional indexing<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-programming/#fractional-indexing" aria-label="Copy link to section: Fractional indexing" onclick="copyHeadingLink(this, event)"></button></h3><p>Found through Evan Wallace&rsquo;s <a href="https://madebyevan.com/algos/crdt-fractional-indexing/" target="_blank" rel="noopener">blog post</a>, and used a naive integer-based version for the v0.5 of Scatterpad. The <a href="https://www.youtube.com/watch?v=zo-mMAyCjLU" target="_blank" rel="noopener">sorting things on a canvas</a> video from tldraw provides a more robust algorithm, using lexographic order instead of infinitely dividing numbers.</p>
<p>I personally use the <a href="https://github.com/nathanhleung/jittered-fractional-indexing?tab=readme-ov-file" target="_blank" rel="noopener">jittered-fractional-indexing</a> library, which in turn forks the <a href="https://github.com/rocicorp/fractional-indexing" target="_blank" rel="noopener">original</a> from the lovely folks at Rocicorp.</p>
<h3 id="hashing" class="prose-heading">Hashing<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-programming/#hashing" aria-label="Copy link to section: Hashing" onclick="copyHeadingLink(this, event)"></button></h3><p>The first time this <em>really</em> clicked for me was when I saw a hash of a schema <a href="https://twitter.com/artman/status/1779110535327351267" target="_blank" rel="noopener">being used to invalidate</a> an old store. A hash is a way to give a name to something after the fact!</p>
<h3 id="signals" class="prose-heading">Signals<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-programming/#signals" aria-label="Copy link to section: Signals" onclick="copyHeadingLink(this, event)"></button></h3><p>Encountered through <a href="https://signia.tldraw.dev/docs/what-are-signals" target="_blank" rel="noopener">Signia</a>, and from then on I wrote all my apps with these as the foundation whenever possible. Solid&rsquo;s component model (or should I say, <a href="https://www.youtube.com/watch?v=U0_ZKRWW6E4" target="_blank" rel="noopener">lack of one</a>) is probably the best example of the ideas in action.</p>
<h3 id="idempotency" class="prose-heading">Idempotency<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-programming/#idempotency" aria-label="Copy link to section: Idempotency" onclick="copyHeadingLink(this, event)"></button></h3><p><a href="https://lightfoot.dev/why-arent-you-idempotent/" target="_blank" rel="noopener">https://lightfoot.dev/why-arent-you-idempotent/</a></p>
<h3 id="binary-search" class="prose-heading">Binary search<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-programming/#binary-search" aria-label="Copy link to section: Binary search" onclick="copyHeadingLink(this, event)"></button></h3><p><a href="https://drmaciver.substack.com/p/how-to-find-things-an-intro-to-binary" target="_blank" rel="noopener">https://drmaciver.substack.com/p/how-to-find-things-an-intro-to-binary</a></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Chat quotes debut on joodaloop.com</title>
      <link>https://joodaloop.com/riffs/chats/</link>
      <pubDate>Thu, 25 Sep 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/chats/</guid>
      <description>I’m trying out a new format on this site: conversations. You can expect to see it in different places/pages over time.&#xA;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m trying out a new format on this site: conversations. You can expect to see it in different places/pages over time.</p>
<p>The design will probably change slightly in the future; but the more interesting questions are around what parts of the conversation I choose to display. Do I include random messages above/below the relevant slice? Do I preserve typos and &ldquo;hmmm&quot;s and &ldquo;huh&quot;s? How should privacy-preservation work?</p>
<p>Here&rsquo;s an apt example (w/ <a href="https://twitter.com/anjali_shriva" target="_blank" rel="noopener">Anjali</a>):</p>
<article class='chat start-them'>
<blockquote>
<p>i think conversations are the laziest tool for thought, because you&rsquo;re just offloading cognition to the other person</p></blockquote>
<blockquote>
<p>well&hellip;.</p>
<p>high variance</p></blockquote>
<blockquote>
<p>say more</p></blockquote>
<blockquote>
<p>they can force you into new avenues</p>
<p>think of them as an oblique strategy</p>
<p>they can also give you missing context, but that&rsquo;s fulfilling a search function</p>
<p>but then again what is thinking if not search</p></blockquote>
<blockquote>
<blockquote>
<p>think of them as an oblique strategy</p></blockquote>
<p>such a good comparison, damn</p>
<blockquote>
<p>but then again what is thinking if not search</p></blockquote>
<p>search + reasoning</p></blockquote>
</article>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Gift Culture</title>
      <link>https://joodaloop.com/riffs/gift-culture/</link>
      <pubDate>Mon, 18 Aug 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/gift-culture/</guid>
      <description>I don’t have much to say here yet, the point of this post is to link you to Innovation depends on Gift Culture.&#xA;</description>
      <content:encoded><![CDATA[<p>I don&rsquo;t have much to say here yet, the point of this post is to link you to <a href="https://alexdanco.com/2025/02/21/innovation-takes-magic-and-that-magic-is-gift-culture/" target="_blank" rel="noopener">Innovation depends on Gift Culture</a>.</p>
<blockquote>
<p>Gift exchange flip the Lemon Market problem upside down, because of the particular social rules around gift-giving and celebrating intent. Gift culture has sacred protocol: if you&rsquo;re offered a gift, you must accept the gift, and you must reciprocate either in return or by paying it forward. If I offer you a gift, saying, &ldquo;Here is all this information, promise and potential&rdquo;, then by the rules of gift exchange, you are obligated to take it seriously, and you are obligated to offer some potential in return, for a window of time.</p></blockquote>
<p>And this tweet:</p>
<blockquote>
<p>I&rsquo;ve talked to a lot of ambitious elders about this and the general shape of the answer i found was that those who were most fulfilled were those who gave back to others. they&rsquo;re proud of the difference they made to people, not the artifacts they produced or awards they won</p>
<cite>
	<a href="https://twitter.com/visakanv/status/1938267091754488265"> @visakanv </a>
</cite></blockquote>
<p>I might eventually collect enough material to turn this into it&rsquo;s own page someday, but for now it exists because it&rsquo;s a good summary of how I try to live.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>joodaloop.com v4.5</title>
      <link>https://joodaloop.com/riffs/joodaloop-v4.5/</link>
      <pubDate>Mon, 26 May 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/joodaloop-v4.5/</guid>
      <description>It will only go live in June, July, August September (!!!), but I just finished a partial redesign for this site, and I’m rather proud of it. I’ve arrived at a place where every kind of post format or type has a place here – from this tiny post you’re currently reading, to frequently updated lists like Twitter Bookmarks.&#xA;</description>
      <content:encoded><![CDATA[<p>It will only go live in <del>June</del>, <del>July</del>, <del>August</del> September (!!!), but I just finished a partial redesign for this site, and I&rsquo;m rather proud of it. I&rsquo;ve arrived at a place where every kind of post format or type has a place here – from this tiny post you&rsquo;re currently reading, to frequently updated lists like <a href="/twitter-bookmarks">Twitter Bookmarks</a>.</p>
<p>The Writing page was the only one that really changed to accomplish this. It turned into a dense 2-column page with sorting by topic instead of post type. The other pages only received small layout touch ups and tiny typography fixes. Oh, and the dark mode blue got darker. But that was all.</p>
<p>Edit: I also added a new &ldquo;chats&rdquo; format right before I shipped this version.</p>
<p><em>Which is good!</em> This website has been through 4 designs in total, and this latest version has lasted as long as all the others combined. Not that I haven&rsquo;t tried to replace it. <a href="https://v5.joodaloop.com/" target="_blank" rel="noopener">v5</a> and v6 redesigns happened in the background, but turned out to not be worth shipping. The current version is, in fact, close to perfect. Who would have thought?</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Ontological Engineering</title>
      <link>https://joodaloop.com/ontological-engineering/</link>
      <pubDate>Tue, 04 Feb 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/ontological-engineering/</guid>
      <description>I accept that real world is hopelessly intertwingled, everything is related to everything, etc, etc. But I see ontology as a tool to prune those connections down to purposeful buckets and helpful categories instead of “true” ones. Ontology should start from a well-defined, pragmatic purpose.&#xA;</description>
      <content:encoded><![CDATA[<p>I accept that real world is hopelessly <a href="https://en.wikipedia.org/wiki/Intertwingularity" target="_blank" rel="noopener">intertwingled</a>, everything is related to everything, etc, etc. But I see ontology as a tool to prune those connections down to purposeful buckets and helpful categories instead of &ldquo;true&rdquo; ones. Ontology should start from a well-defined, pragmatic purpose.</p>
<p>But you&rsquo;re welcome to do it for fun (and share them!).</p>
<h3 id="metadata" class="prose-heading">Metadata<button type="button" class="copy-heading" data-link="https://joodaloop.com/ontological-engineering/#metadata" aria-label="Copy link to section: Metadata" onclick="copyHeadingLink(this, event)"></button></h3><blockquote>
<p>Do we throw out metadata, then?</p>
<p>Of course not. Metadata can be quite useful, if taken with a sufficiently large pinch of salt. The meta-utopia will never come into being, but metadata is often a good means of making rough assumptions about the information that floats through the Internet.</p>
<p>Certain kinds of implicit metadata is awfully useful, in fact. Google exploits metadata about the structure of the World Wide Web: by examining the number of links pointing at a page (and the number of links pointing at each linker), Google can derive statistics about the number of Web-authors who believe that that page is important enough to link to, and hence make extremely reliable guesses about how reputable the information on that page is.</p>
<p>This sort of <em>observational metadata</em> is far more reliable than the stuff that human beings create for the purposes of having their documents found. It cuts through the marketing bullshit, the self-delusion, and the vocabulary collisions.</p>
<p>Taken more broadly, this kind of metadata can be thought of as a pedigree: who thinks that this document is valuable? How closely correlated have this person&rsquo;s value judgments been with mine in times gone by? This kind of implicit endorsement of information is a far better candidate for an information-retrieval panacea than all the world&rsquo;s schema combined.</p>
<cite>
	<a href="https://people.well.com/user/doctorow/metacrap.htm"> Cory Doctorow</a>, Metacrap: Putting the torch to seven straw-men of the meta-utopia
</cite></blockquote>
<h3 id="metaphor" class="prose-heading">Metaphor<button type="button" class="copy-heading" data-link="https://joodaloop.com/ontological-engineering/#metaphor" aria-label="Copy link to section: Metaphor" onclick="copyHeadingLink(this, event)"></button></h3><blockquote>
<p>In fact, metaphors were central to the XP methodology. A metaphor &ldquo;helps everyone on the project understand the basic elements and their relationships.&rdquo; And they are especially useful for high-level design:</p>
<p>Architecture is just as important in XP projects as it is in any software project. Part of the architecture is captured by the system metaphor. If you have a good metaphor in place, everyone on the team can tell about how the system as a whole works.</p>
<p>Instead of exhaustive design, Beck wanted <em>just enough</em> design. His system metaphor was something that could be explained in a moment, and was robust to change. It was a <a href="https://explaining.software/archive/transparent-like-frosted-glass/" target="_blank" rel="noopener">pane of frosted glass</a>, a <a href="https://explaining.software/archive/glossary/#locus" target="_blank" rel="noopener">locus</a>.</p>
<cite>
	<a href="https://explaining.software/archive/the-death-of-the-architect/"> Zach Tellman</a>, the death of the architect
</cite></blockquote>
<h3 id="processes-vs-things" class="prose-heading">processes vs. things<button type="button" class="copy-heading" data-link="https://joodaloop.com/ontological-engineering/#processes-vs-things" aria-label="Copy link to section: processes vs. things" onclick="copyHeadingLink(this, event)"></button></h3><blockquote>
<p>We challenge the widespread presumption that matter and objects are ontologically prior to processes and events, and also the less widespread but increasingly popular view that processes and events are ontologically prior to matter and objects. Instead we advance a third view according to which each of these pairs of categories is ontologically dependent on the other. In particular, taking a cue from an ontology of devices, we identify the object as an interface between those processes which are internal to it and those which are external to it and which it may be said to enact, thereby linking objects intrinsically to the processes in which they are involved as well as providing a more powerful determinant of object identity than more traditional, non-dynamic criteria based on demarcation from the environment. The internal processes are themselves external processes in relation to the components of the object which enact them, leading to a potentially open-ended recursive decomposition of both objects and processes in a complex web of mutual interdependency.</p>
<cite>
	<a href="https://explaining.software/archive/the-death-of-the-architect/"> Antony Galton and Riichiro Mizoguchi</a>. The Water Falls but the Waterfall does not Fall: New perspectives on Objects, Processes and Events
</cite></blockquote>
<blockquote>
<p>Whereas Humans view computers as tools below them to which they give orders and that do their bidding, Houyhnhnms view computing as an interaction within a system around them that extends their consciousness. Humans articulate their plans primarily in terms of things: the logical and physical devices they build (sometimes including tools to make more tools), in the lower realms of software and hardware. Houyhnhnms weave their conversations foremost in terms of processes: the interactions they partake in, that they attempt to automate (including these conversations themselves), which always involves <a href="https://en.wikipedia.org/wiki/Wetware_%28brain%29" target="_blank" rel="noopener">wetware</a> first. In short, Humans have <em>computer</em> systems, Houyhnhnms have <em>computing</em> systems.</p>
<cite>
    <a href="https://ngnghm.github.io/blog/2015/08/02/chapter-1-the-way-houyhnhnms-compute/"> François-René Rideau</a>, Chapter 1: The Way Houyhnhnms Compute
</cite></blockquote>
<h3 id="alt-systems" class="prose-heading">alt-systems<button type="button" class="copy-heading" data-link="https://joodaloop.com/ontological-engineering/#alt-systems" aria-label="Copy link to section: alt-systems" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://johnnydecimal.com/" target="_blank" rel="noopener">Johnny Decimal</a></li>
</ul>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>You should make a Telegram bot</title>
      <link>https://joodaloop.com/riffs/make-a-telegram-bot/</link>
      <pubDate>Thu, 05 Dec 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/make-a-telegram-bot/</guid>
      <description>Shipped a starter template for Telegram bots on Cloudflare Workers, using much of the code from Ellipsis, but making the D1 database optional. It creates a bot that acts as an interface to Claude, using the Anthropic API.&#xA;</description>
      <content:encoded><![CDATA[<p>Shipped a starter template <strong><a href="https://github.com/joodaloop/telegram-bot-as-cf-worker" target="_blank" rel="noopener">for Telegram bots on Cloudflare Workers</a></strong>, using much of the code from Ellipsis, but making the D1 database optional. It creates a bot that acts as an interface to Claude, using the Anthropic API.</p>
<p>The goal was to keep initial setup as straightforward as possible (you should be able to run this without creating a local copy of the code), and I plan to make all future features work the same way. There&rsquo;s tension between minimalism and demoing a full-featured app though.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Ellipsis</title>
      <link>https://joodaloop.com/riffs/ellipsis/</link>
      <pubDate>Mon, 02 Dec 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/ellipsis/</guid>
      <description>I just put together Telegram bot called Ellipsis, acts as a chat interface to Claude. Currently only accessible to me, and a couple friends.&#xA;</description>
      <content:encoded><![CDATA[<p>I just put together <strong>Telegram bot called Ellipsis</strong>, acts as a chat interface to Claude. Currently only accessible to me, and a couple friends.</p>
<p>Built with Hono and Drizzle, hosted on Cloudflare Workers with their D1 database acting as the storage layer. To start with it just has a simple 6 message context window, but I have a few <a href="https://docs.joodaloop.com/ellipsis" target="_blank" rel="noopener">more ideas</a> that I want to try later.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>PDFs</title>
      <link>https://joodaloop.com/pdfs/</link>
      <pubDate>Sat, 09 Nov 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/pdfs/</guid>
      <description>Why Childhood is Bad for ChildrenSarah Hannan&#xA;</description>
      <content:encoded><![CDATA[<h5 id="why-childhood-is-bad-for-children" class="prose-heading"><a href="https://onlinelibrary.wiley.com/doi/abs/10.1111/japp.12256" target="_blank" rel="noopener">Why Childhood is Bad for Children</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#why-childhood-is-bad-for-children" aria-label="Copy link to section: Why Childhood is Bad for Children" onclick="copyHeadingLink(this, event)"></button></h5><p>Sarah Hannan</p>
<h5 id="the-water-falls-but-the-waterfall-does-not-fall-new-perspectives-on-objects-processes-and-events" class="prose-heading"><a href="https://empslocal.ex.ac.uk/people/staff/apgalton/Preprints/AO-Waterfall-preprint.pdf" target="_blank" rel="noopener">The Water Falls but the Waterfall does not Fall: New perspectives on Objects, Processes and Events</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#the-water-falls-but-the-waterfall-does-not-fall-new-perspectives-on-objects-processes-and-events" aria-label="Copy link to section: The Water Falls but the Waterfall does not Fall: New perspectives on Objects, Processes and Events" onclick="copyHeadingLink(this, event)"></button></h5><p>Antony Galton and Riichiro Mizoguchi</p>
<h5 id="dbsp-automatic-incremental-view-maintenance-for-rich-query-languages" class="prose-heading"><a href="https://www.vldb.org/pvldb/vol16/p1601-budiu.pdf" target="_blank" rel="noopener">DBSP: Automatic Incremental View Maintenance for Rich Query Languages</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#dbsp-automatic-incremental-view-maintenance-for-rich-query-languages" aria-label="Copy link to section: DBSP: Automatic Incremental View Maintenance for Rich Query Languages" onclick="copyHeadingLink(this, event)"></button></h5><p>Mihai Budiu, Tej Chajed, Frank McSherry, Leonid Ryzhyk, and Val Tannen</p>
<h5 id="digital-typography" class="prose-heading"><a href="https://web.archive.org/web/20190523200235/https://www.kyotoprize.org/wp/wp-content/uploads/2016/02/12kA_lct_EN.pdf" target="_blank" rel="noopener">DIGITAL TYPOGRAPHY</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#digital-typography" aria-label="Copy link to section: DIGITAL TYPOGRAPHY" onclick="copyHeadingLink(this, event)"></button></h5><p>Donald Knuth</p>
<h5 id="categorizing-variants-of-goodhart" class="prose-heading"><a href="https://arxiv.org/abs/1803.04585" target="_blank" rel="noopener">Categorizing Variants of Goodhart&rsquo;s Law</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#categorizing-variants-of-goodhart" aria-label="Copy link to section: Categorizing Variants of Goodhart" onclick="copyHeadingLink(this, event)"></button></h5><p>David Manheim, Scott Garrabrant</p>
<h5 id="strong-inference" class="prose-heading"><a href="https://iiif.library.cmu.edu/file/Newell_box00015_fld01099_doc0010/Newell_box00015_fld01099_doc0010.pdf" target="_blank" rel="noopener">Strong Inference</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#strong-inference" aria-label="Copy link to section: Strong Inference" onclick="copyHeadingLink(this, event)"></button></h5><p>John R. Platt</p>
<h5 id="expressing-temporality-in-graphical-user-interface" class="prose-heading"><a href="https://www.diva-portal.org/smash/get/diva2:1483061/FULLTEXT01.pdf" target="_blank" rel="noopener">Expressing Temporality in Graphical User Interface</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#expressing-temporality-in-graphical-user-interface" aria-label="Copy link to section: Expressing Temporality in Graphical User Interface" onclick="copyHeadingLink(this, event)"></button></h5><p>Taner Olcay</p>
<h5 id="what-does-it-mean-to-represent-mental-representations-as-falsifiable-memory-patterns" class="prose-heading"><a href="https://arxiv.org/pdf/2203.02956" target="_blank" rel="noopener">What does it mean to represent? Mental representations as falsifiable memory patterns</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#what-does-it-mean-to-represent-mental-representations-as-falsifiable-memory-patterns" aria-label="Copy link to section: What does it mean to represent? Mental representations as falsifiable memory patterns" onclick="copyHeadingLink(this, event)"></button></h5><p>Eloy Parra-Barrero and Yulia Sandamirskaya</p>
<h5 id="onepassword-security-design" class="prose-heading"><a href="https://1passwordstatic.com/files/security/1password-white-paper.pdf" target="_blank" rel="noopener">OnePassword Security Design</a><button type="button" class="copy-heading" data-link="https://joodaloop.com/pdfs/#onepassword-security-design" aria-label="Copy link to section: OnePassword Security Design" onclick="copyHeadingLink(this, event)"></button></h5>
<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Actually Useful Design Commentary</title>
      <link>https://joodaloop.com/useful-design/</link>
      <pubDate>Mon, 30 Sep 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/useful-design/</guid>
      <description>Philosophy design is the second derivative of just plain doing stuff Christopher Alexander: A Primer A computer is a general-purpose machine: it can do pretty much anything — or at least, software could be created to make it do pretty much anything. Therefore, in theory, a user “entering” an application for the first time must assume that they can do anything in it but then learn very quickly where the application’s limits are. Thus, making software useable is as much about designing what can not be done as it is about designing how to do things.&#xA;</description>
      <content:encoded><![CDATA[<h2 id="philosophy" class="prose-heading">Philosophy<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-design/#philosophy" aria-label="Copy link to section: Philosophy" onclick="copyHeadingLink(this, event)"></button></h2><ul>
<li><a href="https://www.youtube.com/watch?v=ZKaToLZsAEc" target="_blank" rel="noopener">design is the second derivative of just plain doing stuff</a></li>
<li><a href="https://vimeo.com/491222729?turnstile=0.FHTcqjdvIHJzQ7AB0kIb7oo-9Q4mVtaBHNedlDjrSGUtRCsXv0drDWk4AmX60lZdrrdbMGhuI3Y1CYt9OhzRYfpu_nZ1ahfGetDdjkAY8slyZejtLloEH1S3Q77yvGO_JH4dNxJykiuOrIa-GsfVpF37ifa5YGZcBg87mpmHimS1HWWPvENUzOPTeQe5JJu6zLC0a-VS-yhFwlPJSyIE6c6FyzqRg_XhzmRtWCBVMV80uzAn12y8K-W0n8acQlTj37N_e0uHj1DcSfSFBJuopeu1FojIoA0Ptzavbxavd27ATEaNpRRQuvhseFmNzUDc2hnQJCf7pniLIGxHjQ4eauVXIx1q9yyRAudGZiwOu0eL8XXkB8BuqlBIjbpM8_pFWC85zpIZiZlyqDQh4vy10eab_4o5yzr8dy-Ne13g5RHCNkEkl6mkatdbsF6YRel_xf-F-VkkAD4e-Rw2_4zt7iFKu9uIRe5rRKsqNbxU1uDucU91112wyDjk28-QOFOSVTu1S_Yt4M1Uub3jMuU2dSHq562xLlvr_ma11bZ9sjkU83JVotq3MucKWwFClitp_wLPhvgC-KrXKpn5Fu8uBLTOk3sFTHy4tR8WSaR0thI7LQ8MxJ-FvNjAYxcIfZodFqWR12XnXyw8F4GL-KRO2keylpGwx5VyYVskVCjUTx0gBMb1bfzeJTbuBXL2Iz4N-1_h1UQT4D8GS3N11_1Y3hwJZQprnPYdTM-thgAmM0JZi0ywbE7cUy3RpP60_Bf0-_8hgCzXXcYpOvCVwrZrisVm7Q5pkPN0_cwx4CFQOE-iyCq9owFbFk4Q2SKH04cQhvOoCYtzCItsn9ZTD2vX8vqmKcojF2BaufrhyeUCcHjv-XQOc-FT6AFU68L8DVAhCPv7t91Rwgk-UHTUVJPCafQCPKA8a770GJPJAd6xKhM.O-0JULekCr35KCuPLYbxfA.74140a32f08fc954d880178a498b9f9492456d210d6475d341db29f8c1ce19b3" target="_blank" rel="noopener">Christopher Alexander: A Primer</a></li>
</ul>
<blockquote>
<p>A computer is a general-purpose machine: it can do pretty much anything — or at least, software could be created to make it do pretty much anything. Therefore, in theory, a user &ldquo;entering&rdquo; an application for the first time must assume that they can do anything in it but then learn very quickly where the application’s limits are. <strong>Thus, making software useable is as much about designing what can not be done as it is about designing how to do things.</strong></p>
<p><cite> <a href="https://christophlocher.com/notes/screen-as-room#1-sense-of-agency" target="_blank" rel="noopener">Christoph Locher</a>, Screen As Room: An Architectural Perspective on User Interfaces</cite></p></blockquote>
<blockquote>
<p>The practice of Design is commonly considered to have emerged during the Industrial Revolution. (p. 24) During this era, the Designer supplanted the craftsperson, whose role was the &ldquo;hand-making of furniture, tools, pottery or buildings, according to traditional methods and forms&rdquo;. (p. 25) The craftsperson does not develop new forms, but inherits the ones that have evolved over a long time of subtle modifications. Through the Industrial Revolution the division of labor was introduced. In this process the Designer holds a special role: They are now the only one to consider the item as a whole.</p>
<p><cite> <a href="https://christophlabacher.com/notes/glenn-parsons-the-philosophy-of-design" target="_blank" rel="noopener">Christoph Locher</a>, Notes from Glenn Parsons’ The Philosophy of Design </cite></p></blockquote>
<blockquote>
<p>Have you been forced to accept compromises?<br>
<strong>I don’t remember ever being forced to accept compromises but I have willingly accepted constraints.</strong></p>
<p>What do you feel is the primary condition for the practice of Design and for its propagation?<br>
<strong>A recognition of need.</strong></p>
<p><cite> <a href="https://rsms.me/eames-definition-of-design" target="_blank" rel="noopener">Charles Eames</a>, The Definition of Design </cite></p></blockquote>
<blockquote>
<p>Let me read you The Road to Hell, a series of questions that become more difficulty the deeper you go. The first couple are easy, would you—</p></blockquote>
<ol>
<li>Design a package to look larger on the shelf?</li>
<li>Do an ad for a slow-moving, boring film to make it seem like a lighthearted comedy?</li>
<li>Design a crest for a new vineyard to suggest that it&rsquo;s been in business for a long time?</li>
<li>Design a jacket for a book whose sexual content you find personally repellent?</li>
<li>Design an advertising campaign for a company with a history of known discrimination in minority hiring?</li>
<li>Design a package for a cereal aimed at children, which has low nutritional value and high sugar content?</li>
<li>Design a line of T-shirts for a manufacturer who employs child labor?</li>
<li>Design a promotion for a diet product that you know doesn&rsquo;t work?</li>
<li>Design an ad for a political candidate whose policies you believe would be harmful to the general public?</li>
<li>Design a brochure piece for an SUV that turned over more frequently than average in emergency conditions and caused the death of 150 people?</li>
<li>Design an ad for a product whose continued use might cause the user&rsquo;s death?</li>
</ol>
<blockquote>
<p><cite> <a href="https://miltonglaser.com/milton/c:essays/#2" target="_blank" rel="noopener">Ambiguity &amp; Truth</a> </cite></p></blockquote>
<h2 id="process" class="prose-heading">Process<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-design/#process" aria-label="Copy link to section: Process" onclick="copyHeadingLink(this, event)"></button></h2><ul>
<li><a href="https://www.henrikkarlsson.xyz/p/unfolding" target="_blank" rel="noopener">Everything that turned out well in my life followed the same design process</a></li>
<li><a href="https://matthewstrom.com/writing/copying/" target="_blank" rel="noopener">Copying (is the way design works)</a></li>
</ul>
<blockquote>
<p>Draft, then polish. When you draft, it is still crucial to get right the key details. The utmost is to stay faithful to the meaning. At the end of the day, both design and writing are ways to communicate. For communication clarity is important, and there are rules to guarantee it. Unclear design, as well as unclear speech, can become dangerous.</p>
<p><cite> <a href="https://stasaki.com/designer-as-writer/" target="_blank" rel="noopener">Designer as Writer</a> </cite></p></blockquote>
<h2 id="practice" class="prose-heading">Practice<button type="button" class="copy-heading" data-link="https://joodaloop.com/useful-design/#practice" aria-label="Copy link to section: Practice" onclick="copyHeadingLink(this, event)"></button></h2><ul>
<li><a href="https://simplexct.com/data-ink-ratio-tables" target="_blank" rel="noopener">The Ink-data ratio (tables)</a></li>
<li><a href="https://www.youtube.com/watch?v=YM2Nj691PMo" target="_blank" rel="noopener">Frank Rausch – Good Typography, Better Apps</a></li>
<li><a href="https://worrydream.com/MagicInk/" target="_blank" rel="noopener">Magic Ink</a></li>
<li><a href="https://ia.net/topics/the-web-is-all-about-typography-period" target="_blank" rel="noopener">Web Design is 95% Typography</a></li>
</ul>
<blockquote>
<p>I was talking to one usability expert and he was describing how they measure task completion.  Did the user press the buttons in the right order?  Their ideal app resulted in new users completing tasks 100% of the time. This isn&rsquo;t exploratory learning.  You need to be able to fail and explore the possibility space of a particular tool.  Through repeated failure and success, users build up robust skills that can be applied successfully in a wide variety of situations.</p>
<p>Users are not dimwitted Users are not dimwitted monkeys They are intelligent human beings Sure there are monkeys. They are intelligent human beings.  Sure, there are limitations, but for the most part we are wired to be problem solvers.  Our brains are flooded with lovely chemicals like dopamine and endorphins when we figure something out on our own.  Thats fun at its heart:  Our brains telling us that we grokked something interesting. When you build applications that let users be smart, they love you for it.  The secret to good game design is simple.  Set up situations where there is a problem that must be solved and let the user solve it.  Give them subtle clue, but don&rsquo;t take away that aha moment.</p>
<p><cite> <a href="https://gwern.net/doc/design/2008-cook.pdf" target="_blank" rel="noopener">Building a Princess Saving App</a> </cite></p></blockquote>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Revstar</title>
      <link>https://joodaloop.com/riffs/revstar/</link>
      <pubDate>Wed, 21 Aug 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/revstar/</guid>
      <description>I am now the proud owner of what is the most beautiful guitar I’ve ever seen or played.&#xA;</description>
      <content:encoded><![CDATA[<p>I am now the proud owner of what is the most beautiful guitar I’ve ever seen or played.</p>
<p>For the very fair price of $750 American, it comes with excellent P90s, stainless steel frets, a carbon fiber reinforced and satin-finish neck, and lovely build quality everywhere else.</p>
<p>If that wasn’t enough, Yamaha also ships it with Elixir Nanoweb strings and a well-padded soft case. Good stuff!</p>
<video controls="">
<source src="https://media.joodaloop.com/revstar.mp4" type="video/mp4">
</video>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>How I Use Hugo</title>
      <link>https://joodaloop.com/hugo/</link>
      <pubDate>Tue, 13 Aug 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/hugo/</guid>
      <description>I’ll be honest, Hugo is not the simplest tool in the world. I have spent hours digging through forum posts and documentation pages.&#xA;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ll be honest, Hugo is not the simplest tool in the world. I have spent hours digging through forum posts and documentation pages.</p>
<p>But it <em>was</em> simple enough for me to use when I first started out making websites, when I didn&rsquo;t know what a config file did, or what a server was. So there&rsquo;s that.</p>
<p><strong>Note:</strong> I&rsquo;ve created a really minimal <a href="https://github.com/joodaloop/hugoloop" target="_blank" rel="noopener">Hugo starter site</a> example, the most barebones example of how I structure my sites.</p>
<p>What makes it worth learning + using? For me the answer is three-fold:</p>
<ol>
<li>
<p><strong>It doesn&rsquo;t break:</strong> Once have the binary downloaded, you&rsquo;ll never have to install anything else again, it&rsquo;s all self-contained. It&rsquo;s also &ldquo;<a href="https://commaok.xyz/post/on_hugo/" target="_blank" rel="noopener">finished software</a>&rdquo;, you can stick to your current version and never upgrade.</p>
<p>When I make sites for clients, I don&rsquo;t want them to deal with fix broken stuff months down the line, the fewer moving parts the better. Having just one part? Bliss.</p>
</li>
<li>
<p><strong>Ease-of-use:</strong> Once you&rsquo;ve done the hard work of creating the site, it&rsquo;s really simple for other people to use. They clone the repo, install Hugo, run <code>hugo serve</code> and&hellip;that&rsquo;s it. No annoying &rsquo;npm install&rsquo; commands, or running a database process. <a href="https://twitter.com/rsnous/status/1786153733048430752" target="_blank" rel="noopener">&ldquo;i&rsquo;m so scared of package managers and build systems&rdquo;</a></p>
</li>
<li>
<p><strong>It&rsquo;s light:</strong> I say this often, but it&rsquo;s <em>so</em> nice to work with something that&rsquo;s just a simple binary. No plugin downloads or package upgrades, no need for a runtime environment, no slow build times, and the Hugo server&rsquo;s hot reloading is <em>fast</em>.</p>
</li>
</ol>
<p>I&rsquo;m not going to try to teach you how to use Hugo in this post, I&rsquo;ll only recommend this <a href="https://www.youtube.com/watch?v=qtIqKaDlqXo&amp;list=PLLAZ4kZ9dFpOnyRlyS-liKL5ReHDcj4G3" target="_blank" rel="noopener">tutorial</a>, Googling stuff when you&rsquo;re stuck, and this <a href="https://gist.github.com/janert/4e22671044ffb06ee970b04709dd7d81" target="_blank" rel="noopener">guide</a>. Heck, if you run into a problem, feel free to <a href="https://twitter.com/joodalooped" target="_blank" rel="noopener">DM me</a> and I&rsquo;ll help you if I can.</p>
<p>Instead, this post is about documenting what is best described as the &ldquo;folk practices&rdquo; around how I work with Hugo.</p>
<h3 id="the-command-line" class="prose-heading">The command line<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#the-command-line" aria-label="Copy link to section: The command line" onclick="copyHeadingLink(this, event)"></button></h3><p>The only command I run is &ldquo;hugo server&rdquo;. It&rsquo;s what starts up the site preview that I can use for both writing and development. One of my favourite things about Hugo is that, unlike most other generators, this command doesn&rsquo;t create an output directory each time (which clutters up my file searches), it just serves pages from memory.</p>
<p><strong>Edit:</strong> As of <a href="https://github.com/gohugoio/hugo/issues/11987" target="_blank" rel="noopener">February 2024</a>, this is no longer true. You need to pass the &ndash;renderToMemory flag to &ldquo;hugo serve&rdquo; in order to avoid writing to disk.</p>
<p>To create a new post I just make a new .md file myself in my text editor and save it to the relevant folder.</p>
<p>Even creating a new site is a process of simply copying over one of my previous sites, and editing the template files in there.</p>
<h3 id="site-structure" class="prose-heading">Site structure<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#site-structure" aria-label="Copy link to section: Site structure" onclick="copyHeadingLink(this, event)"></button></h3><p>I don&rsquo;t use themes, none of my sites even have a &ldquo;themes&rdquo; directory. I don&rsquo;t want to work with or depend on someone else&rsquo;s code.</p>
<p>I store my templates and static files directly in the root, so my site structure looks like this.</p>
<p><img src="/media/photos/hugo-dir.png" alt="Hugo site file structure"></p>
<p>This is all you need. Really. Even the &ldquo;resources&rdquo; folder is empty, it&rsquo;s just generated by Hugo.</p>
<h3 id="content" class="prose-heading">Content<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#content" aria-label="Copy link to section: Content" onclick="copyHeadingLink(this, event)"></button></h3><p>Try to only use the bare minimum frontmatter fields. For me these are <code>title</code>, <code>description</code>, and <code>date</code>. I prefer YAML over TOML.</p>
<p>Write all your posts in Markdown, dropping down to HTML when necessary. Hugo let&rsquo;s you use them within the same file if you have <a href="https://gohugo.io/getting-started/configuration-markup/#rendererunsafe" target="_blank" rel="noopener">unsafe</a> set to true in your config file.  Don&rsquo;t use shortcodes, these are generator-specific constructs that reduce portability.</p>
<h3 id="processing" class="prose-heading">Processing<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#processing" aria-label="Copy link to section: Processing" onclick="copyHeadingLink(this, event)"></button></h3><p>Hugo does provide a bunch of processing functionality, but I don&rsquo;t use any of it. Stylesheets are plain CSS, images are optimised before I add them, not during the build step.</p>
<h3 id="deployment" class="prose-heading">Deployment<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#deployment" aria-label="Copy link to section: Deployment" onclick="copyHeadingLink(this, event)"></button></h3><p>All my static sites are deployed on Netlify, they have a <em>very</em> generous free tier for static sites. It rebuilds the site whenever I push to the Github repo, and handles builds according to a <code>netlify.config</code> file. This is what mine looks like:</p>
<pre><code class="language-toml">baseURL = &quot;/&quot;

[[headers]]
  for = &quot;/*&quot;
    [headers.values]
      Access-Control-Allow-Origin = &quot;*&quot;

[build]
  command = &quot;hugo&quot;
  publish = &quot;public&quot;

[build.environment]
  HUGO_VERSION = &quot;0.105.0&quot;

[[redirects]]
  from = &quot;/*&quot;
  to = &quot;/404.html&quot;
  status = 404

[[headers]]
  for = &quot;/*&quot;
    [headers.values]
    Cache-Control = &quot;public, immutable, max-age=900&quot;

[[headers]]
  for = &quot;/fonts/*&quot;
    [headers.values]
    Cache-Control = &quot;public, immutable, max-age=31536000&quot;

[[headers]]
  for = &quot;/css/*&quot;
    [headers.values]
    Cache-Control = &quot;public, must-revalidate, max-age=300000&quot;
    ETag = &quot;unique_value&quot;

[[headers]]
  for = &quot;/media/*&quot;
    [headers.values]
    Cache-Control = &quot;public, immutable, max-age=31536000&quot;
</code></pre>
<h2 id="power-tools" class="prose-heading">Power tools<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#power-tools" aria-label="Copy link to section: Power tools" onclick="copyHeadingLink(this, event)"></button></h2><h3 id="render-hooks" class="prose-heading">Render hooks<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#render-hooks" aria-label="Copy link to section: Render hooks" onclick="copyHeadingLink(this, event)"></button></h3><p>Hugo lets you hook into the generation process for certain Markdown elements, so that you can customise the output HTML. At the moment, there are hooks available for headings, links, images, and code blocks.</p>
<p>Here&rsquo;s an example of using the link render hook (/layouts/_default/_markup/render-link.html) to set only external links to open in a new tab.</p>
<pre><code class="language-html">&lt;a href=&quot;{{ .Destination | safeURL }}&quot;{{ with .Title}} title=&quot;{{ . }}&quot;{{ end }}{{ if strings.HasPrefix .Destination &quot;http&quot; }} target=&quot;_blank&quot; class=&quot;external-link&quot; {{ end }}&gt;{{ .Text | safeHTML }}&lt;/a&gt;
</code></pre>
<h3 id="forum" class="prose-heading">Forum<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#forum" aria-label="Copy link to section: Forum" onclick="copyHeadingLink(this, event)"></button></h3><p>I&rsquo;ve found most answers to my questions from Googling &ldquo;how to do X in hugo&rdquo; and following one of the links to a similar question Hugo forum. Many answers come directly from the creator and chief maintainers.</p>
<h3 id="template-functions" class="prose-heading">Template functions<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#template-functions" aria-label="Copy link to section: Template functions" onclick="copyHeadingLink(this, event)"></button></h3><p>There are a <em>ton</em> of useful functions and <a href="https://gohugo.io/quick-reference/methods/" target="_blank" rel="noopener">methods</a> in Hugo&rsquo;s templating language. It isn&rsquo;t a pretty one, nor is it particularly beginner-friendly (it uses <a href="https://en.wikipedia.org/wiki/Polish_notation" target="_blank" rel="noopener">Polish notation</a>) but it can do way more than any other templating language I&rsquo;ve used.</p>
<p>Simple example of fetching pages from the &ldquo;guides&rdquo; section of my site.</p>
<pre><code class="language-html">{{ range where .Site.RegularPages &quot;Section&quot; &quot;guides&quot; }}
    &lt;p&gt;
        &lt;a href=&quot;{{ .Permalink }}&quot;&gt; {{ .Title }} &lt;/a&gt;
    &lt;/p&gt;
{{ end }}
</code></pre>
<h3 id="in-built-functionality" class="prose-heading">In-built functionality<button type="button" class="copy-heading" data-link="https://joodaloop.com/hugo/#in-built-functionality" aria-label="Copy link to section: In-built functionality" onclick="copyHeadingLink(this, event)"></button></h3><p>There&rsquo;s a <a href="https://gohugo.io/content-management/syntax-highlighting/" target="_blank" rel="noopener">syntax highlighter</a>, a bunch of <a href="https://gohugo.io/hugo-pipes/" target="_blank" rel="noopener">processing functions</a>, the ability to add classes to Markdown elements with <a href="https://gohugo.io/content-management/markdown-attributes/" target="_blank" rel="noopener">Markdown attributes</a>, templates for <a href="https://gohugo.io/templates/rss/" target="_blank" rel="noopener">RSS feeds</a>, and help for <a href="https://gohugo.io/content-management/multilingual/" target="_blank" rel="noopener">multi-lingual</a> sites.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Mac app studios</title>
      <link>https://joodaloop.com/mac-devs/</link>
      <pubDate>Tue, 09 Jul 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/mac-devs/</guid>
      <description>Mikkel Malmberg&#xA;Objective Development&#xA;Many Tricks&#xA;Low Tech Guys&#xA;Panic&#xA;</description>
      <content:encoded><![CDATA[<p><a href="https://mikkelmalmberg.com/" target="_blank" rel="noopener">Mikkel Malmberg</a></p>
<p><a href="https://www.obdev.at/index.html" target="_blank" rel="noopener">Objective Development</a></p>
<p><a href="https://manytricks.com/" target="_blank" rel="noopener">Many Tricks</a></p>
<p><a href="https://lowtechguys.com/" target="_blank" rel="noopener">Low Tech Guys</a></p>
<p><a href="https://panic.com/" target="_blank" rel="noopener">Panic</a></p>
<p><a href="https://retina.studio/" target="_blank" rel="noopener">retina studio</a></p>
<p><a href="https://micropixels.software/" target="_blank" rel="noopener">Micropixels</a></p>
<p><a href="https://sindresorhus.com/apps" target="_blank" rel="noopener">Sindre Sorhus</a></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>My Inventions</title>
      <link>https://joodaloop.com/inventions/</link>
      <pubDate>Thu, 20 Jun 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/inventions/</guid>
      <description> Ideas and implementations that I arrived at independently. Since it is impossible to claim true novelty, I can only make a softer claim of newness: when I came up with these things, I hadn’t seen them before.&#xA;</description>
      <content:encoded><![CDATA[<!-- for when I reach 10: https://twitter.com/runaway_vol/status/1807466550384841067 -->
<p>Ideas and implementations that I arrived at independently. Since it is impossible to claim true novelty, I can only make a softer claim of newness: when I came up with these things, I hadn&rsquo;t seen them before.</p>
<!--### A shared, realtime chat section for website visitors-->
<h3 id="messages-to-accompany-phone-calls" class="prose-heading">Messages to accompany phone calls<button type="button" class="copy-heading" data-link="https://joodaloop.com/inventions/#messages-to-accompany-phone-calls" aria-label="Copy link to section: Messages to accompany phone calls" onclick="copyHeadingLink(this, event)"></button></h3><p>Some calls are &ldquo;would be nice if you answered&rdquo;, while some are &ldquo;PLEASE PICK UP&rdquo;. Phone calls should contain a small text message that shows up on the receiver&rsquo;s UI, as a way to communicate urgency.</p>
<p><strong>When:</strong> <em>circa 2022</em></p>
<h3 id="a-foolproof-method-for-hand-based-fly-killing" class="prose-heading">A foolproof method for hand-based fly-killing<button type="button" class="copy-heading" data-link="https://joodaloop.com/inventions/#a-foolproof-method-for-hand-based-fly-killing" aria-label="Copy link to section: A foolproof method for hand-based fly-killing" onclick="copyHeadingLink(this, event)"></button></h3><p>Sneak up to the fly, and smash your palms together around 3 inches <em>above</em> the fly. It will fly right into your hands.</p>
<p><strong>When:</strong> <em>Sometime in middle school</em></p>
<h3 id="horizontal-table-of-contents" class="prose-heading">Horizontal table of contents<button type="button" class="copy-heading" data-link="https://joodaloop.com/inventions/#horizontal-table-of-contents" aria-label="Copy link to section: Horizontal table of contents" onclick="copyHeadingLink(this, event)"></button></h3><p>Viewable at <a href="https://nickarner.com/books" target="_blank" rel="noopener">nickarner.com/books</a>. Saves lots of space for long ToCs in a single-column layout while still providing a navigable summary of the post.</p>
<p><strong>When:</strong> August 2023</p>
<h3 id="monthly-shareholder-letters-to-friends" class="prose-heading">Monthly shareholder letters to friends<button type="button" class="copy-heading" data-link="https://joodaloop.com/inventions/#monthly-shareholder-letters-to-friends" aria-label="Copy link to section: Monthly shareholder letters to friends" onclick="copyHeadingLink(this, event)"></button></h3><p>Write the most official-sounding monthly update possible. Add stats and figures and challenges. Anybody invested in you in any way deserves a shareholder letter.</p>
<p><strong>When:</strong> June 2024</p>
<h3 id="font-switcher-for-a-personal-website" class="prose-heading">Font-switcher for a personal website<button type="button" class="copy-heading" data-link="https://joodaloop.com/inventions/#font-switcher-for-a-personal-website" aria-label="Copy link to section: Font-switcher for a personal website" onclick="copyHeadingLink(this, event)"></button></h3><p>As seen in the top-left corner of this site.</p>
<p><strong>When:</strong> January 2024</p>
<!-- ### phone call with message -->

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Computing Without the Courses</title>
      <link>https://joodaloop.com/computing/</link>
      <pubDate>Sat, 25 May 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/computing/</guid>
      <description>These are not a substitute for proper study, or writing lots of code.&#xA;</description>
      <content:encoded><![CDATA[<p>These are not a substitute for proper study, or writing lots of code.</p>
<p>Go play Nand2Tetris. It&rsquo;s a fun game, doesn&rsquo;t need you to learn any syntax, and gives you the assurance that you computers are, in fact, built on very understandable basic components.</p>
<h3 id="canon" class="prose-heading">Canon<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#canon" aria-label="Copy link to section: Canon" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://aphyr.com/posts/341-hexing-the-technical-interview" target="_blank" rel="noopener">Hexing the Technical Interview</a></li>
<li><a href="https://www.cs.utexas.edu/users/EWD/" target="_blank" rel="noopener">E. W. Dijkstra Archive</a></li>
<li><a href="https://www.bloomberg.com/graphics/2015-paul-ford-what-is-code/" target="_blank" rel="noopener">What is Code?</a></li>
<li><a href="https://degoes.net/articles/modern-fp-part-2" target="_blank" rel="noopener">Modern Functional Programming: Part 2</a></li>
<li><a href="https://github.com/d-cook/SomethingNew/blob/master/Resources.md" target="_blank" rel="noopener">SomethingNew</a></li>
<li><a href="https://news.ycombinator.com/item?id=22907211" target="_blank" rel="noopener">Ask HN: What are some great posts or articles about history of computing?</a></li>
</ul>
<h3 id="fundamentals" class="prose-heading">Fundamentals<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#fundamentals" aria-label="Copy link to section: Fundamentals" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://missing.csail.mit.edu/" target="_blank" rel="noopener">The Missing Semester of Your CS Education</a></li>
<li><a href="https://cpu.land/" target="_blank" rel="noopener">Putting the &ldquo;You&rdquo; in CPU</a></li>
<li><a href="https://mitpress.mit.edu/books/elements-computing-systems" target="_blank" rel="noopener">The Elements of Computing Systems</a>, and the <a href="https://nandgame.com/" target="_blank" rel="noopener">Nand2Tetris game</a></li>
<li><a href="https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/" target="_blank" rel="noopener">The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets</a></li>
<li><a href="https://mattmahoney.net/dc/dce.html" target="_blank" rel="noopener">Data Compression Explained</a></li>
<li><a href="https://tom.preston-werner.com/2009/05/19/the-git-parable.html" target="_blank" rel="noopener">The Git Parable</a></li>
<li><a href="https://danluu.com/teach-debugging/" target="_blank" rel="noopener">Teach Debugging</a></li>
<li><a href="https://codexpanse.com/courses/computer-science-for-the-busy-developer/" target="_blank" rel="noopener">Computer Science for The Busy Developer</a></li>
<li><a href="https://cdsmith.wordpress.com/2011/01/09/an-old-article-i-wrote/" target="_blank" rel="noopener">What To Know Before Debating Type Systems</a></li>
<li><a href="https://mollymielke.notion.site/Computing-History-Hub-be72f307fc2e4b05abe3dc67eb937521" target="_blank" rel="noopener">Computing History Hub</a></li>
</ul>
<h3 id="databases" class="prose-heading">Databases<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#databases" aria-label="Copy link to section: Databases" onclick="copyHeadingLink(this, event)"></button></h3><p>I have a special <a href="/databases">Databases page</a> because they&rsquo;re so fun, just a never-ending source of interesting ideas.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=5ZjhNTM8XU8" target="_blank" rel="noopener">“Transactions: myths, surprises and opportunities”</a></li>
<li><a href="https://www.benstopford.com/2015/02/14/log-structured-merge-trees/" target="_blank" rel="noopener">Log Structured Merge Trees</a></li>
</ul>
<h3 id="pl-theory" class="prose-heading">PL Theory<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#pl-theory" aria-label="Copy link to section: PL Theory" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://www.adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html" target="_blank" rel="noopener">Functors, Applicatives, And Monads In Pictures</a></li>
<li><a href="https://craftinginterpreters.com/" target="_blank" rel="noopener">Crafting Interpreters</a></li>
</ul>
<h3 id="crypto--auth" class="prose-heading">Crypto / Auth<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#crypto--auth" aria-label="Copy link to section: Crypto / Auth" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://fly.io/blog/api-tokens-a-tedious-survey/" target="_blank" rel="noopener">API Tokens: A Tedious Survey</a></li>
</ul>
<h3 id="languages" class="prose-heading">Languages<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#languages" aria-label="Copy link to section: Languages" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://gobyexample.com/" target="_blank" rel="noopener">Go by Example</a></li>
<li><a href="https://www.braveclojure.com/clojure-for-the-brave-and-true/" target="_blank" rel="noopener">Clojure for the Brave and True</a></li>
<li><a href="https://learnyousomeerlang.com/starting-out-for-real" target="_blank" rel="noopener">Learn You Some Erlang (for greater good)</a></li>
</ul>
<h3 id="building-abstractions" class="prose-heading">Building abstractions<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#building-abstractions" aria-label="Copy link to section: Building abstractions" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://htmx.org/essays/locality-of-behaviour/" target="_blank" rel="noopener">Locality of Behaviour</a></li>
<li><a href="https://notebook.drmaciver.com/posts/2024-01-13-08:28.html" target="_blank" rel="noopener">Writing good programming abstractions</a></li>
<li><a href="https://blog.pragmaticengineer.com/a-philosophy-of-software-design-review/" target="_blank" rel="noopener">A Philosophy of Software Design</a> – <a href="https://milkov.tech/assets/psd.pdf" target="_blank" rel="noopener">PDF</a></li>
<li><a href="https://dannorth.net/cupid-for-joyful-coding" target="_blank" rel="noopener">CUPID—for joyful coding</a></li>
<li><a href="https://12factor.net" target="_blank" rel="noopener">The Twelve-Factor App</a></li>
<li><a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/" target="_blank" rel="noopener">The Law of Leaky Abstractions</a></li>
</ul>
<h3 id="code-janitor-tips" class="prose-heading">Code janitor tips<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#code-janitor-tips" aria-label="Copy link to section: Code janitor tips" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/" target="_blank" rel="noopener">Making Wrong Code Look Wrong</a></li>
<li><a href="https://github.com/brandur/heroku-http-api-design" target="_blank" rel="noopener">HTTP API Design Guide</a></li>
<li><a href="https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#requirements" target="_blank" rel="noopener">Best Practices for Designing a Pragmatic RESTful API</a></li>
<li><a href="https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/" target="_blank" rel="noopener">Parse, don’t validate</a></li>
<li><a href="https://danluu.com/teach-debugging/" target="_blank" rel="noopener">Teach Debugging</a></li>
<li><a href="https://www.infoq.com/presentations/Thinking-in-Data/" target="_blank" rel="noopener">Thinking in Data</a></li>
</ul>
<h3 id="data-modelling" class="prose-heading">Data modelling<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#data-modelling" aria-label="Copy link to section: Data modelling" onclick="copyHeadingLink(this, event)"></button></h3><ul>
<li><a href="https://www.notion.so/blog/data-model-behind-notion" target="_blank" rel="noopener">https://www.notion.so/blog/data-model-behind-notion</a></li>
</ul>
<h3 id="misc" class="prose-heading">Misc.<button type="button" class="copy-heading" data-link="https://joodaloop.com/computing/#misc" aria-label="Copy link to section: Misc." onclick="copyHeadingLink(this, event)"></button></h3><p><a href="https://blog.sbensu.com/posts/demand-for-visual-programming/" target="_blank" rel="noopener">We need visual programming. No, not like that.</a></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Anti-library</title>
      <link>https://joodaloop.com/anti-library/</link>
      <pubDate>Sun, 19 May 2024 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/anti-library/</guid>
      <description>A Perfect Vacuum&#xA;Brideshead Revisited&#xA;Axiomatic&#xA;The Everything Music Composition Book&#xA;</description>
      <content:encoded><![CDATA[<p>A Perfect Vacuum</p>
<p>Brideshead Revisited</p>
<p>Axiomatic</p>
<p>The Everything Music Composition Book</p>
<p><a href="https://cup.columbia.edu/book/language-the-unknown/9780231216791/" target="_blank" rel="noopener">Language: The Unknown</a></p>
<p>Piranesi</p>
<p>Invisible Cities</p>
<p>Language and Literature</p>
<p>Lord of Light</p>
<p>The Lady Tasting Tea</p>
<p>Neuromancer</p>
<p>the making of karateka</p>
<p>Fall Revolution</p>
<p>Piranesi</p>
<p>Ra by qtnm</p>
<p>Swimming Across</p>
<p>High Output Management</p>
<p>The Raw Shark Texts</p>
<p>Hyperion</p>
<p>Watchmen</p>
<p>The Name of the Rose</p>
<p>The Girl with All the Gifts</p>
<p>Use of Weapons</p>
<p>The Mark and the Void</p>
<p>Annihilation</p>
<p>All the Light We Cannot See</p>
<p>Unsong</p>
<p>Red Plenty</p>
<p>Piranesi</p>
<p>A Heartbreaking Work of Staggering Genius</p>
<p>Theses on the Philosophy of History</p>
<p>In the Vineyard of the Text</p>
<p>This Is How They Tell Me the World Ends: The Cyberweapons Arms Race</p>
<p>The Quantum Thief</p>
<p>Anthem</p>
<p>Pascal&rsquo;s Apology</p>
<p>Gambling on Development</p>
<p>Rhythms of the Brain</p>
<p>Human, Forever</p>
<p>Hacker&rsquo;s delight</p>
<p>Accelerated Expertise</p>
<p>The Hedgehog &amp; The Fox</p>
<p>The Feather Men</p>
<p>The Mind-Body Problem</p>
<p>A Complicated Kindness</p>
<p>The Book of the New Sun</p>
<p>Diaspora by Greg Egan</p>
<p>Against Rousseau</p>
<p>Husserl&rsquo;s phenomenology</p>
<p>Agnar Mykle and Knut Hamsun</p>
<p>Music: A Subversive history</p>
<p>V.</p>
<p>The Open Society and its Enemies</p>
<p>Lacan</p>
<p>Gravity&rsquo;s Rainbow</p>
<p>The unwomanly face of war</p>
<p>Axiomatic</p>
<p>Ficciones</p>
<p>Bleak House</p>
<p>Dean Koontz&rsquo;s &ldquo;Elsewhere&rdquo;</p>
<p>Dusk (James Salter)</p>
<p>Two Cultures</p>
<p>These Precious Days</p>
<p>The Farther Reaches of Human Nature</p>
<p>The Origin of Wealth</p>
<p>Chronic City</p>
<p>Recursion</p>
<p>The Glass Hotel</p>
<p>Too Loud a Solitude</p>
<p>Principles of Population Genetics</p>
<p>A Gentleman in Moscow</p>
<p>Anathem</p>
<p>Player of Games</p>
<p>The History of Scarcity</p>
<p>Naked Economics</p>
<p>Life: A users manual</p>
<p>On food and cooking</p>
<p>Caro</p>
<p>The Mystery of Capital</p>
<p>Ethics</p>
<p>The Present Age</p>
<p>Down and Out in London and Paris</p>
<p>Oglivey on Advertising</p>
<p>White by Kenya Hara</p>
<p>Conversations With Friends</p>
<p>A Good Man Is Hard To Find</p>
<p>A Grief Observed</p>
<p>Money And Government</p>
<p>Second Nature</p>
<p>Operating Systems: Three Easy Parts</p>
<p>Why We Talk</p>
<p>Euclid&rsquo;s Elements</p>
<p>The Waves</p>
<p>Godel, Escher, Bach</p>
<p>The Moon Is A Harsh Mistress</p>
<p>Things Hidden Since the Foundation Of The World</p>
<p>The Mote in Gods Eye</p>
<p>The Origin of Consciousness in the Breakdown of the Bicameral Mind</p>
<p>The Unfolding of Language.</p>
<p>A Splendid Wickedness</p>
<p>The Dream-Child&rsquo;s Progress</p>
<p>The Experience of God</p>
<p>Capitalism and Freedom</p>
<p>Development as Freedom</p>
<p>In Service of the Republic</p>
<p>From Third World to First</p>
<p>Knowledge and the Wealth of Nations</p>
<p>How Asia Works</p>
<p>Stubborn Attachments</p>
<p>Ringworld</p>
<p>Orality and Literacy</p>
<p>Snow Crash</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
  </channel>
</rss>
