michaelheap.com I write about systems, people, and what we learn when things go wrong. 2026-09-24T14:26:06Z https://michaelheap.com Michael Heap m@michaelheap.com iA Writer in Obsidian 2026-09-24T14:26:06Z https://michaelheap.com/ia-writer-obsidian/ <p>I used to be a big iA Writer user for writing on the go. I recently wanted to go back to that experience and came <em>this</em> close to buying the latest edition before realising that all I'd do is point it at my Obsidian vault anyway.</p> <p>So I spent an hour or so with Obsidian and Claude and have replicated iA writer in Obsidian. Here's how I did it</p> <div class="image-wrapper "><picture> <source class="" type="image/webp" srcset="https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-320.webp 320w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-640.webp 640w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-960.webp 960w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-1200.webp 1200w" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 960px) 960px, (max-width: 1200px) 1200px, 100vw" /> <img class="" alt="iA Writer in Obsidian" src="https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-1200.jpeg" sizes="(max-width: 320px) 320px, (max-width: 640px) 640px, (max-width: 960px) 960px, (max-width: 1200px) 1200px, 100vw" srcset="https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-320.jpeg 320w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-640.jpeg 640w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-960.jpeg 960w, https://michaelheap.com/images/ia-writer-obsidian/ia-writer-obsidian.png/GUehTtitVZ-1200.jpeg 1200w" width="1200" height="645" /> </picture></div> <h2 id="typewriter-mode" tabindex="-1">Typewriter Mode</h2> <p>The majority of this functionality is added by the <a href="https://community.obsidian.md/plugins/typewriter-mode">Typewriter Mode</a> plugin by Davis Riedel. It provides a toolkit of features such as &quot;dim paragraphs&quot; and &quot;keep the current line centered&quot; that I use.</p> <p>Install the plugin to get started.</p> <p>Next, update the settings to match what I have by replacing <code>.obsidian/plugins/typewriter-mode/data.json</code> with the following:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">json</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-color-text)">{</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"general"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"version"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"1.5.0"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isAnnounceUpdatesEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isPluginActivated"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isOnlyActivateAfterFirstInteractionEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"enabledPlatforms"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"both"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"enabledFilePaths"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> []</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"disabledFilePaths"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> []</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"typewriter"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isTypewriterScrollEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isOnlyMaintainTypewriterOffsetWhenReachedEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isTypewriterOnlyUseCommandsEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"typewriterOffset"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0.5</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"keepLinesAboveAndBelow"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isKeepLinesAboveAndBelowEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"linesAboveAndBelow"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">5</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"maxChars"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isMaxCharsPerLineEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"maxCharsPerLine"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">64</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"dimming"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isDimUnfocusedEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isDimUnfocusedOnlyInWritingFocusModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isDimHighlightListParentEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isDimTableAsOneEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"dimUnfocusedMode"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"paragraphs"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"dimUnfocusedEditorsBehavior"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"dim-all"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"dimmedOpacity"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0.25</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isPauseDimUnfocusedWhileScrollingEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isPauseDimUnfocusedWhileSelectingEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"currentLine"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isHighlightCurrentLineEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isHighlightCurrentLineOnlyInWritingFocusModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isFadeLinesEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isFadeLinesOnlyInWritingFocusModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"fadeLinesIntensity"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0.55</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isHighlightCurrentLineOnlyInFocusedEditorEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isPauseCurrentLineHighlightWhileScrollingEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isPauseCurrentLineHighlightWhileSelectingEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"currentLineHighlightStyle"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"box"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"currentLineHighlightUnderlineThickness"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">1</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"currentLineHighlightColor-dark"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"#444444"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"currentLineHighlightColor-light"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"#dddddd"</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"writingFocus"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"doesWritingFocusShowHeader"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"doesWritingFocusShowVignette"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"doesWritingFocusShowStatusBar"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isWritingFocusFullscreen"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"writingFocusVignetteStyle"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"box"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"writingFocusFontSize"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">0</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"restoreCursorPosition"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isRestoreCursorPositionEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"cursorPositions"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {}</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"hemingwayMode"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isHemingwayModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isHemingwayModeOnlyInWritingFocusModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isAllowBackspaceInHemingwayModeEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isShowHemingwayModeStatusBarEnabled"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"hemingwayModeStatusBarText"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Hemingway"</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div></code></div></pre> <h2 id="the-ia-writer-font" tabindex="-1">The iA Writer Font</h2> <p>I wanted Obsidian to feel just like iA Writer, and using the iA Writer font is a big part of this Thankfully the fonts are <a href="https://github.com/iaolo/iA-Fonts">available on GitHub</a>. Rather than installing the font locally, I chose to embed it in my stylesheet so that it syncs with my vault to all platforms.</p> <p>Here's how to do it:</p> <ol> <li>Open your Obsidian vault folder on your computer.</li> <li>Navigate to <code>.obsidian/snippets/</code> (If the <code>snippets</code> folder doesn't exist, create it).</li> <li>Create a new plain text file named <code>ia-writer-font.css</code>.</li> <li>Open it in any text editor and paste the CSS below into it.</li> </ol> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">css</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-token-comment)">/* iA Writer Mono Webfont Embedded */</span></div><div class="line"><span style="color: var(--shiki-token-keyword)">@font-face</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">font-family</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'iA Writer Mono'</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">src</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">url</span><span style="color: var(--shiki-token-constant)">(</span><span style="color: var(--shiki-token-string-expression)">'data:font/woff2;charset=utf-8;base64,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'</span><span style="color: var(--shiki-token-constant)">) </span><span style="color: var(--shiki-token-function)">format</span><span style="color: var(--shiki-token-constant)">(</span><span style="color: var(--shiki-token-string-expression)">'woff2'</span><span style="color: var(--shiki-token-constant)">)</span><span style="color: var(--shiki-color-text)">;\n </span><span style="color: var(--shiki-token-constant)">font-weight</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">normal</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">font-style</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">normal</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-comment)">/* Apply the writing style only in Typewriter Mode's Writing Focus Mode. */</span></div><div class="line"><span style="color: var(--shiki-token-string-expression)">body</span><span style="color: var(--shiki-token-function)">.ptm-focus-mode</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">.cm-editor</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">.cm-content</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">font-family</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"iA Writer Mono"</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-token-constant)"> monospace </span><span style="color: var(--shiki-token-keyword)">!important</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">font-size</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">22</span><span style="color: var(--shiki-token-keyword)">px</span><span style="color: var(--shiki-token-constant)"> </span><span style="color: var(--shiki-token-keyword)">!important</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-string-expression)">body</span><span style="color: var(--shiki-token-function)">.ptm-focus-mode</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">.cm-editor</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> --file-line-width</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">60</span><span style="color: var(--shiki-token-keyword)">rem</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-string-expression)">body</span><span style="color: var(--shiki-token-function)">.ptm-focus-mode</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">.cm-editor</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">.cm-line</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">line-height</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">1.8 </span><span style="color: var(--shiki-token-keyword)">!important</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">letter-spacing</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">-0.01</span><span style="color: var(--shiki-token-keyword)">em</span><span style="color: var(--shiki-token-constant)"> </span><span style="color: var(--shiki-token-keyword)">!important</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div><div class="line"></div></code></div></pre> <ol start="5"> <li>Save the file.</li> <li>In Obsidian, go to <strong>Settings -&gt; Appearance -&gt; CSS Snippets</strong> and toggle <code>ia-writer-font</code> to <strong>ON</strong>. You may need to reload the app for the snippet to show up in this screen.</li> </ol> <p>This snippet embeds the iA Writer font, and makes it active any time the Typewriter plugin's focus mode is enabled.</p> <h2 id="toggle-writing-mode" tabindex="-1">Toggle Writing Mode</h2> <p>The final part was the trickiest. I wanted to enable Typewriter scrolling and dimming, focus the editor, and enter Writing Focus, but only in edit mode. I explored using Commander for this, but ended up writing a small custom plugin.</p> <p>The plugin can be triggered in both <code>preview</code> and <code>source</code> mode. It enables typewriter mode, and does not try to re-enable it if typewriter mode is already enabled. When triggered again, typewriter mode is disabled and you're returned to your original file mode.</p> <p>To use this, add it to your <code>.obsidian/plugins</code> folder:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">bash</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-color-text)">❯ tree .obsidian/plugins/mheap-focus-mode</span></div><div class="line"><span style="color: var(--shiki-color-text)">.obsidian/plugins/mheap-focus-mode</span></div><div class="line"><span style="color: var(--shiki-color-text)">├── main.js</span></div><div class="line"><span style="color: var(--shiki-color-text)">└── manifest.json</span></div></code></div></pre> <p><code>main.js</code>:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">javascript</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> { </span><span style="color: var(--shiki-token-constant)">MarkdownView</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">Notice</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">Plugin</span><span style="color: var(--shiki-color-text)"> } </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">require</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"obsidian"</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-constant)">module</span><span style="color: var(--shiki-color-text)">.</span><span style="color: var(--shiki-token-constant)">exports</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">class</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">MheapFocusModePlugin</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">extends</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Plugin</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> originalMode </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">null</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">onload</span><span style="color: var(--shiki-color-text)">() {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-function)">.addCommand</span><span style="color: var(--shiki-color-text)">({</span></div><div class="line"><span style="color: var(--shiki-color-text)"> id</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"toggle-mheap-focus-mode"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> name</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Toggle mheap focus mode"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> icon</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"pen-line"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">callback</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">async</span><span style="color: var(--shiki-color-text)"> () </span><span style="color: var(--shiki-token-keyword)">=&gt;</span><span style="color: var(--shiki-color-text)"> {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">const</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">view</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">app</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">workspace</span><span style="color: var(--shiki-token-function)">.getActiveViewOfType</span><span style="color: var(--shiki-color-text)">(MarkdownView);</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-keyword)">!</span><span style="color: var(--shiki-color-text)">view) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">Notice</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"Open a Markdown note first."</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">return</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-constant)">view</span><span style="color: var(--shiki-token-function)">.getMode</span><span style="color: var(--shiki-color-text)">() </span><span style="color: var(--shiki-token-keyword)">===</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"source"</span><span style="color: var(--shiki-color-text)">) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-keyword)">!</span><span style="color: var(--shiki-token-constant)">document</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">body</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">classList</span><span style="color: var(--shiki-token-function)">.contains</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"ptm-focus-mode"</span><span style="color: var(--shiki-color-text)">)) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-function)">.enableTypewriterMode</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> view);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">return</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-function)">.disableTypewriterMode</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> view);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">return</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-function)">.enableTypewriterMode</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-constant)">this</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> view);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> });</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">async</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">enableTypewriterMode</span><span style="color: var(--shiki-color-text)">(t</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> v) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-color-text)">.originalMode </span><span style="color: var(--shiki-token-keyword)">===</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">null</span><span style="color: var(--shiki-color-text)">) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-color-text)">.originalMode </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.getMode</span><span style="color: var(--shiki-color-text)">();</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">app</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">commands</span><span style="color: var(--shiki-token-function)">.executeCommandById</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"typewriter-mode:typewriter-enable"</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.setState</span><span style="color: var(--shiki-color-text)">({ </span><span style="color: var(--shiki-token-keyword)">...</span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.getState</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> mode</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"source"</span><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> { history</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-color-text)"> });</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">new</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">Promise</span><span style="color: var(--shiki-color-text)">((resolve) </span><span style="color: var(--shiki-token-keyword)">=&gt;</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">window</span><span style="color: var(--shiki-token-function)">.requestAnimationFrame</span><span style="color: var(--shiki-color-text)">(resolve));</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">editor</span><span style="color: var(--shiki-token-function)">.focus</span><span style="color: var(--shiki-color-text)">();</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">app</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">commands</span><span style="color: var(--shiki-token-function)">.executeCommandById</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"typewriter-mode:writing-focus-enable"</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">async</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">disableTypewriterMode</span><span style="color: var(--shiki-color-text)">(t</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> v) {</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">app</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">commands</span><span style="color: var(--shiki-token-function)">.executeCommandById</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"typewriter-mode:writing-focus-disable"</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">app</span><span style="color: var(--shiki-token-function)">.</span><span style="color: var(--shiki-token-constant)">commands</span><span style="color: var(--shiki-token-function)">.executeCommandById</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-string-expression)">"typewriter-mode:typewriter-disable"</span><span style="color: var(--shiki-color-text)">);</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">await</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.setState</span><span style="color: var(--shiki-color-text)">(</span></div><div class="line"><span style="color: var(--shiki-color-text)"> { </span><span style="color: var(--shiki-token-keyword)">...</span><span style="color: var(--shiki-token-constant)">v</span><span style="color: var(--shiki-token-function)">.getState</span><span style="color: var(--shiki-color-text)">()</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> mode</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-color-text)">.originalMode </span><span style="color: var(--shiki-token-keyword)">??</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"preview"</span><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> { history</span><span style="color: var(--shiki-token-keyword)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span><span style="color: var(--shiki-color-text)"> }</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> );</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">t</span><span style="color: var(--shiki-color-text)">.originalMode </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">null</span><span style="color: var(--shiki-color-text)">;</span></div><div class="line"><span style="color: var(--shiki-color-text)"> }</span></div><div class="line"><span style="color: var(--shiki-color-text)">};</span></div></code></div></pre> <p><code>manifest.json</code>:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">json</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-color-text)">{</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"id"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"mheap-focus-mode"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"name"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"mheap focus mode"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"version"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"1.0.0"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"minAppVersion"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"1.11.0"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"description"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Opens the active note in Editing View and enters Typewriter Mode Writing Focus."</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"author"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Michael Heap"</span><span style="color: var(--shiki-token-punctuation)">,</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">"isDesktopOnly"</span><span style="color: var(--shiki-token-punctuation)">:</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">false</span></div><div class="line"><span style="color: var(--shiki-color-text)">}</span></div></code></div></pre> <p>You'll need to reload Obsidian after creating these files, then head to <code>Community Plugins</code> in settings and enable the new plugin.</p> <p>Then finally, bind a keyboard shortcut to trigger the <code>mheap focus mode: Toggle mheap focus mode</code> command. I use <code>cmd+shift+W</code> (for <strong>W</strong>riting).</p> <h2 id="fin" tabindex="-1">Fin</h2> <p>Now you have iA Writer, but in Obsidian. I hope you enjoy it as much as I do.</p> I don't want the details 2026-09-23T08:25:43Z https://michaelheap.com/i-dont-want-the-details/ <p>A few months ago I was dragged into a call with my engineering counterpart and their boss (who happens to be our SVP of engineering). Something had gone wrong that shouldn't have. Nothing catastrophic, but important enough that I was now on a call with an SVP.</p> <p>I started to explain how it happened when they cut me off with &quot;Michael, I don't want the details&quot;.</p> <p>They continued:</p> <blockquote> <p>I know that if we get into the details, the reasons will be perfectly reasonable. You'll explain what happened, I'll understand why everyone made the decisions they made, and I'll empathise with you. <br /><br /></p> <p>Then it'll happen again. <br /><br /></p> <p>So I don't want the details. I want to know what we're changing.</p> </blockquote> <p>At first I thought &quot;I don't want the details&quot; sounded dismissive. How can they make informed decisions without understanding the details?</p> <p>Then I realised that &quot;I don't want the details&quot; wasn't being dismissive. The executive assumed that we were competent, and was saying &quot;I already believe you. Now let's talk about what happens next&quot;.</p> <h2 id="asking-the-right-question" tabindex="-1">Asking the right question</h2> <p>After something goes wrong, most organizations ask &quot;Why did this happen?&quot; This is a question we're all familiar with answering.</p> <p>We write up timelines. We reconstruct decisions. We explain dependencies. At the end of it, we hand over a document that contains the specific combination of events that led to the incident.</p> <p>Everyone nods their head, says &quot;that makes sense&quot;, and we all move on with our day.</p> <p>Understanding an issue is not the same as fixing it. A good explanation can make things worse. Once everyone agrees that the behaviour was reasonable, the urgency to change anything disappears.</p> <p>When an incident is an unfortunate but understandable sequence of events where no-one is at fault nothing changes. Then the same thing happens six months later, and everyone is left wondering how we landed here again.</p> <p>To drive change in your organization, don't ask &quot;why did this happen?&quot;.</p> <p>Instead, ask:</p> <p><strong>What are we changing so that the same class of failure is less likely next time?</strong></p> <h2 id="reasonable-people" tabindex="-1">Reasonable people</h2> <p>The SVP wasn't interested in understanding how the issue happened or who was involved. They didn't want to be convinced that everyone involved behaved reasonably. That's a baseline expectation.</p> <p>Their question became:</p> <p><strong>“Given that reasonable people produced this outcome, what needs to change?”</strong></p> <p>Consider these examples:</p> <blockquote> <p>&quot;We missed it because Alice was on holiday and Bob thought the Widgets team owned it&quot;.</p> </blockquote> <p>Okay. How do we make ownership unambiguous when someone is unavailable?</p> <blockquote> <p>&quot;The requirements changed three days before launch.&quot;</p> </blockquote> <p>Of course they did! What happens when requirements change inside the launch window?</p> <blockquote> <p>&quot;The alert fired, but the on-call engineer had already dealt with twenty low-value alerts that evening&quot;.</p> </blockquote> <p>Makes sense. How do we improve the signal to noise ratio of our alerts?</p> <p>Focus on changing the system. The people are usually not what needs changing.</p> <h2 id="a-good-explanation-is-not-a-fix" tabindex="-1">A good explanation is not a fix</h2> <p>If your postmortem is full of sentences like &quot;we should involve support earlier&quot; and &quot;we need to communicate better&quot;, or my personal favourite, &quot;we'll be more careful next time&quot;, you have a collection of hopes dressed up as progress.</p> <p>If your corrective action depends on people remembering a conversation from six months ago, you don't have a corrective action. You have organizational folklore. If everyone involved in the incident left the company tomorrow, would the fix still work? If the answer is <em>no</em>, the people may have learned something while the system is still destined to fail.</p> <p>For a postmortem to drive lasting change, ask:</p> <p><strong>If the same situation happened tomorrow, what would cause a different outcome?</strong></p> <p>A process that forces a decision at this point is an improvement. A system that prevents this class of mistake is stronger still.</p> <h2 id="process-for-process'-sake" tabindex="-1">Process for process' sake</h2> <p>You can take &quot;the system prevents this class of mistake&quot; too far.</p> <p>Not every failure deserves a new process. That's how you build environments that no-one wants to work in. Sometimes the cost of preventing recurrence is higher than the cost of occasionally accepting the failure, and that's ok.</p> <p>But you need to accept failure with your eyes open. &quot;We are consciously accepting this risk&quot; is very different from &quot;we said we'd try harder and everyone felt better&quot;.</p> <h2 id="trust" tabindex="-1">Trust</h2> <p>I still think about what the SVP said a lot. What sounded like impatience was a declaration of trust. They didn't need me to prove that the people involved were competent or well intentioned. They were willing to start there. If the investigation showed otherwise, we could deal with that separately.</p> <p>What they didn't want was for empathy to become the mechanism by which the organisation absolved itself of having to change.</p> <p>People are usually making the best decisions they can with the information, incentives and constraints around them. That's why fixing the people is often the wrong answer.</p> <p>Sometimes the most useful thing a leader can say is:</p> <p><strong>I believe you. I don’t need the details. Tell me what we're changing.</strong></p> Boardgame Recommendations 2026-09-21T16:16:56Z https://michaelheap.com/boardgames/ <p>After reading <a href="https://lws.io/blog/boardgames/">Kevin's board game recommendations</a> I realised two things:</p> <ol> <li>He and I have very similar taste in games</li> <li>I regularly make recommendations in conversation and should just write them down</li> </ol> <p>So, here we go.</p> <p><strong>If you don't want to read lots of words, skip to the <a href="https://michaelheap.com/boardgames/#tldr">tl;dr</a></strong>. You can also see my complete collection <a href="https://boardgamegeek.com/collection/user/mheap?own=1&amp;subtype=boardgame&amp;ff=1">here</a>.</p> <h2 id="top-5" tabindex="-1">Top 5</h2> <p>Leading with the best. If I could only have five games in my collection, these are the five that I’d have.</p> <h3 id="power-grid" tabindex="-1">Power Grid</h3> <p>My undisputed favourite game since 2014. <a href="https://boardgamegeek.com/boardgame/2651/power-grid">Power Grid</a> is an economy/auction game where you bid on power plants to power cities. Each round you have to purchase resources for your power plants.</p> <p>The genius behind this game is that when buying resources, the person in last place buys first. As it’s a supply and demand based market with fixed restocking that means that the person in last place needs fewer resources for the same resources than the players that are pulling ahead.</p> <p>With a huge selection of expansion maps, Power Grid is a game that I’ll never get tired of playing.</p> <h3 id="viticulture" tabindex="-1">Viticulture</h3> <p><a href="https://boardgamegeek.com/boardgame/183394/viticulture-essential-edition">Viticulture</a> is a worker placement game about making wine. On your turn you have a limited number of workers to place one at a time. Each location that they could be played in also has limited space, and someone might beat you to it. It’s a strategic game of building an engine that produces lots of wine, but that doesn’t take too long to get started in case someone else ends the game.</p> <p>I enjoyed the Viticulture base game, but the more expansions I play, the more I love the game overall. The <a href="https://boardgamegeek.com/boardgame/202174/viticulture-tuscany-essential-edition">Tuscany</a> expansion is the sweet spot right now, but maybe I just need to play Bordeaux some more.</p> <p>At this point I mostly play Tuscany on BoardGameArena, and <a href="https://boardgamegeek.com/boardgame/360226/viticulture-world-cooperative-expansion">Viticulture World</a> (which is a <strong>very hard</strong> co-op expansion) in person. If you’ve got a regular group to play with, I can highly recommend Viticulture World as a way to challenge yourself.</p> <h3 id="puerto-rico" tabindex="-1">Puerto Rico</h3> <p><a href="https://michaelheap.com/boardgames/%5Bhttps://boardgamegeek.com/boardgame/415843/puerto-rico-1897-special-edition%5D(https://boardgamegeek.com/boardgame/3076/puerto-rico)">Puerto Rico</a> is classed as an “action selection” game, but that doesn’t really explain what it does. The idea of the game is that you’re all explorers looking to build up your plantations in Puerto Rico (yes, the theme isn’t great). On your turn you can choose an action for everyone to take. As the person that selected it you get one bonus (e.g. a special plantation, produce one more good).</p> <p>The trick to winning Puerto Rico is to take the action that benefits you the most while also not benefiting other players.</p> <p>It’s hard to imagine until you play it, but I highly recommend giving it a go. It’s also on BoardGameArena, and if you like it there’s an <a href="https://boardgamegeek.com/boardgame/415843/puerto-rico-1897-special-edition">Awaken Realms reprint</a> that’s massively overproduced, but also beautiful.</p> <h3 id="lords-of-waterdeep" tabindex="-1">Lords of Waterdeep</h3> <p><a href="https://boardgamegeek.com/boardgame/110327/lords-of-waterdeep">Lords of Waterdeep</a> is one of the original worker placement games. This is my go-to game on my iPad when I’m travelling, and I finally got my hands on a copy of the base game and skull port expansion thanks to the recent reprint.</p> <p>On your turn you visit locations to collect resources. Then spend those resources to complete quests. The quests have various synergies with each other and depending on which you take you can generate a ton of victory points thanks to the interactions between the cards themselves.</p> <h3 id="ra" tabindex="-1">Ra</h3> <p>Finally, <a href="https://boardgamegeek.com/boardgame/12/ra">Ra</a>! Another reprint that I’m very glad I backed. Ra is the quintessential auction game. Each player starts with some bid tokens and uses them to bid on a tableau of tiles that have been drawn. When you win a bid, you swap your chip with one of the values in the middle. This is how people that start with high values end up with low value chips and vice versa.</p> <p>The tiles that you win are placed in front of you in one of eight spaces. Four of them are reset every round, and four persist for the whole game. Figuring out which combination of spaces you want to invest in and which to ignore is most of the strategy. Careful though! If you’re building for a specific win condition people will start outbidding you to stop you getting the tiles you need.</p> <h2 id="quickfire-round" tabindex="-1">Quickfire Round</h2> <h3 id="worker-placement" tabindex="-1">Worker Placement</h3> <p>We already covered Viticulture and Lords of Waterdeep, which are positions one and two.</p> <p>The final worker placement game is <a href="https://boardgamegeek.com/boardgame/63628/the-manhattan-project">The Manhattan Project</a>, which is a tight game about building bombs, spying on other players and destroying other player's factories. You have different types of workers that can take specific actions, so you need to balance the workers you have at various points in the game. Each player can see what every other player is doing, so there is plenty of opportunity for calculation. Who can run the most efficient program?</p> <h3 id="deck-bag-builders" tabindex="-1">Deck / Bag Builders</h3> <p>Although I'll usually reach for worker placement games, deck/bag builders are my comfort game when I only have a short amount of time. Deck builder games are where you start with a hand of fixed cards, then spend resources available on those cards to buy better cards. Then use those cards to get even better cards.</p> <p>The strategy is to balance getting victory points (useless each round, but they're how you win) with economy and attack cards. Balance things correctly and you'll be victorious while everyone else is still building their economy.</p> <p>A bag builder is the same as a deck builder, but instead of drawing cards you pull tokens out of a cloth bag.</p> <ol> <li> <p><a href="https://boardgamegeek.com/boardgame/422780/mistborn-the-deckbuilding-game">Mistborn: The Deckbuilding Game</a> takes the top spot for me in this category. It comes with both a competitive and a co-operative mode. Personally, I prefer the competitive mode but the co-op is great too.</p> <p>If you're a fan of Brandon Sanderson's Mistborn novels, you'll love how thematic this game is. Burning metals to take actions, with characters you know and love available on the cards themselves. I've played this one half a dozen times already this year.</p> </li> <li> <p><a href="https://boardgamegeek.com/boardgame/194607/mystic-vale">Mystic Vale</a> is an intriguing game. The cards you buy are transparent, and you make your own cards by layering cards on top of each other in a plastic sleeve.</p> <p>The aim of the game is to collect victory points before they run out by adding victory point slots to your cards. But be careful, if you fill them up with victory points you won't be able to purchase any new cards.</p> <p>Mystic Vale had a great push-your-luck mechanism where you can keep drawing cards, but if you draw too many curse icons you lose your entire hand.</p> <p>I play this one a <em>lot</em> on the iPad when I have a few minutes to spare.</p> </li> <li> <p><a href="https://boardgamegeek.com/boardgame/244521/quacks">Quacks</a> (formerly known as Quacks of Quedlinburg) is a push your luck game where you draw tokens from a bag, gain money then spend that money on better tokens. You start from the same position every round, so there's a tension between improving your starting location and getting better chips in your bag to score higher each round.</p> <p>Quacks is the game I'd choose if I were introducing someone to deck/bag building games.</p> </li> </ol> <h3 id="co-op-games" tabindex="-1">Co-op Games</h3> <p>As mentioned above, Mistborn and Viticulture both have great co-op modes that I can highly recommend. For pure co-op games:</p> <ol> <li><a href="https://boardgamegeek.com/boardgame/98778/hanabi">Hanabi</a>: You have five cards in your hand that everyone can see except you. They can give you information about the cards, such as &quot;these two cards are the number 3&quot;, or &quot;these three cards are red&quot;. The aim of the game is to build stacks of colour-matched fireworks in order from 1-5 across all players.</li> <li><a href="https://boardgamegeek.com/boardgame/173090/the-game">The Game</a>: A terribly named, but very fun game. Each player has a set of numbered cards that they're trying to get rid of. There are four piles in the middle to play cards on to. Two are labelled 1-&gt;50, and two are labelled 50-&gt;1. You can play on any pile, but the numbers must be sequental. The only way you can go backwards is by playing a card that is exactly 10 difference with the current card. The challenge is that you can't tell each other what cards you have - only vague sentences like &quot;I have a REALLY good card for this pile&quot; are allowed. If anyone can't play on their turn, the game is over and you all lose.</li> <li><a href="https://boardgamegeek.com/boardgame/220517/the-shipwreck-arcana">The Shipwreck Arcana</a>: I've been playing Hanabi and The Game for 10+ years. I picked up Shipwreck last year when I was travelling and finally got it to the table. It has tarot-inspired graphics, and is about predicting what fates (numbers 1-7) people are holding in their hands. There are shared places to play numbers on that say things like &quot;play here if your numbers are exactly 3 apart&quot; or &quot;play here if the sum of your fates and all visible fates is a multiple of 4&quot;. It's hard to explain, so I recommend watching this <a href="https://youtu.be/E3fwBVWdUiw?t=39">four minute intro</a>.</li> </ol> <h3 id="two-player-games" tabindex="-1">Two Player Games</h3> <p>If you're looking for head to head games, there are some goodies out there.</p> <ol> <li><a href="https://boardgamegeek.com/boardgame/424219/zenith">Zenith</a>: A tug of war game where you're trying to influence planets by pulling them towards you. You can win by influencing the same planet 3 times, and 4 different planets of any combination of 5 planets. There's a ton of variety based on the research track used, the players involved and the order of the cards drawn. This is regularly my most played game on BoardGameArena each month, and I play the physical copy too.</li> <li><a href="https://boardgamegeek.com/boardgame/329082/radlands">Radlands</a>: I've only played this a couple of times but it's already in my top 3. I waited for the super deluxe edition and the neoprene mats make all the difference to your camp setup. The idea is that you're rival gangs trying to protect your camps. You only space for have six survivors, and you can build interesting combinations of survivors to destroy your opponent's camp. Simple to set up, reasonable depth and it plays quickly.</li> <li><a href="https://boardgamegeek.com/boardgame/50/lost-cities">Lost Cities</a>: A Knizia classic. Draw cards and build runs of numbers in a matching colour. Careful though - each run you start gives you -20 points until you play enough cards to offset it. Build numbers from 1-10 (so you only need a 3, 7 and 10 to break even). If you think you'll do well on a pile, play a wager card to increase your multiplier (both positive and negative - you can end up starting at -80 if you play three wagers in a single column!). This is another fantastic game to play on BoardGameArena. I'd recommend real-time for this one.</li> </ol> <p>Other two player games that we love include <a href="https://boardgamegeek.com/boardgame/54043/jaipur">Japiur</a>, <a href="https://boardgamegeek.com/boardgame/372/schotten-totten">Schotten Totten</a> and <a href="https://boardgamegeek.com/boardgame/373106/sky-team">Sky Team</a>.</p> <h3 id="party-games" tabindex="-1">Party Games</h3> <p>If you've got a larger group of people, party games work well. Party games are usually either competitive, social deduction games or co-operative. My top 3 are all co-operative, but the honourable mentions are all deduction games.</p> <ol> <li><a href="https://boardgamegeek.com/boardgame/254640/just-one">Just One</a>: A co-operative game where you're all trying to help one person guess a single word by giving one word clues. However, if two people write the same clue they're not allowed to share it with the guesser. I've played this with family over the holidays. I've played this at team offsites. It goes down well everywhere.</li> <li><a href="https://boardgamegeek.com/boardgame/411567/the-gang">The Gang</a>: A co-operative version of Texas Hold'em poker. Guess who has the strongest hand, who has the weakest hand, and every hand in between. After each new card is revealed everyone takes a numbered chip indicating how strong they think their hand is. If you get it right, you rob the vault! If not, you trip the alarm. If your group knows how to play poker, this is phenomenal. If not, I'd give it a miss.</li> <li><a href="https://boardgamegeek.com/boardgame/178900/codenames">Codenames</a>: Split in to two teams and try to identify all of the words related to your team through word association before the other team finds theirs. Each turn, the spy master gives a one word clue and a number e.g. &quot;Commonwealth 3&quot;. This means that there are 3 cards that relate to the word &quot;commonwealth&quot;. Codenames scales to any number of players, and has a variety of editions (standard, marvel)</li> </ol> <p>For competitive games we enjoy <a href="https://boardgamegeek.com/boardgame/135779/a-fake-artist-goes-to-new-york">A Fake Artist Goes to New York</a>, <a href="https://boardgamegeek.com/boardgame/166384/spyfall">Spyfall</a> and <a href="https://boardgamegeek.com/boardgame/128882/the-resistance-avalon">The Resistance: Avalon</a> (which I played every day for 4 years when I worked in an office).</p> <h2 id="what-i-take-to-game-night" tabindex="-1">What I take to game night</h2> <p>It really depends on the night. Most nights I take one of the above games as the main game, plus <a href="https://boardgamegeek.com/boardgame/420087/flip-7">Flip 7</a>, <a href="https://boardgamegeek.com/boardgame/129622/love-letter">Love Letter</a> or <a href="https://boardgamegeek.com/boardgame/131357/coup">Coup</a> as a quick filler game for before or after the main game.</p> <p>If we're feeling tired we'll pick up a lighter game. Something like <a href="https://boardgamegeek.com/boardgame/157969/sheriff-of-nottingham">Sheriff of Nottingham</a> (declare goods that you're importing. The Sheriff may choose to inspect your bag. If you're smuggling contraband, you pay. Otherwise he pays you), <a href="https://boardgamegeek.com/boardgame/271869/sushi-roll">Sushi Roll</a> (a set building game. This is the dice version of Sushi Go) or <a href="https://boardgamegeek.com/boardgame/260605/camel-up-second-edition">Camel Up</a> (a silly game about racing camels. Part luck, part strategy, lots of chaos).</p> <p>Finally, there are a couple of honourable mentions that don't fit the categories above, but do make it to the table a couple of times per year as the main game:</p> <ol> <li><a href="https://boardgamegeek.com/boardgame/290236/canvas">Canvas</a>: A bit like Mystic Vale, this is a game where you combine transparent cards to make something. You purchase cards from an auction, then combine their abilities (the five colours on the card) in order to meet the randomly drawn composition cards and score points. It sounds abstract until you play it (or watch <a href="https://www.youtube.com/watch?v=kAZxJTqFgSw">this video</a> from the publisher). I've had a lot of success with people at game night <em>and</em> with family with Canvas.</li> <li><a href="https://boardgamegeek.com/boardgame/68448/7-wonders">7 Wonders</a>: A tableau building, card drafting game where you choose a card then pass your entire hand on to the next player. There are 7 ways to score points, so every game can have a different strategy. This is a favourite for when you have a lot of players looking for a game as it goes up to 7 players (if there are 8 players, that's two games of four). Be warned: scoring makes zero sense until the end of your first game, then it's super easy to understand.</li> <li><a href="https://boardgamegeek.com/boardgame/18/roborally">RoboRally</a>: There are many versions of this. The linked one is the one I originally played way back in 2014. I own the <a href="https://boardgamegeek.com/boardgame/417203/robo-rally-30th-anniversary">30th anniversary edition</a>, but they all play the same. Plan your moves by playing cards in order. Then hope that you planned correctly and that conveyer belts, weapons and other robots don't push you off course. Be the first to get to the objectives to win.</li> </ol> <h2 id="tldr" tabindex="-1">TL;DR</h2> <p>I wrote a <em>lot</em> of words above. Here's the short version:</p> <ul> <li><strong>Top 5</strong>: <a href="https://boardgamegeek.com/boardgame/2651/power-grid">Power Grid</a>, <a href="https://michaelheap.com/boardgames/">Viticulture</a>, <a href="https://boardgamegeek.com/boardgame/3076/puerto-rico">Puerto Rico</a>, <a href="https://boardgamegeek.com/boardgame/110327/lords-of-waterdeep">Lords of Waterdeep</a>, <a href="https://boardgamegeek.com/boardgame/12/ra">Ra</a></li> <li><strong>Worker placement</strong>: <a href="https://michaelheap.com/boardgames/">Lords of Waterdeep</a>, <a href="https://michaelheap.com/boardgames/">Viticulture</a>, <a href="https://boardgamegeek.com/boardgame/63628/the-manhattan-project">The Manhattan Project</a></li> <li><strong>Deck/bag building</strong>: <a href="https://boardgamegeek.com/boardgame/422780/mistborn-the-deckbuilding-game">Mistborn: The Deckbuilding Game</a>, <a href="https://boardgamegeek.com/boardgame/194607/mystic-vale">Mystic Vale</a>, <a href="https://boardgamegeek.com/boardgame/244521/quacks">Quacks</a></li> <li><strong>Co-operative</strong>: <a href="https://boardgamegeek.com/boardgame/98778/hanabi">Hanabi</a>, <a href="https://boardgamegeek.com/boardgame/173090/the-game">The Game</a>, <a href="https://boardgamegeek.com/boardgame/220517/the-shipwreck-arcana">The Shipwreck Arcana</a></li> <li><strong>2 player</strong>: <a href="https://boardgamegeek.com/boardgame/424219/zenith">Zenith</a>, <a href="https://boardgamegeek.com/boardgame/329082/radlands">Radlands</a>, <a href="https://boardgamegeek.com/boardgame/50/lost-cities">Lost Cities</a>, <a href="https://boardgamegeek.com/boardgame/54043/jaipur">Japiur</a>, <a href="https://boardgamegeek.com/boardgame/372/schotten-totten">Schotten Totten</a>, <a href="https://boardgamegeek.com/boardgame/373106/sky-team">Sky Team</a></li> <li><strong>Party games</strong>: <a href="https://boardgamegeek.com/boardgame/254640/just-one">Just One</a>, <a href="https://boardgamegeek.com/boardgame/411567/the-gang">The Gang</a>, <a href="https://boardgamegeek.com/boardgame/178900/codenames">Codenames</a>, <a href="https://boardgamegeek.com/boardgame/135779/a-fake-artist-goes-to-new-york">A Fake Artist Goes to New York</a>, <a href="https://boardgamegeek.com/boardgame/166384/spyfall">Spyfall</a>, <a href="https://boardgamegeek.com/boardgame/128882/the-resistance-avalon">The Resistance: Avalon</a></li> <li><strong>Filler games</strong>: <a href="https://boardgamegeek.com/boardgame/420087/flip-7">Flip 7</a>, <a href="https://boardgamegeek.com/boardgame/129622/love-letter">Love Letter</a>, <a href="https://boardgamegeek.com/boardgame/131357/coup">Coup</a></li> <li><strong>Lighter games</strong>: <a href="https://boardgamegeek.com/boardgame/157969/sheriff-of-nottingham">Sheriff of Nottingham</a>, <a href="https://boardgamegeek.com/boardgame/271869/sushi-roll">Sushi Roll</a>, <a href="https://boardgamegeek.com/boardgame/260605/camel-up-second-edition">Camel Up</a></li> <li><strong>Bonus games</strong>: <a href="https://boardgamegeek.com/boardgame/290236/canvas">Canvas</a>, <a href="https://boardgamegeek.com/boardgame/68448/7-wonders">7 Wonders</a>, <a href="https://boardgamegeek.com/boardgame/18/roborally">RoboRally</a></li> </ul> Fetch PR comments using the `gh` CLI 2026-09-19T13:20:43Z https://michaelheap.com/gh-pr-comments/ <p>The &quot;fix this with copilot&quot; button on GitHub is great, but when you're already working on a branch locally sometimes you want to pass the review feedback to your agent directly.</p> <p>If you use the <code>gh</code> CLI, you can install this by running <code>gh extension install mheap/gh-pr-comments</code>.</p> <p>Once it's installed, run <code>gh pr-comments &lt;PR number&gt; | pbcopy</code> to get all of the comments ready to paste in to your agent.</p> <p>Here's what it does under the hood:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">bash</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-token-comment)">#!/usr/bin/env bash</span></div><div class="line"><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -euo pipefail</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">(( $# </span><span style="color: var(--shiki-token-keyword)">&lt;</span><span style="color: var(--shiki-token-string)"> </span><span style="color: var(--shiki-token-constant)">1</span><span style="color: var(--shiki-token-string)"> </span><span style="color: var(--shiki-token-keyword)">||</span><span style="color: var(--shiki-token-string)"> $# </span><span style="color: var(--shiki-token-keyword)">&gt;</span><span style="color: var(--shiki-token-string)"> </span><span style="color: var(--shiki-token-constant)">2</span><span style="color: var(--shiki-token-string)"> ))</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">||</span><span style="color: var(--shiki-color-text)"> [[ </span><span style="color: var(--shiki-token-keyword)">!</span><span style="color: var(--shiki-color-text)"> ${1</span><span style="color: var(--shiki-token-keyword)">:-</span><span style="color: var(--shiki-color-text)">} </span><span style="color: var(--shiki-token-keyword)">=~</span><span style="color: var(--shiki-color-text)"> ^[0-9]+$ ]]</span><span style="color: var(--shiki-token-keyword)">;</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">then</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Usage: gh pr-comments &lt;PR number&gt; [owner/repo]"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">&gt;&2</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">exit</span><span style="color: var(--shiki-color-text)"> 1</span></div><div class="line"><span style="color: var(--shiki-token-keyword)">fi</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)">pr=</span><span style="color: var(--shiki-token-string-expression)">"$1"</span></div><div class="line"><span style="color: var(--shiki-color-text)">repo=</span><span style="color: var(--shiki-token-string-expression)">"${2</span><span style="color: var(--shiki-token-keyword)">:-</span><span style="color: var(--shiki-token-string-expression)">}"</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> [[ </span><span style="color: var(--shiki-token-keyword)">-z</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"$repo"</span><span style="color: var(--shiki-color-text)"> ]]</span><span style="color: var(--shiki-token-keyword)">;</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">then</span></div><div class="line"><span style="color: var(--shiki-color-text)"> repo=</span><span style="color: var(--shiki-token-string-expression)">"$(gh repo view --json nameWithOwner --jq '.nameWithOwner')"</span></div><div class="line"><span style="color: var(--shiki-token-keyword)">fi</span></div><div class="line"></div><div class="line"><span style="color: var(--shiki-color-text)">gh api --paginate </span><span style="color: var(--shiki-token-string-expression)">"repos/$repo/pulls/$pr/comments"</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">|</span><span style="color: var(--shiki-color-text)"> jq -c </span><span style="color: var(--shiki-token-string-expression)">'.[] | {path, line, body}'</span></div></code></div></pre> Dump Kong Gateway configuration 2026-09-15T19:27:15Z https://michaelheap.com/dump-kong-gateway-config/ <p>The simplest way to dump a Kong Gateway configuration is <code>deck gateway dump</code>. However, I sometimes find myself working with a dataplane that does not have an admin API exposed.</p> <p>Here's a one-liner that dumps the config from the running process (enterprise only).</p> <p><strong>Important</strong>: This dumps in DB-less format, not deck format. Use <a href="https://developer.konghq.com/deck/dbless-vs-deck/">deck file format</a> to convert between them.</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">bash</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-color-text)">docker </span><span style="color: var(--shiki-token-function)">exec</span><span style="color: var(--shiki-color-text)"> -i </span><span style="color: var(--shiki-token-string-expression)">"${docker_hash}"</span><span style="color: var(--shiki-color-text)"> sh -c \</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'echo "require([[kong.db.declarative]]).export_from_db({write=function(_,s) io.write(s) end})" | kong runner /dev/stdin'</span><span style="color: var(--shiki-color-text)"> \</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">&gt;</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"${output_file}"</span></div></code></div></pre> <p>Or for <code>kubectl</code>:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">bash</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-color-text)">kubectl </span><span style="color: var(--shiki-token-function)">exec</span><span style="color: var(--shiki-color-text)"> -n kong -i deploy/kong-gateway -- sh -c \</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'echo "require([[kong.db.declarative]]).export_from_db({write=function(_,s) io.write(s) end})" | kong runner /dev/stdin'</span><span style="color: var(--shiki-color-text)"> \</span></div><div class="line"><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">&gt;</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"${output_file}"</span></div></code></div></pre> Asking better questions 2026-05-08T16:54:17Z https://michaelheap.com/asking-better-questions/ <p>There's nothing more terrifying than getting a &quot;Hey, quick question. Are we on track to launch by X?&quot;.</p> <p>It's not the question itself that's terrifying. It's everything you don't know when you hear it:</p> <ul> <li>What do they know that I don't?</li> <li>Why do they care right now?</li> <li>What happens if I give the wrong answer?</li> </ul> <p>That ambiguity is what drives anxiety.</p> <p>There are multiple ways to answer the question, each giving the asker more visibility into your thinking (and more confidence in your answer):</p> <ul> <li>&quot;I think so&quot;</li> <li>&quot;Yes, we're on track&quot;</li> <li>&quot;Yes, we're on track. I reviewed the remaining work items and there are approximately 3 weeks of work left, which will give us 2 weeks of testing.&quot;</li> <li>&quot;Yes, we're on track. I reviewed the remaining work items and there are approximately 3 weeks of work left, which will give us 2 weeks of testing. Is there a particular reason you're asking?&quot;</li> </ul> <p>The first three items make your thinking more visible. But the fourth item digs in to the question behind the question. It's unlikely that they've spontaneously taken interest in the project this morning. What changed that made them ask this now?</p> <p>Sometimes it's as simple as &quot;I'm meeting Customer Z and wanted to let them know when the change is coming&quot;. Other times it's &quot;I was chatting to the marketing team and they want to run a campaign around the new features and wondered when it was releasing&quot;. And sometimes it's &quot;The last 3 releases have been delayed by a couple of weeks and I wanted to make sure that we're not underestimating the amount of work. Every time we miss a deadline I look bad.&quot;</p> <p>Ambiguity drives anxiety. Context removes it.</p> <h2 id="provide-the-why" tabindex="-1">Provide the Why</h2> <p>Now that you know what it's like to be on the receiving end of this type of question, how can you reduce the anxiety for teams that you work with? One sentence of additional context is all it takes to remove that ambiguity.</p> <ul> <li><strong>Bad</strong>: When will your proposal be finished?</li> <li><strong>Good</strong>: When will your proposal be finished? I won't be able to review if it's Thursday or Friday as I'm travelling, so you'll need to wait an additional week. If it's done by Wednesday I'll carve out time.</li> </ul> <p>You can also lead with the reason you're asking:</p> <ul> <li><strong>Bad</strong>: Did we document feature X?</li> <li><strong>Good</strong>: I have partner Y trying to integrate feature X. Do we have any public docs that I can send to them? If not, can you hop on a call to help them out?</li> </ul> <p>Make sure that the context you add is useful, not something that will drive additional anxiety:</p> <ul> <li><strong>Bad</strong>: Are we shipping X this week?</li> <li><strong>Worse</strong>: Are we shipping X this week? Sales is asking</li> <li><strong>Good</strong>: I was talking to one of the sales engineers and they mentioned that feature X would help on one of their deals. Is it still shipping this week?</li> </ul> <p>“Sales is asking” adds pressure, but not clarity. It makes the question feel more urgent without making it easier to answer.</p> <h2 id="ask-the-question-behind-the-question" tabindex="-1">Ask the Question Behind the Question</h2> <p>When you're asking a question, make sure to add enough context that the person knows <em>why</em> you're asking.</p> <p>Context doesn't just give people more information, it changes the shape of the question. Here's what it looks like in practice:</p> <ul> <li><strong>Question</strong>: Are we shipping X this week?</li> <li><strong>Answer</strong>: Yes</li> </ul> <p>Let's try that again with the longer question:</p> <ul> <li><strong>Question</strong>: I was talking to one of the sales engineers and they mentioned that feature X would help on one of their deals. Is it still shipping this week?</li> <li><strong>Answer</strong>: Yes. Which engineer was it? I can give them early access and some internal docs that I've been writing if they want to try it themselves before we officially ship.</li> </ul> <p>The person being asked has the full picture and can give a better answer.</p> <p>In practice, adding context tends to do one of three things:</p> <ul> <li>It changes the <strong>urgency</strong></li> <li>It changes the <strong>format of the answer</strong></li> <li>It changes the definition of <strong>done</strong></li> </ul> <p>In the first example (<em>when</em>), the additional context changes the <strong>urgency</strong> of the question.<br /> In the second example (<em>did</em>), the additional context changes the <strong>format</strong> of the answer from a yes/no to a link.<br /> In the third example (<em>shipping</em>), the additional context changes the definition of <strong>done</strong>.</p> <p>If your context doesn’t change one of those three things, it’s probably not useful to the person you're asking.</p> <p>If you’re being asked a question and they don’t provide context, answer directly, then gently ask what prompted it: &quot;Great question! The answer is X. I'm curious to know what made you ask.&quot;</p> It just has to work 2026-04-29T09:01:50Z https://michaelheap.com/it-just-has-to-work/ <p>We've been trained all of our work life to &quot;do things the right way&quot;.</p> <p>The right process. The right level of detail. The right amount of alignment.</p> <p>You know what happens next. Six months later, nothing has shipped.</p> <h2 id="the-hidden-cost-of-&quot;doing-it-right&quot;" tabindex="-1">The Hidden Cost of &quot;Doing It Right&quot;</h2> <p>When you're a scrappy startup, everything is allowed. Quick hacks, half-baked ideas, and sometimes editing things live in production. But as a company grows, it starts to establish processes to prevent failure. A &quot;best practice&quot; here, or an &quot;executive review&quot; there.</p> <p>Some of that is necessary. Every process is someone's scar. They've lived through outages, security incidents, compliance failures, and broken trust.</p> <p>The problem is what happens over time. Last-resort safeguards quietly become prerequisites for action. Teams wait for a complete understanding of the problem. It rarely happens. When you treat perfection as a risk-avoidance strategy, nothing ever ships.</p> <h2 id="momentum-beats-consensus" tabindex="-1">Momentum Beats Consensus</h2> <p>One product manager I worked with hit this problem. They were struggling to get stakeholder time to talk about the requirements for a new capability. Everyone had opinions, and they wanted to make sure that they were captured.</p> <p>I asked them to write a one-page, opinionated spec and share it. Within a day, stakeholders were commenting in the doc with their opinions.</p> <p><strong>A one-page spec can trigger in a day what weeks of scheduling can’t: informed disagreement.</strong></p> <p>The first version is almost always wrong, but it surfaces the <em>right</em> disagreements fast.</p> <p>It doesn't need to be a spec. Sometimes it’s a clickable prototype. Sometimes it’s a command-line script, a mocked API, a Loom walkthrough. Just make <em>something</em> that people can react to.</p> <p>It doesn’t need to be complete. &quot;Working&quot; means:</p> <ul> <li>Usable by a real person today</li> <li>A measurable metric moves</li> <li>You can tell that it worked within hours or days</li> <li>It fits within your guardrails</li> </ul> <p>Incremental progress is how you get to the right answer faster. It requires clear success criteria and fast feedback loops. More importantly, it requires a willingness to delete work. Ship, learn, iterate, then ship again.</p> <p>Some work has tight constraints - safety, legal, ethical, security - but the need to learn doesn't go away.</p> <h2 id="the-real-questions" tabindex="-1">The Real Questions</h2> <p>Action creates something people can react to. Once something &quot;good enough&quot; is unblocking real users, the questions change. Instead of asking &quot;Is this ready?&quot; or &quot;Will this scale?&quot;, ask questions that inform the future.</p> <ul> <li>“What will we learn if this works?”</li> <li>“How quickly will we know if it doesn’t?”</li> <li>“What gets better the moment this exists?”</li> </ul> <p>Most teams fail not because they move too fast, but because they wait for certainty that never arrives. Teams that wait for perfect don't have better outcomes. They just have fewer of them. Progress starts when there’s something real to push against.</p> <p>Treating every decision as permanent is how you end up six months in with nothing shipped.</p> Disable VSCode embedded browser 2026-04-27T20:05:28Z https://michaelheap.com/vscode-embedded-browser/ <p>VSCode recently started opening my blog previews as an editor tab rather than in my normal browser. It turns out that this is a new <em>Integrated Browser</em> feature inside VSCode Insiders.</p> <p>To disable it, add the following to <code>settings.json</code>:</p> <pre class="shiki css-variables" style="background-color: var(--shiki-color-background); color: var(--shiki-color-text)"><div class="language-id">json</div><div class="code-container"><code><div class="line"><span style="color: var(--shiki-token-string-expression)">"workbench.browser.openLocalhostLinks"</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-constant)">false</span></div></code></div></pre> <p>Or you can search for <code>workbench.browser.openLocalhostLinks</code> in the settings panel and uncheck the box.</p> <p>Then restart VSCode, or reload the window with <em>Command Palette → Developer: Reload Window</em>.</p> When AI beats procrastination 2026-04-20T13:09:18Z https://michaelheap.com/when-ai-beats-procrastination/ <p>I have a list. I’m sure you have a list too. A list of all the things that could be, if only you had more time. Time to explore the idea. Time to build a prototype. Time to invest in something new.</p> <p>And if you’re anything like me, time is an excuse. Once I get started on a project, it becomes all-consuming. I find the time - 10 minutes here, 10 minutes there.</p> <p>If I'm being honest, the list isn’t full of hard problems. It’s full of things that never felt important enough to start.</p> <h2 id="human-vs-ai" tabindex="-1">Human vs AI</h2> <p>A year ago, I thought AI was pretty terrible. It was too slow. Too unpredictable. Too willing to confidently invent nonsense.</p> <p>I’d look at its output, think “I could do this better,” then walk off, adding the idea to the growing pile of things I was technically capable of doing but never motivated enough to begin.</p> <p>The mistake I was making was simple: I was comparing AI to a human.</p> <p>I was asking, “Is this as good as if I did it myself?” and the answer was usually “no.”</p> <p>But I was asking the wrong question. What I should have been asking was “would I ever do this at all?”</p> <h2 id="the-breakthrough" tabindex="-1">The breakthrough</h2> <p>I’ve been meaning to build a CLI that wraps <a href="http://listentotaxman.com/">listentotaxman.com</a> so that I can compare two salaries for <em>years</em>. With a full-time job, a family, and other interests, it never quite made it to the top of the list.</p> <p>So one Saturday evening, I took 10 minutes to <a href="https://michaelheap.com/listentotaxman-cli/">write down what I wanted</a>:</p> <ul> <li>the commands</li> <li>what each should do</li> <li>a couple of example outputs</li> </ul> <p>Then I walked away and made dinner.</p> <p>When I came back, I had something that <em>mostly</em> worked. It wasn’t perfect. It’s definitely not something I’d ship to a customer. But for infrequent, personal use? It was <em>perfect</em>. Far better than the “this would be nice to build someday” alternative.</p> <p>This was the breakthrough for me. <strong>It’s not “AI vs. Michael.” It’s “AI doing the work I never make time for.”</strong></p> <h2 id="getting-started-is-the-hard-part" tabindex="-1">Getting started is the hard part</h2> <p>Realising this changed how I approach my backlog.</p> <ul> <li>I try more things, because failure is cheap.</li> <li>I finish more things, because “good enough” is easy to reach.</li> <li>I revisit old ideas, because they’re no longer competing with everything else for my time.</li> </ul> <p>I used to have more ideas than time. I had to choose between spending an evening at my desk or with my family. That's no longer the case.</p> <p>In two months, I built six tools I’d been putting off for years:</p> <ul> <li><a href="https://michaelheap.com/listentotaxman-cli/">listentotaxman-cli</a> - Compare multiple salaries using <a href="http://listentotaxman.com/">listentotaxman.com</a></li> <li><a href="https://michaelheap.com/gh-saved-issues/">gh-saved-issues</a> - Configure <a href="http://github.com/issues">github.com/issues</a> from a config file</li> <li><a href="https://github.com/mheap/agent-en-place">agent-en-place</a> - Sandbox agents using dynamically built environments with <code>mise</code> and <code>docker</code></li> <li><a href="https://github.com/mheap/google-contacts-backup">google-contacts-backup</a> - Back up and restore your Google contacts to JSON</li> <li><a href="https://michaelheap.com/actions-update-aur/">Automatic AUR updates with GitHub Actions</a></li> <li><a href="https://github.com/mheap/trace2mermaid">trace2mermaid</a> - Render OpenTelemetry traces using <code>mermaid</code></li> </ul> <p>None of these are groundbreaking. And honestly, that’s the point. I couldn’t justify the time investment. But now they exist where they didn’t before.</p> <h2 id="ai-is-still-untrustworthy" tabindex="-1">AI is still untrustworthy</h2> <p>Let’s be clear: I don’t trust any of the code. It's brittle. I’m certain there are bugs I haven’t found (mostly because I haven’t looked very hard). AI has made assumptions that I haven’t validated.</p> <p>AI is not how you build things you care deeply about.</p> <p>It’s how you build things you want to exist.</p> <p>AI doesn’t replace deep thinking and craft. It’s a shortcut around the part where nothing happens at all.</p> Prompt Engineering for Humans 2026-03-31T20:14:17Z https://michaelheap.com/prompt-engineering-for-humans/ <p>A while back, I was working on <a href="https://github.com/mheap/trello-cli">trello-cli</a>, a CLI tool I maintain. I've been slowly adding commands as time allows, but this time I wanted to try out this new-fangled &quot;agentic development&quot; thing that everyone is talking about.</p> <p>So I opened up my terminal, asked it to &quot;Add support for showing card details&quot; and let it churn away. Once it was done I reviewed the output and, honestly, I was disappointed. It added a command that showed the board title, description, and labels. It was missing the card's due date, which is the most important information of all. Checklist support was nowhere to be seen.</p> <p>I went to close my laptop, safe in the knowledge that AI wasn't coming for my job any time soon. Then I realised, the agent had done what I asked. It had added support for showing card details. I didn't specify <em>which</em> details I wanted to see.</p> <p>So I gave it another go, this time assuming it didn't know anything about my intent:</p> <blockquote> <p>Add a card:show command that accepts --board and --list as flags. Output the card title, description, due date, any attached checklists and labels. If any of these values do not exist, skip the header for that section. If checklists have more than 10 items, add a &quot;+ X more&quot; entry. Add an --all-details flag to show all of the information.</p> </blockquote> <p>This time the output was fantastic. It was a command I could use immediately. What would have easily taken me an hour was finished in minutes. Nothing about the model changed. The only thing that changed was the context.</p> <p>The fastest way to get bad output from an AI system is to give it a vague prompt. It turns out the same is true for humans, too.</p> <h2 id="management-context" tabindex="-1">Management = Context</h2> <p>This is exactly what good managers do. Or at least what they’re supposed to do. Good managers, it turns out, spend a lot of time doing <strong>prompt engineering for humans</strong>.</p> <p>Vague prompts produce vague results. From AI. From teams. From organisations.</p> <p>Management isn't about assigning work. It’s about designing <em>context</em>: goals, constraints, expectations, and validation. When those things are clear, teams move quickly and independently. When they aren’t, people guess.</p> <h2 id="the-one-sentence-management-problem" tabindex="-1">The one-sentence management problem</h2> <p>Managers often give direction the same way people write bad AI prompts: short, clear, and wildly underspecified.</p> <p>Here's something that I said in a documentation project at work:</p> <blockquote> <p>“All the information needed to achieve a task must be on a single page.”</p> </blockquote> <p>To me this was a precise requirement. Users must be able to achieve their goal by reading the content on a single page. What I didn't realise is that I had a set of assumptions about what that meant.</p> <p>Bad prompts to AI fail fast; bad prompts to humans fail expensively.</p> <p>Reverse-engineering intent from an underspecified prompt takes a <em>lot</em> of time, and it's usually missing nuance.</p> <h2 id="the-rewrite" tabindex="-1">The rewrite</h2> <p>In this case, the team built something that met the requirements, but didn't match my expectations. I could figure out how to achieve a use case from the page, but it was a painful experience copying arcane configs into various files. If I didn't read closely I'd paste the wrong thing into the wrong file, and none of it would work.</p> <p>After some deliberation, I rephrased the requirements:</p> <blockquote> <p>Users must be able to copy and paste down a page from top to bottom and be successful with their task. They must also have a way to validate that it's working.</p> </blockquote> <p>The goal didn’t change. The <strong>context</strong> did.</p> <p>Now we understand how the user behaves. We know what success looks like. We know how the user verifies the outcome.</p> <h2 id="why-constraints-create-autonomy" tabindex="-1">Why constraints create autonomy</h2> <p>Managers sometimes hesitate to define constraints. They worry that too many rules will limit creativity. In practice, the opposite happens. Constraints remove ambiguity.</p> <p>When teams understand the boundaries - what matters, what doesn’t, and how success will be measured - they stop waiting for clarification and start making decisions.</p> <p>When projects struggle, the instinct is often to blame execution. The team misunderstood the task. The engineer built the wrong thing. The feature didn’t meet expectations.</p> <p>Sometimes that’s true. But more often the real problem is simpler: the context wasn’t clear.</p> <h2 id="the-context-checklist" tabindex="-1">The context checklist</h2> <p>Before assigning work, ask yourself whether the prompt you’re giving your team includes five things:</p> <p><strong>The goal</strong><br /> What outcome are we trying to achieve?</p> <p><strong>The context</strong><br /> Why does this matter?</p> <p><strong>The constraints</strong><br /> What boundaries exist around time, scope, or resources?</p> <p><strong>The success criteria</strong><br /> What does good look like?</p> <p><strong>The validation mechanism</strong><br /> How will we know it works?</p> <p>When these pieces are clear, the team doesn’t need constant clarification or supervision.</p> <h2 id="specify-don't-guess" tabindex="-1">Specify, don't guess</h2> <p>AI didn’t introduce a new problem. It exposed an old one.</p> <p>We’ve always relied on people to interpret vague instructions, fill in gaps, and guess at intent. Sometimes that works when you're a small team. At scale, it breaks.</p> <p>Prompt engineering is just a new name for something managers have always been responsible for: making sure the work is understandable before it begins.</p> <p>The difference now is that there’s no illusion. Machines don’t guess what you meant. They reflect exactly what you said and you have to deal with the consequences.</p>