<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://joodaloop.com/feed.xsl" type="text/xsl"?>
<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>Fri, 04 Sep 2026 00:00:00 &#43;0000</lastBuildDate>
    <image>
      <url>https://joodaloop.com/card.png</url>
      <title>JOODALOOP</title>
      <link>https://joodaloop.com/</link>
    </image>
    
    <item>
      <title>A Better Forum</title>
      <link>https://joodaloop.com/a-better-forum/</link>
      <pubDate>Fri, 11 Sep 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/a-better-forum/</guid><description>I would like to combine a library with a group chat in a cool way</description>
      <content:encoded><![CDATA[<blockquote>
<p>Internet community architecture can be seen as a bi-level optimization design, similar to evolution or economics or war or reinforcement learning. There are fast and slow methods of interaction, and ideas or knowledge (or just ‘memes’) are created, varied, and selected on. These interactions happen inside discrete communities which are themselves created, varied, and grow. So, they are instances of multilevel selection.</p>
<p><cite> Gwern, <a href="https://gwern.net/internet-community-design" target="_blank" rel="noopener" title="Internet Community Design: Slow To Fast · Gwern.net">Internet Community Design: Slow To Fast</a> </cite></p>
</blockquote>
<h2 id="motivations">Motivations</h2>
<h3 id="i-like-forums">I like forums</h3>
<ol>
<li>Their threaded nature make it ergonomic to pck up an existing topic and extend upon it in the future, compared to the &ldquo;reply&rdquo; feature in chat apps that result in multiple interleaved conversations.</li>
<li>Threads make for nice, self-contained units of sharing.</li>
<li>Replies are slow and substantial enough to turn on notifications for.</li>
</ol>
<p>But it strikes me as a bad idea to make Yet Another Place To Have Conversations On; given how many there are already. On the other hand, many of them are dying, and new places struggle to be born. These things go in cycles, so maybe it&rsquo;s time to move on from micro-blogging to mid-posting?</p>
<h3 id="i-would-like-a-shared-library">I would like a shared library</h3>
<p>I like when people have bookshelves on their sites, I like Tom Critchlow&rsquo;s <a href="https://tomcritchlow.com/2020/04/15/library-json/" target="_blank" rel="noopener">Library JSON</a> idea for a protocol for open bookshelves (even though I agree that it should <a href="https://interconnected.org/home/2020/04/16/rss_for_books" target="_blank" rel="noopener">just be RSS</a>, lol).</p>
<p>And yet, the first community-sized books collection I ever heard of was Craig Mod&rsquo;s <em><a href="https://craigmod.com/roden/115/" target="_blank" rel="noopener">A Good Book</a></em> project, with features exactly the ones I was considering myself:</p>
<blockquote>
<p>Since all the books are good books, the idea of “favoriting” was redundant. So popularity is based on engagement: How many notes / quotes a book has, and how many shelves it’s on. I tried to inject some whimsy. The more quotes a book has the more “tabs” poke out of the side.</p>
<p><cite> Craig Mod, <a href="https://craigmod.com/roden/115/" target="_blank" rel="noopener">Go Knicks, A Better Goodreads, &lsquo;Cheap&rsquo; Killer Films</a> </cite></p>
</blockquote>
<p>Not that a library should limit itself to just books, of course. Custom views for other media would be nice. Seems quite useful to have a group-created version of <a href="https://worrydream.com/refs/" target="_blank" rel="noopener">https://worrydream.com/refs/</a>, for example.</p>
<h3 id="i-like-visual-journals">I like visual journals</h3>
<p><a href="https://joodaloop.com/a-better-journal" title="A Better Journal">A Better Journal 2.0</a> is about images, thanks to raw power of screenshots as a communication medium. Unlike text, which is incredibly lossy and requires painful effort to capture the right feeling, images almost just &ldquo;are&rdquo; the thing they&rsquo;re talking about.</p>
<p>I liked the <a href="https://web.archive.org/web/20230328074610/https://www.campsite.design/" target="_blank" rel="noopener">initial idea</a> behind Campsite, as a place for WIP design to be shared with other people in the company. It was much like having an internal Twitter of sorts. Low effort enough to make a post, but because it&rsquo;s a group with a specific topic focus it doesn&rsquo;t really get noisy the way a wide open commons might.</p>
<h2 id="concepts">Concepts</h2>
<h3 id="a-forum">A forum</h3>
<p>Classically designed for now, with replies + reactions + upvotes. Encourage personal projects to be turned into a thread so that they can be followed + commented on in one place.</p>
<h3 id="a-shared-library">A shared library</h3>
<p>Custom designed views for each kind of media. Ideally with archiving the actual media too, both for preservatin reasons and to give members easy access. Piracy, hell yeah!</p>
<h3 id="rich-user-profiles">Rich user profiles</h3>
<p>Links to current projects, long-term planning, wishlists, etc.</p>
<h3 id="a-feed">A feed</h3>
<p>For posting to when something doesn&rsquo;t deserve to be in a thread, but also every item added to the library shows up as an update in the feed. Maybe add a constraint that all posts should contain at least one image?</p>
<h3 id="misc">Misc.</h3>
<ul>
<li>Events</li>
<li>Online statuses</li>
<li>Graphs of stats</li>
</ul>
<h2 id="references">References</h2>
<ul>
<li><a href="https://oxide.computer/blog/a-tool-for-discussion" target="_blank" rel="noopener">A Tool for Discussion | Oxide Computer Company</a></li>
<li><a href="https://gwern.net/internet-community-design" target="_blank" rel="noopener">Internet Community Design: Slow To Fast</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?subject=Comment%20about%20%22A%20Better%20Forum%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Pattern Languages</title>
      <link>https://joodaloop.com/pattern-languages/</link>
      <pubDate>Wed, 09 Sep 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/pattern-languages/</guid><description>How to make one The fact is, that we have written this book as a first step in the society-wide process by which people will gradually become conscious of their own pattern languages, and work to improve them. We believe, and have explained in The Timeless Way of Building, that the languages which people have today are so brutal, and so fragmented, that most people no longer have any language to speak of at all—and what they do have is not based on human, or natural considerations.&#xA;</description>
      <content:encoded><![CDATA[<h2 id="how-to-make-one">How to make one</h2>
<blockquote>
<p>The fact is, that we have written this book as a first step in the society-wide process by which people will gradually become conscious of their own pattern languages, and work to improve them. We believe, and have explained in The Timeless Way of Building, that the languages which people have today are so brutal, and so fragmented, that most people no longer have any language to speak of at all—and what they do have is not based on human, or natural considerations.</p>
<p>We have spent years trying to formulate this language, in the hope that when a person uses it, he will be so impressed by its power, and so joyful in its use, that he will understand again, what it means to have a living language of this kind. If we only succeed in that, it is possible that each person may once again embark on the construction and development of his own language—perhaps taking the language printed in this book, as a point of departure.</p>
<p><cite> <a href="https://www.patternlanguageindetwitter.com/understanding-a-pattern-language#philosophical-ideals" target="_blank" rel="noopener">Understanding A Pattern Language</a> </cite></p>
</blockquote>
<blockquote>
<p>In this paper, we present the purpose, creating process, and overview of a pattern language for creating pattern languages, consisting364 patterns for pattern mining, pattern writing, and pattern symbolizing. For the past 10 years, we, Iba Lab, have created more than 20 pattern languages on various topics to describe human actions, consisting of more than 600 patterns in total. By creating these new pattern languages, we have studied and developed methodology to create pattern languages and to practice and modify them.</p>
<p><cite> <a href="https://dl.acm.org/doi/epdf/10.5555/3158161.3158175" target="_blank" rel="noopener">A Pattern Language for Creating Pattern Languages</a> </cite></p>
</blockquote>
<h3 id="a-pattern-language-for-pattern-writing"><a href="https://hillside.net/index.php/a-pattern-language-for-pattern-writing" target="_blank" rel="noopener">A Pattern Language for Pattern Writing</a></h3>
<p>This pattern language attempts to capture some of these &ldquo;best practices&rdquo; of pattern writing, both by describing them in pattern form, and by demonstrating them in action.</p>
<p><strong>Very good!</strong></p>
<h3 id="working-with-patterns-an-introduction"><a href="https://patternsofcommoning.org/working-with-patterns-an-introduction/" target="_blank" rel="noopener">Working with Patterns: An Introduction</a></h3>
<p>Someone who develops a pattern language must outline certain aspects for the description and then stick to the outline selected. If necessary, it is always possible to expand and change it. What is important is that each piece of information has its precise place and that the different aspects are not mixed when deriving statements. This makes it easier for individuals and groups to collaborate, both in a particular field of application and across disciplines and topics.</p>
<p><strong>Also very good!</strong></p>
<h3 id="building-an-interaction-design-pattern-language-a-case-study"><a href="https://www.sciencedirect.com/science/article/abs/pii/S0747563209001952" target="_blank" rel="noopener">Building an interaction design pattern language: A case study</a></h3>
<p><a href="https://www.sciencedirect.com/topics/computer-science/interaction-design" target="_blank" rel="noopener">Interaction design</a> patterns are a proven way to communicate good design. However, current pattern collections are not sufficiently powerful and generative to be used as a guide for designing an entire application such as those used in complex business environments. This study shows how we built and validated interaction <a href="https://www.sciencedirect.com/topics/computer-science/design-patterns" target="_blank" rel="noopener">design patterns</a> that serve as the specification for the redesign of an application. Additionally, they were integrated into a <a href="https://www.sciencedirect.com/topics/computer-science/pattern-languages" target="_blank" rel="noopener">pattern language</a>, as a ruleset for human–computer interaction (HCI) non-professionals to continue development of the application. We demonstrate how individual phases in the redesign of an application can be matched with the process of creating an interaction design pattern language. To facilitate the writing of individual interaction design patterns as well as the development of the pattern language as a whole, a combination of user interviews, controlled experiments and analytical methods has been applied successfully.</p>
<h2 id="examples-of-pls">Examples of PLs</h2>
<h3 id="pattern-languages-as-media-for-the-creative-society"><a href="https://arxiv.org/pdf/1308.1178" target="_blank" rel="noopener">PATTERN LANGUAGES AS MEDIA FOR THE CREATIVE SOCIETY</a></h3>
<p>This paper proposes new languages for basic skills in the Creative Society, where people create their own goods, tools, concepts, knowledge, and mechanisms with their own hands: the skills of learning, presentation, and collaboration.</p>
<h3 id="pedagogical-patterns"><a href="http://pedagogicalpatterns.org/" target="_blank" rel="noopener">Pedagogical Patterns</a></h3>
<p>Pedagogical patterns try to capture expert knowledge of the practice of teaching and learning. The intent is to capture the essence of the practice in a compact form that can be easily communicated to those who need the knowledge.</p>
<h3 id="patterns-for-decentralised-organising"><a href="https://github.com/rdbartlett/patterns/tree/master/print%20ready" target="_blank" rel="noopener">Patterns for Decentralised Organising</a></h3>
<p>This is a book about working in groups, based on 8 years experience in community projects and startups.</p>
<p>I’m not so interested in <em>what</em> you’re working on together, I’m just going to focus on <em>how</em> you do it. To my way of thinking, it doesn’t matter if you’re trying to build a better electric vehicle, or develop government policy, or blockade a pipeline; whenever you work with a group of people on a shared objective, there’s some <em>stuff</em> you’re going to deal with, some challenges. <em>How do we decide what we’re working on? who does what? who can join our team? what are our expectations for each other? what happens when someone doesn’t fulfil those expectations? what do we do with disagreement? how do decisions get made?</em></p>
<h3 id="an-everlasting-meal-cooking-with-economy-and-grace">An Everlasting Meal: Cooking with Economy and Grace</h3>
<h3 id="workflow-patterns"><a href="http://workflowpatterns.com/patterns/control/advanced_branching/wcp6.php" target="_blank" rel="noopener">Workflow Patterns</a></h3>
<p>The aim of this initiative is to provide a conceptual basis for process technology. In particular, the research provides a thorough examination of the various perspectives (control flow, data, resource, and exception handling) that need to be supported by a workflow language or a business process modelling language. The results can be used for examining the suitability of a particular process language or workflow system for a particular project, assessing relative strengths and weaknesses of various approaches to process specification, implementing certain business requirements in a particular process-aware information system, and as a basis for language and tool development.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Pattern%20Languages%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Better living through respecting chemistry</title>
      <link>https://joodaloop.com/riffs/better-chemistry/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/better-chemistry/</guid><description>I often talk to people about how getting better at self-driven work requires accumulating many small tricks and stratagems to keep from falling off — like body doubling, app blocking, and stopping in the middle.&#xA;</description>
      <content:encoded><![CDATA[<p>I often talk to people about how getting better at self-driven work requires accumulating many small tricks and stratagems to keep from falling off — like <a href="https://www.focusmate.com/" target="_blank" rel="noopener">body doubling</a>, app blocking, and <a href="https://writewithseth.com/the-secret-to-consistent-writing-stop-in-the-middle/" target="_blank" rel="noopener">stopping in the middle</a>.</p>
<p>This topic can often sound defeatist, because <em>surely</em> there is more to it than tricking yourself into the right state of mind for doing the work. Where is the beautiful relationship to the feeling of mastery? The rewarding fruits of the labour? The satisfaction of competence? Aren&rsquo;t <em>these</em> supposed to be the Good Motivators that drive one forward with a pure energy that has no need for silly tricks?</p>
<p>In practice, it is both. If you neglect either one, you can end up in a bad place, believing that neither drivers are effective since they didn&rsquo;t work in isolation. You can set out on a Great Work, and give up in a week because you didn&rsquo;t have enough tricks for preserving momentum in your toolkit. Or you can know all the tricks to energy management, and fail to follow through because deep down you don&rsquo;t actually care about the outcome.</p>
<p>Similarly, chemistry is slightly embarrassing to think about, but will absolutely dominate your outcomes in practice.</p>
<blockquote>
<p>The first-line treatment for ADHD is stimulants. Everything else in this post works best as a complement to, rather than as an alternative to, stimulant medication. In fact most of the strategies described here, I was only able to execute after starting stimulants. For me, chemistry is the critical node in the tech tree: the todo list, the pomodoro timers, etc., all of that was unlocked by the medication.</p>
<p>&hellip;</p>
<p>Taking Ritalin with no plan for what you will do today/tomorrow/this week doesn’t work. Dually, an ambitious todo list will sit idle if your brain won’t let you execute it. So personal growth comes from using both internal and external changes, like a ladder with alternating left-right steps.</p>
<p><cite> Fernando Borretti, <a href="https://borretti.me/article/notes-on-managing-adhd" target="_blank" rel="noopener">Notes on Managing ADHD</a> </cite></p>
</blockquote>
<p>You have to respect your chemistry because we are, in our mortal frames, as Fernando puts it: <q>&hellip;automata, our minds are molecules in salt water</q>. You <em>can</em> be driven forward by intrinsic fascination because you have a soul that can yearn and rejoice in the endeavour. But you will be <strong>tying it down with all kinds of ballast</strong> if you ignore the things that govern the chemistry of it&rsquo;s body; even things that don&rsquo;t need medication.</p>
<ol>
<li><strong>Isolation</strong> is the absolute worst. It will crush your body on a hormonal level almost instantly, but it also does direct damage to the soul.</li>
<li><strong>Chemicals</strong> that go into your body become temporary but recurrent parts of it. In case it isn&rsquo;t obvious, <em>everything</em> is a chemical.</li>
<li><strong>Energy</strong> is a physical process that needs calories and rejuvenation, and is governed by external stimuli like vigorous activity or sunlight.</li>
</ol>
<p>I want you to think of these things with the seriousness and impact that one very easily ascribes to the medication of debilitating conditions — and ignoring them as being akin to refusing a vaccination, or choosing to eat lead. <strong>Your soul needs it.</strong></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Better%20living%20through%20respecting%20chemistry%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>A Better Journal</title>
      <link>https://joodaloop.com/a-better-journal/</link>
      <pubDate>Sat, 05 Sep 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/a-better-journal/</guid><description>Better views of the past and future</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve an app with this name once before, and it wasn&rsquo;t good enough for me to use, even though I put a <em>lot</em> of work into the design (conceptual and visual) and performance. I have a hypothesis for why it didn&rsquo;t work out:</p>
<ol>
<li><strong>It had time tracking as it&rsquo;s core feature.</strong> It turns out, I don&rsquo;t care how <em>exactly</em> I&rsquo;ve spent my time! It&rsquo;s very important, of course, but I can just measure it by looking at a calendar. How many days of this year have passed? Simple as. The thing that does matter is output, being able to <em>see</em> what the time amounted to and judge if it was worth it.</li>
<li><strong>It was based on text entries.</strong> I hate looking at plain text. It&rsquo;s such an impoverished medium. I feel nothing when looking back on entries that describe something I&rsquo;ve made or work I&rsquo;ve tracked. I hate writing them even more, they don&rsquo;t capture enough.</li>
<li><strong>I was trying to make it easy to add entries.</strong> But that doesn&rsquo;t matter if I never look back on it. <em>Writing about past is just not that interesting</em>. Intrinsically, it has no hold over my mind the way the present does. Nor is it worth thinking about, relative to the future.
<blockquote>
<p>At first I thought the problem was friction: the higher the activation energy to using a tool, the less likely you are to use it. Even a small amount of friction can cause me to go, oh, who cares, can’t be bothered. So each version gets progressively more frictionless.</p>
<p>&hellip;</p>
<p>And yet I still don’t use it. Why?</p>
<p><cite> Fernando Borretti, <a href="https://borretti.me/article/unbundling-tools-for-thought" target="_blank" rel="noopener" title="Unbundling Tools for Thought, 2022">Unbundling Tools for Thought</a> </cite></p>
</blockquote>
</li>
</ol>
<p>To improve over these problems will require a new approach that includes multiple representations that make it <em>feel</em> good to gather retrospectives material, and look at it later. Alongside solving this design problem, I would also like to find ways to add The Future to this application&rsquo;s concept space.</p>
<h2 id="conceptual-approach">Conceptual approach</h2>
<p>When thinking about presenting information in ways that are <em>resonant</em> enough to look back on, while also avoiding the act of writing; a simple solution presents itself:</p>
<h3 id="images">Images</h3>
<p>In particular, <strong>screenshots</strong> — perhaps the most underrated digital record of our era given their ubiquity and sheer ease of use.</p>
<blockquote>
<p>When thinking about media that can survive millenia, I&rsquo;m more confident in diagrams that communicate through visual patterns than in any kind of digital file format that depends on a working decoder to be visualized, or in a single language as the chosen vehicle for information. The Rosetta Stone, through visually paired symbols, transmitted distant languages in a redundant format that could be deciphered in the far future with minimal context. If computation is the execution of algorithms on structured data, then screenshots may prove naive. But if computation is the shepherding of information through space and time, then they may prove essential.</p>
<p>During the opening of the conference, Omar honed in on the subversive nature of the screenshot. In popular computing, it circumvents the app siloes that define our contemporary digital ecosystems. A screenshot doesn&rsquo;t need a log in, bypasses DRMs, and is interoperable between practically every single computational device. Even in the &ldquo;high-culture&rdquo; of computing, where text is dominant, screenshots prove subversive. The screenshot is unstructured information which must be parsed to offer the tidy data best suited to computer hacking. They are seen as verbose and unwieldly, despite universal adoption. The Tao of Unix is text files, not bitmaps.</p>
<p><cite> cristóbal, <a href="https://x.com/tobyshooters/status/2094413705156960740?s=20" target="_blank" rel="noopener">tweeting</a> </cite></p>
</blockquote>
<p>This supremacy is partly a result of the failures of the URL:</p>
<blockquote>
<p>The dream of URLs—open, permissionless sharing—is fading. I can&rsquo;t paste URLs into my AIs or send them to my friends and be sure that they&rsquo;ll see what I see. But you know what does work? Screenshots! Screenshots are the successor to URLs. Open, permissionless sharing.</p>
<p><cite> zooko🛡🦓🦓🦓 ⓩ, <a href="https://twitter.com/zooko/status/2094096331174289862" target="_blank" rel="noopener">tweeting</a> </cite></p>
</blockquote>
<p>And their &ldquo;resonance factor&rdquo; completely trounces text. Even without invoking the old adage about being worth a thousand words, just looking at a grid of images is a more pleasurable activity than if it was lines upon lines of uniform words. <strong>I have verified this empirically too:</strong> I actively enjoy looking back at my LOG note in Bear, which is can be thought of as version 0 of this app. When I just wrote text entries I <em>never</em> scrolled down to old ones.</p>
<img
  src="https://media.joodaloop.com/log.jpg?width=900&amp;height=1086" alt="Screenshot of my LOG note in Bear, showing how I add screenshots of websites I’ve made to my journal file" width="900" height="1086"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><p>So this new journal will use the image as it&rsquo;s primary object. Outputs and in-process work can all be captured by screenshots. In fact, a series of screenshots can act a <a href="https://unsung.aresluna.org/it-moved-too-slowly-to-be-an-asteroid/" target="_blank" rel="noopener">blink comparator</a> of sorts, making it easy to <em>feel</em> the change.</p>
<p>Text may accompany the image to provide explicit narrative context, and also to enable&hellip;</p>
<h3 id="categorising-through-text-search">Categorising through text search</h3>
<p>As even a fledgling ontologist knows, tags are a dangerous thing. Unless carefully hatched in a context of use, they can spiral into infinite combinations of generic descriptors. They also (usually) need a relational database of some kind to implement well.</p>
<p>We will not be using tags; instead relying on fast text search across all entries in the journal. When I add entries like &ldquo;Published worknote for Better Journal&rdquo; and &ldquo;Design first UI for Better Journal&rdquo;, they are both trivially gathered into one project by the search term &ldquo;journal&rdquo;. The more tag-crazy among us might even resort to <code>#journal</code> hashtags, but I&rsquo;m hoping the simple capabilites of a prose description proves enough to discourage them.</p>
<p>Of course, commonly searched terms can be saved as one-click actions, such that they feel as good as using tags.</p>
<details id="arent-search-terms-just-in-text-tags">
  <summary>Aren&rsquo;t search terms just in-text tags?</summary>
  <div><p>No, because tags allow you to create a taxonomy that lives outside of the text you&rsquo;re writing. Nothing is stopping you from creating a tag called <code>#fun</code> and adding it to half your entries just because it exists.</p>
<p>Compare it to searching through regular text captions, which are constrained by the fact that they accompany specific images. Their immediate context decides their content, not arbitrary terms that you pre-defined into tags and must now think about using every time.</p>
</div>
</details>
<h3 id="days-as-the-unit-of-time">Days as the unit of time</h3>
<p>Because I&rsquo;ve never found myself caring about anything more granular than that. In the long run, you will not care if you did something by 6pm or 6am, just the fact that it was done.</p>
<h3 id="predictions-for-calibration">Predictions for calibration</h3>
<p>How can one bring the future into a system that is focused on creating good pictures of the past? My answer is &ldquo;calibration practice&rdquo;.</p>
<p>You can create Predictions, entries dated in the future, that say &ldquo;I will have done X by date Y&rdquo;. On the day you make a journal entry about actually doing it, you can connect the prediction to it. This can be used to calculate a Brier-eqsue score for timeliness predictions in your personal life. Fun possibilities for graphs here, including being able to see if how your prediciton ability itself changes over time.</p>
<h2 id="implementation-details">Implementation details</h2>
<h3 id="interface">Interface</h3>
<p>As always, iteration will prove invaluable. So even if my ideal client is a native Mac app, I will build it in Tauri first.</p>
<p>I will try to design + prototype at least 2 layouts per week, starting in September, and record all the  design sketches here:</p>
<ol>
<li><img
  src="https://media.joodaloop.com/abj-1.jpg?width=1200&amp;height=765" alt="First design idea" width="1200" height="765"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
></li>
<li><img
  src="https://media.joodaloop.com/abj-2.jpg?width=1000&amp;height=638" alt="Second design idea" width="1000" height="638"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
></li>
<li><img
  src="https://media.joodaloop.com/abj-3.jpg?width=1200&amp;height=765" alt="Third design idea" width="1200" height="765"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
></li>
<li><img
  src="https://media.joodaloop.com/abj-4.jpg?width=1200&amp;height=768" alt="Fourth design idea" width="1200" height="768"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
></li>
</ol>
<h3 id="data-model">Data model</h3>
<p>An entry is just a combination of text + image/video, and expressible in Markdown and frontmatter. Since days are the unit of time, we can put multiple entries in a &ldquo;day file&rdquo;. This also makes the order of entries simple, they&rsquo;re just ordered top to bottom.</p>
<p>An example file (imagine it&rsquo;s called <code>2026/09/04/entries.md</code>) would look like:</p>
<pre><code class="language-md">id: a7f3
media: 
  - content-hash-041243hr3.png
  - content-hash-893f3fh42.mp4

Caption written as regular text, no need to worry about line breaks and quote rules, etc.

---

id: b9a8
media: 
  - can-also-be-manually-written.png

I'm really optimising for human readability here.
</code></pre>
<p>Predictions can be similarly minimal:</p>
<pre><code class="language-yaml">id: 2r82
prediction: &quot;I will ship an intial version of A Better Journal, as a desktop app for MacOS&quot;
date: 2026-09-12
confidence: 0.4
completed: a7f3
</code></pre>
<p>This simplicity is necessary to keep from spiralling into an everything app. If you don&rsquo;t draw hard lines in the sand, you end up trying to build <a href="https://timelinize.com/" target="_blank" rel="noopener">universal timelines</a> and <a href="https://alexanderobenauer.com/ollos/" target="_blank" rel="noopener">operating system interfaces</a> based on time. They&rsquo;re cool, but they don&rsquo;t share my goals of far less ambitious goal of restrospection.</p>
<p>Honestly, all I&rsquo;m doing is asking the question &ldquo;what if Twitter was the best journalling app?&rdquo;. Except, instead of threads, things are connected by searching for text terms instead. Or is &ldquo;replying&rdquo; worth it as a mechanism to connect progress specific events across time?</p>
<p>A simple data model encourages <a href="https://borretti.me/article/client-freedom" target="_blank" rel="noopener">client freedom</a>. So features like OCR, near-duplicate detection, color filters, etc. can be left up to clients instead of being added to the core data model.</p>
<p>A filesystem structure makes for clunkier sync than a custom database-backed protocol, but should not pose too much of an issue, given that it&rsquo;s a single-user app. In the worst case, I&rsquo;ll just do what <a href="https://bear.app/faq/how-bear-pro-handles-conflicted-notes/" target="_blank" rel="noopener">Bear does</a> (compare-and-swap, create a fork on conflict).</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://pingpractice.org/method" target="_blank" rel="noopener">Ping Practice</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?subject=Comment%20about%20%22A%20Better%20Journal%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>SSSync</title>
      <link>https://joodaloop.com/sssync/</link>
      <pubDate>Sun, 30 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/sssync/</guid><description>An offline-first sync engine for web apps</description>
      <content:encoded><![CDATA[<p>When syncing data to a client, you can express what the client needs by either:</p>
<ol>
<li>Live queries (arbitrary, requires a running server)</li>
<li>A pre-calculated subset of data (user&rsquo;s working set)</li>
</ol>
<p>Live queries are in most ways the superior way to do things. They combine the freedom of &ldquo;just make an API request&rdquo; with the performance a built-in local cache and the consistency of transactional updates. There&rsquo;s only 4 (small) downsides with existing libraries:</p>
<ol>
<li>They involve stateful servers for satisfying queries (usually pretty scalable read replicas of the main database), which have RAM requirements proportional to O(row results) instead of using the client as the data source.</li>
<li>Are usually tied to specific databases (often Postgres) or are a database too (Convex, Jazz). This is mostly a good idea, just constraining.</li>
<li>None of the existing solutions have support for <abbr title="Server-side rendering">SSR</abbr> yet.</li>
<li>Only a couple of them support offline mutations.</li>
</ol>
<p><strong>I expect that LLMs will make the first two problems smaller over time</strong>, by rewriting the server code in more memory-efficient languages and make it trivial to add new database adapters.</p>
<p>Meanwhile, the downsides of a pre-calculated subset are many:</p>
<ol>
<li>Obviously, it only works for apps where the data a user sees is a neat rarely-changing subset.</li>
<li>Data, once fetched, continues to build up on the client even if none of the UI is requesting it anymore.</li>
<li>Your subset-calculating code can contain bugs.</li>
<li>Most existing solutions use JSON document models instead of relational.</li>
<li>Most existing solutions require loading the user&rsquo;s working subset the first time they open the app/site. This is untenable past a certain size of data.</li>
</ol>
<h2 id="so-why-work-on-it">So why work on it?</h2>
<p>Linear is (to my knowledge) the only subset-based sync solution that also has efficient data loading. They do so by combining a fetch-when-needed (instead of load upfront) protocol with a change stream. My library will try to commoditise this capability. With support for SSR, unlike Linear.</p>
<p>In addition, the way my approach handles data fetching allows it to be used for arbitrary apps, not just ones that want a persistent local cache. Github, for example, is a mixture of arbitrary, temporarily-used data (when you visit a random repo) and well-defined subsets that could be cached locally (your own repos, your org&rsquo;s repos) and something like that would be possible to build with SSSync. (Doing so would worsen a few consistency guarantees in the local database, but that&rsquo;s what HTTP-based web apps do anyway).</p>
<p>Some other reasons:</p>
<ol>
<li>Be able to make apps that have zero idle cost by running on serverless compute and storage.</li>
<li>Build things like fuzz testing, network failure simulation, etc. into the library dev tools.</li>
<li>Have an open source library of my own.</li>
</ol>
<h2 id="system-components">System components</h2>
<h3 id="client-query-api">Client query API</h3>
<p>My requirements are:</p>
<ul>
<li>Ability to clearly know that something is a &ldquo;fetch-by-id + relations&rdquo; that can be sent to the server if not found locally.</li>
<li>Easy to make performant on IndexedDB.</li>
<li>Easy to build an efficient subscription system for.</li>
</ul>
<p>This suggests two simple yet distinct query patterns:</p>
<pre><code class="language-ts">// Get a single item, with nested relations
sssync.db.posts.byId([id], [&quot;authors&quot;])

// Get a range, filtered by a Javascript function
sssync.db.posts.all(() =&gt; a.date &lt; TODAYS_DATE)
</code></pre>
<h3 id="client-storage-layer">Client storage layer</h3>
<p>IndexedDB has the most browser compatibility and least need for custom tooling or bundler complications. Especially for a v1, there&rsquo;s no reason to reinvent storage yet. I will also avoid using indexes (Javacript-only filtering) and migrations (just blow away old databases and remake a new one in a new namespace each time).</p>
<p>I need to be careful about serialization though.</p>
<h3 id="data-fetching-protocol">Data-fetching protocol</h3>
<h4 id="fetch-by-id--relations">Fetch by id + relations</h4>
<p>Most UI in apps is relational. The nice thing about &ldquo;get by id, and relations of that item&rdquo; is that it makes for a simple protocol. The server knows exactly what kind of requests to expect since they all look like:</p>
<pre><code class="language-ts">{type: &quot;posts&quot;, id: &quot;uuid&quot;, related: [&quot;authors&quot;, &quot;comments&quot;]}
</code></pre>
<p>It&rsquo;s also super easy to cache. A request for an item can be conclusively satisfied just be checking if it exists in the local database, no invalidation needed. And relations can be tracked too, each time a server satisfies a relational fetch.</p>
<h4 id="named-loader-functions">Named loader functions</h4>
<p>But how do you build a cache around things fetched in arbitrary bunches, in truncated lists, or that use arbitrary server logic to put together?</p>
<p>I propose a simple system of named functions, producing cache keys that are a combination of the function name and args. These functions can be run once, on a debounce, or manually whenever the developer wants — and their results dumped into the local database.</p>
<pre><code class="language-tsx">// An example of a simple fetch()-based loader
sssync.loaders = {
  latestPosts: (user) =&gt; fetch(&quot;/posts/&quot; + user)
}

// Component using the loader
function Posts (){
  const loaded = sssync.load.latestPosts({refresh: 3000})
  const posts = sssync.db.posts.all()

  return (
    &lt;div&gt;
      {posts.slice(0, 50).map(post =&gt; &lt;h2&gt;{post.title}&lt;/h2&gt;)}
      {!loaded &amp;&amp; (&lt;div&gt; This list might be stale! &lt;/div&gt;)
    &lt;/div&gt;
  )
}
</code></pre>
<h3 id="sync-logic">Sync logic</h3>
<p>The only sync path is an ordered stream of updates that the server is responsible for fanning out to clients. Given the <code>last_sync_id</code> from any client, it must return updates and a fresh <code>last_sync_id</code> in a single response. If it wants to batch the data into multiple responses, it may add a <code>more_updates: true</code> parameter to the JSON payload to tell the client to make more requests.</p>
<p>I need to finalise the shape of updates that must come back from a sync request. It should be possible to implement this protocol over Websockets and SSE too.</p>
<h3 id="write-path">Write path</h3>
<p>I prefer semantically named and versioned change objects because they force best practices while also solving the schema migration problem. Credit to <a href="https://dev.docs.livestore.dev/building-with-livestore/events/" target="_blank" rel="noopener" title="LiveStore: Local-first data layer for high-performance apps">Livestore</a> for the inspiration.</p>
<pre><code class="language-ts">postCreated: {
   name: 'v1.PostCreated',
   schema: object({ id: string(), text: string() }),
 })

sssync.write(
  &quot;v1.postCreated&quot;,
  {id: NEW_UUID, title: &quot;New post about SSSync&quot;}
)
</code></pre>
<p>When triggered, these named changes will be immediately converted into actual state updates using projector functions on the client and broadcasted to the server in the background.</p>
<p>On the server, you can write whatever code you like to handle them. This approach to conflict management is called <a href="https://rocicorp.dev/blog/ready-player-two" target="_blank" rel="noopener">server reconciliation</a>.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22SSSync%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Worknotes debut on joodaloop.com</title>
      <link>https://joodaloop.com/riffs/worknotes/</link>
      <pubDate>Fri, 28 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/worknotes/</guid><description>When working on any long-running software project, I like to maintain one large note tracking my goals, design ideas, influences and references, dead ends, etc. I used to write these notes in Craft, because it gave me a really nice editor, alongside the ability to send it to other people at a shareable URL.&#xA;</description>
      <content:encoded><![CDATA[<p>When working on any long-running software project, I like to maintain one large note tracking my goals, design ideas, influences and references, dead ends, etc. I used to write these notes in <a href="https://craft.do" target="_blank" rel="noopener" title="Craft — Productivity App for Notes, Tasks, and Docs">Craft</a>, because it gave me a really nice editor, alongside the ability to send it to other people at a shareable URL.</p>
<p>But I was using too many notes apps, one of which I&rsquo;d built myself (<a href="https://tldraft.app" target="_blank" rel="noopener" title="tldraft • shareable offline-first docs">tldraft.app</a>), and wanted to consolidate and clean up my scattered words. I considered building a microsite of some kind for these work notes, or adding read-only sharing to tldraft itself so I could move them there.</p>
<p>Instead, I realised there was no reason to not add them to this site. The Workbench made for a suitable container, given that it already tracked the history of my focuses. It was time for it to also track their live notes.</p>
<p>So, worknotes are now a new content format, and two of them have been added to site already. Find them on the <a href="https://joodaloop.com/workbench#the-visual-display-of-qualitative-information" title="Workbench">Workbench</a> page, under the Display of Qualitative Information section.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Worknotes%20debut%20on%20joodaloop.com%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Things You Could Buy</title>
      <link>https://joodaloop.com/riffs/buy/</link>
      <pubDate>Thu, 27 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/buy/</guid><description>I hand-made a microsite of things I think are universally good purchases. You can find it at buy.joodaloop.com in a browser of your choice.&#xA;</description>
      <content:encoded><![CDATA[<p>I hand-made a microsite of things I think are universally good purchases. You can find it at <a href="https://buy.joodaloop.com" target="_blank" rel="noopener">buy.joodaloop.com</a> in a browser of your choice.</p>
<p>I&rsquo;m particularly proud of how the design has no links and doesn&rsquo;t look like a strict grid of items. I originally planned to make it sortable, filterable and carefully ordered by value to money ratio; and realised none of that was necessary given the small number of items I actually had to display.</p>
<p>The font is Times New Roman btw.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Things%20You%20Could%20Buy%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>out.joodaloop.com</title>
      <link>https://joodaloop.com/out/</link>
      <pubDate>Thu, 27 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/out/</guid><description>Designing a visual log of my digital output and it&#39;s consequences</description>
      <content:encoded><![CDATA[<h2 id="design-decisions">Design decisions</h2>
<h3 id="what-happens-in-real-life-stays-in-real-life">what happens in real life stays in real life</h3>
<p>Everything on the microsite would only deal with activities that happened on a screen. No biomarkers, personal milestones, or events with friends will be logged on here.</p>
<p>Something about trying to convert non-screen activities and happenings into computer bits feels off to me. I&rsquo;ve never really liked photo or video either, except as a trigger for my own memory.</p>
<h3 id="i-only-care-about-outputs--consequences">i only care about outputs + consequences</h3>
<p>Do I really care how many times I worked out vs. how fit I actually feel day-to-day? In general, I find that input isn&rsquo;t worth attention, and I especially dislike when it&rsquo;s fetishized in terms of raw hours or reps instead of quality of outcome.</p>
<p>I also <strong>don&rsquo;t care about time</strong>, especially standardised time:</p>
<blockquote>
<p>Our modern sense of time is homogenous. It divided and measured in &ldquo;units&rdquo; to be filled. Clock time. These time units have no meaning themselves. They are empty containers, filled with meaning by us, through activities we do within them.</p>
<p><cite> Gordan Brander, <a href="https://gordonbrander.com/notes/time-consciousness/" target="_blank" rel="noopener" title="Time consciousness - gordonbrander.com">Time consciousness</a> </cite></p>
</blockquote>
<blockquote>
<p>Hell-bent on standardization; on Cartesian deliverance. Time is the primary socializing tool. Indelibly imprinted and structurally biased. We are domesticated creatures of technical abstraction. If rationalism/reductionism is our religion, then time keeping is our benediction</p>
<p><cite> Buried Inside, <a href="https://genius.com/Buried-inside-time-as-surrogate-religion-lyrics" target="_blank" rel="noopener" title="Buried Inside – Time As Surrogate Religion Lyrics | Genius Lyrics">Time As Surrogate Religion</a> </cite></p>
</blockquote>
<h3 id="viewer-friendly">viewer-friendly</h3>
<p>The goal is for everything to come together in a browsing-friendly way, presenting information that is, first and foremost, useful to the reader.</p>
<p>One of the best ways to make something nice to look at is to make it a picture instead of text. Luckily, I can get a lot of mileage from the <a href="https://alexwlchan.net/2022/screenshots/" target="_blank" rel="noopener" title="You should take more screenshots – alexwlchan">humble screenshot</a> since most of my work is visual.</p>
<h2 id="what-do-i-want-to-log">What do I want to log?</h2>
<ul>
<li>Writing
<ul>
<li>Good tweets</li>
<li>Shareholder letters</li>
<li>joodaloop.com posts, including edits</li>
<li>Essays</li>
</ul>
</li>
<li>Microsite creation and redesigns
<ul>
<li>Updates to microsite content</li>
</ul>
</li>
<li>Client projects
<ul>
<li>Launches</li>
<li>Discarded concepts</li>
</ul>
</li>
<li>Personal project launches and updates</li>
<li>Songs recorded</li>
</ul>
<h2 id="what-do-i-want-to-measure">What do I want to measure?</h2>
<ul>
<li>Vistors to my web properties, maybe their comments</li>
<li># of items in each category</li>
<li>Word count</li>
</ul>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22out.joodaloop.com%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>My Favourite Are.na Channels</title>
      <link>https://joodaloop.com/arena-channels/</link>
      <pubDate>Thu, 27 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/arena-channels/</guid><description>The ones I return to again and again</description>
      <content:encoded><![CDATA[<h4 id="time-and-the-future--kent-de-bruin"><a href="https://www.are.na/kent/time-and-the-future" target="_blank" rel="noopener" title="(time and the future) | Are.na">(time and the future)</a> — Kent de Bruin</h4>
<p>Exploring the future of the calendar</p>
<h4 id="designing-time--aaron-lewis"><a href="https://www.are.na/aaron-lewis/designing-time" target="_blank" rel="noopener" title="designing time | Are.na">designing time</a> — Aaron Lewis</h4>
<p>Timekeeping is politics by other means</p>
<h4 id="engineering-write-ups--blogs--vids--yihui-h"><a href="https://www.are.na/yihui-h/engineering-write-ups-blogs-vids" target="_blank" rel="noopener" title="engineering write-ups / blogs / vids | Are.na">engineering write-ups / blogs / vids</a> — Yihui H.</h4>
<p>interesting write-ups / videos about engineering challenges, breakdowns and solutions. mostly iOS / web dev</p>
<h4 id="thoughts-in-need-of-a-home--chris-beiser"><a href="https://www.are.na/chris-beiser/thoughts-in-need-of-a-home" target="_blank" rel="noopener" title="thoughts in need of a home | Are.na">thoughts in need of a home</a> — Chris Beiser</h4>
<p>this is where I put the thoughts I have which I don’t yet have a channel for, so that I can learn what they’re about. everyone on this website is so good at putting things in correct categories.</p>
<h4 id="now-that--parker-dot-mov"><a href="https://www.are.na/parker-dot-mov/now-that-s-what-i-call-a-landing-page" target="_blank" rel="noopener" title="now that&#39;s what i call a landing page | Are.na">now that&rsquo;s what i call a landing page</a> — parker dot mov</h4>
<p>—</p>
<h4 id="web-design-as-architecture--malte-müller"><a href="https://www.are.na/malte-muller/web-design-as-architecture" target="_blank" rel="noopener" title="Web design as architecture | Are.na">Web design as architecture</a> — Malte Müller</h4>
<p>A call for more elaborate discourse and better metaphors for designing and building digital platforms.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22My%20Favourite%20Are.na%20Channels%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>in.joodaloop.com</title>
      <link>https://joodaloop.com/in/</link>
      <pubDate>Thu, 27 Aug 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/in/</guid><description>Presenting my media intake in a reader-friendly way</description>
      <content:encoded><![CDATA[<p>A few people with great media lists:</p>
<ul>
<li>Gavin Leech&rsquo;s <a href="https://www.gleech.org/books" target="_blank" rel="noopener" title="Reading">Reading</a> page</li>
<li>Justin Duke&rsquo;s <a href="https://jmduke.com/" target="_blank" rel="noopener" title="Applied Cartography | Justin Duke">Media</a> section</li>
</ul>
<p>Huh, that&rsquo;s way less people than I&rsquo;d expected. I guess personal websites need to start showing more love for media catalogues. Especially ones that take the trouble to rank things for visitors in useful ways.</p>
<p>I too, want to avoid just having a long list of items of everything I&rsquo;ve ever consumed. Most of them are a &ldquo;waste&rdquo; of time. I want to instead only list the things worth recommending.</p>
<p>But wait, what if I want to dis-recommend something? Something I think is overrated (see: <a href="https://www.gleech.org/books" target="_blank" rel="noopener" title="Reading">sort by controversy</a>), and want to warn people off of? Should I even assume that authority?</p>
<h2 id="things-i-want-to-log">Things I want to log</h2>
<ul>
<li>Books</li>
<li>Movies</li>
<li>Music</li>
<li>Internet writing
<ul>
<li>Essays</li>
<li>Websites</li>
<li>Tweets</li>
</ul>
</li>
</ul>
<h3 id="metadata">Metadata</h3>
<ul>
<li>Author</li>
<li>Personal affection (star)</li>
<li>&ldquo;Rereads&rdquo;</li>
<li>Heftiness/length (1–3)</li>
</ul>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22in.joodaloop.com%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>My Twitter Threads</title>
      <link>https://joodaloop.com/my-threads/</link>
      <pubDate>Sun, 26 Jul 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/my-threads/</guid><description>Collection of Twitter threads I&#39;ve written that are worth reading</description>
      <content:encoded><![CDATA[<h2 id="design">design</h2>
<p><a href="https://twitter.com/joodalooped/status/2081331753357279344?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;thread of things i would never do as a designer, as an attempt to... 1. define my own approach via negativa 2. collect critique in one place 1/N i would not animate this at all (slow, no stable reference), nor would i add a \&#34;back\&#34; action to a ToC https://t.co/t9sJauVjwz\&#34;">things i wouldn&rsquo;t do as a designer</a></p>
<p><a href="https://twitter.com/joodalooped/status/2034179973905576168?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;thread of dishonest design\&#34;">thread of dishonest design</a></p>
<p><a href="https://twitter.com/joodalooped/status/1908307504963977295?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;thread of interfaces that make text a first class citizen 1. using “glow” instead of a static “chip block” https://t.co/ZecLqahWYX\&#34;">interfaces that make text a first class citizen</a></p>
<h2 id="ai">ai</h2>
<p><a href="https://twitter.com/joodalooped/status/2070833331714052355?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;time to make a thread so i can keep track of updates in this space 1. the original post on Work Data by me and @anjali_shriva\&#34;">work data</a></p>
<p><a href="https://twitter.com/joodalooped/status/1884544798389911761?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;thread of types of reactions from programmers to LLM progress 1. the scaling law believer it’s all over, just a matter of time. might as well enjoy these last few years apps and UI will be a solved problem in a couple a years, we’ll maybe stick around as testing nannies\&#34;">thread of types of reactions from programmers to LLM progress</a></p>
<h2 id="misc">misc.</h2>
<p><a href="https://twitter.com/joodalooped/status/1939219429214089289?s=20" target="_blank" rel="noopener" title="X on X">tradeoffs thread</a></p>
<p><a href="https://twitter.com/joodalooped/status/1941014183619055955?s=20" target="_blank" rel="noopener" title="X on X">“indicators of continued childhood”</a></p>
<p><a href="https://twitter.com/joodalooped/status/2010664133897920864?s=20" target="_blank" rel="noopener" title="X on X">instances of failureship bias</a></p>
<p><a href="https://twitter.com/joodalooped/status/2039570442185543917?s=20" target="_blank" rel="noopener" title="X on X">ideas that make for good “solve for equilibrium” problems</a></p>
<p><a href="https://twitter.com/joodalooped/status/2041414365371658379?s=20" target="_blank" rel="noopener" title="judah on Twitter: \&#34;thread of fun temporary underclass activities\&#34;">thread of fun temporary underclass activities</a></p>
<p><a href="https://twitter.com/joodalooped/status/1999925775949324451?s=20" target="_blank" rel="noopener" title="X on X">thread of nice wood things</a></p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22My%20Twitter%20Threads%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>joodaloop.com v4.6</title>
      <link>https://joodaloop.com/riffs/joodaloop-v4.6/</link>
      <pubDate>Fri, 10 Jul 2026 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/riffs/joodaloop-v4.6/</guid><description>Around a year ago, I wrote about how the current design of my site had proved undislodgable. You can see today that it has survived yet another year. Congratulations, site!&#xA;</description>
      <content:encoded><![CDATA[<p>Around a year ago, I wrote about how the current design of my site had <a href="https://joodaloop.com/riffs/joodaloop-v4.5/" title="joodaloop.com v4.5">proved undislodgable</a>. You can see today that it has survived yet another year. Congratulations, site!</p>
<p>This stability has allowed me to focus on small refinements and new features. And enough of these changes have happened in the last few months to merit a version bump. Introducing, <strong>joodaloop.com v4.6</strong>, now with&hellip;</p>
<ul>
<li><strong>Offline browsing</strong> through a Service Worker that caches all page content for instant page loads after the first visit.</li>
<li><strong>The ~~~ page debuted</strong> with a new tweet-like format — the need for which was covered in &ldquo;<a href="https://joodaloop.com/riffs/microblog-ontology/" title="An ontology of microblogging">An ontology of microblogging</a>&rdquo;.</li>
<li><strong>Site-wide title search</strong> can be brought up by hitting <no-wrap><kbd>⌘</kbd> + <kbd>K</kbd></no-wrap> on any page. It&rsquo;s a particularly nice experience due to the fact that pages load instantly.</li>
<li><strong>Frames, Focuses &amp; Frontiers</strong> is a new section on the Workbench page that tracks my personal history of, well&hellip;those 3 things.</li>
<li><strong>A custom collapsible</strong> was designed using the <code>&lt;details&gt;</code> element in order to compress that list to a practical length. And found further use on&hellip;</li>
<li><strong>The new Writing page layout</strong>, which now consists of essays (segmented by platform) and Notes, Lists &amp; Guides (split into more focused categories).</li>
<li><strong>Backlinks</strong> now show up in the INFO section of post pages.</li>
<li><strong>Invitation to email me</strong> is appended to the end of all posts, including RSS feed entries.</li>
<li><strong>An LLM-coded linter</strong> was built to support content and build output correctness across the site. Dozens of typos were caught, and missing page metadata added. You are invited to <a href="https://lint.joodaloop.com/" target="_blank" rel="noopener">try it yourself</a>.</li>
<li><strong>Analytics</strong> were brought back using <a href="https://counterscale.dev/" target="_blank" rel="noopener">Counterscale</a>, which I recommend.</li>
<li><strong>Images have improved styling</strong>, including a max-height to prevent overly long blocks, and a neat fallback for when they fail to load.</li>
<li><strong>Dark mode readability improved</strong> as a result of picking a lighter shade of blue for the site&rsquo;s theme color (<code>#040c5b</code> -&gt; <code>#141c6b</code>), in response to critique by a particularly impassioned user.</li>
<li><strong>The home page &ldquo;STUFF&rdquo; section</strong> now gives each of my major projects it&rsquo;s own callout box instead of using plain lists.</li>
</ul>
<!--- **A larger font size** was chosen (+0.5px) to also help readability.-->

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22joodaloop.com%20v4.6%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <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 and upload the site directly myself. As a bonus, <strong>it&rsquo;s really fast</strong>. A change to a single post page goes live in ~3 seconds, compared to the 10+ seconds taken by the old <code>git push</code> → Github → Netlify → CDN workflow.</p>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22My%20site%20has%20a%20Makefile%20now%2C%20also%20offline%20browsing%22">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="https://joodaloop.com/~" title="~~~">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="https://joodaloop.com/writing">writing</a> (lists, notebooks, or essays) that require real investment into polish and maintenance.</li>
<li><a href="https://joodaloop.com/riffs" title="Riffs &#43; Raff">Riffs</a>, which are temporal publications, used primarily to wonder aloud in brief or send out announcements.</li>
<li><a href="https://joodaloop.com/~" title="~~~">~~~</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 with other people, like Twitter.</p>
<p>The medium and the message and me have yet to exhaust all possible combinations of formats and workflows — hence the space for <strong>~~~</strong> as a new entrant. 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?subject=Comment%20about%20%22An%20ontology%20of%20microblogging%22">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>Technological developments that were bad ideas in retrospect.</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?subject=Comment%20about%20%22Bad%20Tech%22">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?subject=Comment%20about%20%22The%20Great%20Realtime%20Collaboration%20Misdirection%22">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>Mostly ideas from other people.</description>
      <content:encoded><![CDATA[<h2 id="talks">Talks</h2>
<p><strong><a href="https://www.youtube.com/watch?v=5ZjhNTM8XU8" target="_blank" rel="noopener" title="Transactions: myths, surprises and opportunities by Martin Kleppmann">&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" title="Martin Kleppmann | Kafka Summit SF 2018 Keynote (Is Kafka a Database?)">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" title="Enough with all the Raft">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" title="Good thing we&#39;re not writing a database">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" title="Automerge">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" title="Serverless primitives for the shared log architecture">Serverless primitives for the shared log architecture</a>:</strong> Re. S2.</p>
<h2 id="writing">Writing</h2>
<p><strong><a href="https://tom.preston-werner.com/2009/05/19/the-git-parable.html" target="_blank" rel="noopener" title="The Git Parable">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" title="Building a BFT JSON CRDT">Building a BFT JSON CRDT</a></strong></p>
<!--**[Data Synchronization: Patterns, Tools, & Techniques](https://www.datasyncbook.com/)**-->
<p><strong><a href="https://www.brianstorti.com/replication/" target="_blank" rel="noopener" title="A Primer on Database Replication">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" title="Log Structured Merge Trees | Ben Stopford">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" title="Notes on Distributed Systems for Young Bloods – Something Similar">Notes on Distributed Systems for Young Bloods</a></strong></p>
<!--https://simonklee.dk/notes-on-databases-->

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Databases%22">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="https://joodaloop.com/workbench" title="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?subject=Comment%20about%20%22Clocks%20as%20progress%20bars%2C%20please%22">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>A few things I think we could do with less off</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" title="Why does Outlook map Ctrl&#43;F to Forward instead of Find, like all right-thinking programs? - The Old New Thing">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="https://joodaloop.com/riffs/design-calibration" title="Better design through 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">Indirection</h2>
<p>Recently, my personal design work has coalesced around the prevention of <a href="https://joodaloop.com/interface-anxiety" title="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" title="Simple Made Easy - Rich Hickey (2011)">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>John Siracusa, <a href="https://archive.arstechnica.com/paedia/f/finder/finder-3.htm" target="_blank" rel="noopener" title="About the Finder... - Page 3 - (03/2003)">&ldquo;About the Finder&hellip;&rdquo;</a></cite></p>
</blockquote>
<h3 id="hyperlinks">Hyperlinks</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" title="Link Preview — uiwtf">speculative interfaces</a> or a completely <a href="https://browser.horse" target="_blank" rel="noopener" title="Horse: The Browser for ADHD">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" title="Give footnotes the boot - JakeArchibald.com">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" title="Sidenotes In Web Design · Gwern.net">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">Transclusion</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;, 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" title="Rich Hickey: Deconstructing the Database">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" title="Omar Rizwan on Twitter: \&#34;Leaning into folk practices 👏🏽 https://t.co/CC2CtU9jip I feel like the weakness of map apps/websites in this scenario shows some deep failure to see and match the folk practice here. I don&#39;t know if it&#39;s on the part of Google or Apple or transit agencies or what\&#34;">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" title="Design Of This Website · Gwern.net">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" title="Latticework: Unifying annotation and freeform text editing for augmented sensemaking">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>
<p>For a more nuanced critique of transclusion, see <a href="https://notes.andymatuschak.org/zBLUefAuJvhXq4p4HhXJqyK" target="_blank" rel="noopener" title="Transclusion is limited by the data model’s composability">Transclusion is limited by the data model’s composability</a> by Andy Matuschak.</p>
<h2 id="ideological-mistakes">Ideological mistakes</h2>
<p>The unfortunate consequence of holding notions of &ldquo;purity&rdquo; or <a href="https://twitter.com/joodalooped/status/1999510110058737917" target="_blank" rel="noopener" title="judah on Twitter: \&#34;do it for too long and you end up in places like \&#34;everything is everything\&#34; and \&#34;system simplicity\&#34;\&#34;">&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" title="Worse Is Better">Worse is Better</a>. Letting your decisions be guided by raw ideas instead of the gentle pushback of reality.</p>
<h3 id="spatialambient-computing">Spatial/ambient computing</h3>
<p>Hardware issues aside, I&rsquo;m not on board with the idea that we need <a href="https://twitter.com/yiliush/status/1789362464452223033?s=20" target="_blank" rel="noopener" title="Yilio on Twitter: \&#34;Okay, here’s another peek. I’ve been working on a radical redesign of @SoftspaceAI based on lessons we’ve learned since launch. Three new key ideas in this redesign, all shown in the video. It feels really good and I *want* to dogfood it way more than before.\&#34;">dozens of screens</a> floating around, Minority Report-style. Nor that we should be using grandiose gestures to move things around instead of efficient keyboards. Great work has been done on typewriters, there&rsquo;s no evidence that a single laptop screen is a limiting factor for creative potential.</p>
<p>Attention, on the other hand, <em>does</em> seem to matter. And a dozen focus points, especially the kind promised by &ldquo;ambient computing&rdquo; seem more like adversaries than aids to attention preservation. Also, <a href="https://worrydream.com/ABriefRantOnTheFutureOfInteractionDesign/" target="_blank" rel="noopener" title="A Brief Rant on the Future of Interaction Design">screens are kinda lame</a>, really.</p>
<h3 id="liquid-glass">Liquid glass</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" title="Apple apps that are not yet Liquid Glassed | MacRumors Forums">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">Poor data ink ratios</h3>
<p>I am an unapologetic Tufte graphics and <a href="https://worrydream.com/MagicInk/" target="_blank" rel="noopener" title="Magic Ink: Information Software and the Graphical Interface">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" title="judah on Twitter: \&#34;this is also why the American Graphics guy is sometimes wrong btw. condensing things is good, don&#39;t fetishize density as an aesthetic\&#34;">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" title="Ditch those words! • Robin Rendle">ditch those words</a> completely.</p>
<h3 id="xanadu">Xanadu</h3>
<p><a href="https://gwern.net/xanadu" target="_blank" rel="noopener" title="Project Xanadu: Even More Hindsight · Gwern.net">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">Personal software</h3>
<p>Yes, the future will have many more <a href="https://maggieappleton.com/home-cooked-software" target="_blank" rel="noopener" title="Home-Cooked Software and Barefoot Developers">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" title="Steve Ruiz on Twitter: \&#34;My intuition is that teams will be building more / more ambitious internal tools this year to replace SaaS. AI is driving down the costs while also driving up the value in owing your own stuff.\&#34;">replace</a> some SaaS products. And yes, there will be more <a href="https://news.ycombinator.com/item?id=40878765" target="_blank" rel="noopener" title="Ask HN: Is there any software you only made for your own use but nobody else? | Hacker News">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" title="Loquitur Ponte Sublicio on Twitter: \&#34;McConaughey gets at something that seems obvious to me but few say. I dont 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, specifi…">@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" title="I Wish People Were More Public">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" title="Self-hosting Is Selfish — Boris Mann&#39;s Homepage">Self Hosting is selfish</a></p>
<h3 id="concierge-attitudes">Concierge attitudes</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>
<p>There is a time and place for magic, but it ought to happen in full view of the user, and at moments where user intervention would be unpleasant anyway.</p>
<blockquote>
<p>My favorite part of Google Maps isn’t the fact that it gets you where you want to go, but this:</p>
<p>When you take a wrong turn or go the wrong way, it doesn’t break down or tell you to take a u-turn (unless you REALLY messed up). Usually it just updates the route from where you are right now to get you where you need to go. Driving is stressful and it takes away the stress of making a wrong turn and just reroutes you instead of making you stop and re-evaluate or start over (i.e. the more interventionist solution)</p>
</blockquote>
<!--### "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">Lazy patterns</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">The &ldquo;above the fold&rdquo; holy grail</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">Infinite canvases</h3>
<p>I have a <a href="https://joodaloop.com/canvas-ui" title="Canvas UIs: A Critical Review">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">Modals</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" title="Accessible notifications and messages | Primer">realize</a> that.</p>
<h3 id="bento-boxes">Bento boxes</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" title="Dispatch #31: Anti-Design">anti-design</a>, anti-design loves <a href="https://bentogrids.com/" target="_blank" rel="noopener" title="Bento Grids">bento boxes</a>.</p>
<h3 id="sidebars">Sidebars</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" title="Breadcrumb navigation - Wikipedia">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" title="Manav B. Ponnekanti">Manav</a>, &ldquo;No one uses their computer like this anymore because minimum window sizes are too large&rdquo;:</p>
<img
  src="https://media.joodaloop.com/macos-desktop-old.jpg?width=1024&amp;height=768" alt="Screengrab of old MacOS desktop with overlapping windows" width="1024" height="768"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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" title="judah on Twitter: \&#34;i wish to expand on the “data-ink ratio” idea with the “live pixels ratio” measured by how much an interactive item on a screen achieves (frequency x power) relative to how much vital space it takes up\&#34;">@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">Fuzzy/semantic search</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> Pao Ramen, <a href="https://paoramen.fika.bar/local-first-search-01K1B0WM1X4P5SV5QAES0Z5N75" target="_blank" rel="noopener" title="Local-first search">Local-first Search</a></cite></p>
</blockquote>
<h3 id="digital-gardens">Digital gardens</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" title="Szymon Kaliski">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" title="Large-scale study of human memory for meaningful narratives">Studies</a> <a href="https://www.sciencedirect.com/science/article/abs/pii/0010028577900056" target="_blank" rel="noopener" title="Story structure and memory">have</a> <a href="https://psycnet.apa.org/record/1964-02036-001" target="_blank" rel="noopener" title="Memory for prose">consistently</a> <a href="https://link.springer.com/article/10.3758/s13423-020-01853-1" target="_blank" rel="noopener" title="Memory and comprehension of narrative versus expository texts: A meta-analysis | Psychonomic Bulletin &amp; Review | Springer Nature Link">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" title="The Browser is a Printing Press • Robin Rendle">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?subject=Comment%20about%20%22Software%20Design%20Ideas%20I%20Dislike%22">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>“...it’s important for every designer to notice when they wince, and teach others how to wince and notice, too.”</description>
      <content:encoded><![CDATA[<p><strong>A sense of chronic unease or acute worry experienced while interacting with a user interface.</strong></p>
<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>
<blockquote>
<p>I think it’s important for every designer to notice when they wince, and teach others how to wince and notice, too.</p>
<p><cite> Marcin Wichary, <a href="https://unsung.aresluna.org/houston-we-have-1-problems/" target="_blank" rel="noopener" title="“Houston, we have 1 problem(s).” – Unsung">&ldquo;Houston, we have 1 problem(s).&rdquo;</a> </cite></p>
</blockquote>
<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">Notifications</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>One move we could make is a <a href="https://borretti.me/article/inboxes-are-underrated" target="_blank" rel="noopener" title="Inboxes are Underrated">single inbox</a> for calmer triage, but most apps just show multiple dots all over their interface instead.</p>
<h3 id="heaviness">Heaviness</h3>
<p>It comes in two forms:</p>
<ol>
<li>
<p><strong>Latency:</strong> Loading spinners, perceptible gaps between a click and resulting action, a frozen interface — all of these are an unsettling game of &ldquo;guess what happens next?&rdquo;. A page scrolling slower than your mouse wheel feels like being stuck in molasses.</p>
<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" title="Fast Software, the Best Software — by Craig Mod">vice versa</a>.</p>
</li>
<li>
<p><strong>Visual noise:</strong> To the degree that <a href="https://worrydream.com/MagicInk/" target="_blank" rel="noopener" title="Magic Ink: Information Software and the Graphical Interface">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="https://joodaloop.com/riffs/new-macos-menus" title="The new MacOS menus could be better">icons</a>, and <a href="https://mattstromawn.com/writing/ui-density/" target="_blank" rel="noopener" title="UI Density || Matt Ström-Awn, designer-leader">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;</p>
</li>
</ol>
<h3 id="uncertainty">Uncertainty</h3>
<p>Some retreats from visual heaviness end up in the arms of naive minimalism. Look at this coffee machine panel (<a href="https://jenson.org/free/" target="_blank" rel="noopener" title="Design can be free – Scott Jenson">source</a>, worth reading) for example: it&rsquo;s minimalism results in it hiding information.</p>
<img
  src="https://media.joodaloop.com/coffee-panel.png?width=510&amp;height=282" alt="Coffee machine panel with just numbers and icons" width="510" height="282"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><p>An absence of labels asks <em>you</em> to fill in the gaps, to memorize things. Ambiguity leads to hesitance, by way of uncertainty.</p>
<p>In many apps, it makes for a series of nervous back-and-forth jumps between multiple screens. In absence of unambiguous tooltips/labels/descriptions, you receive no clue as the where your next click is going to take you.</p>
<p>This is what plagues hyperlinks, which are a tool for <a href="https://joodaloop.com/design-dislikes#hyperlinks" title="Software Design Ideas I Dislike">indirection</a> that often don&rsquo;t provide any hints as to <em>where</em> they&rsquo;re going. <a href="https://joodaloop.com/design-dislikes#transclusion" title="Software Design Ideas I Dislike">Transclusion</a> is another offender, requiring users to think about every transcluded instance that might be affected by a change to a source document.</p>
<h3 id="non-standard-behaviour">Non-standard behaviour</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, <no-wrap><kbd>⌘</kbd> + <kbd>F</kbd></no-wrap>, 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 each other&rsquo;s rules that <a href="https://twitter.com/joodalooped/status/1954109983022277096" target="_blank" rel="noopener" title="judah on Twitter: \&#34;the problem with making anything good, especially keyboard-based functionality is that it doesn’t exist in other apps and now your body feels the anxiety of “can i use this or not?” all the time happens with “CMD &#43; Enter to submit vs. just Enter” for example\&#34;">relying on the anything</a> starts to feel impossible).</p>
<p>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="change">Change</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 with their trust burned. Once bitten, forever shy.</p>
<p>It&rsquo;s not just changes to the product that can have this effect. Veteran users of software can smell the desperation in a rebrand. They can sense the upcoming product pivot that finally casts their specific needs aside.</p>
<h3 id="powerlessness">Powerlessness</h3>
<p>For the longest time, the black box of social media 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="https://joodaloop.com/design-dislikes#concierge-attitudes" title="Software Design Ideas I Dislike">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>

<p><strong>If you feel like commenting on this post, send me an e-mail at <a href="mailto:judah@joodaloop.com?subject=Comment%20about%20%22Interface%20Anxiety%22">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?subject=Comment%20about%20%22Better%20design%20through%20calibration%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
    <item>
      <title>Better Blog Design</title>
      <link>https://joodaloop.com/blog-design/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 &#43;0000</pubDate>
      <guid isPermaLink="true">https://joodaloop.com/blog-design/</guid><description>Some patterns for modern content websites</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">Don&rsquo;t paginate</h3>
<p>Moving information out of view creates more <a href="https://joodaloop.com/interface-anxiety" title="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 <no-wrap><kbd>⌘</kbd> + <kbd>F</kbd></no-wrap> search to work as a full-site search.</p>
<p>One of my favourite examples of laying out a small collection of essays:</p>
<img
  src="https://media.joodaloop.com/manav-blog.jpg?width=1478&amp;height=1398" alt="Screenshot of ponnekanti.net blog home page, with a vertical list of essay titles" width="1478" height="1398"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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">Prefer one level of navigation</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" title="A Brief History &amp; Ethos of the Digital Garden">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-bad-thumbnail-images">Avoid bad thumbnail images</h3>
<p>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. They are largely a relic of the nonsense SEO recommendations of the 2010s. 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>
<img
  src="https://media.joodaloop.com/sunil-og-image.png?width=1200&amp;height=630" alt="Example of a Open Graph image containing the title of the post" width="1200" height="630"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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" title="Philip Ilic Thomas">author</a> <a href="https://brandur.org/articles" target="_blank" rel="noopener" title="Articles — brandur.org">themselves</a>, or use a consistent illustration style. They look really nice, even when they&rsquo;re not particularly relevant to the content of the post.</p>
<h3 id="make-categorisation-useful">Make categorisation useful</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" title="Archive — Piper Haywood">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">Topic</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">Quality</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">Length</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">Use more content formats</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" title="Bookshelf — nihalsahu.net">bookshelf</a> (with <a href="https://nicochilla.com/books-on-the-shelf/" target="_blank" rel="noopener" title="Books on the shelf">reviews</a>?), media <a href="https://macwright.com/photos/" target="_blank" rel="noopener" title="Photos - macwright.com">galleries</a>, blogchains, etc. etc.</p>
<h3 id="use-short-urls-if-you-can-afford-to">Use short URLs, if you can afford to</h3>
<p>There&rsquo;s nothing <em>wrong</em> with having your posts live at <code>domain.com/posts/2025-12-25/post-url</code> but there&rsquo;s something really nice about being able to share <a href="https://qntm.org/urls" target="_blank" rel="noopener" title="On short URLs">short URLs</a> that look as neat as <code>domain.com/post-url</code> by quickly typing them out from memory.</p>
<h3 id="let-things-feel-like-paper">Let things feel like paper</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" title="The return of fancy tools - macwright.com">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?subject=Comment%20about%20%22Better%20Blog%20Design%22">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>
<img
  src="https://media.joodaloop.com/hig-icons.jpg?width=2772&amp;height=1384" alt="Screenshot from HIG warning against the use of icons in menus, to prevent interface clutter" width="2772" height="1384"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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>
<img
  src="https://media.joodaloop.com/macos-menus.jpg?width=1188&amp;height=653" alt="Screenshot comparing MacOS menus with original vs. lightened icons" width="1188" height="653"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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>
<img
  src="https://media.joodaloop.com/align-line.jpg?width=1138&amp;height=684" alt="Screenshot with a red line to mark the shift of attention to the text instead of icons" width="1138" height="684"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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?subject=Comment%20about%20%22The%20new%20MacOS%20menus%20could%20be%20better%22">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>Some notes on the limitations of the medium.</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" title="Zooming User Interface (ZUI) | Hacker News">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" title="Steve Ruiz on Twitter: \&#34;Good example is fast creative iteration with clients in an agency context. Whip up shitty generated creative together with a client in order to dial in / iterate on the client’s vision. The generated work is never the final product but better direction faster\&#34;">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">Infinite canvases and me</h2>
<p>I first encountered serious usage in <a href="https://excalidraw.com/" target="_blank" rel="noopener" title="Excalidraw Whiteboard">Excalidraw</a>, followed by <a href="https://museapp.com/" target="_blank" rel="noopener" title="Muse — dive into big ideas">Muse</a>, Figma, then <a href="https://www.tldraw.com/" target="_blank" rel="noopener" title="tldraw • very good free whiteboard">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" title="The Workshop and the Storefront | Brad Frost">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" title="Mind Mapping Software &amp; Tool For Mac &amp; Windows">Scapple</a>, which was near-perfect apart from the fact that it didn&rsquo;t have a web app.</p>
<img
  src="https://media.joodaloop.com/scapple.jpeg?width=1303&amp;height=808" alt="Screenshot of the Scapple app" width="1303" height="808"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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" title="Infinite Canvas app gallery">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" title="Steve Ruiz on Twitter: \&#34;Good example is fast creative iteration with clients in an agency context. Whip up shitty generated creative together with a client in order to dial in / iterate on the client’s vision. The generated work is never the final product but better direction faster\&#34;">&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" title="Scatterpad">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" title="from:johnnulls canvas - Search / Twitter">Mr. Nulls</a> or <a href="https://youtu.be/EigynPfpre4?si=RLpQIKX32q6VrzKC&amp;t=3624" target="_blank" rel="noopener" title="Tools for Thought Rocks: December 2022 - Jakob from LogSeq, Jess Martin">Jess</a>, but a fair number nonetheless.</p>
<h2 id="the-problems-and-a-few-speculative-suggestions">The problems, and a few speculative suggestions</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">They invite messes</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 the canvas is such a singular medium, you&rsquo;re encouraged to put <em>every</em> detail of your project 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" title="ashley on Twitter: \&#34;hmm.. she&#39;s doing very ⭐️cool things but ngl i think \&#34;canvases\&#34; are more overwhelming than other UIs. esp infinite ones it&#39;s like an endless desk w/ no built-in anchors? u can cluster items be near each other but u have to remember the groupings &amp;amp; their relative locations urself\&#34;">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" title="John on Twitter: \&#34;@PascalPixel @astralwave @Horse_Browser @Paul_Rony @kosmik_app definitely love kosmik, but i do like the feeling of being on a web page when browsing vs in a canvas. “full scenic” here would probably look more like a beefed up sidebar, or side-by-side panel…but certainly a place where t…">sidebars</a>, <a href="https://news.ycombinator.com/item?id=40039143" target="_blank" rel="noopener" title="Zooming User Interface (ZUI) | Hacker News">panes</a>, and <a href="https://www.inkandswitch.com/muse/#shelf" target="_blank" rel="noopener" title="Muse: Designing a studio for ideas — Shelf">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" title="John on Twitter: \&#34;i think it makes more sense to include mechanisms such that each node can disclose its inputs/outputs, and have these be easily editable and to stop showing lines all the time, and only reveal on hover or selection\&#34;">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 each page as a single, specific artifact. Like a <a href="https://twitter.com/KinopioClub/status/1939691591431590296?s=20" target="_blank" rel="noopener" title="Kinopio on Twitter: \&#34;Fran emailed me about a student plan, and right after made this super cute TikTok ↓\&#34;">birthday card</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" title="Supporting Faster File Load Times with Memory Optimizations in Rust | Figma Blog">incredible</a> <a href="https://www.figma.com/blog/speeding-up-file-load-times-one-page-at-a-time/" target="_blank" rel="noopener" title="Speeding Up File Load Times, One Page At A Time | Figma Blog">technical</a> <a href="https://www.figma.com/blog/incremental-frame-loading/" target="_blank" rel="noopener" title="Improving Performance with Incremental Frame Loading | Figma Blog">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">The hell of eternal adjustments</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://allume.com/memos/2021-08-text-blocks/" target="_blank" rel="noopener" title="Text blocks — Allume">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 <a href="https://gitnation.com/contents/arrows-at-length" target="_blank" rel="noopener" title="Arrows (At Length) by Steve Ruiz">shape-bound</a> arrows are amazing too. We need more stuff like them. Amelia Wattenberger has a <a href="https://wattenberger.com/thoughts/evolving-the-infinite-canvas" target="_blank" rel="noopener" title="Evolving the infinite canvas">few ideas</a> that might be worth trying.</p>
<h3 id="mobile-unfriendliness">Mobile-unfriendliness</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) will be a weak one due to the variety of idiosyncratic usage patterns. It defeats the point of being a wide open space, really.</p>
<h3 id="they-do-not-situate">They do not situate</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" title="Steve Ruiz on Twitter: \&#34;these are good notes, I‘ve had my head in canvas world for a while and have some thoughts: canvases allow for arbitraty structure, ad hoc arrangements, which is nice and squishy vs being trapped inside of a structured / block based editor those squishy arrangements often seem “…">&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" title="Ashley on Twitter: \&#34;oh interestingg, maybe! i am not fully convinced bc i feel like desk clutter is often just clutter, but sure i can think of some objects that do subtly anchor the space, like a monitor, a pencil holder, or a tissue box\&#34;">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" title="Kinopio on Twitter: \&#34;Line Dividers [New] Add lines from the toolbar (or with &#39;L&#39;) to mark pages, sections, slides, and other large variable height areas that can be cumbersome to manage with boxes alone. Jump between lines, and make room in busy spaces with the &#39;Select All Below&#39; button.\&#34;">line dividers</a>, or <a href="https://twitter.com/tbsrnstrm/status/1959601780649832562" target="_blank" rel="noopener" title="Tobias Renström on Twitter: \&#34;Stacks will be an organic, lightweight way of grouping things together - without all the structure. Bunch stuff together, click to expand, open to view or pull back what&#39;s needed again. The lovely kind of mess.\&#34;">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" title="ashley on Twitter: \&#34;hmm.. she&#39;s doing very ⭐️cool things but ngl i think \&#34;canvases\&#34; are more overwhelming than other UIs. esp infinite ones it&#39;s like an endless desk w/ no built-in anchors? u can cluster items be near each other but u have to remember the groupings &amp;amp; their relative locations urself\&#34;">still exists</a>.</strong></p>
<p>Again, Muse has some <a href="https://museapp.com/memos/2020-12-infinite-canvas/" target="_blank" rel="noopener" title="Infinite canvas">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">The interaction mechanics are meh</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 worse 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" title="Steve Ruiz on Twitter: \&#34;Chat has this superpower though which is that it can handle bad inputs like “vapes cancer few words” or “podcast ai 9funy” and still produce a pretty good output. This is harder on the canvas; it’s not as good for drunk users\&#34;">&ldquo;it’s not as good for drunk users&rdquo;</a>.</p>
<h2 id="but-if-youre-going-to-make-one-anyway">But if you&rsquo;re going to make one anyway&hellip;</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" title="tldraw: Infinite Canvas SDK for React">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" title="from:steveruizok rotation - Search / Twitter">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" title="Creating a Zoom UI - Steve Ruiz">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" title="Creating UI delight: dynamically rotating mouse cursors">Dynamically rotating mouse cursors</a>, because why not?</li>
<li><a href="https://www.redblobgames.com/making-of/draggable/" target="_blank" rel="noopener" title="Implementing draggable objects">Pointer</a> <a href="https://writing.grantcuster.com/posts/2021-09-15-towards-more-manageable-pointer-events/" target="_blank" rel="noopener" title="Towards more manageable pointer events - Grant Custer">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" title="tldraw/packages/editor/src/lib/editor/Editor.ts at main · tldraw/tldraw · GitHub">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?subject=Comment%20about%20%22Canvas%20UIs%3A%20A%20Critical%20Review%22">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 revealing 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 revealing as they are load-bearing. These are some of mine, in no particular order.</p>
<ul>
<li>
<p>Read (mostly on my e-reader).</p>
</li>
<li>
<p>Add writing or design improvements (see <a href="https://joodaloop.com/changelog" title="Changelog for joodaloop.com">Changelog</a>) to this site.</p>
</li>
<li>
<p>Sketch new interface ideas in tldraw.</p>
</li>
<li>
<p>Binge-read the classic DC comic series on <a href="https://readcomicsonline.ru/" target="_blank" rel="noopener" title="Read Comics Online">Read Comics Online</a></p>
</li>
<li>
<p>Go lounge around at a friend&rsquo;s place.</p>
</li>
<li>
<p>Talk to an LLM about sync engine architectures.</p>
</li>
<li>
<p>Go through the tabs in my reading backlog.</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="https://joodaloop.com/twitter-bookmarks" title="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" title="localfirst.fm — A podcast about local-first software development">localfirst.fm</a>, <a href="https://jacksondahl.com/dialectic" target="_blank" rel="noopener" title="Dialectic — Jackson Dahl">Dialectic</a>, <a href="https://www.manifold1.com/" target="_blank" rel="noopener" title="Manifold">Manifold</a>, <a href="https://www.youtube.com/@ryansolid/videos" target="_blank" rel="noopener" title="Ryan Carniato - YouTube">Ryan Carniato&rsquo;s streams</a></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" title="The Commoncog Forum - A sensemaking community for business nerds.">Commoncog Forum</a>.</p>
</li>
<li>
<p><del>Doomscroll Twitter, sometimes Bluesky.</del><br>
I use write-only clients for both these apps, no timeline to scroll.</p>
</li>
<li>
<p><del>Rewrite my todo lists to clean up/reprioritise them.</del><br>
<a href="https://joodaloop.com/todo-history#august-2026">No more</a>!</p>
</li>
<li>
<p><del>Prune my unused notes in Bear or the drafts section of this site.</del><br>
No longer necessary, I have banished all my non-active notes to the archive.</p>
</li>
<li>
<p><del>Go through the designs on <a href="https://deadsimplesites.com/" target="_blank" rel="noopener" title="Dead Simple Sites — Minimal Web Design Inspiration &amp; Gallery">Dead Simple Sites</a> to see what simple ways of laying out text I can make possible in the Scatterpad editor.</del><br>
Not my goal anymore.</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?subject=Comment%20about%20%22Things%20I%20Do%20To%20Procrastinate%22">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>
<img
  src="https://joodaloop.com/media/photos/v2.png" alt="Screenshot of joodaloop.com v2" width="2000" height="1235"onerror="const s=document.createElement('span');s.className='img-failed';s.textContent=('“' + this.alt + '”');this.replaceWith(s)"
><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="https://joodaloop.com/riffs/joodaloop-v4.5" title="joodaloop.com 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?subject=Comment%20about%20%22Versioning%20joodaloop.com%20redesigns%22">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?subject=Comment%20about%20%22Hugoloop%2C%20a%20super-minimal%20starter%20site%22">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" title="Aaron Boodman on Twitter: \&#34;What are some of the ideas from programming languages or tools that have most influenced you as a developer. I&#39;ll start: * React: reactive UI * Git: content-addressing and immutability * Golang: structural typing * Rust: option types / exhaustive match\&#34;">Good list here</a>.</p>
<h3 id="fractional-indexing">Fractional indexing</h3>
<p>Found through Evan Wallace&rsquo;s <a href="https://madebyevan.com/algos/crdt-fractional-indexing/" target="_blank" rel="noopener" title="CRDT: Fractional Indexing - Made by Evan">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" title="sorting things on the canvas">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" title="GitHub - nathanhleung/jittered-fractional-indexing: Fractional indexing in JavaScript with random jitter for collision avoidance · GitHub">jittered-fractional-indexing</a> library, which in turn forks the <a href="https://github.com/rocicorp/fractional-indexing" target="_blank" rel="noopener" title="GitHub - rocicorp/fractional-indexing: Fractional Indexing in JavaScript · GitHub">original</a> from the lovely folks at Rocicorp. There&rsquo;s also one from <a href="https://github.com/tldraw/tldraw/pull/9352" target="_blank" rel="noopener" title="perf(utils): inline fractional indexing and speed up index key generation by steveruizok · Pull Request #9352 · tldraw/tldraw · GitHub">tldraw</a>, optimised for their use case.</p>
<h3 id="hashing">Hashing</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" title="Tuomas Artman on Twitter: \&#34;@eneskaya @linear @tommoor @eldh The hash is generated from the schema of the model (its properties and types). When the schema changes, e.g a new property is added, the hash changes and it’s as of the store does not exist and is the bootstrapped.\&#34;">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">Signals</h3>
<p>Encountered through <a href="https://signia.tldraw.dev/docs/what-are-signals" target="_blank" rel="noopener" title="What are Signals? | signia">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" title="SolidJS The World Beyond Components by Ryan Carniato">lack of one</a>) is probably the best example of the ideas in action.</p>
<h3 id="idempotency">Idempotency</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">Binary search</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?subject=Comment%20about%20%22Useful%20Programming%20Ideas%22">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?subject=Comment%20about%20%22Chat%20quotes%20debut%20on%20joodaloop.com%22">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>
<p><cite> <a href="https://twitter.com/visakanv/status/1938267091754488265" target="_blank" rel="noopener">@visakanv</a> </cite></p>
</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?subject=Comment%20about%20%22Gift%20Culture%22">judah@joodaloop.com</a>. I check all mail.</strong></p>]]></content:encoded>
    </item>
    
  </channel>
</rss>
